Newsletter - Version 7.0.8

Version Description

  • [SUBSCRIBERS] Changed action buttons
  • [GENERAL] Reoganization of CSS and removal of unused files
  • [DASHBOARD] New window open for links and fix of invalid URLs
  • [NEWSLETTERS] New action buttons
  • [GENERAL] Minor fixes and optimizations
  • [COMPOSER] Fixed rare size error on gif images
Download this release

Release Info

Developer satollo
Plugin Icon 128x128 Newsletter
Version 7.0.8
Comparing to
See all releases

Code changes from version 7.0.7 to 7.0.8

Files changed (58) hide show
  1. admin-dark.css +34 -0
  2. admin.css +80 -1094
  3. admin.js +7 -1
  4. admin.min.css +0 -1
  5. admin.min.js +0 -5
  6. css/controls-dark.css +61 -0
  7. css/controls.css +146 -0
  8. css/dashboard.css +1 -106
  9. css/dashboard.min.css +0 -1
  10. css/dropdown.css +0 -14
  11. css/extensions.css +150 -0
  12. css/fields.css +1 -9
  13. css/fields.min.css +0 -1
  14. css/tabs.css +94 -0
  15. css/welcome.css +348 -0
  16. emails/edit.php +9 -8
  17. emails/index.php +13 -12
  18. emails/new.php +15 -0
  19. emails/subjects.php +0 -10
  20. emails/tnp-composer/_css/newsletter-builder-v2.css +0 -9
  21. emails/tnp-composer/_css/newsletter-builder-v2.min.css +0 -1
  22. emails/tnp-composer/_css/newsletter-builder.css +0 -9
  23. emails/tnp-composer/_scripts/newsletter-builder-v2.min.js +0 -26
  24. emails/tnp-composer/_scripts/newsletter-builder.js +0 -2
  25. emails/tnp-composer/_scripts/newsletter-builder.min.js +0 -18
  26. emails/tnp-composer/index-v2.php +21 -8
  27. includes/PHPMailerLoader.php +40 -40
  28. includes/composer.php +121 -142
  29. includes/controls.php +245 -143
  30. includes/helper.php +3 -0
  31. includes/mailer.php +547 -547
  32. includes/module.php +19 -5
  33. main/extensions.php +0 -46
  34. main/index.php +15 -11
  35. main/info.php +2 -2
  36. main/logs.php +57 -0
  37. main/main.php +2 -2
  38. main/status.php +0 -16
  39. main/welcome.php +3 -1
  40. plugin.php +20 -16
  41. readme.txt +10 -1
  42. style.min.css +0 -1
  43. subscription/profile.php +31 -31
  44. subscription/subscription.php +14 -15
  45. tnp-header.php +8 -2
  46. users/edit.php +1 -1
  47. users/import.php +3 -3
  48. users/index.php +12 -12
  49. vendor/select2/LICENSE +0 -18
  50. vendor/select2/LICENSE.md +21 -0
  51. vendor/select2/css/select2.min.css +1 -0
  52. vendor/select2/js/select2.min.js +2 -0
  53. vendor/select2/select2-spinner.gif +0 -0
  54. vendor/select2/select2.css +0 -692
  55. vendor/select2/select2.js +0 -3729
  56. vendor/select2/select2.min.js +0 -23
  57. vendor/select2/select2.png +0 -0
  58. vendor/select2/select2x2.png +0 -0
admin-dark.css ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "css/controls-dark.css";
2
+
3
+ #tnp-body {
4
+ background-color: transparent;
5
+ }
6
+
7
+ /* Tabs */
8
+ #tnp-body #tabs p {
9
+ color: #999;
10
+ }
11
+
12
+ #tnp-body #tabs .ui-tabs-panel {
13
+ background-color: transparent;
14
+ padding-left: 0 !important;
15
+ }
16
+
17
+ #tnp-body #tabs .ui-widget-header .ui-state-default {
18
+ background-color: transparent;
19
+ }
20
+
21
+ #tnp-body #tabs .ui-widget-header .ui-state-default a {
22
+ color: #fff;
23
+ }
24
+
25
+ #tnp-body #tabs .ui-widget-header .ui-state-active a {
26
+ color: #fff;
27
+ background-color: #28313C;
28
+ }
29
+
30
+ #tnp-body #tabs h3,
31
+ #tnp-body #tabs h4 {
32
+ color: #fff;
33
+ }
34
+
admin.css CHANGED
@@ -1,4 +1,7 @@
1
- /* Bootstrap like */
 
 
 
2
 
3
  #tnp-wrap * {
4
  -webkit-box-sizing: border-box;
@@ -6,13 +9,6 @@
6
  box-sizing: border-box;
7
  }
8
 
9
- /* Color picker patch */
10
- #tnp-wrap .iris-picker, #tnp-wrap .iris-picker * {
11
- -moz-box-sizing: content-box;
12
- -webkit-box-sizing: content-box;
13
- box-sizing: content-box;
14
- }
15
-
16
  #tnp-wrap *:before,
17
  #tnp-wrap *:after {
18
  -webkit-box-sizing: border-box;
@@ -20,10 +16,23 @@
20
  box-sizing: border-box;
21
  }
22
 
23
- /*.row {
24
- margin-right: -15px;
25
- margin-left: -15px;
26
- }*/
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
  .container {
29
  width: 100%;
@@ -124,31 +133,6 @@
124
  margin-top: 80px;
125
  }
126
 
127
-
128
-
129
- #tnp-wrap,
130
- #tnp-header,
131
- #tnp-body p,
132
- #tnp-body td,
133
- #tnp-body td p,
134
- #tnp-body input,
135
- #tnp-body select,
136
- #tnp-body textarea {
137
- font-family: soleil, sans-serif;
138
- -webkit-font-smoothing: antialiased; /* Chrome, Safari */
139
- -moz-osx-font-smoothing: grayscale; /* Firefox */
140
- }
141
-
142
- #tnp-body h1,
143
- #tnp-body h2,
144
- #tnp-body h3,
145
- #tnp-body h4 {
146
- font-family: soleil, sans-serif;
147
- -webkit-font-smoothing: antialiased; /* Chrome, Safari */
148
- -moz-osx-font-smoothing: grayscale; /* Firefox */
149
- }
150
-
151
-
152
  #tnp-promotion-bar {
153
  background-color: #FF5F65;
154
  color: ddd;
@@ -180,7 +164,6 @@
180
 
181
  #tnp-header a {
182
  text-decoration: none;
183
- /*font-family: soleil,sans-serif;*/
184
  color: white;
185
  letter-spacing: 0.1em;
186
  }
@@ -197,34 +180,15 @@
197
  color: #000!important;
198
  }
199
 
200
- .tnp-error {
201
- border-left: 5px solid #dd0000;
202
- background-color: #fff;
203
- padding: 15px;
204
- margin: 15px 0;
205
- font-size: 1.2em;
206
- line-height: 1.5em;
207
- }
208
-
209
- .tnp-warning {
210
- border-left: 5px solid #ffb900;
211
- background-color: #fff;
212
- padding: 15px;
213
- margin: 15px 0;
214
- font-size: 1.2em;
215
- line-height: 1.5em;
216
- }
217
 
218
- .tnp-message {
219
- border-left: 5px solid #46b450;
220
- background-color: #fff;
221
- padding: 15px;
222
- margin: 15px 0;
223
- font-size: 1.2em;
224
- line-height: 1.5em;
225
  }
226
 
227
- /* Default font colors for our dark background page body */
228
  #tnp-body h1,
229
  #tnp-body h2,
230
  #tnp-body h3,
@@ -233,6 +197,13 @@
233
  color: #fff;
234
  }
235
 
 
 
 
 
 
 
 
236
  #tnp-body ul {
237
  list-style-type: circle;
238
  list-style-position: inside;
@@ -259,14 +230,21 @@
259
  #tnp-body .button:focus,
260
  #tnp-body .button-primary,
261
  #tnp-body .button-primary:visited,
262
- #tnp-body .button-primary:hover,
 
 
 
 
 
 
263
  #tnp-body .button-secondary,
264
  #tnp-body .button-secondary:visited,
265
  #tnp-body .button-secondary:hover {
266
  color: #fff;
267
- background-color: #3498db;
268
  text-shadow: none;
269
  width: auto;
 
270
  }
271
 
272
  /* Icon in button media selector */
@@ -290,14 +268,6 @@
290
  width: auto;
291
  }
292
 
293
- /* Form tables correction */
294
- #tnp-body .form-table h1,
295
- #tnp-body .form-table h2,
296
- #tnp-body .form-table h4,
297
- #tnp-body .form-table h3 {
298
- color: #444;
299
- }
300
-
301
  #tnp-body tbody th,
302
  #tnp-body td,
303
  #tnp-body td p,
@@ -314,52 +284,6 @@
314
  color: #27AE60; /* Green */
315
  }
316
 
317
-
318
- /* Tables of class form-table */
319
- #tnp-body .form-table {
320
- background-color: #fff;
321
- border: 1px solid #ECF0F1;
322
- margin-top: 2em;
323
- border-spacing: 4px;
324
- border-collapse: separate;
325
- }
326
-
327
- #tnp-body .form-table th {
328
- text-align: right;
329
- font-weight: bold;
330
- max-width: 200px;
331
- color: #000000;
332
- background-color: #ECF0F1;
333
- vertical-align: middle;
334
- }
335
-
336
- #tnp-body .form-table th small {
337
- font-weight: normal;
338
- }
339
-
340
- #tnp-body .form-table textarea {
341
- width: 100%;
342
- }
343
-
344
- /* Table inside a field form table to create a grid of options */
345
- #tnp-body .form-table table {
346
- border-collapse: collapse;
347
- }
348
-
349
- #tnp-body .form-table table td,
350
- .form-table table th {
351
- padding: 5px;
352
- font-size: .9em;
353
- font-weight: normal;
354
- border: 1px solid #eee;
355
- }
356
-
357
- #tnp-body .form-table table thead th {
358
- text-align: left;
359
- font-weight: bold;
360
- }
361
-
362
-
363
  /*******************************************************************************
364
  * Wide fat tables
365
  */
@@ -391,44 +315,7 @@
391
  background-color: #f4faff;
392
  }
393
 
394
- #tnp-body .widefat.tnp-newsletters-list tbody tr {
395
- height: 70px;
396
- }
397
-
398
- /* jQuery UI tabs corrections */
399
- #tnp-body #tabs h3,
400
- #tnp-body #tabs h4,
401
- #tnp-body #tabs p,
402
- #tnp-body #tabs li
403
- {
404
- color: #444;
405
- }
406
-
407
- /* Button correction */
408
- #tnp-body #tabs .button,
409
- #tnp-body #tabs .button:visited,
410
- #tnp-body #tabs .button:hover,
411
- #tnp-body #tabs .button-primary,
412
- #tnp-body #tabs .button-primary:visited,
413
- #tnp-body #tabs .button-primary:hover,
414
- #tnp-body #tabs .button-secondary,
415
- #tnp-body #tabs .button-secondary:visited,
416
- #tnp-body #tabs .button-secondary:hover {
417
- color: #fff;
418
- width: auto;
419
- }
420
-
421
- #tnp-body td .tnp-tabs {
422
-
423
- }
424
-
425
- #tnp-body td .tnp-tabs .ui-widget-header {
426
- background-color: #ddd;
427
- }
428
 
429
- #tnp-body td .tnp-tabs .ui-tabs-anchor {
430
- color: #000;
431
- }
432
 
433
  table.clicks td {
434
  border: 1px solid #666;
@@ -452,74 +339,9 @@ table.clicks {
452
  background-color: #aaa;
453
  }
454
 
455
- .tnp-checkboxes label {
456
- display: block;
457
- float: left;
458
- width: 220px;
459
- border: 1px solid #ccc;
460
- background-color: #f4f4f4;
461
- margin-bottom: 5px;
462
- padding: 5px;
463
- white-space: nowrap;
464
- margin-right: 5px;
465
- }
466
-
467
  .tnp-buttons {
468
  /*background-color: #0073aa;*/
469
- padding: 10px;
470
- }
471
-
472
- .newsletter-checkbox-group, .nl-checkbox-group {
473
- float: left;
474
- margin-right: 5px;
475
- border: 1px solid #ccc;
476
- background-color: #f4f4f4;
477
- margin-bottom: 5px;
478
- padding: 5px;
479
- white-space: nowrap;
480
- overflow: hidden;
481
- }
482
-
483
- /* Checkbox group */
484
- .newsletter-checkboxes-item {
485
- float: left;
486
- margin-right: 5px;
487
- border: 1px solid #ddd;
488
- border-radius: 3px;
489
- background-color: #f4f4f4;
490
- width: 150px;
491
- margin-bottom: 5px;
492
- padding: 3px;
493
- white-space: nowrap;
494
- overflow: hidden;
495
- }
496
-
497
- .newsletter-checkboxes-item input {
498
- vertical-align: text-bottom;
499
- }
500
-
501
- .newsletter-checkboxes-item label {
502
- display: inline;
503
- }
504
-
505
- .newsletter-preferences-item {
506
- float: left;
507
- margin-right: 5px;
508
- border: 1px solid #ccc;
509
- background-color: #f4f4f4;
510
- width: 250px;
511
- margin-bottom: 5px;
512
- padding: 5px;
513
- white-space: nowrap;
514
- overflow: hidden;
515
- }
516
-
517
- .newsletter-preferences-item label {
518
- display: inline;
519
- }
520
-
521
- .form-table td .nl-checkbox-group label {
522
- display: inline;
523
  }
524
 
525
 
@@ -527,14 +349,6 @@ table.clicks {
527
 
528
 
529
 
530
-
531
- /*
532
- .form-table td label {
533
- font-size: 10px;
534
- display: block;
535
- }
536
- */
537
-
538
  .tnp-notice {
539
  padding: 15px;
540
  margin: 10px 0;
@@ -583,72 +397,11 @@ table.clicks {
583
  cursor: pointer;
584
  }
585
 
586
-
587
-
588
- .newsletter-message {
589
- background-color: #efe;
590
- border-color: #393;
591
- border-radius: 5px;
592
- border-style: solid;
593
- border-width: 3px;
594
- padding: .6em;
595
- margin-bottom: .6em;
596
- }
597
-
598
- .newsletter-error-span {
599
- color: #f00;
600
- font-weight: bold;
601
- }
602
-
603
- .newsletter-error {
604
- background-color: #fee;
605
- border-color: #933;
606
- border-radius: 5px;
607
- border-style: solid;
608
- border-width: 2px;
609
- padding: .6em;
610
- margin-bottom: .6em;
611
- }
612
-
613
- .newsletter-error strong, .newsletter-message strong {
614
- font-weight: bold;
615
- }
616
-
617
- #newsletter-warnings {
618
- background-color: #FFEBE8;
619
- border-color: #C00;
620
- border-radius: 3px;
621
- border-style: solid;
622
- border-width: 1px;
623
- padding: .6em;
624
- margin-bottom: .6em;
625
- }
626
-
627
- .newsletter-buttons {
628
- margin-top: 1em;
629
- margin-bottom: 1em;
630
- }
631
-
632
  .tnp-paginator {
633
  margin-top: 10px;
634
  margin-bottom: 5px;
635
  }
636
 
637
- .newsletter-option-grid th {
638
- text-align: right;
639
- width: auto;
640
- border: 0;
641
- padding: 3px;
642
- font-weight: normal;
643
- vertical-align: top;
644
- padding-right: 15px;
645
- }
646
- .newsletter-option-grid td {
647
- border: 0;
648
- padding: 3px;
649
- vertical-align: top;
650
- }
651
-
652
  .newsletter-box {
653
  border: 1px solid #ddd;
654
  padding: 10px;
@@ -732,9 +485,7 @@ table.clicks {
732
 
733
  /* CSS General Font Styles */
734
 
735
- p.description {
736
- font-size: 12px !important;
737
- }
738
 
739
 
740
  /* CSS Themes Preview */
@@ -786,29 +537,7 @@ p.description {
786
  }
787
 
788
 
789
- /* Regole Generali*/
790
 
791
- #tnp-body {
792
- padding: 10px;
793
- background-color: #28313C;
794
- /*border-color: 10px solid #28313C;*/
795
- }
796
-
797
- .tnp-darkbg {
798
- background-color: #34495E!important;
799
- }
800
-
801
- #tnp-body h3 {
802
- margin-top: 25px;
803
- clear: both;
804
- /* display: inline-block; */
805
- /* background-color: #34495E; */
806
- /* color: #fff !important; */
807
- margin-bottom: 10px;
808
- /* width: 200px;*/
809
- /* text-align: right; */
810
- /* border-bottom: 2px solid #27AE60;*/
811
- }
812
 
813
 
814
  .tnp-body-lite {
@@ -840,6 +569,12 @@ p.description {
840
  color: #565656;
841
  }
842
 
 
 
 
 
 
 
843
  #tnp-heading h2 {
844
  color: #fff;
845
  font-family: soleil, sans-serif;
@@ -1030,12 +765,6 @@ p.description {
1030
  border-left: 3px solid #2ECC71;
1031
  }
1032
 
1033
- /* Wrapper Background */
1034
-
1035
- #wpwrap {
1036
- background-color: #222B36 !important;
1037
- }
1038
-
1039
  /* Global buttons styles */
1040
 
1041
  #dashboard-widgets .button {
@@ -1059,15 +788,7 @@ p.description {
1059
  width: auto;
1060
  }
1061
 
1062
- .wp-core-ui .button-secondary, .wp-core-ui .button, .wp-core-ui .button-primary {
1063
- background-color: #3498db;
1064
- box-shadow: none;
1065
- color: #fff;
1066
- font-family: soleil,sans-serif;
1067
- margin: 0px 2px;
1068
- }
1069
-
1070
- .wp-core-ui .button-secondary:hover, .wp-core-ui .button:hover, .wp-core-ui .button-primary:hover {
1071
  background-color: #5DADE2;
1072
  color: #fff;
1073
  width: auto;
@@ -1288,730 +1009,42 @@ table.widefat {
1288
  margin: 5px;
1289
  }
1290
 
1291
- /*******************************************************************************
1292
- * Overrides some jQuery UI styles, specially for tabs and only inside the
1293
- * #tnp-body div
1294
- */
1295
-
1296
- #tnp-body .ui-widget {
1297
- font-family: soleil, sans-serif;
1298
- }
1299
-
1300
- #tnp-body #tabs {
1301
- background-color: transparent;
1302
- border: 0!important;
1303
- padding: 0;
1304
- margin: 0;
1305
- }
1306
 
1307
- #tnp-body #tabs .ui-widget-header {
1308
- background: #28313C;
1309
- border: 0;
1310
- }
1311
 
1312
- #tnp-body #tabs .ui-tabs-panel {
1313
- padding: 15px!important;
1314
- background-color: #fff;
 
 
 
 
1315
  }
1316
 
1317
- #tnp-body #tabs a.ui-tabs-anchor,
1318
- #tnp-body #tabs a.ui-tabs-anchor:visited {
1319
- color: #444;
 
 
 
 
 
 
1320
  }
1321
 
1322
- #tnp-body .ui-tabs .ui-tabs-nav {
1323
- padding: 0;
1324
  }
1325
 
1326
- #tnp-body .ui-tabs .ui-tabs-nav li a {
1327
- font-size: 14px;
1328
- }
1329
-
1330
- #tnp-body #tabs .ui-tabs {
1331
- border-color: #28313C;
1332
- background-color: #28313C;
1333
- border: 0;
1334
- }
1335
-
1336
- #tnp-body #tabs .ui-tabs .ui-tabs-nav {
1337
- margin: 0;
1338
- padding: .2em .2em 0 0;
1339
- background-color: #f2f2f2;
1340
- }
1341
-
1342
- #tnp-body #tabs .ui-tabs .ui-tabs-panel {
1343
- padding: 1em 0;
1344
- background-color: #f2f2f2;
1345
- margin: 0;
1346
- border: 0;
1347
- }
1348
-
1349
- #tnp-body .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
1350
- background: #fff !important;
1351
- font-weight: normal;
1352
- font-family: soleil, sans-serif;
1353
- }
1354
-
1355
-
1356
- #tnp-body .ui-widget-content {
1357
- background: #fff;
1358
- }
1359
-
1360
- #tnp-body .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
1361
- border: none;
1362
- background: #ECF0F1;
1363
- font-family: soleil, sans-serif;
1364
- }
1365
-
1366
-
1367
- /*******************************************************************************
1368
- * Extension Panel
1369
- */
1370
-
1371
- .tnp-extension-premium-box, .tnp-extension-free-box, .tnp-integration-box {
1372
- width: 300px;
1373
- height: 220px;
1374
- background-color: #222B36;
1375
- text-align: center;
1376
- margin: 20px;
1377
- float: left;
1378
- position: relative;
1379
- }
1380
-
1381
- .tnp-extension-premium-box:hover, .tnp-extension-free-box:hover, .tnp-integration-box:hover {
1382
- background-color: #232C35;
1383
- box-shadow: 1px 1px 15px #222B36;
1384
- }
1385
-
1386
- .tnp-extension-premium-box p, .tnp-extension-free-box p, .tnp-integration-box p {
1387
- padding: 5px 10px;
1388
- color: #72777c;
1389
- font-size: 14px;
1390
- margin-top: 0px;
1391
- }
1392
-
1393
- .tnp-extension-premium-box h3 {
1394
- font-family: soleil, sans-serif;
1395
- padding: 5px 8px !important;
1396
- border-radius: 3px;
1397
- display: inline-block;
1398
- font-size: 16px;
1399
- color: #fff;
1400
- margin-bottom: 0px !important;
1401
- margin-top: 25px !important;
1402
- font-weight: 300;
1403
- width: auto !important;
1404
- border-bottom: none !important;
1405
- }
1406
-
1407
- .tnp-extension-free-box h3 {
1408
- font-family: soleil, sans-serif;
1409
- padding: 5px 8px !important;
1410
- border-radius: 3px;
1411
- display: inline-block;
1412
- font-size: 16px;
1413
- color: #fff;
1414
- margin-bottom: 0px !important;
1415
- margin-top: 25px !important;
1416
- font-weight: 300;
1417
- width: auto !important;
1418
- border-bottom: none !important;
1419
- }
1420
-
1421
- .tnp-integration-box h3 {
1422
- font-family: soleil, sans-serif;
1423
- padding: 5px 8px !important;
1424
- border-radius: 3px;
1425
- display: inline-block;
1426
- font-size: 16px;
1427
- color: #fff;
1428
- margin-bottom: 0px !important;
1429
- margin-top: 25px !important;
1430
- font-weight: 300;
1431
- width: auto !important;
1432
- border-bottom: none !important;
1433
- }
1434
-
1435
- .tnp-extension-premium-action {
1436
- bottom: 0;
1437
- position: absolute;
1438
- width: 100%;
1439
- padding: 12px;
1440
- font-family: soleil, sans-serif;
1441
- }
1442
-
1443
- .tnp-extension-free-action {
1444
- bottom: 0;
1445
- position: absolute;
1446
- width: 100%;
1447
- padding: 12px;
1448
- font-family: soleil, sans-serif;
1449
- }
1450
-
1451
- .tnp-integration-action {
1452
- bottom: 0;
1453
- position: absolute;
1454
- width: 100%;
1455
- padding: 12px;
1456
- font-family: soleil, sans-serif;
1457
- }
1458
-
1459
-
1460
- .tnp-extension-premium-action span {
1461
- color: #27AE60;
1462
- }
1463
-
1464
- .tnp-extension-free-action span {
1465
- color: #27AE60;
1466
- }
1467
-
1468
- .tnp-integration-action span {
1469
- color: #27AE60;
1470
- }
1471
-
1472
- .tnp-extension-activate {
1473
- color: #1ABC9C;
1474
- padding: 5px 8px;
1475
- text-decoration: none;
1476
- cursor: pointer;
1477
- }
1478
-
1479
- .tnp-extension-install {
1480
- color: #2980B9;
1481
- padding: 5px 8px;
1482
- text-decoration: none;
1483
- cursor: pointer;
1484
- }
1485
-
1486
- .tnp-extension-buy {
1487
- color: #F1C40F;
1488
- padding: 5px 8px;
1489
- text-decoration: none;
1490
- cursor: pointer;
1491
- }
1492
-
1493
- #tnp-body a.tnp-extension-details{
1494
- color: #999999;
1495
- padding: 5px 8px;
1496
- text-decoration: none;
1497
- cursor: pointer;
1498
- }
1499
-
1500
- .tnp-extension-free {
1501
- color: #D35400;
1502
- padding: 5px 8px;
1503
- text-decoration: none;
1504
- cursor: pointer;
1505
- position: relative;
1506
- }
1507
-
1508
- img.tnp-extensions-free-badge {
1509
- position: absolute;
1510
- display: block;
1511
- right: 0;
1512
- top: 0;
1513
- width: 70px;
1514
- }
1515
-
1516
- .tnp-extensions-image img {
1517
- margin: 25px 0px -10px;
1518
- }
1519
-
1520
- /* Subscription modal for free extensions */
1521
- #tnp-subscribe-overlay {
1522
- height: 100vh;
1523
- width: 100vw;
1524
- z-index: 10000;
1525
- display: none;
1526
- background-image: url(images/modal-background.png);
1527
- background-repeat: repeat;
1528
- position: fixed;
1529
- top: 0;
1530
- left: -20px;
1531
- }
1532
-
1533
- #tnp-subscribe-modal {
1534
- width: 600px;
1535
- background-color: rgba(255,255,255,1);
1536
- margin-right: auto;
1537
- margin-left: auto;
1538
- margin-top: 100px;
1539
- -webkit-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.5);
1540
- -moz-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.5);
1541
- box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.5);
1542
- padding: 25px;
1543
- background-color: #1D2B38;
1544
-
1545
- text-align: center;
1546
- }
1547
-
1548
- #tnp-subscribe-modal img {
1549
- width: 30%;
1550
- }
1551
-
1552
- #tnp-subscribe-title {
1553
- font-size: 20px;
1554
- margin-top: 30px;
1555
- margin-bottom: 30px;
1556
- line-height: 30px;
1557
- color: white;
1558
- font-weight: 200;
1559
- }
1560
-
1561
- #tnp-subscribe-email-wrapper {
1562
- margin: 20px;
1563
- }
1564
-
1565
- #tnp-subscribe-email-wrapper input {
1566
- border: none;
1567
- background-color: #223242;
1568
- color: white;
1569
- }
1570
-
1571
- #tnp-subscribe-email {
1572
- font-size: 24px;
1573
- box-sizing: border-box;
1574
- width: 100%;
1575
- padding: 10px;
1576
- text-align: center;
1577
- }
1578
-
1579
- #tnp-subscribe-submit-wrapper {
1580
- margin-bottom: 20px;
1581
- }
1582
-
1583
- #tnp-subscribe-submit {
1584
- font-size: 24px;
1585
- background-color: #219050;
1586
- color: #fff;
1587
- padding: 10px 35px;
1588
- border: 0;
1589
- font-size: 17px;
1590
- letter-spacing: 2px;
1591
- }
1592
-
1593
- #tnp-subscribe-no-thanks {
1594
- color: #666;
1595
- margin-top: 20px;
1596
- margin-bottom: 20px;
1597
- }
1598
-
1599
-
1600
- /* Theme options and theme preview styles */
1601
-
1602
- #tnp-body div.tnp-emails-theme-options {
1603
- background-color: #fff;
1604
- padding: 10px;
1605
- margin-top: 14px;
1606
- }
1607
-
1608
- .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
1609
- border: none;
1610
- background: #ECF0F1;
1611
- font-family: soleil, sans-serif;
1612
- }
1613
-
1614
-
1615
-
1616
- /* --------------------------------
1617
-
1618
- Tnp Welcome Slider
1619
-
1620
- -------------------------------- */
1621
-
1622
- .cd-slider-wrapper {
1623
- position: relative;
1624
- width: 100%;
1625
- height: 90vh;
1626
- /* hide horizontal scrollbar on IE11 */
1627
- overflow: hidden;
1628
- margin: 0 auto;
1629
- }
1630
- .cd-slider-wrapper .cd-slider, .cd-slider-wrapper .cd-slider > li {
1631
- height: 100%;
1632
- width: 100%;
1633
- }
1634
-
1635
- .tnp-logo-big {
1636
- width: 300px;
1637
- }
1638
-
1639
- .tnp-row {
1640
- display: table-row;
1641
- }
1642
-
1643
- .tnp-third {
1644
- width: 33%;
1645
- float: left;
1646
- }
1647
-
1648
- .tnp-welcome-confirm-button {
1649
- color: #fff;
1650
- padding: 10px 30px;
1651
- background-color: #2ECC71;
1652
- font-weight: 700;
1653
- font-size: 15px;
1654
- box-shadow: 0 20px 38px rgba(0, 0, 0, 0.16);
1655
- text-decoration: none;
1656
- display: inline-block;
1657
- text-align: center;
1658
- margin: 20px auto 0px;
1659
- }
1660
-
1661
- .tnp-welcome-confirm-button:hover {
1662
- box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
1663
- color: #fff;
1664
- }
1665
-
1666
- .tnp-welcome-confirm-button:visited {
1667
- color: #fff;
1668
- text-decoration: none;
1669
- }
1670
-
1671
- .tnp-welcome-link-button {
1672
- color: #fff;
1673
- padding: 10px 30px;
1674
- background-color: #3498DB;
1675
- font-weight: 700;
1676
- font-size: 15px;
1677
- box-shadow: 0 20px 38px rgba(0, 0, 0, 0.16);
1678
- text-decoration: none;
1679
- }
1680
-
1681
- .tnp-welcome-link-button:hover {
1682
- box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
1683
- color: #fff;
1684
- }
1685
-
1686
- .tnp-welcome-link-button:visited {
1687
- color: #fff;
1688
- text-decoration: none;
1689
- }
1690
-
1691
- #tnp-welcome input[type="text"], #tnp-welcome input[type="email"] {
1692
- max-width: 90%;
1693
- }
1694
-
1695
- .tnp-welcome-next {
1696
- background-color: #2ECC71;
1697
- padding: 10px 20px;
1698
- color: white;
1699
- text-decoration: none;
1700
- font-weight: 600;
1701
- font-size: 16px;
1702
- margin: 0px 10px;
1703
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);
1704
- width: -moz-fit-content;
1705
- width: -webkit-fit-content;
1706
- width: fit-content;
1707
- display: flex;
1708
- align-items: center;
1709
- }
1710
-
1711
- .tnp-welcome-next:hover {
1712
- box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
1713
- color: #fff;
1714
- }
1715
-
1716
- .tnp-welcome-next:visited {
1717
- color: #fff;
1718
- text-decoration: none;
1719
- }
1720
-
1721
- .tnp-welcome-prev {
1722
- background-color: #3498DB;
1723
- padding: 10px 20px;
1724
- color: white;
1725
- text-decoration: none;
1726
- font-weight: 600;
1727
- font-size: 16px;
1728
- margin: 0px 0px 0px 10px;
1729
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);
1730
- width: -moz-fit-content;
1731
- width: -webkit-fit-content;
1732
- width: fit-content;
1733
- display: flex;
1734
- align-items: center;
1735
- }
1736
-
1737
- .tnp-welcome-prev:hover {
1738
- box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
1739
- color: #fff;
1740
- }
1741
-
1742
- .tnp-welcome-prev:visited {
1743
- color: #fff;
1744
- text-decoration: none;
1745
- }
1746
-
1747
- .tnp-welcome-next svg {
1748
- margin-left: 10px;
1749
- }
1750
-
1751
- .tnp-welcome-prev svg {
1752
- margin-right: 10px;
1753
- }
1754
-
1755
- .cd-slider input {
1756
- width: 250px;
1757
- height: 40px;
1758
- border: 1px solid #6c7280;
1759
- background: #454a56;
1760
- color: white;
1761
- color: white;
1762
- padding: 0px 10px;
1763
- }
1764
-
1765
- .cd-slider > li {
1766
- position: absolute;
1767
- top: 0;
1768
- left: 0;
1769
- opacity: 0;
1770
- /* used to vertically center its content */
1771
- display: table;
1772
- background-position: center center;
1773
- background-repeat: no-repeat;
1774
- -webkit-font-smoothing: antialiased;
1775
- -moz-osx-font-smoothing: grayscale;
1776
- }
1777
- .cd-slider > li.visible {
1778
- /* selected slide */
1779
- position: relative;
1780
- z-index: 2;
1781
- opacity: 1;
1782
- }
1783
- .cd-slider > li:first-of-type {
1784
- background-color: #2B313A;
1785
- }
1786
- .cd-slider > li:nth-of-type(2) {
1787
- background-color: #2B313A;
1788
- }
1789
- .cd-slider > li:nth-of-type(3) {
1790
- background-color: #2B313A;
1791
- }
1792
- .cd-slider > li:nth-of-type(4) {
1793
- background-color: #2B313A;
1794
- }
1795
- .cd-slider > li:first-of-type, .cd-slider > li:nth-of-type(2), .cd-slider > li:nth-of-type(3), .cd-slider > li:nth-of-type(4) {
1796
- background-size: cover;
1797
- }
1798
- .cd-slider > li > div {
1799
- /* vertically center the slider content */
1800
- display: table-cell;
1801
- vertical-align: middle;
1802
- text-align: center;
1803
- }
1804
- .cd-slider > li h2, .cd-slider > li p {
1805
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
1806
- line-height: 1.2;
1807
- margin: 0 auto 14px;
1808
- color: #ffffff;
1809
- width: 90%;
1810
- max-width: 320px;
1811
- }
1812
- .cd-slider > li h2 {
1813
- font-size: 40px;
1814
- }
1815
- .cd-slider > li p {
1816
- font-size: 18px;
1817
- line-height: 26px;
1818
- text-align: left;
1819
- color: #B8C3C9;
1820
- margin: 40px auto;
1821
- }
1822
-
1823
- .cd-slider > li .cd-btn {
1824
- display: inline-block;
1825
- padding: 1.2em 1.4em;
1826
- margin-top: .8em;
1827
- background-color: rgba(0, 0, 0, 0.6);
1828
- border-radius: .25em;
1829
- font-size: 1.3rem;
1830
- font-weight: 700;
1831
- letter-spacing: 1px;
1832
- color: #ffffff;
1833
- text-transform: uppercase;
1834
- -webkit-transition: background-color 0.2s;
1835
- -moz-transition: background-color 0.2s;
1836
- transition: background-color 0.2s;
1837
- }
1838
- .no-touch .cd-slider > li .cd-btn:hover {
1839
- background-color: rgba(0, 0, 0, 0.8);
1840
- }
1841
- @media only screen and (min-width: 768px) {
1842
- .cd-slider > li h2, .cd-slider > li p {
1843
- max-width: 520px;
1844
- }
1845
- .cd-slider > li h2 {
1846
- font-size: 40px;
1847
- }
1848
- .cd-slider > li p {
1849
- font-size: 18px;
1850
- line-height: 26px;
1851
- text-align: left;
1852
- color: #B8C3C9;
1853
- margin: 40px auto;
1854
-
1855
- }
1856
- }
1857
- @media only screen and (min-width: 1170px) {
1858
- .cd-slider > li h2, .cd-slider > li p {
1859
- margin-bottom: 20px;
1860
- }
1861
- .cd-slider > li h2 {
1862
- font-size: 40px;
1863
- }
1864
- .cd-slider > li p {
1865
- font-size: 18px;
1866
- line-height: 26px;
1867
- text-align: center;
1868
- color: #B8C3C9;
1869
- margin: 30px auto;
1870
- }
1871
- }
1872
-
1873
- /* --------------------------------
1874
-
1875
- Tnp Welcome Slider Navigation
1876
-
1877
- -------------------------------- */
1878
- .cd-slider-navigation {
1879
- position: relative;
1880
- bottom: 110px;
1881
- z-index: 3;
1882
- display: flex;
1883
- justify-content: center;
1884
- }
1885
-
1886
- /* svg cover layer */
1887
-
1888
- .cd-svg-cover {
1889
- position: absolute;
1890
- z-index: 1;
1891
- left: 0;
1892
- top: 0;
1893
- height: 100%;
1894
- width: 100%;
1895
- opacity: 0;
1896
- }
1897
- .cd-svg-cover path {
1898
- fill: #ED6A6A;
1899
- }
1900
- .cd-svg-cover.is-animating {
1901
- z-index: 4;
1902
- opacity: 1;
1903
- -webkit-transition: opacity 0.6s;
1904
- -moz-transition: opacity 0.6s;
1905
- transition: opacity 0.6s;
1906
- }
1907
-
1908
- /* Switch element style */
1909
-
1910
- /* The switch - the box around the slider */
1911
- .switch {
1912
- position: relative;
1913
- display: inline-block;
1914
- width: 60px;
1915
- height: 34px;
1916
- }
1917
-
1918
- /* Hide default HTML checkbox */
1919
- .switch input {display:none;}
1920
-
1921
- /* The slider */
1922
- .slider {
1923
- position: absolute;
1924
- cursor: pointer;
1925
- top: 0;
1926
- left: 0;
1927
- right: 0;
1928
- bottom: 0;
1929
- background-color: #ccc;
1930
- -webkit-transition: .4s;
1931
- transition: .4s;
1932
- }
1933
-
1934
- .slider:before {
1935
- position: absolute;
1936
- content: "";
1937
- height: 26px;
1938
- width: 26px;
1939
- left: 4px;
1940
- bottom: 4px;
1941
- background-color: white;
1942
- -webkit-transition: .4s;
1943
- transition: .4s;
1944
- }
1945
-
1946
- input:checked + .slider {
1947
- background-color: #2196F3;
1948
- }
1949
-
1950
- input:focus + .slider {
1951
- box-shadow: 0 0 1px #2196F3;
1952
- }
1953
-
1954
- input:checked + .slider:before {
1955
- -webkit-transform: translateX(26px);
1956
- -ms-transform: translateX(26px);
1957
- transform: translateX(26px);
1958
- }
1959
-
1960
- /* Rounded sliders */
1961
- .slider.round {
1962
- border-radius: 34px;
1963
- }
1964
-
1965
- .slider.round:before {
1966
- border-radius: 50%;
1967
- }
1968
-
1969
- /* Cossa sea sta roba? ORDINE! */
1970
-
1971
- #tnp-body div.tnp-emails-theme-options table.form-table {
1972
- margin: 0;
1973
- }
1974
-
1975
- #tnp-body div.tnp-emails-theme-options h3 {
1976
- color: #000;
1977
- }
1978
-
1979
-
1980
- /* Suggerimenti Oggetto + Inserimento Emoticons */
1981
-
1982
- .tnp-emails-edit #options-subject {
1983
- font-size: 16px;
1984
- display: inline-block;
1985
- margin: 20px 0px;
1986
- width: auto;
1987
- border-radius: 4px;
1988
- padding: 5px 10px;
1989
- }
1990
-
1991
- .tnp-suggest-button {
1992
- font-family: soleil, sans-serif;
1993
- margin-left: 8px;
1994
- border-radius: 3px;
1995
- background-color: #2980B9;
1996
- padding: 10px 15px 8px;
1997
- font-size: 14px;
1998
- color: #fff !important;
1999
- text-decoration: none;
2000
- }
2001
-
2002
- .tnp-suggest-button:hover {
2003
- background-color: #3f8dbf;
2004
- }
2005
-
2006
- .tnp-popup-overlay {
2007
- display: none;
2008
- position: fixed;
2009
- top: 0;
2010
- left: 0;
2011
- width: 100%;
2012
- height: 100%;
2013
- background-color: rgba(0, 0, 0, .8);
2014
- z-index: 10000;
2015
  }
2016
 
2017
  .tnp-popup {
@@ -2067,28 +1100,6 @@ input:checked + .slider:before {
2067
  }
2068
 
2069
 
2070
- #tnp-edit-emoji-list {
2071
- font-size: 28px;
2072
- }
2073
- #tnp-edit-emoji-list a {
2074
- display: inline-block;
2075
- margin-right: 5px;
2076
- margin-bottom: 5px;
2077
- }
2078
-
2079
- /* Stili per il campo testo oggetto delle email */
2080
-
2081
- /*#options-subject {
2082
- background: url(images/idea.svg) no-repeat white 99% 3px;
2083
- background-size: 25px;
2084
- }
2085
-
2086
- #options-subject:hover {
2087
- background: url(images/idea.svg) no-repeat red 99% 3px;
2088
- background-size: 25px;
2089
- }*/
2090
-
2091
-
2092
  /* Stile selettore liste - Schermata di invio newsletter */
2093
 
2094
  .tnp-list-conditions p {
@@ -2204,31 +1215,6 @@ iframe.tnp-editor-preview-desktop {
2204
  color: #34495E;
2205
  }
2206
 
2207
- /*.tnp-nl-status-bar {
2208
- height: 24px;
2209
- width: auto;
2210
- background-color: #fe5e64;
2211
- margin: 10px 0px;
2212
- border-radius: 15px;
2213
- text-align: center;
2214
- }
2215
-
2216
- .tnp-nl-status-bar span {
2217
- color: #fff;
2218
- line-height: 24px;
2219
- }*/
2220
- /*
2221
- #tnp-nl-status-toggle {
2222
- width: 30px;
2223
- height: 30px;
2224
- background-color: #22272d;
2225
- z-index: 999999;
2226
- position: fixed;
2227
- right: 390px;
2228
- color: white;
2229
- text-align: center;
2230
- }*/
2231
-
2232
  .tnp-status-header #options-subject {
2233
  width: calc(100% - 150px);
2234
  }
1
+ /* WordPress admin main wrapper */
2
+ #wpwrap {
3
+ background-color: #222B36 !important;
4
+ }
5
 
6
  #tnp-wrap * {
7
  -webkit-box-sizing: border-box;
9
  box-sizing: border-box;
10
  }
11
 
 
 
 
 
 
 
 
12
  #tnp-wrap *:before,
13
  #tnp-wrap *:after {
14
  -webkit-box-sizing: border-box;
16
  box-sizing: border-box;
17
  }
18
 
19
+ #tnp-wrap,
20
+ #tnp-wrap td,
21
+ #tnp-wrap h1,
22
+ #tnp-wrap h2,
23
+ #tnp-wrap h3,
24
+ #tnp-wrap h4,
25
+ #tnp-wrap input,
26
+ #tnp-wrap select,
27
+ #tnp-wrap textarea,
28
+ #tnp-wrap button,
29
+ #tnp-wrap li,
30
+ #tnp-wrap a
31
+ {
32
+ font-family: soleil, sans-serif;
33
+ -webkit-font-smoothing: antialiased; /* Chrome, Safari */
34
+ -moz-osx-font-smoothing: grayscale; /* Firefox */
35
+ }
36
 
37
  .container {
38
  width: 100%;
133
  margin-top: 80px;
134
  }
135
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  #tnp-promotion-bar {
137
  background-color: #FF5F65;
138
  color: ddd;
164
 
165
  #tnp-header a {
166
  text-decoration: none;
 
167
  color: white;
168
  letter-spacing: 0.1em;
169
  }
180
  color: #000!important;
181
  }
182
 
183
+ /******************************************************************************
184
+ * BODY
185
+ ******************************************************************************/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
+ #tnp-body {
188
+ padding: 10px;
189
+ background-color: #28313C;
 
 
 
 
190
  }
191
 
 
192
  #tnp-body h1,
193
  #tnp-body h2,
194
  #tnp-body h3,
197
  color: #fff;
198
  }
199
 
200
+ #tnp-body h3 {
201
+ margin-top: 25px;
202
+ clear: both;
203
+ margin-bottom: 10px;
204
+ }
205
+
206
+
207
  #tnp-body ul {
208
  list-style-type: circle;
209
  list-style-position: inside;
230
  #tnp-body .button:focus,
231
  #tnp-body .button-primary,
232
  #tnp-body .button-primary:visited,
233
+ #tnp-body .button-primary:hover {
234
+ color: #fff;
235
+ text-shadow: none;
236
+ width: auto;
237
+ vertical-align: bottom;
238
+ }
239
+
240
  #tnp-body .button-secondary,
241
  #tnp-body .button-secondary:visited,
242
  #tnp-body .button-secondary:hover {
243
  color: #fff;
244
+ background-color: #999;
245
  text-shadow: none;
246
  width: auto;
247
+ vertical-align: bottom;
248
  }
249
 
250
  /* Icon in button media selector */
268
  width: auto;
269
  }
270
 
 
 
 
 
 
 
 
 
271
  #tnp-body tbody th,
272
  #tnp-body td,
273
  #tnp-body td p,
284
  color: #27AE60; /* Green */
285
  }
286
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  /*******************************************************************************
288
  * Wide fat tables
289
  */
315
  background-color: #f4faff;
316
  }
317
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
318
 
 
 
 
319
 
320
  table.clicks td {
321
  border: 1px solid #666;
339
  background-color: #aaa;
340
  }
341
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  .tnp-buttons {
343
  /*background-color: #0073aa;*/
344
+ padding: 10px 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  }
346
 
347
 
349
 
350
 
351
 
 
 
 
 
 
 
 
 
352
  .tnp-notice {
353
  padding: 15px;
354
  margin: 10px 0;
397
  cursor: pointer;
398
  }
399
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  .tnp-paginator {
401
  margin-top: 10px;
402
  margin-bottom: 5px;
403
  }
404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  .newsletter-box {
406
  border: 1px solid #ddd;
407
  padding: 10px;
485
 
486
  /* CSS General Font Styles */
487
 
488
+
 
 
489
 
490
 
491
  /* CSS Themes Preview */
537
  }
538
 
539
 
 
540
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
541
 
542
 
543
  .tnp-body-lite {
569
  color: #565656;
570
  }
571
 
572
+ #tnp-heading h1 {
573
+ color: #fff;
574
+ font-family: soleil, sans-serif;
575
+ font-weight: 900;
576
+ }
577
+
578
  #tnp-heading h2 {
579
  color: #fff;
580
  font-family: soleil, sans-serif;
765
  border-left: 3px solid #2ECC71;
766
  }
767
 
 
 
 
 
 
 
768
  /* Global buttons styles */
769
 
770
  #dashboard-widgets .button {
788
  width: auto;
789
  }
790
 
791
+ .wp-core-ui .button-secondary:hover, .wp-core-ui .button-primary:hover {
 
 
 
 
 
 
 
 
792
  background-color: #5DADE2;
793
  color: #fff;
794
  width: auto;
1009
  margin: 5px;
1010
  }
1011
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1012
 
1013
+ /* Suggerimenti Oggetto + Inserimento Emoticons */
 
 
 
1014
 
1015
+ .tnp-emails-edit #options-subject {
1016
+ font-size: 16px;
1017
+ display: inline-block;
1018
+ margin: 20px 0px;
1019
+ width: auto;
1020
+ border-radius: 4px;
1021
+ padding: 5px 10px;
1022
  }
1023
 
1024
+ .tnp-suggest-button {
1025
+ font-family: soleil, sans-serif;
1026
+ margin-left: 8px;
1027
+ border-radius: 3px;
1028
+ background-color: #2980B9;
1029
+ padding: 10px 15px 8px;
1030
+ font-size: 14px;
1031
+ color: #fff !important;
1032
+ text-decoration: none;
1033
  }
1034
 
1035
+ .tnp-suggest-button:hover {
1036
+ background-color: #3f8dbf;
1037
  }
1038
 
1039
+ .tnp-popup-overlay {
1040
+ display: none;
1041
+ position: fixed;
1042
+ top: 0;
1043
+ left: 0;
1044
+ width: 100%;
1045
+ height: 100%;
1046
+ background-color: rgba(0, 0, 0, .8);
1047
+ z-index: 10000;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1048
  }
1049
 
1050
  .tnp-popup {
1100
  }
1101
 
1102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1103
  /* Stile selettore liste - Schermata di invio newsletter */
1104
 
1105
  .tnp-list-conditions p {
1215
  color: #34495E;
1216
  }
1217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1218
  .tnp-status-header #options-subject {
1219
  width: calc(100% - 150px);
1220
  }
admin.js CHANGED
@@ -142,7 +142,7 @@ window.onload = function () {
142
  * https://seballot.github.io/spectrum/
143
  */
144
  function tnp_controls_init() {
145
- jQuery(".tnpf-color").spectrum({
146
  type: 'color',
147
  allowEmpty: true,
148
  showAlpha: false,
@@ -183,3 +183,9 @@ function tnp_fields_media_mini_remove(name) {
183
  $field.trigger("change");
184
  document.getElementById(name + "_img").src = "";
185
  }
 
 
 
 
 
 
142
  * https://seballot.github.io/spectrum/
143
  */
144
  function tnp_controls_init() {
145
+ jQuery(".tnpc-color").spectrum({
146
  type: 'color',
147
  allowEmpty: true,
148
  showAlpha: false,
183
  $field.trigger("change");
184
  document.getElementById(name + "_img").src = "";
185
  }
186
+
187
+ function tnp_lists_toggle(e) {
188
+ console.log(e);
189
+ jQuery('#' + e.id + '-notes > div').hide();
190
+ jQuery('#' + e.id + '-notes .list_' + e.value).show();
191
+ }
admin.min.css DELETED
@@ -1 +0,0 @@
1
- #tnp-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tnp-wrap .iris-picker,#tnp-wrap .iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#tnp-wrap *:before,#tnp-wrap *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.container{width:100%;padding-right:1rem;padding-left:1rem;margin-right:auto;margin-left:auto}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}@media all and (max-width:1100px){.col-md-12{width:100%}.col-md-11{width:100%}.col-md-10{width:100%}.col-md-9{width:100%}.col-md-8{width:100%}.col-md-7{width:100%}.col-md-6{width:100%}.col-md-5{width:100%}.col-md-4{width:100%}.col-md-3{width:100%}.col-md-2{width:100%}.col-md-1{width:100%}}.tnp-row-padded{width:90%;margin:0 auto;display:flex;justify-content:space-between}.tnp-col-3-boxed{width:30%;border:1px solid #3c414c;padding:0 0 30px 0;border-radius:10px}.tnp-margin-top{margin-top:80px}#tnp-wrap,#tnp-header,#tnp-body p,#tnp-body td,#tnp-body td p,#tnp-body input,#tnp-body select,#tnp-body textarea{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-promotion-bar{background-color:#ff5f65;color:ddd;padding:10px 0;text-align:center;font-size:16px}#tnp-promotion-bar a{color:#fff;font-weight:normal;text-decoration:none}#tnp-header{text-align:left;font-size:12px;color:#fff;font-family:soleil,sans-serif}#tnp-header input{font-size:12px}#tnp-header a{text-decoration:none;color:white;letter-spacing:.1em}#tnp-header a:hover{color:#fff}.error a,.error a:hover{color:#000!important}.updated a,.updated a:hover{color:#000!important}.tnp-error{border-left:5px solid #d00;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-warning{border-left:5px solid #ffb900;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-message{border-left:5px solid #46b450;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4,#tnp-body p,#tnp-body li{color:#fff}#tnp-body ul{list-style-type:circle;list-style-position:inside;margin-left:1em}#tnp-body a,#tnp-body a:active{color:#2980b9}#tnp-body a:hover{color:#3498db}#tnp-body .tnp-submit{margin-bottom:10px}#tnp-body .button,#tnp-body .button:visited,#tnp-body .button:hover,#tnp-body .button:active,#tnp-body .button:focus,#tnp-body .button-primary,#tnp-body .button-primary:visited,#tnp-body .button-primary:hover,#tnp-body .button-secondary,#tnp-body .button-secondary:visited,#tnp-body .button-secondary:hover{color:#fff;background-color:#3498db;text-shadow:none;width:auto}#tnp-body span.wp-media-buttons-icon:before{color:#fff}#tnp-body .tnp-button{color:#fff;background-color:#3498db;text-shadow:none}#tnp-body .button-primary.tnp-button-white,#tnp-body .tnp-button.tnp-button-white{color:#444!important;background-color:#fff!important;box-shadow:none!important;-webkit-box-shadow:none!important;width:auto}#tnp-body .form-table h1,#tnp-body .form-table h2,#tnp-body .form-table h4,#tnp-body .form-table h3{color:#444}#tnp-body tbody th,#tnp-body td,#tnp-body td p,#tnp-body td .button,#tnp-body td .button:visited,#tnp-body td .button:hover,#tnp-body td .button:active,#tnp-body td .button:focus{color:#444}#tnp-body td a,#tnp-body td a:visited{color:#27ae60}#tnp-body .form-table{background-color:#fff;border:1px solid #ecf0f1;margin-top:2em;border-spacing:4px;border-collapse:separate}#tnp-body .form-table th{text-align:right;font-weight:bold;max-width:200px;color:#000;background-color:#ecf0f1;vertical-align:middle}#tnp-body .form-table th small{font-weight:normal}#tnp-body .form-table textarea{width:100%}#tnp-body .form-table table{border-collapse:collapse}#tnp-body .form-table table td,.form-table table th{padding:5px;font-size:.9em;font-weight:normal;border:1px solid #eee}#tnp-body .form-table table thead th{text-align:left;font-weight:bold}#tnp-body .widefat{width:90%}#tnp-body .widefat th{text-align:left}#tnp-body .widefat thead{background-color:#3498db;font-family:soleil,sans-serif;color:#fff!important}#tnp-body .widefat thead tr th{color:#fff!important}#tnp-body .widefat td,.widefat th{vertical-align:middle}.tnp-newsletters-list tbody tr{height:70px}.widefat tr:nth-child(even){background-color:#f4faff}#tnp-body #tabs h1,#tnp-body #tabs h2,#tnp-body #tabs h3,#tnp-body #tabs h4,#tnp-body #tabs p,#tnp-body #tabs td,#tnp-body #tabs th,#tnp-body #tabs input,#tnp-body #tabs select,#tnp-body #tabs textarea,#tnp-body #tabs a{color:#444}#tnp-body #tabs .button,#tnp-body #tabs .button:visited,#tnp-body #tabs .button:hover,#tnp-body #tabs .button-primary,#tnp-body #tabs .button-primary:visited,#tnp-body #tabs .button-primary:hover,#tnp-body #tabs .button-secondary,#tnp-body #tabs .button-secondary:visited,#tnp-body #tabs .button-secondary:hover{color:#fff;width:auto}#tnp-body td .tnp-tabs .ui-widget-header{background-color:#ddd}#tnp-body td .tnp-tabs .ui-tabs-anchor{color:#000}table.clicks td{border:1px solid #666;padding:2px;font-size:10px}table.clicks{border-collapse:collapse}.grid{border-collapse:collapse}.grid td,.grid th{padding:10px;border:1px solid #ddd;margin:0}.grid th{background-color:#aaa}.tnp-checkboxes label{display:block;float:left;width:220px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;margin-right:5px}.tnp-buttons{padding:10px}.newsletter-checkbox-group,.nl-checkbox-group{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item{float:left;margin-right:5px;border:1px solid #ddd;border-radius:3px;background-color:#f4f4f4;width:150px;margin-bottom:5px;padding:3px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item input{vertical-align:text-bottom}.newsletter-checkboxes-item label{display:inline}.newsletter-preferences-item{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;width:250px;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-preferences-item label{display:inline}.form-table td .nl-checkbox-group label{display:inline}.tnp-notice{padding:15px;margin:10px 0;padding-right:70px;position:relative;border:1px solid #eee;background-color:#fff;color:#444;font-size:13px;border-left:5px solid #27ae60}.tnp-notice a{color:#0073aa;text-decoration:none;font-weight:bold}.tnp-notice a.tnp-dismiss{display:block;position:absolute;right:10px;top:13px;font-size:25px;text-decoration:none;color:#666}.tnp-notice input[type=email]{margin:10px 5px 5px;width:250px;border:0;box-shadow:none;background-color:#ecf0f1;padding:8px}.tnp-notice input[type=submit]{border:0;box-shadow:none;background-color:#27ae60;padding:8px;font-family:soleil,sans-serif;font-size:13px;color:#fff;cursor:pointer}.newsletter-message{background-color:#efe;border-color:#393;border-radius:5px;border-style:solid;border-width:3px;padding:.6em;margin-bottom:.6em}.newsletter-error-span{color:#f00;font-weight:bold}.newsletter-error{background-color:#fee;border-color:#933;border-radius:5px;border-style:solid;border-width:2px;padding:.6em;margin-bottom:.6em}.newsletter-error strong,.newsletter-message strong{font-weight:bold}#newsletter-warnings{background-color:#ffebe8;border-color:#C00;border-radius:3px;border-style:solid;border-width:1px;padding:.6em;margin-bottom:.6em}.newsletter-buttons{margin-top:1em;margin-bottom:1em}.tnp-paginator{margin-top:10px;margin-bottom:5px}.newsletter-option-grid th{text-align:right;width:auto;border:0;padding:3px;font-weight:normal;vertical-align:top;padding-right:15px}.newsletter-option-grid td{border:0;padding:3px;vertical-align:top}.newsletter-box{border:1px solid #ddd;padding:10px;background-color:#fafafa;margin-bottom:15px}.newsletter-box h3{margin-top:0}.newsletter-textarea-preview{border:1px solid #ddd}.tnp-tab-notice{background-color:#fff;border:1px solid #eee;border-left:3px solid gray;padding:10px;margin:10px 0;color:#444}.tnp-tab-warning{background-color:#fff;border:1px solid #eee;border-left:3px solid orange;padding:10px;margin:10px 0;color:#444}.tnp-tab-success{background-color:#fff;border:1px solid #eee;border-left:3px solid green;padding:10px;margin:10px 0;color:#444}.tnp-tab-error{background-color:#fff;border:1px solid #eee;border-left:3px solid red;padding:10px;margin:10px 0;color:#444}.tnp-tip{margin-top:5px}.tip-button{padding:0 5px;color:#fd5f65;text-transform:uppercase;letter-spacing:.2em;font-size:10px;border:1px red solid}.tip-content{font-weight:500;font-size:11px;color:#999}p.description{font-size:12px!important}.tnp-theme-preview{display:inline-block;text-align:center}.tnp-theme-preview p{font-family:soleil;font-size:13px;letter-spacing:.2em;color:#fff}.tnp-theme-preview img:hover{box-shadow:3px 3px 8px 2px #293848}.tnp-theme-preview img{border-radius:10px;height:190px;width:auto}.tnp-theme-preview .tnp-theme-composer{height:250px;width:auto}.tnp-theme-preview .tnp-theme-html{width:auto}.tnp-header-logo{margin-left:10px}.wp-core-ui .button-primary{background-color:#2b2f3a;color:#fff;width:auto}#tnp-body{padding:10px;background-color:#28313c}.tnp-darkbg{background-color:#34495e!important}#tnp-body h3{margin-top:25px;clear:both;margin-bottom:10px}.tnp-body-lite{background-color:#f1f1f1!important}#tnp-heading{padding:10px;margin-bottom:10px;border-radius:5px}#tnp-heading a{color:#fff;border-bottom:1px solid #fff;text-decoration:none}#tnp-heading a:hover{color:#27ae60;border-bottom:1px solid #27ae60}#tnp-heading div p{color:#565656}#tnp-heading h2{color:#fff;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:1.1rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0;margin-bottom:15px}#tnp-heading h3{color:#27ae60;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:.8rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0}#tnp-heading p{margin:0;color:#ccc}#tnp-heading .notice p{margin:.5em 0;padding:2px}#tnp-heading .tnp-btn-h1{color:#fff;background-color:#3498db;border-radius:3px;padding:6px 11px;text-decoration:none;text-transform:capitalize;font-family:soleil,sans-serif;margin-left:10px;font-size:.75rem;font-weight:300;border:0}#tnp-heading .tnp-btn-h1:hover{color:#fff;background-color:#5dade2;-webkit-transition:background-color .25s linear;transition:background-color .25s linear;-webkit-font-smoothing:subpixel-antialiased;border:0;color:#fff}.metabox-holder{width:100%}.postbox{border:0}.postbox h3 a{float:right}#dashboard-widgets .postbox-container{width:33.333%}#tnp-body .postbox p{color:#000}#dashboard-widgets .postbox-container .postbox h3{font-family:soleil,sans-serif;letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#dashboard-widgets .postbox-container h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem}#dashboard-widgets .postbox-container h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}.postbox-container i{margin-right:3px}#tnp-dash-newsletters tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:first-of-type{width:250px;overflow:hidden}#tnp-dash-subscribers table{table-layout:fixed}#tnp-dash-documentation .inside div{margin-top:10px}#tnp-dash-documentation .inside a{text-decoration:none;color:#fff;display:block;font-family:soleil,sans-serif;padding:5px 10px}#tnp-footer{margin-top:10px;padding:20px 10px 10px 40px;background-color:#28313c;font-family:soleil,sans-serif}#tnp-footer div{width:33%;display:inline-block}#tnp-footer a{color:#fff;text-decoration:none}#tnp-footer a:hover{color:#bdc3c7}#tnp-footer input[type="submit"]{background-color:#2ecc71;border:0;padding:5px;color:#fff}#tnp-footer form{white-space:nowrap}#tnp-footer li{display:inline;margin-left:15px;padding:2px 5px;border-left:3px solid #2ecc71}#wpwrap{background-color:#222b36!important}#dashboard-widgets .button{border:0;background:0;box-shadow:none;color:#322c39}#dashboard-widgets .button:hover{background-color:#ecf0f1}.wp-core-ui .button-secondary,.wp-core-ui .button-primary{background-color:#3498db;border:0;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px;width:auto}.wp-core-ui .button-secondary,.wp-core-ui .button,.wp-core-ui .button-primary{background-color:#3498db;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px}.wp-core-ui .button-secondary:hover,.wp-core-ui .button:hover,.wp-core-ui .button-primary:hover{background-color:#5dade2;color:#fff;width:auto}span.wp-media-buttons-icon:before{color:#fff}.tnp-paginator [value="Go"]{background-color:#27ae60}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71}.notice-dismiss{padding:3px}.tnp-paginator{color:#fff;font-family:soleil,sans-serif;margin:10px 0}.tnp-paginator .button-secondary{padding:5px;line-height:normal;height:auto;font-size:12px;height:25px;border:0;border-radius:3px;vertical-align:baseline}.tnp-paginator [value="Go"]{background-color:#27ae60!important}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71!important}.tnp-paginator input{background-color:#2c3e50;border:0;border-radius:3px;color:#fff;padding:5px;line-height:normal;font-size:12px;height:25px}.tnp-subscribers-search{color:#fff;font-family:soleil,sans-serif;background-color:#2c3e50;padding:20px;border-radius:5px;margin-bottom:20px;display:inline-block}.tnp-subscribers-search select{margin-left:5px;padding:0;line-height:inherit}.tnp-video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.tnp-video-container iframe,.tnp-video-container object,.tnp-video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.bg-white{background-color:#FFF}.orange{background-color:#f39c12}.blue{background-color:#2980b9}.purple{background-color:#8e44ad}.notice a{color:#27ae60!important;text-decoration:underline!important}.tnp-chart{border:1px solid #eee;width:100%}.tnp-db-table{width:auto;background-color:#fff}.tnp-db-table thead{border-bottom:1px solid #eee}.tnp-db-table th{font-weight:bold}.tnp-db-table td,.tnp-db-table th{padding:3px;font-family:monospace;border:0}.tnp-main-status h3,.tnp-main-status h4{color:#fff}#tnp-status-table .tnp-ok{font-weight:bold;color:white;font-size:14px;background-color:#27ae60;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-ko{font-weight:bold;color:white;font-size:14px;background-color:#e74c41;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-maybe{font-weight:bold;color:white;font-size:14px;background-color:#f1c40f;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}.tnp-main-status .tnp-log-files li{padding-left:15px}.tnp-main-status .tnp-log-files li,.tnp-main-status .tnp-log-files li a{color:#fff}.tnp-main-status .tnp-log-files .tnp-log-size{font-style:italic}table.widefat{border:0;box-shadow:none}#tnp-status-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-parameters-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-body .ui-widget{font-family:soleil,sans-serif}#tnp-body #tabs{background-color:transparent;border:0!important;padding:0;margin:0}#tnp-body #tabs .ui-widget-header{background:#28313c;border:0}#tnp-body #tabs .ui-tabs-panel{padding:15px!important;background-color:#fff}#tnp-body #tabs a.ui-tabs-anchor,#tnp-body #tabs a.ui-tabs-anchor:visited{color:#444}#tnp-body .ui-tabs .ui-tabs-nav{padding:0}#tnp-body .ui-tabs .ui-tabs-nav li a{font-size:14px}#tnp-body #tabs .ui-tabs{border-color:#28313c;background-color:#28313c;border:0}#tnp-body #tabs .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0 0;background-color:#f2f2f2}#tnp-body #tabs .ui-tabs .ui-tabs-panel{padding:1em 0;background-color:#f2f2f2;margin:0;border:0}#tnp-body .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff!important;font-weight:normal;font-family:soleil,sans-serif}#tnp-body .ui-widget-content{background:#fff}#tnp-body .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.tnp-extension-premium-box,.tnp-extension-free-box,.tnp-integration-box{width:300px;height:220px;background-color:#222b36;text-align:center;margin:20px;float:left;position:relative}.tnp-extension-premium-box:hover,.tnp-extension-free-box:hover,.tnp-integration-box:hover{background-color:#232c35;box-shadow:1px 1px 15px #222b36}.tnp-extension-premium-box p,.tnp-extension-free-box p,.tnp-integration-box p{padding:5px 10px;color:#72777c;font-size:14px;margin-top:0}.tnp-extension-premium-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-free-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-integration-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-premium-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-free-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-integration-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-premium-action span{color:#27ae60}.tnp-extension-free-action span{color:#27ae60}.tnp-integration-action span{color:#27ae60}.tnp-extension-activate{color:#1abc9c;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-install{color:#2980b9;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-buy{color:#f1c40f;padding:5px 8px;text-decoration:none;cursor:pointer}#tnp-body a.tnp-extension-details{color:#999;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-free{color:#d35400;padding:5px 8px;text-decoration:none;cursor:pointer;position:relative}img.tnp-extensions-free-badge{position:absolute;display:block;right:0;top:0;width:70px}.tnp-extensions-image img{margin:25px 0 -10px}#tnp-subscribe-overlay{height:100vh;width:100vw;z-index:10000;display:none;background-image:url(images/modal-background.png);background-repeat:repeat;position:fixed;top:0;left:-20px}#tnp-subscribe-modal{width:600px;background-color:rgba(255,255,255,1);margin-right:auto;margin-left:auto;margin-top:100px;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);box-shadow:0 0 20px 0 rgba(0,0,0,0.5);padding:25px;background-color:#1d2b38;text-align:center}#tnp-subscribe-modal img{width:30%}#tnp-subscribe-title{font-size:20px;margin-top:30px;margin-bottom:30px;line-height:30px;color:white;font-weight:200}#tnp-subscribe-email-wrapper{margin:20px}#tnp-subscribe-email-wrapper input{border:0;background-color:#223242;color:white}#tnp-subscribe-email{font-size:24px;box-sizing:border-box;width:100%;padding:10px;text-align:center}#tnp-subscribe-submit-wrapper{margin-bottom:20px}#tnp-subscribe-submit{font-size:24px;background-color:#219050;color:#fff;padding:10px 35px;border:0;font-size:17px;letter-spacing:2px}#tnp-subscribe-no-thanks{color:#666;margin-top:20px;margin-bottom:20px}#tnp-body div.tnp-emails-theme-options{background-color:#fff;padding:10px;margin-top:14px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.cd-slider-wrapper{position:relative;width:100%;height:90vh;overflow:hidden;margin:0 auto}.cd-slider-wrapper .cd-slider,.cd-slider-wrapper .cd-slider>li{height:100%;width:100%}.tnp-logo-big{width:300px}.tnp-row{display:table-row}.tnp-third{width:33%;float:left}.tnp-welcome-confirm-button{color:#fff;padding:10px 30px;background-color:#2ecc71;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none;display:inline-block;text-align:center;margin:20px auto 0}.tnp-welcome-confirm-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-confirm-button:visited{color:#fff;text-decoration:none}.tnp-welcome-link-button{color:#fff;padding:10px 30px;background-color:#3498db;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none}.tnp-welcome-link-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-link-button:visited{color:#fff;text-decoration:none}#tnp-welcome input[type="text"],#tnp-welcome input[type="email"]{max-width:90%}.tnp-welcome-next{background-color:#2ecc71;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-next:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-next:visited{color:#fff;text-decoration:none}.tnp-welcome-prev{background-color:#3498db;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 0 0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-prev:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-prev:visited{color:#fff;text-decoration:none}.tnp-welcome-next svg{margin-left:10px}.tnp-welcome-prev svg{margin-right:10px}.cd-slider input{width:250px;height:40px;border:1px solid #6c7280;background:#454a56;color:white;color:white;padding:0 10px}.cd-slider>li{position:absolute;top:0;left:0;opacity:0;display:table;background-position:center center;background-repeat:no-repeat;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cd-slider>li.visible{position:relative;z-index:2;opacity:1}.cd-slider>li:first-of-type{background-color:#2b313a}.cd-slider>li:nth-of-type(2){background-color:#2b313a}.cd-slider>li:nth-of-type(3){background-color:#2b313a}.cd-slider>li:nth-of-type(4){background-color:#2b313a}.cd-slider>li:first-of-type,.cd-slider>li:nth-of-type(2),.cd-slider>li:nth-of-type(3),.cd-slider>li:nth-of-type(4){background-size:cover}.cd-slider>li>div{display:table-cell;vertical-align:middle;text-align:center}.cd-slider>li h2,.cd-slider>li p{text-shadow:0 1px 3px rgba(0,0,0,0.1);line-height:1.2;margin:0 auto 14px;color:#fff;width:90%;max-width:320px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}.cd-slider>li .cd-btn{display:inline-block;padding:1.2em 1.4em;margin-top:.8em;background-color:rgba(0,0,0,0.6);border-radius:.25em;font-size:1.3rem;font-weight:700;letter-spacing:1px;color:#fff;text-transform:uppercase;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.no-touch .cd-slider>li .cd-btn:hover{background-color:rgba(0,0,0,0.8)}@media only screen and (min-width:768px){.cd-slider>li h2,.cd-slider>li p{max-width:520px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}}@media only screen and (min-width:1170px){.cd-slider>li h2,.cd-slider>li p{margin-bottom:20px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:center;color:#b8c3c9;margin:30px auto}}.cd-slider-navigation{position:relative;bottom:110px;z-index:3;display:flex;justify-content:center}.cd-svg-cover{position:absolute;z-index:1;left:0;top:0;height:100%;width:100%;opacity:0}.cd-svg-cover path{fill:#ed6a6a}.cd-svg-cover.is-animating{z-index:4;opacity:1;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}#tnp-body div.tnp-emails-theme-options table.form-table{margin:0}#tnp-body div.tnp-emails-theme-options h3{color:#000}.tnp-emails-edit #options-subject{font-size:16px;display:inline-block;margin:20px 0;width:auto;border-radius:4px;padding:5px 10px}.tnp-suggest-button{font-family:soleil,sans-serif;margin-left:8px;border-radius:3px;background-color:#2980b9;padding:10px 15px 8px;font-size:14px;color:#fff!important;text-decoration:none}.tnp-suggest-button:hover{background-color:#3f8dbf}.tnp-popup-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.8);z-index:10000}.tnp-popup{width:40vw;height:66vh;overflow:auto;margin:100px auto 0 auto;background-color:#181818;padding:20px;position:relative}.tnp-popup-close{display:block;position:absolute;top:5px;right:5px;background-color:#181818;color:#fff;font-size:40px;padding:10px;text-align:right;cursor:pointer}.tnp-subjects-header{font-size:16px;color:#fff;padding:0 70px 20px 20px;font-family:soleil,sans-serif;border-bottom:1px solid #282828}#tnp-edit-subjects-list{padding:0 70px 20px 20px}#tnp-edit-subjects-list a{padding:5px}#tnp-edit-subjects-list svg{margin:0 10px 0 0;vertical-align:middle}.tnp-subject-category{color:#565656;margin:25px 0 10px 0;font-size:12px;text-transform:uppercase;letter-spacing:.1em}#tnp-edit-emoji-list{font-size:28px}#tnp-edit-emoji-list a{display:inline-block;margin-right:5px;margin-bottom:5px}.tnp-list-conditions p{margin:0 10px}.tnp-lists .tnp-notes{margin:0;font-size:.9em}iframe.tnp-editor-preview-mobile{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;box-shadow:1px 1px 10px #777;border-radius:10px;padding:5px;width:320px;height:500px;float:left}iframe.tnp-editor-preview-desktop{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;border-radius:10px;box-shadow:1px 1px 10px #777;padding:15px;width:650px;margin-right:20px;height:500px;float:left}#tnp-license-control{border-left:5px solid #27ae60;display:inline-block;padding:15px 20px;margin-left:-10px;margin-top:15px;border-radius:2px;background-color:#fff}#tnp-license-control form{margin-bottom:10px;margin-top:10px}#tnp-license-control form input{padding-left:10px}#tnp-license-control a{border-bottom:0;color:#27ae60}#tnp-nl-status{width:100%;background:#fffafa;padding:15px 25px 15px 25px;border-left:10px solid #27ae60;border-radius:0 5px 5px 0}#tnp-nl-status p{font-size:17px}.tnp-nl-status-row{margin:10px 0}.tnp-nl-status-title{font-size:26px;line-height:32px;margin:5px 0 0 0;color:#3498db;font-weight:900;vertical-align:middle}.tnp-nl-status-title-value{font-size:13px;line-height:32px;margin:0 0 0 5px;color:#fff;background-color:#95a5a6;border-radius:4px;text-transform:uppercase;letter-spacing:1px;vertical-align:sub}.tnp-nl-status-schedule-targeting{font-size:15px;color:#34495e}.tnp-nl-status-schedule-value{font-size:15px;color:#34495e}.tnp-status-header #options-subject{width:calc(100% - 150px)}.tnp-one-third{width:40%;display:inline-block;vertical-align:top}.tnp-two-thirds{width:59%;display:inline-block;vertical-align:top}.tnp-progress{display:flex;height:1.5rem;overflow:hidden;font-size:.75rem;background-color:#c9cccf;border-radius:.25rem;margin:0;min-width:100px}.tnp-progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}.tnp-progress.sent .tnp-progress-bar{background-color:green}.tnp-progress-numbers{text-align:center;color:#666}.tnp-progress-date{color:#666;font-style:italic}span.tnp-email-status-new{background-color:#8e44ad;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-paused{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sending{background-color:#27ae60;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-scheduled{background-color:#e67e22;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sent{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}#tnp-schedule-button{background-color:#e67e22!important}#tnp-schedule-button:hover{background-color:#ec913f!important}.tnp-button-cancel{background-color:#e74c3c!important}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnp-promo{text-align:left;background-color:#222b36;margin:20px;border-radius:5px;padding:20px 40px}#tnp-promo .tnp-promo-how-to{width:50%;padding:5px 20px;margin-top:30px;margin-bottom:30px;border-left:2px solid #f1c40f}#tnp-promo .tnp-promo-how-to h3{color:#ecf0f1;margin:0;line-height:36px}#tnp-promo .tnp-promo-how-to p{color:#ecf0f1;margin:0;font-size:16px;line-height:26px}#tnp-promo .tnp-promo-buttons{margin:50px 0}#tnp-promo .tnp-promo-button{background:#27ae60;text-decoration:none;color:white;padding:15px 20px;font-size:15px;border-radius:2px}#tnp-promo .tnp-promo-button:hover{background:#2ecc71;color:white}#tnp-promo .tnp-promo-button i{margin-right:3px}#tnp-body td a.tnp-table-link,#tnp-body td a.tnp-table-link:visited{color:#444}#tnp-body td a.tnp-table-link:hover{color:#3498db}.text-left{text-align:left}.tab-min-height{min-height:500px}.tnp-control-all-languages-notice{padding:15px;border:1px dashed #999}.sp-dd{display:none}.sp-replacer{width:30px!important;height:30px!important}
 
admin.min.js DELETED
@@ -1,5 +0,0 @@
1
- jQuery.cookie=function(c,b,a){if("undefined"!=typeof b){a=a||{};null===b&&(b="",a.expires=-1);var d="";a.expires&&("number"==typeof a.expires||a.expires.toUTCString)&&("number"==typeof a.expires?(d=new Date,d.setTime(d.getTime()+864E5*a.expires)):d=a.expires,d="; expires="+d.toUTCString());var e=a.path?"; path="+a.path:"",f=a.domain?"; domain="+a.domain:"";a=a.secure?"; secure":"";document.cookie=[c,"=",encodeURIComponent(b),d,e,f,a].join("")}else{b=null;if(document.cookie&&""!=document.cookie)for(a=
2
- document.cookie.split(";"),d=0;d<a.length;d++)if(e=jQuery.trim(a[d]),e.substring(0,c.length+1)==c+"="){b=decodeURIComponent(e.substring(c.length+1));break}return b}};function tnp_toggle_schedule(){jQuery("#tnp-schedule-button").toggle();jQuery("#tnp-schedule").toggle()}function tnp_select_toggle(c,b){1==c.value?jQuery("#options-"+b).show():jQuery("#options-"+b).hide()}
3
- function tnp_date_onchange(c){var b=c.id.substring(0,c.id.lastIndexOf("_"));c=document.getElementById("options-"+b);let a=document.getElementById(b+"_year"),d=document.getElementById(b+"_month");b=document.getElementById(b+"_day");c.value=""===a.value||""===d.value||""===b.value?0:(new Date(a.value,d.value,b.value,12,0,0)).getTime()/1E3}
4
- window.onload=function(){jQuery(".tnp-counter-animation").each(function(){var c=jQuery(this),b=null;(function(a){return!isNaN(Number(a))&&-1!==Number(a).toString().indexOf(".")})(c.text())?b={parsed:parseFloat(c.text()),rounded:function(a){return a.toFixed(1)}}:(b={parsed:parseInt(c.text()),rounded:function(a){return Math.ceil(a)}},c.hasClass("percentage")&&c.css("min-width","60px"));jQuery({counter:0}).animate({counter:b.parsed},{duration:1E3,easing:"swing",step:function(){c.text(b.rounded(this.counter))}})});
5
- (function(){if(jQuery("#tnp-nl-status").length&&jQuery("#newsletter-form").length){var c=jQuery("#tnp-nl-status .tnp-nl-status-schedule-value");jQuery("#newsletter-form").change(function(b){1===jQuery(b.target).parents("#tabs-options").length&&c.text(tnp_translations.save_to_update_counter)})}})()};function tnp_controls_init(){jQuery(".tnpf-color").spectrum({type:"color",allowEmpty:!0,showAlpha:!1,showInput:!0,preferredFormat:"hex"})};
 
 
 
 
 
css/controls-dark.css ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .tnpc-error, .tnpc-warning, .tnpc-message {
3
+ background-color: #28313C;
4
+ color: #fff;
5
+ }
6
+
7
+ #tnp-body table.form-table {
8
+ border: 1px solid #666;
9
+ border-radius: 3px;
10
+ margin-top: 0;
11
+ margin-bottom: 1em;
12
+ }
13
+
14
+ #tnp-body table.form-table th {
15
+ width: 150px;
16
+ }
17
+
18
+ #tnp-body table.form-table, #tnp-body table.form-table th {
19
+ background-color: transparent;
20
+ color: #fff;
21
+ }
22
+
23
+ #tnp-body table.form-table th, #tnp-body table.form-table td {
24
+ vertical-align: top;
25
+ }
26
+
27
+ #tnp-body table.form-table td {
28
+ color: #999;
29
+ }
30
+
31
+ #tnp-body table.form-table p.description {
32
+ color: #aaa;
33
+ }
34
+
35
+ #tnp-body table.widefat {
36
+ background-color: transparent !important;
37
+ }
38
+
39
+ #tnp-body table.widefat input[type="text"] {
40
+ background-color: #28313C;
41
+ color: #fff !important;
42
+ }
43
+
44
+ #tnp-body table.widefat thead {
45
+ background-color: #28313C;
46
+ color: #fff!important;
47
+ }
48
+
49
+ #tnp-body table.widefat td {
50
+ color: #999;
51
+ }
52
+
53
+ #tnp-body table.widefat tr:nth-child(even) {
54
+ background-color: #28313C;
55
+ }
56
+
57
+ /* Set of checkboxes */
58
+ .tnpc-checkboxes label {
59
+ border: 1px solid #666;
60
+ background-color: transparent;
61
+ }
css/controls.css ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Classes used by controls. Should be prefixed with "tnpc-" */
2
+
3
+
4
+ /* Top page messages */
5
+ .tnpc-error, .tnpc-warning, .tnpc-message,
6
+ .tnp-error, .tnp-warning, .tnp-message {
7
+ background-color: #fff;
8
+ padding: 15px;
9
+ margin: 15px 0;
10
+ font-size: 1.2em;
11
+ line-height: 1.5em;
12
+ margin-left: 10px;
13
+ }
14
+
15
+ .tnpc-error, .tnp-error {
16
+ border-left: 5px solid #dd0000;
17
+ }
18
+
19
+ .tnpc-warning, .tnp-warning {
20
+ border-left: 5px solid #ffb900;
21
+ }
22
+
23
+ .tnpc-message, .tnp-message {
24
+ border-left: 5px solid #46b450;
25
+ }
26
+
27
+
28
+ /* Structure */
29
+
30
+ /* Tables with controls */
31
+ #tnp-body .form-table {
32
+ background-color: #fff;
33
+ border: 1px solid #ECF0F1;
34
+ margin-top: 2em;
35
+ border-spacing: 4px;
36
+ border-collapse: separate;
37
+ }
38
+
39
+ #tnp-body .form-table h4,
40
+ #tnp-body .form-table h3 {
41
+ color: #444;
42
+ }
43
+
44
+ /* WP has different padding for TH and TD (why???) */
45
+ #tnp-body .form-table th, #tnp-body .form-table td {
46
+ padding: 15px;
47
+ }
48
+
49
+ #tnp-body .form-table th {
50
+ text-align: right;
51
+ font-weight: bold;
52
+ max-width: 200px;
53
+ color: #000000;
54
+ background-color: #ECF0F1;
55
+ vertical-align: middle;
56
+ }
57
+
58
+ #tnp-body .form-table th small {
59
+ font-weight: normal;
60
+ }
61
+
62
+ #tnp-body .form-table textarea {
63
+ width: 100%;
64
+ }
65
+
66
+ /* Subtables contained in a main form table TD */
67
+ #tnp-body .form-table td table {
68
+ border: 0;
69
+ border-collapse: collapse;
70
+ }
71
+
72
+ #tnp-body .form-table table thead th {
73
+ text-align: left;
74
+ font-weight: bold;
75
+ }
76
+
77
+ #tnp-body .form-table td table th {
78
+ background-color: transparent;
79
+ text-align: right;
80
+ width: auto;
81
+ border: 0;
82
+ padding: 3px;
83
+ font-weight: normal;
84
+ vertical-align: middle;
85
+ padding-right: 15px;
86
+ }
87
+
88
+ #tnp-body .form-table td table td {
89
+ background-color: transparent;
90
+ border: 0;
91
+ padding: 3px;
92
+ vertical-align: middle;
93
+ }
94
+
95
+ /* Fix for select 2 */
96
+ #tnp-body .form-table td ul {
97
+ margin-left: 0;
98
+ }
99
+
100
+
101
+ /* Set of checkboxes */
102
+ .tnpc-checkboxes label {
103
+ display: block;
104
+ float: left;
105
+ width: 250px;
106
+ border: 1px solid #ccc;
107
+ background-color: #f4f4f4;
108
+ margin-bottom: 5px;
109
+ padding: 5px;
110
+ white-space: nowrap;
111
+ margin-right: 5px;
112
+ overflow: hidden;
113
+ }
114
+
115
+
116
+ /* Hint text after a field */
117
+ .tnpc-hint, p.description {
118
+ margin-top: 15px;
119
+ clear: both;
120
+ font-size: 12px !important;
121
+ color: #666;
122
+ font-style: italic;
123
+ }
124
+
125
+ /* Color picker */
126
+ .tnpc-color {
127
+ width: 40px;
128
+ font-size: 12px;
129
+ }
130
+
131
+ /* Buttons */
132
+ .tnpc-button, .tnpc-button:visited, .tnpc-button:hover, .tnpc-button:active {
133
+ min-width: 3em;
134
+ text-align: center;
135
+ color: #fff!important;
136
+ width: auto;
137
+ }
138
+
139
+ /* Lists select with triggers */
140
+ .tnpc_lists_notes {
141
+ color: #999;
142
+ font-size: .9em;
143
+ padding: 0px 0 0 15px;
144
+ border-left: 3px solid #888;
145
+ margin-top: 10px;
146
+ }
css/dashboard.css CHANGED
@@ -1,114 +1,9 @@
1
- #tnp-body #tnp-dashboard .tnp-widget p {
2
- margin: 0 0 10px 0;
3
- padding: 0;
4
- }
5
-
6
- #tnp-dashboard .row .tnp-widget {
7
- min-height: 350px;
8
- padding: 0;
9
- text-align: center;
10
- }
11
-
12
- /* The widget title */
13
-
14
- #tnp-dashboard h3 {
15
- letter-spacing: 0.05rem;
16
- background-color: #415b76;
17
- color: #fff;
18
- margin: 0;
19
- padding: 9px;
20
- }
21
-
22
-
23
- #tnp-dashboard h3 a {
24
- color: white;
25
- text-decoration: none;
26
- margin-left: 5px;
27
- padding: 2px 8px;
28
- background-color: #26C281;
29
- border-radius: 2px;
30
- font-weight: 300;
31
- text-transform: capitalize;
32
- font-size: 0.8rem;
33
- float: right;
34
- }
35
-
36
- #tnp-dashboard h3 a:hover {
37
- color: white;
38
- text-decoration: none;
39
- margin-left: 5px;
40
- background-color: #2ECC71;
41
- }
42
-
43
-
44
- /* The widget inner content */
45
-
46
- #tnp-dashboard .tnp-widget .tnp-inner {
47
- padding: 15px;
48
- }
49
-
50
-
51
- /* One or more buttons in a row */
52
- #tnp-dashboard .tnp-cta {
53
- text-align: center;
54
- margin-bottom: 15px;
55
- }
56
-
57
- #tnp-dashboard .tnp-cta a {
58
- display: inline-block;
59
- padding: 10px;
60
- color: #fff;
61
- background-color: green;
62
- text-decoration: none;
63
- }
64
-
65
- #tnp-dashboard .tnp-cta a:hover {
66
- color: #fff;
67
- }
68
-
69
-
70
- #tnp-dashboard .tnp-widget img {
71
- max-width: 80%!important;
72
- display: block;
73
- margin: 0 auto;
74
- }
75
-
76
- #tnp-dashboard .tnp-widget table {
77
- max-width: 100%;
78
- width: 100%;
79
- margin: 0;
80
- box-sizing: border-box;
81
- }
82
-
83
- #tnp-dashboard .tnp-widget table td,
84
- #tnp-dashboard .tnp-widget table th
85
- {
86
- text-align: left;
87
- }
88
-
89
- /* Bottoni usati all'interno delle tabelle, magari con la sola icona */
90
- #tnp-dashboard .tnp-widget table .button-primary {
91
- min-width: 40px;
92
- text-align: center;
93
- display: inline-block;
94
- }
95
-
96
- #tnp-dashboard .tnp-widget .tnp-canvas {
97
- position: relative;
98
- }
99
-
100
- /* Tnp Dashboard with Flexbox - Redesign */
101
 
102
  #wpfooter {
103
  position: relative;
104
  }
105
 
106
- #tnp-heading h1 {
107
- color: #fff;
108
- font-family: soleil, sans-serif;
109
- font-weight: 900;
110
- }
111
-
112
  .tnp-dashboard {
113
  background-color: #f2f5f9;
114
  color: #222222;
1
+ /* This is loaded inline in the main/index.php file */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  #wpfooter {
4
  position: relative;
5
  }
6
 
 
 
 
 
 
 
7
  .tnp-dashboard {
8
  background-color: #f2f5f9;
9
  color: #222222;
css/dashboard.min.css DELETED
@@ -1 +0,0 @@
1
- #tnp-body #tnp-dashboard .tnp-widget p{margin:0 0 10px 0;padding:0}#tnp-dashboard .row .tnp-widget{min-height:350px;padding:0;text-align:center}#tnp-dashboard h3{letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#tnp-dashboard h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem;float:right}#tnp-dashboard h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}#tnp-dashboard .tnp-widget .tnp-inner{padding:15px}#tnp-dashboard .tnp-cta{text-align:center;margin-bottom:15px}#tnp-dashboard .tnp-cta a{display:inline-block;padding:10px;color:#fff;background-color:green;text-decoration:none}#tnp-dashboard .tnp-cta a:hover{color:#fff}#tnp-dashboard .tnp-widget img{max-width:80%!important;display:block;margin:0 auto}#tnp-dashboard .tnp-widget table{max-width:100%;width:100%;margin:0;box-sizing:border-box}#tnp-dashboard .tnp-widget table td,#tnp-dashboard .tnp-widget table th{text-align:left}#tnp-dashboard .tnp-widget table .button-primary{min-width:40px;text-align:center;display:inline-block}#tnp-dashboard .tnp-widget .tnp-canvas{position:relative}
 
css/dropdown.css CHANGED
@@ -2,11 +2,6 @@
2
  margin: 0; padding: 0; border: 0;
3
  }
4
 
5
- /* Removed by Stefano */
6
- .tnp-drowpdown li {
7
- /*min-width: 150px;*/
8
- }
9
-
10
  .tnp-drowpdown {
11
  margin-top: 10px;
12
  -webkit-transition-timing-function: ease;
@@ -65,8 +60,6 @@
65
  background-color: #34495E;
66
  /*border: 1px solid #34495E;*/
67
  }
68
- .tnp-drowpdown ul li:hover a {
69
- }
70
 
71
  .tnp-drowpdown ul li a {
72
  display: block;
@@ -95,13 +88,10 @@
95
  line-height: 1.6em;
96
  }
97
 
98
-
99
  .tnp-drowpdown ul ul li:nth-child(even) {
100
  background-color: #3b3342;
101
  }
102
 
103
-
104
-
105
  .tnp-drowpdown ul ul li:hover {
106
  background: inherit;
107
  }
@@ -117,10 +107,6 @@
117
  position: absolute; left: 100%; top:0;
118
  }
119
 
120
- .tnp-wrap ul li {
121
- list-style-type: none;
122
- }
123
-
124
  .tnp-professional-extensions-button {
125
  background-color: #27AE60;
126
  border: 1px solid #27AE60 !important;
2
  margin: 0; padding: 0; border: 0;
3
  }
4
 
 
 
 
 
 
5
  .tnp-drowpdown {
6
  margin-top: 10px;
7
  -webkit-transition-timing-function: ease;
60
  background-color: #34495E;
61
  /*border: 1px solid #34495E;*/
62
  }
 
 
63
 
64
  .tnp-drowpdown ul li a {
65
  display: block;
88
  line-height: 1.6em;
89
  }
90
 
 
91
  .tnp-drowpdown ul ul li:nth-child(even) {
92
  background-color: #3b3342;
93
  }
94
 
 
 
95
  .tnp-drowpdown ul ul li:hover {
96
  background: inherit;
97
  }
107
  position: absolute; left: 100%; top:0;
108
  }
109
 
 
 
 
 
110
  .tnp-professional-extensions-button {
111
  background-color: #27AE60;
112
  border: 1px solid #27AE60 !important;
css/extensions.css ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Used even by the addons manager addon */
2
+
3
+ .tnp-extension-premium-box, .tnp-extension-free-box, .tnp-integration-box {
4
+ width: 300px;
5
+ height: 220px;
6
+ background-color: #222B36;
7
+ text-align: center;
8
+ margin: 20px;
9
+ float: left;
10
+ position: relative;
11
+ }
12
+
13
+ .tnp-extension-premium-box:hover, .tnp-extension-free-box:hover, .tnp-integration-box:hover {
14
+ background-color: #232C35;
15
+ box-shadow: 1px 1px 15px #222B36;
16
+ }
17
+
18
+ .tnp-extension-premium-box p, .tnp-extension-free-box p, .tnp-integration-box p {
19
+ padding: 5px 10px;
20
+ color: #72777c;
21
+ font-size: 14px;
22
+ margin-top: 0px;
23
+ }
24
+
25
+ .tnp-extension-premium-box h3 {
26
+ font-family: soleil, sans-serif;
27
+ padding: 5px 8px !important;
28
+ border-radius: 3px;
29
+ display: inline-block;
30
+ font-size: 16px;
31
+ color: #fff;
32
+ margin-bottom: 0px !important;
33
+ margin-top: 25px !important;
34
+ font-weight: 300;
35
+ width: auto !important;
36
+ border-bottom: none !important;
37
+ }
38
+
39
+ .tnp-extension-free-box h3 {
40
+ font-family: soleil, sans-serif;
41
+ padding: 5px 8px !important;
42
+ border-radius: 3px;
43
+ display: inline-block;
44
+ font-size: 16px;
45
+ color: #fff;
46
+ margin-bottom: 0px !important;
47
+ margin-top: 25px !important;
48
+ font-weight: 300;
49
+ width: auto !important;
50
+ border-bottom: none !important;
51
+ }
52
+
53
+ .tnp-integration-box h3 {
54
+ font-family: soleil, sans-serif;
55
+ padding: 5px 8px !important;
56
+ border-radius: 3px;
57
+ display: inline-block;
58
+ font-size: 16px;
59
+ color: #fff;
60
+ margin-bottom: 0px !important;
61
+ margin-top: 25px !important;
62
+ font-weight: 300;
63
+ width: auto !important;
64
+ border-bottom: none !important;
65
+ }
66
+
67
+ .tnp-extension-premium-action {
68
+ bottom: 0;
69
+ position: absolute;
70
+ width: 100%;
71
+ padding: 12px;
72
+ font-family: soleil, sans-serif;
73
+ }
74
+
75
+ .tnp-extension-free-action {
76
+ bottom: 0;
77
+ position: absolute;
78
+ width: 100%;
79
+ padding: 12px;
80
+ font-family: soleil, sans-serif;
81
+ }
82
+
83
+ .tnp-integration-action {
84
+ bottom: 0;
85
+ position: absolute;
86
+ width: 100%;
87
+ padding: 12px;
88
+ font-family: soleil, sans-serif;
89
+ }
90
+
91
+
92
+ .tnp-extension-premium-action span {
93
+ color: #27AE60;
94
+ }
95
+
96
+ .tnp-extension-free-action span {
97
+ color: #27AE60;
98
+ }
99
+
100
+ .tnp-integration-action span {
101
+ color: #27AE60;
102
+ }
103
+
104
+ .tnp-extension-activate {
105
+ color: #1ABC9C;
106
+ padding: 5px 8px;
107
+ text-decoration: none;
108
+ cursor: pointer;
109
+ }
110
+
111
+ .tnp-extension-install {
112
+ color: #2980B9;
113
+ padding: 5px 8px;
114
+ text-decoration: none;
115
+ cursor: pointer;
116
+ }
117
+
118
+ .tnp-extension-buy {
119
+ color: #F1C40F;
120
+ padding: 5px 8px;
121
+ text-decoration: none;
122
+ cursor: pointer;
123
+ }
124
+
125
+ #tnp-body a.tnp-extension-details{
126
+ color: #999999;
127
+ padding: 5px 8px;
128
+ text-decoration: none;
129
+ cursor: pointer;
130
+ }
131
+
132
+ .tnp-extension-free {
133
+ color: #D35400;
134
+ padding: 5px 8px;
135
+ text-decoration: none;
136
+ cursor: pointer;
137
+ position: relative;
138
+ }
139
+
140
+ img.tnp-extensions-free-badge {
141
+ position: absolute;
142
+ display: block;
143
+ right: 0;
144
+ top: 0;
145
+ width: 70px;
146
+ }
147
+
148
+ .tnp-extensions-image img {
149
+ margin: 25px 0px -10px;
150
+ }
css/fields.css CHANGED
@@ -1,7 +1,4 @@
1
- /* DEBUG - Disable when done */
2
- /*.tnp-field {*/
3
- /*border: 1px dashed #999;*/
4
- /*}*/
5
 
6
  /* STRUCTURE */
7
  .tnp-field-row {
@@ -167,8 +164,3 @@ tnp-field.tnp-font {
167
  font-weight: normal;
168
  color: #999999;
169
  }
170
-
171
- .tnpf-color {
172
- width: 40px;
173
- font-size: 12px;
174
- }
1
+
 
 
 
2
 
3
  /* STRUCTURE */
4
  .tnp-field-row {
164
  font-weight: normal;
165
  color: #999999;
166
  }
 
 
 
 
 
css/fields.min.css DELETED
@@ -1 +0,0 @@
1
- .tnp-field-row{clear:both;margin-left:-10px;margin-right:-10px}.tnp-field-col-2{width:50%;box-sizing:border-box;padding:10px;float:left}.tnp-field-col-3{width:33%;box-sizing:border-box;padding:10px;float:left}.tnp-field-col-20{width:20%;box-sizing:border-box;padding:10px;float:left}.tnp-field-col-33{width:33%;box-sizing:border-box;padding:10px;float:left}.tnp-field-col-66{width:66%;box-sizing:border-box;padding:10px;float:left}.tnp-field-col-80{width:80%;box-sizing:border-box;padding:10px;float:left}.tnp-field.tnp-separator{border-top:1px solid #ddd;line-height:0}.tnp-field{display:block;width:100%;margin-bottom:10px}.tnp-field label.tnp-label,.tnp-field-row label.tnp-row-label{display:block;font-size:12px;font-weight:300;border-bottom:1px solid #fff;margin:25px 0 10px 0;font-family:soleil,sans-serif;font-weight:300;padding-bottom:5px;color:#868686}.tnp-field-row label.tnp-row-label{margin-left:10px}.tnp-field.tnp-checkbox label{display:inline}.tnp-field:not(.tnp-colorpicker) input{width:100%}.tnp-field input[type=number]{width:100px}.tnp-field.tnp-size input{width:60px;display:inline}.tnp-field .tnp-padding-fields{display:inline}.tnp-field .tnp-padding-fields input{width:40px;display:inline}.tnp-field select{width:auto!important;color:#34495e}.tnp-field input[type=url]{font-family:monospace}.tnp-field input[type=color]{width:40px;min-height:30px;vertical-align:middle}.tnp-field input[type=submit]{width:auto}.tnp-field input[type=checkbox]{width:auto}.tnp-field.tnpf-button .tnpf-font-family{font-size:13px}.tnp-field.tnpf-button .tnpf-font-size{font-size:13px}.tnp-field.tnpf-button .tnpf-font-weight{font-size:13px}.tnp-description{margin-top:7px;font-style:italic;font-weight:normal;color:#999}.tnpf-color{width:40px;font-size:12px}
 
css/tabs.css ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Since #tabs has a white background, all elements should be made dark */
2
+
3
+ #tnp-body #tabs h3,
4
+ #tnp-body #tabs h4,
5
+ #tnp-body #tabs p,
6
+ #tnp-body #tabs li,
7
+ #tnp-body #tabs input,
8
+ #tnp-body #tabs select,
9
+ #tnp-body #tabs textarea {
10
+ color: #444;
11
+ }
12
+
13
+ #tnp-body td .tnp-tabs {
14
+
15
+ }
16
+
17
+ #tnp-body td .tnp-tabs .ui-widget-header {
18
+ background-color: #ddd;
19
+ }
20
+
21
+ #tnp-body td .tnp-tabs .ui-tabs-anchor {
22
+ color: #000;
23
+ }
24
+
25
+ #tnp-body .ui-widget {
26
+ font-family: soleil, sans-serif;
27
+ }
28
+
29
+ #tnp-body #tabs {
30
+ background-color: transparent;
31
+ border: 0!important;
32
+ padding: 0;
33
+ margin: 0;
34
+ }
35
+
36
+ #tnp-body #tabs .ui-widget-header {
37
+ background: #28313C;
38
+ border: 0;
39
+ }
40
+
41
+ #tnp-body #tabs .ui-tabs-panel {
42
+ padding: 15px!important;
43
+ background-color: #fff;
44
+ }
45
+
46
+ #tnp-body #tabs a.ui-tabs-anchor,
47
+ #tnp-body #tabs a.ui-tabs-anchor:visited {
48
+ color: #444;
49
+ }
50
+
51
+ #tnp-body .ui-tabs .ui-tabs-nav {
52
+ padding: 0;
53
+ margin: 0;
54
+ }
55
+
56
+ #tnp-body .ui-tabs .ui-tabs-nav li a {
57
+ font-size: 14px;
58
+ }
59
+
60
+ #tnp-body #tabs .ui-tabs {
61
+ border-color: #28313C;
62
+ background-color: #28313C;
63
+ border: 0;
64
+ }
65
+
66
+ #tnp-body #tabs .ui-tabs .ui-tabs-nav {
67
+ margin: 0;
68
+ padding: .2em .2em 0 0;
69
+ background-color: #f2f2f2;
70
+ }
71
+
72
+ #tnp-body #tabs .ui-tabs .ui-tabs-panel {
73
+ padding: 1em 0;
74
+ background-color: #f2f2f2;
75
+ margin: 0;
76
+ border: 0;
77
+ }
78
+
79
+ #tnp-body .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
80
+ background: #fff !important;
81
+ font-weight: normal;
82
+ font-family: soleil, sans-serif;
83
+ }
84
+
85
+
86
+ #tnp-body .ui-widget-content {
87
+ background: #fff;
88
+ }
89
+
90
+ #tnp-body .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
91
+ border: none;
92
+ background: #ECF0F1;
93
+ font-family: soleil, sans-serif;
94
+ }
css/welcome.css ADDED
@@ -0,0 +1,348 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* This is loaded inline in the welcome.php page */
2
+
3
+ .cd-slider-wrapper {
4
+ position: relative;
5
+ width: 100%;
6
+ height: 90vh;
7
+ /* hide horizontal scrollbar on IE11 */
8
+ overflow: hidden;
9
+ margin: 0 auto;
10
+ }
11
+ .cd-slider-wrapper .cd-slider, .cd-slider-wrapper .cd-slider > li {
12
+ height: 100%;
13
+ width: 100%;
14
+ }
15
+
16
+ .tnp-logo-big {
17
+ width: 300px;
18
+ }
19
+
20
+ .tnp-row {
21
+ display: table-row;
22
+ }
23
+
24
+ .tnp-third {
25
+ width: 33%;
26
+ float: left;
27
+ }
28
+
29
+ .tnp-welcome-confirm-button {
30
+ color: #fff;
31
+ padding: 10px 30px;
32
+ background-color: #2ECC71;
33
+ font-weight: 700;
34
+ font-size: 15px;
35
+ box-shadow: 0 20px 38px rgba(0, 0, 0, 0.16);
36
+ text-decoration: none;
37
+ display: inline-block;
38
+ text-align: center;
39
+ margin: 20px auto 0px;
40
+ }
41
+
42
+ .tnp-welcome-confirm-button:hover {
43
+ box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
44
+ color: #fff;
45
+ }
46
+
47
+ .tnp-welcome-confirm-button:visited {
48
+ color: #fff;
49
+ text-decoration: none;
50
+ }
51
+
52
+ .tnp-welcome-link-button {
53
+ color: #fff;
54
+ padding: 10px 30px;
55
+ background-color: #3498DB;
56
+ font-weight: 700;
57
+ font-size: 15px;
58
+ box-shadow: 0 20px 38px rgba(0, 0, 0, 0.16);
59
+ text-decoration: none;
60
+ }
61
+
62
+ .tnp-welcome-link-button:hover {
63
+ box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
64
+ color: #fff;
65
+ }
66
+
67
+ .tnp-welcome-link-button:visited {
68
+ color: #fff;
69
+ text-decoration: none;
70
+ }
71
+
72
+ #tnp-welcome input[type="text"], #tnp-welcome input[type="email"] {
73
+ max-width: 90%;
74
+ }
75
+
76
+ .tnp-welcome-next {
77
+ background-color: #2ECC71;
78
+ padding: 10px 20px;
79
+ color: white;
80
+ text-decoration: none;
81
+ font-weight: 600;
82
+ font-size: 16px;
83
+ margin: 0px 10px;
84
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);
85
+ width: -moz-fit-content;
86
+ width: -webkit-fit-content;
87
+ width: fit-content;
88
+ display: flex;
89
+ align-items: center;
90
+ }
91
+
92
+ .tnp-welcome-next:hover {
93
+ box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
94
+ color: #fff;
95
+ }
96
+
97
+ .tnp-welcome-next:visited {
98
+ color: #fff;
99
+ text-decoration: none;
100
+ }
101
+
102
+ .tnp-welcome-prev {
103
+ background-color: #3498DB;
104
+ padding: 10px 20px;
105
+ color: white;
106
+ text-decoration: none;
107
+ font-weight: 600;
108
+ font-size: 16px;
109
+ margin: 0px 0px 0px 10px;
110
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);
111
+ width: -moz-fit-content;
112
+ width: -webkit-fit-content;
113
+ width: fit-content;
114
+ display: flex;
115
+ align-items: center;
116
+ }
117
+
118
+ .tnp-welcome-prev:hover {
119
+ box-shadow: 0 0 38px rgba(0, 0, 0, 0.16);
120
+ color: #fff;
121
+ }
122
+
123
+ .tnp-welcome-prev:visited {
124
+ color: #fff;
125
+ text-decoration: none;
126
+ }
127
+
128
+ .tnp-welcome-next svg {
129
+ margin-left: 10px;
130
+ }
131
+
132
+ .tnp-welcome-prev svg {
133
+ margin-right: 10px;
134
+ }
135
+
136
+ .cd-slider input {
137
+ width: 250px;
138
+ height: 40px;
139
+ border: 1px solid #6c7280;
140
+ background: #454a56;
141
+ color: white;
142
+ color: white;
143
+ padding: 0px 10px;
144
+ }
145
+
146
+ .cd-slider > li {
147
+ position: absolute;
148
+ top: 0;
149
+ left: 0;
150
+ opacity: 0;
151
+ /* used to vertically center its content */
152
+ display: table;
153
+ background-position: center center;
154
+ background-repeat: no-repeat;
155
+ -webkit-font-smoothing: antialiased;
156
+ -moz-osx-font-smoothing: grayscale;
157
+ }
158
+ .cd-slider > li.visible {
159
+ /* selected slide */
160
+ position: relative;
161
+ z-index: 2;
162
+ opacity: 1;
163
+ }
164
+ .cd-slider > li:first-of-type {
165
+ background-color: #2B313A;
166
+ }
167
+ .cd-slider > li:nth-of-type(2) {
168
+ background-color: #2B313A;
169
+ }
170
+ .cd-slider > li:nth-of-type(3) {
171
+ background-color: #2B313A;
172
+ }
173
+ .cd-slider > li:nth-of-type(4) {
174
+ background-color: #2B313A;
175
+ }
176
+ .cd-slider > li:first-of-type, .cd-slider > li:nth-of-type(2), .cd-slider > li:nth-of-type(3), .cd-slider > li:nth-of-type(4) {
177
+ background-size: cover;
178
+ }
179
+ .cd-slider > li > div {
180
+ /* vertically center the slider content */
181
+ display: table-cell;
182
+ vertical-align: middle;
183
+ text-align: center;
184
+ }
185
+ .cd-slider > li h2, .cd-slider > li p {
186
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
187
+ line-height: 1.2;
188
+ margin: 0 auto 14px;
189
+ color: #ffffff;
190
+ width: 90%;
191
+ max-width: 320px;
192
+ }
193
+ .cd-slider > li h2 {
194
+ font-size: 40px;
195
+ }
196
+ .cd-slider > li p {
197
+ font-size: 18px;
198
+ line-height: 26px;
199
+ text-align: left;
200
+ color: #B8C3C9;
201
+ margin: 40px auto;
202
+ }
203
+
204
+ .cd-slider > li .cd-btn {
205
+ display: inline-block;
206
+ padding: 1.2em 1.4em;
207
+ margin-top: .8em;
208
+ background-color: rgba(0, 0, 0, 0.6);
209
+ border-radius: .25em;
210
+ font-size: 1.3rem;
211
+ font-weight: 700;
212
+ letter-spacing: 1px;
213
+ color: #ffffff;
214
+ text-transform: uppercase;
215
+ -webkit-transition: background-color 0.2s;
216
+ -moz-transition: background-color 0.2s;
217
+ transition: background-color 0.2s;
218
+ }
219
+ .no-touch .cd-slider > li .cd-btn:hover {
220
+ background-color: rgba(0, 0, 0, 0.8);
221
+ }
222
+ @media only screen and (min-width: 768px) {
223
+ .cd-slider > li h2, .cd-slider > li p {
224
+ max-width: 520px;
225
+ }
226
+ .cd-slider > li h2 {
227
+ font-size: 40px;
228
+ }
229
+ .cd-slider > li p {
230
+ font-size: 18px;
231
+ line-height: 26px;
232
+ text-align: left;
233
+ color: #B8C3C9;
234
+ margin: 40px auto;
235
+
236
+ }
237
+ }
238
+ @media only screen and (min-width: 1170px) {
239
+ .cd-slider > li h2, .cd-slider > li p {
240
+ margin-bottom: 20px;
241
+ }
242
+ .cd-slider > li h2 {
243
+ font-size: 40px;
244
+ }
245
+ .cd-slider > li p {
246
+ font-size: 18px;
247
+ line-height: 26px;
248
+ text-align: center;
249
+ color: #B8C3C9;
250
+ margin: 30px auto;
251
+ }
252
+ }
253
+
254
+ /* --------------------------------
255
+
256
+ Tnp Welcome Slider Navigation
257
+
258
+ -------------------------------- */
259
+ .cd-slider-navigation {
260
+ position: relative;
261
+ bottom: 110px;
262
+ z-index: 3;
263
+ display: flex;
264
+ justify-content: center;
265
+ }
266
+
267
+ /* svg cover layer */
268
+
269
+ .cd-svg-cover {
270
+ position: absolute;
271
+ z-index: 1;
272
+ left: 0;
273
+ top: 0;
274
+ height: 100%;
275
+ width: 100%;
276
+ opacity: 0;
277
+ }
278
+ .cd-svg-cover path {
279
+ fill: #ED6A6A;
280
+ }
281
+ .cd-svg-cover.is-animating {
282
+ z-index: 4;
283
+ opacity: 1;
284
+ -webkit-transition: opacity 0.6s;
285
+ -moz-transition: opacity 0.6s;
286
+ transition: opacity 0.6s;
287
+ }
288
+
289
+ /* Switch element style */
290
+
291
+ /* The switch - the box around the slider */
292
+ .switch {
293
+ position: relative;
294
+ display: inline-block;
295
+ width: 60px;
296
+ height: 34px;
297
+ }
298
+
299
+ /* Hide default HTML checkbox */
300
+ .switch input {display:none;}
301
+
302
+ /* The slider */
303
+ .slider {
304
+ position: absolute;
305
+ cursor: pointer;
306
+ top: 0;
307
+ left: 0;
308
+ right: 0;
309
+ bottom: 0;
310
+ background-color: #ccc;
311
+ -webkit-transition: .4s;
312
+ transition: .4s;
313
+ }
314
+
315
+ .slider:before {
316
+ position: absolute;
317
+ content: "";
318
+ height: 26px;
319
+ width: 26px;
320
+ left: 4px;
321
+ bottom: 4px;
322
+ background-color: white;
323
+ -webkit-transition: .4s;
324
+ transition: .4s;
325
+ }
326
+
327
+ input:checked + .slider {
328
+ background-color: #2196F3;
329
+ }
330
+
331
+ input:focus + .slider {
332
+ box-shadow: 0 0 1px #2196F3;
333
+ }
334
+
335
+ input:checked + .slider:before {
336
+ -webkit-transform: translateX(26px);
337
+ -ms-transform: translateX(26px);
338
+ transform: translateX(26px);
339
+ }
340
+
341
+ /* Rounded sliders */
342
+ .slider.round {
343
+ border-radius: 34px;
344
+ }
345
+
346
+ .slider.round:before {
347
+ border-radius: 50%;
348
+ }
emails/edit.php CHANGED
@@ -1,4 +1,5 @@
1
  <?php
 
2
  defined('ABSPATH') || exit;
3
 
4
  /* @var $wpdb wpdb */
@@ -15,7 +16,7 @@ function tnp_prepare_controls($email, $controls) {
15
  }
16
 
17
  // Always required
18
- $email = $module->get_email($_GET['id'], ARRAY_A);
19
 
20
  if (empty($email)) {
21
  echo 'Wrong email identifier';
@@ -27,28 +28,28 @@ $email_id = $email['id'];
27
  /* Satus changes which require a reload */
28
  if ($controls->is_action('pause')) {
29
  $wpdb->update(NEWSLETTER_EMAILS_TABLE, array('status' => 'paused'), array('id' => $email_id));
30
- $email = $module->get_email($_GET['id'], ARRAY_A);
31
  tnp_prepare_controls($email, $controls);
32
  }
33
 
34
  if ($controls->is_action('continue')) {
35
  $wpdb->update(NEWSLETTER_EMAILS_TABLE, array('status' => 'sending'), array('id' => $email_id));
36
- $email = $module->get_email($_GET['id'], ARRAY_A);
37
  tnp_prepare_controls($email, $controls);
38
  }
39
 
40
  if ($controls->is_action('abort')) {
41
  $wpdb->query("update " . NEWSLETTER_EMAILS_TABLE . " set last_id=0, sent=0, status='new' where id=" . $email_id);
42
- $email = $module->get_email($_GET['id'], ARRAY_A);
43
  tnp_prepare_controls($email, $controls);
44
  $controls->messages = __('Delivery definitively cancelled', 'newsletter');
45
  }
46
 
47
  if ($controls->is_action('change-private')) {
48
- $data = array();
49
  $data['private'] = $controls->data['private'] ? 1 : 0;
50
  $data['id'] = $email['id'];
51
- $email = Newsletter::instance()->save_email($data, ARRAY_A);
52
  $controls->add_message_saved();
53
 
54
  tnp_prepare_controls($email, $controls);
@@ -93,7 +94,7 @@ if (!$controls->is_action()) {
93
 
94
  if ($controls->is_action('html')) {
95
 
96
- $data = array();
97
  $data['editor'] = NewsletterEmails::EDITOR_HTML;
98
  $data['id'] = $email_id;
99
 
@@ -102,7 +103,7 @@ if ($controls->is_action('html')) {
102
  unset($data['options']['composer']);
103
  // End backward compatibility
104
 
105
- $email = Newsletter::instance()->save_email($data, ARRAY_A);
106
  $controls->messages = 'You can now edit the newsletter as pure HTML';
107
 
108
  tnp_prepare_controls($email, $controls);
1
  <?php
2
+ /* @var $this NewsletterEmails */
3
  defined('ABSPATH') || exit;
4
 
5
  /* @var $wpdb wpdb */
16
  }
17
 
18
  // Always required
19
+ $email = $this->get_email($_GET['id'], ARRAY_A);
20
 
21
  if (empty($email)) {
22
  echo 'Wrong email identifier';
28
  /* Satus changes which require a reload */
29
  if ($controls->is_action('pause')) {
30
  $wpdb->update(NEWSLETTER_EMAILS_TABLE, array('status' => 'paused'), array('id' => $email_id));
31
+ $email = $this->get_email($_GET['id'], ARRAY_A);
32
  tnp_prepare_controls($email, $controls);
33
  }
34
 
35
  if ($controls->is_action('continue')) {
36
  $wpdb->update(NEWSLETTER_EMAILS_TABLE, array('status' => 'sending'), array('id' => $email_id));
37
+ $email = $this->get_email($_GET['id'], ARRAY_A);
38
  tnp_prepare_controls($email, $controls);
39
  }
40
 
41
  if ($controls->is_action('abort')) {
42
  $wpdb->query("update " . NEWSLETTER_EMAILS_TABLE . " set last_id=0, sent=0, status='new' where id=" . $email_id);
43
+ $email = $this->get_email($_GET['id'], ARRAY_A);
44
  tnp_prepare_controls($email, $controls);
45
  $controls->messages = __('Delivery definitively cancelled', 'newsletter');
46
  }
47
 
48
  if ($controls->is_action('change-private')) {
49
+ $data = [];
50
  $data['private'] = $controls->data['private'] ? 1 : 0;
51
  $data['id'] = $email['id'];
52
+ $email = $this->save_email($data, ARRAY_A);
53
  $controls->add_message_saved();
54
 
55
  tnp_prepare_controls($email, $controls);
94
 
95
  if ($controls->is_action('html')) {
96
 
97
+ $data = [];
98
  $data['editor'] = NewsletterEmails::EDITOR_HTML;
99
  $data['id'] = $email_id;
100
 
103
  unset($data['options']['composer']);
104
  // End backward compatibility
105
 
106
+ $email = $this->save_email($data, ARRAY_A);
107
  $controls->messages = 'You can now edit the newsletter as pure HTML';
108
 
109
  tnp_prepare_controls($email, $controls);
emails/index.php CHANGED
@@ -33,9 +33,8 @@ if ($controls->is_action('delete_selected')) {
33
  $controls->messages .= $r . ' message(s) deleted';
34
  }
35
 
36
- $pagination_controller = new TNP_Pagination_Controller( NEWSLETTER_EMAILS_TABLE, 'id', [ 'type' => 'message' ] );
37
- $emails = $pagination_controller->get_items();
38
-
39
  ?>
40
 
41
  <div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
@@ -55,7 +54,7 @@ $emails = $pagination_controller->get_items();
55
 
56
  <a href="<?php echo $this->get_admin_page_url('composer'); ?>" class="button-primary"><?php _e('New newsletter', 'newsletter') ?></a>
57
 
58
- <?php $controls->button_confirm('delete_selected', __('Delete selected newsletters', 'newsletter')); ?>
59
 
60
  <?php $pagination_controller->display_paginator(); ?>
61
 
@@ -77,8 +76,7 @@ $emails = $pagination_controller->get_items();
77
  </thead>
78
 
79
  <tbody>
80
- <?php
81
- foreach ($emails as $email) { ?>
82
  <tr>
83
  <td><input type="checkbox" class="tnp-selector" name="ids[]" value="<?php echo $email->id; ?>"/></td>
84
  <td><?php echo $email->id; ?></td>
@@ -94,19 +92,22 @@ $emails = $pagination_controller->get_items();
94
  <?php $this->show_email_status_label($email) ?>
95
  </td>
96
  <td>
97
- <?php $this->show_email_progress_bar($email, array('numbers'=>true)) ?>
98
  </td>
99
  <td><?php if ($email->status == 'sent' || $email->status == 'sending') echo $this->format_date($email->send_on); ?></td>
100
  <td>
101
  <?php echo $this->get_edit_button($email) ?>
102
  </td>
103
 
104
- <td>
105
- <a class="button-primary" href="<?php echo NewsletterStatistics::instance()->get_statistics_url($email->id); ?>"><i class="fas fa-chart-bar"></i> <?php _e('Statistics', 'newsletter') ?></a>
 
 
 
 
 
 
106
  </td>
107
- <td><a class="button-primary" target="_blank" rel="noopener" href="<?php echo home_url('/')?>?na=view&id=<?php echo $email->id; ?>"><i class="fas fa-eye"></i>&nbsp;<?php _e('View', 'newsletter')?></a></td>
108
- <td><?php $controls->button_copy($email->id); ?></td>
109
- <td><?php $controls->button_delete($email->id); ?></td>
110
  </tr>
111
  <?php } ?>
112
  </tbody>
33
  $controls->messages .= $r . ' message(s) deleted';
34
  }
35
 
36
+ $pagination_controller = new TNP_Pagination_Controller(NEWSLETTER_EMAILS_TABLE, 'id', ['type' => 'message']);
37
+ $emails = $pagination_controller->get_items();
 
38
  ?>
39
 
40
  <div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
54
 
55
  <a href="<?php echo $this->get_admin_page_url('composer'); ?>" class="button-primary"><?php _e('New newsletter', 'newsletter') ?></a>
56
 
57
+ <?php $controls->button_confirm('delete_selected', __('Delete selected newsletters', 'newsletter')); ?>
58
 
59
  <?php $pagination_controller->display_paginator(); ?>
60
 
76
  </thead>
77
 
78
  <tbody>
79
+ <?php foreach ($emails as $email) { ?>
 
80
  <tr>
81
  <td><input type="checkbox" class="tnp-selector" name="ids[]" value="<?php echo $email->id; ?>"/></td>
82
  <td><?php echo $email->id; ?></td>
92
  <?php $this->show_email_status_label($email) ?>
93
  </td>
94
  <td>
95
+ <?php $this->show_email_progress_bar($email, array('numbers' => true)) ?>
96
  </td>
97
  <td><?php if ($email->status == 'sent' || $email->status == 'sending') echo $this->format_date($email->send_on); ?></td>
98
  <td>
99
  <?php echo $this->get_edit_button($email) ?>
100
  </td>
101
 
102
+ <td style="white-space: nowrap">
103
+ <?php $controls->button_icon_statistics(NewsletterStatistics::instance()->get_statistics_url($email->id)) ?>
104
+ <?php $controls->button_icon_view(home_url('/') . '?na=view&id=' . $email->id) ?>
105
+ </td>
106
+
107
+ <td style="white-space: nowrap">
108
+ <?php $controls->button_icon_copy($email->id); ?>
109
+ <?php $controls->button_icon_delete($email->id); ?>
110
  </td>
 
 
 
111
  </tr>
112
  <?php } ?>
113
  </tbody>
emails/new.php CHANGED
@@ -109,6 +109,21 @@ if ($controls->is_action('create')) {
109
  $controls->data['id'] = $theme_id;
110
  }
111
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
  <div class="wrap tnp-emails tnp-emails-new" id="tnp-wrap">
114
 
109
  $controls->data['id'] = $theme_id;
110
  }
111
  ?>
112
+ <style>
113
+ #tnp-body .tnp-emails-theme-options {
114
+ background-color: #fff;
115
+ padding: 10px;
116
+ margin-top: 14px;
117
+ }
118
+
119
+ #tnp-body .tnp-emails-theme-options table.form-table {
120
+ margin: 0;
121
+ }
122
+
123
+ #tnp-body .tnp-emails-theme-options h3 {
124
+ color: #000;
125
+ }
126
+ </style>
127
 
128
  <div class="wrap tnp-emails tnp-emails-new" id="tnp-wrap">
129
 
emails/subjects.php CHANGED
@@ -3,10 +3,6 @@
3
  jQuery("#tnp-edit-subjects").show();
4
  }
5
 
6
- function tnp_emoji() {
7
- jQuery("#tnp-edit-emoji").show();
8
- }
9
-
10
  jQuery(function () {
11
  jQuery("#tnp-edit-subjects-list a").click(function (e) {
12
  e.preventDefault();
@@ -15,12 +11,6 @@
15
  jQuery("#tnp-edit-subjects").hide();
16
  });
17
 
18
- jQuery("#tnp-edit-emoji-list a").click(function (e) {
19
- e.preventDefault();
20
- document.getElementById("options-subject").value = this.title + document.getElementById("options-subject").value;
21
- jQuery("#tnp-edit-emoji").hide();
22
- });
23
-
24
  jQuery(".tnp-popup-close").click(function () {
25
  jQuery(this).parent().parent().hide();
26
 
3
  jQuery("#tnp-edit-subjects").show();
4
  }
5
 
 
 
 
 
6
  jQuery(function () {
7
  jQuery("#tnp-edit-subjects-list a").click(function (e) {
8
  e.preventDefault();
11
  jQuery("#tnp-edit-subjects").hide();
12
  });
13
 
 
 
 
 
 
 
14
  jQuery(".tnp-popup-close").click(function () {
15
  jQuery(this).parent().parent().hide();
16
 
emails/tnp-composer/_css/newsletter-builder-v2.css CHANGED
@@ -523,15 +523,6 @@ iframe#tnpc-mobile-preview {
523
  color: #E74C3C;
524
  }
525
 
526
- .tnpc-edit-box-content-field .iris-square {
527
- margin-right: 10px;
528
- }
529
-
530
- .tnpc-edit-box-content-field .iris-picker .iris-slider {
531
- height: 100% !important;
532
- }
533
-
534
-
535
 
536
  /* Tnp Composer Preview */
537
 
523
  color: #E74C3C;
524
  }
525
 
 
 
 
 
 
 
 
 
 
526
 
527
  /* Tnp Composer Preview */
528
 
emails/tnp-composer/_css/newsletter-builder-v2.min.css DELETED
@@ -1 +0,0 @@
1
- #wpbody-content{padding-bottom:15px}#newsletter-builder{height:calc(100vh - 120px);display:flex;flex-flow:row;position:relative;overflow:hidden;box-sizing:border-box}#newsletter-builder-area{display:flex;flex-flow:column;background-color:#fff;width:800px;box-sizing:border-box;border-radius:10px;overflow:hidden;float:left}#newsletter-builder-sidebar{display:flex;flex-flow:column;width:450px;background-color:#ecf0f1;margin-left:20px;overflow-y:scroll;position:relative}#tnpc-subject-wrap{border-bottom:1px solid #ccc;padding-bottom:20px;padding-top:20px;padding-left:20px}#tnpc-subject-wrap th{color:#999;font-size:14px;font-weight:normal!important;text-align:right;padding-right:10px;padding-bottom:10px;vertical-align:middle}#tnpc-subject-wrap td{color:#000;font-size:14px;font-weight:normal!important;text-align:left;padding-right:10px;padding-bottom:10px;vertical-align:middle}#tnpc-subject input[type=text]{width:550px;font-size:16px;margin-right:15px;border:1px solid #ddd}#tnpc-subject i{font-size:18px}.tnp-composer-heading{background-color:#0073aa;border-radius:0!important;position:fixed;bottom:0;right:0;left:56px;z-index:1000}.tnp-composer-heading h2{display:inline-block;margin-left:30px!important;text-transform:none!important;font-weight:400!important}.tnp-composer-heading a{display:inline-block;margin-left:30px}.tnp-composer-heading form{display:inline-block;margin-left:30px}.tnp-composer-heading img{width:50px;vertical-align:middle}#newsletter-builder-sidebar h4{color:#868686;font-family:Montserrat,sans-serif;font-weight:300;border-bottom:1px solid #fff;padding-bottom:10px}#newsletter-builder-sidebar .newsletter-sidebar-add-buttons img{width:150px;height:auto}.newsletter-sidebar-add-buttons{border-radius:4px;padding:5px;margin:5px}.tnp-body-lite{background-color:#fff!important}.newsletter-sidebar-buttons-content-tab{margin:1px;position:relative;display:inline-block}.newsletter-sidebar-buttons-content-tab:hover{cursor:move}.newsletter-sidebar-buttons-content-tab:hover img{opacity:.8}.newsletter-sidebar-buttons-content-tab:hover .newsletter-sidebar-buttons-content-tab-add{opacity:.5}.newsletter-sidebar-buttons-content-tab-add{height:100%;width:100%;background-color:rgba(70,70,70,1);position:absolute;left:0;top:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;z-index:2;opacity:0;text-align:center;line-height:inherit;color:white}.newsletter-sidebar-buttons-content-tab-add:hover{background-color:rgba(0,0,0,1)}#newsletter-builder-area-center-frame-content{min-height:50px;padding-bottom:75px;background-color:#ecf0f1;padding-top:30px;overflow-y:scroll}#newsletter-mobile-preview-area{margin-left:30px;box-sizing:border-box;margin-top:30px;text-align:center;border:1px solid #ddd;border-radius:10px;padding-left:10px;padding-right:10px;padding-top:10px}#newsletter-mobile-preview-area input{width:100px}iframe#tnpc-mobile-preview{height:550px;box-sizing:border-box;width:320px;border-radius:10px;margin-top:20px;margin-left:20px;background-color:#f6f8fd}.tnpc-row{-webkit-transition:box-shadow .5s;-moz-transition:box-shadow .5s;-o-transition:box-shadow .5s;transition:box-shadow .5s;position:relative}.tnpc-row:hover{cursor:move;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.2);box-shadow:0 0 20px 0 rgba(0,0,0,0.2)}.tnpc-row.ui-sortable-helper{max-width:700px!important}.tnpc-row-delete,.tnpc-row-edit-block,.tnpc-row-clone{height:30px;width:30px;top:0;background-color:rgba(255,255,255,0.5);z-index:5;position:absolute;color:rgba(102,102,102,1);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;opacity:0;text-align:center;font-size:18px}.tnpc-row-delete i,.tnpc-row-edit-block i,.tnpc-row-clone i{line-height:30px}.tnpc-row-delete:hover{background-color:#e74c3c;cursor:pointer;color:rgba(255,255,255,1)}.tnpc-row:hover .tnpc-row-delete,.tnpc-row:hover .tnpc-row-edit-block,.tnpc-row:hover .tnpc-row-clone{opacity:1}.tnpc-row-delete{right:0;z-index:5}.tnpc-row-edit-block{right:60px}.tnpc-row-edit-block:hover{background-color:#e0e0e0;cursor:pointer;color:rgba(0,0,0,1)}.tnpc-row-clone{right:30px}.tnpc-row-clone:hover{background-color:#e0e0e0;cursor:pointer;color:rgba(0,0,0,1)}.tnpc-row-edit{position:relative}.tnpc-row-edit-hover{height:100%;width:100%;background-color:rgba(63,141,191,0.8);position:absolute;left:0;top:0;cursor:default;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s}.tnpc-row-edit-hover i{position:absolute;height:30px;width:30px;line-height:30px;left:50%;top:50%;text-align:center;margin-top:-15px;margin-left:-15px;color:rgba(255,255,255,1);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;font-size:16px}.tnpc-row-edit-hover i:hover{background-color:rgba(0,0,0,0.5);cursor:pointer}.tnpc-drop-here{padding:10px;text-align:center}.tnpc-edit{height:100vh;width:100vw;z-index:10;display:none;position:absolute;top:0;left:0}.tnpc-edit-box-title{width:100%;font-size:29px;color:#666;font-weight:300;margin-bottom:40px}.tnpc-edit-box-content{width:100%;margin-top:10px}.tnpc-edit-box-content-text{width:100%;font-size:15px;color:#666;font-weight:600;margin:15px 0 10px;text-transform:uppercase}.tnpc-edit-box-content-text span{font-size:11px;color:#95a5a6;background-color:#d3eadc;padding:2px 5px;text-transform:none;border-radius:5px}.tnpc-edit-box-content-field{width:100%}.tnpc-edit-box-content-field-input{height:33px;width:380px;border:none!important;outline:0;font-family:inherit;padding-right:10px;font-size:15px;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;color:rgba(102,102,102,1);margin-bottom:10px}.tnpc-edit-box-content-field-input:focus{-webkit-box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2);-moz-box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2);box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2)}.tnpc-edit-box-content-field-textarea{height:180px;width:380px;border:1px solid rgba(204,204,204,1);outline:0;font-family:inherit;font-size:15px;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;color:rgba(102,102,102,1);resize:none;padding:10px}.tnpc-edit-box-content-field-textarea:focus{-webkit-box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2);-moz-box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2);box-shadow:inset 0 0 10px 0 rgba(0,0,0,0.2)}.tnpc-edit-box-content-icons{height:388px;width:388px;border:1px solid rgba(204,204,204,1);margin-top:15px;overflow-y:scroll}.tnpc-edit-box-content-icons i{line-height:50px;background-color:rgba(225,225,225,1);height:50px;width:50px;margin-top:10px;margin-left:10px;text-align:center;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s;font-size:28px;color:rgba(51,51,51,1)}.tnpc-edit-box-content-icons i:hover{cursor:pointer;background-color:rgba(153,153,153,1);-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;color:rgba(0,0,0,1)}.tnpc-edit-box-buttons{margin-top:10px;text-align:right;margin-right:10px}.tnpc-edit-box-buttons-save{height:35px;text-align:right;line-height:35px;color:#27ae60;font-weight:600;font-size:15px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-transition:background .5s;-moz-transition:background .5s;-o-transition:background .5s;transition:background .5s;cursor:pointer;display:inline-block}.tnpc-edit-box-buttons-save:hover{color:#2ecc71}.tnpc-edit-box-buttons-cancel{height:35px;text-align:right;line-height:35px;color:#666;font-weight:normal;font-size:15px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-transition:background .5s;-moz-transition:background .5s;-o-transition:background .5s;transition:background .5s;cursor:pointer;display:inline-block;margin-right:25px}.tnpc-edit-box-buttons-cancel:hover{color:#e74c3c}.tnpc-edit-box-content-field .iris-square{margin-right:10px}.tnpc-edit-box-content-field .iris-picker .iris-slider{height:100%!important}.tnpc-subject a{font-family:Source Sans Pro;font-weight:700;text-transform:uppercase;text-decoration:none;background-color:#3498db;color:white;padding:2px 10px;border-radius:10px;font-size:13px;letter-spacing:.1em}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnpc-html-editor{height:600px;border-top:20px solid #323232;border-radius:8px}.tnp-select2-option img{height:15px;margin-right:5px;vertical-align:middle;background-color:rgba(234,234,234,0.25);padding:10px;border-radius:5px}#tnpc-block-options{z-index:10;flex-flow:column;display:none;position:absolute;top:0;left:0;bottom:0;right:0;background-color:#ecf0f1;padding:0}#tnpc-block-options-buttons{padding:20px;text-align:right;background-color:#ecf0f1;height:70px;border-bottom:1px solid #fff}#tnpc-block-options-form{background-color:#fff;padding:15px;margin-top:0;overflow-y:scroll}#tnpc-block-options-form,#tnpc-block-options-form p{color:#444;background-color:#ecf0f1!important}#tnpc-block-options-form h3{color:#000}#tnpc-block-options-form table.form-table th{width:100%;vertical-align:top;float:left;font-weight:normal;text-transform:uppercase;font-size:13px;padding-top:10px;padding-bottom:5px;padding-left:0;padding-right:0}#tnpc-block-options-form table.form-table td{float:left;padding:0;margin:0;border:0;width:100%}#tnpc-block-options-form table.form-table{margin:0;border-collapse:separate!important;border-spacing:1px!important}#tnpc-block-options-form table.form-table table.tnp-button-colors{border:0;border-collapse:collapse}#tnpc-block-options-form table.form-table table.tnp-button-colors td{border:0;padding-top:0}.tnpc-tabs{background-color:#fff;font-family:Montserrat,sans-serif}.tnpc-tabs button{background-color:inherit;float:left;border:0;outline:0;cursor:pointer;padding:14px 16px;transition:.3s;color:#6a8ba0}.tnpc-tabs button:hover{background-color:#ddd}.tnpc-tabs button.active{background-color:#ecf0f1;color:#3498db}.tabcontent{display:none;padding:6px 12px;border-top:0}.tnpc-controls{text-align:right}.tnpc-logo{float:left}.tnpc-logo p{font-family:Montserrat,Sans-serif;color:#fff!important;font-size:16px;margin-left:20px!important;margin-top:5px!important}#tnpc-general-options select{box-shadow:none;border-radius:0;border:0;margin-right:5px}.tnpc-block-options-warning{background-color:#def9e9;padding:10px 15px}.tnpc-presets-title{padding:0 20px 25px;font-size:21px;margin-bottom:30px;color:#484848;border-bottom:3px solid white}.tnpc-preset{float:left;margin:15px;cursor:pointer;width:150px;height:263px;background:white;border-radius:8px;box-shadow:0 0 2px 0 #dee3e4;position:relative}.tnpc-preset:hover{box-shadow:0 0 8px 8px #dee3e4}.tnpc-preset-label{position:absolute;top:200px;left:50%;text-align:center;transform:translate(-50%,-50%);font-size:14px;width:80%}.tnpc-inline-editable{cursor:text}.tnpc-inline-editable{cursor:text;position:relative}.tnpc-inline-editable:hover{color:#EEE!important}.tnpc-inline-editable:hover:after{content:'';cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.2);opacity:1;border-radius:2px}.tnpc-inline-editable:hover:before{content:'\f464';font-family:dashicons;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:32px;height:32px;font-size:32px;line-height:32px;color:#333}.tnpc-inline-editable-form{position:relative;margin-top:25px}.tnpc-inline-editable-form textarea,.tnpc-inline-editable-form input{width:95%;margin-left:20px}.two-columns .tnpc-inline-editable-form-actions{right:0}.tnpc-inline-editable-form input{padding:5px;font-size:25px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;color:#333;line-height:normal}.tnpc-inline-editable-form-actions{position:absolute;top:-25px;right:5px;display:flex;align-items:center;flex-wrap:wrap}.tnpc-inline-editable-form-actions button{background:0;padding:0;border:0}.tnpc-inline-editable-form-actions span{display:block;font-size:25px;color:#333;cursor:pointer}.tnpc-inline-editable-form-actions span:first-child{margin-right:5px}
 
emails/tnp-composer/_css/newsletter-builder.css CHANGED
@@ -456,15 +456,6 @@ iframe#tnpc-mobile-preview {
456
  color: #E74C3C;
457
  }
458
 
459
- .tnpc-edit-box-content-field .iris-square {
460
- margin-right: 10px;
461
- }
462
-
463
- .tnpc-edit-box-content-field .iris-picker .iris-slider {
464
- height: 100% !important;
465
- }
466
-
467
-
468
 
469
  /* Tnp Composer Preview */
470
 
456
  color: #E74C3C;
457
  }
458
 
 
 
 
 
 
 
 
 
 
459
 
460
  /* Tnp Composer Preview */
461
 
emails/tnp-composer/_scripts/newsletter-builder-v2.min.js DELETED
@@ -1,26 +0,0 @@
1
- jQuery.fn.add_delete=function(){this.append('<div class="tnpc-row-delete" title="Delete"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/delete.png" width="32"></div>');this.find(".tnpc-row-delete").perform_delete()};jQuery.fn.perform_delete=function(){this.click(function(){jQuery("#tnpc-block-options").hide();jQuery(this).parent().remove();tnpc_mobile_preview()})};
2
- jQuery.fn.add_block_edit=function(){this.append('<div class="tnpc-row-edit-block" title="Edit"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/edit.png" width="32"></div>');this.find(".tnpc-row-edit-block").perform_block_edit()};jQuery.fn.add_block_clone=function(){this.append('<div class="tnpc-row-clone" title="Clone"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/copy.png" width="32"></div>');this.find(".tnpc-row-clone").perform_clone()};let start_options=null,container=null;
3
- jQuery.fn.perform_block_edit=function(){jQuery(".tnpc-row-edit-block").click(function(a){a.preventDefault()});this.click(function(a){a.preventDefault();target=jQuery(this).parent().find(".edit-block");container=jQuery(this).closest("table");container.hasClass("tnpc-row-block")?(jQuery("#newsletter-builder-sidebar").css("overflow-y","hidden"),jQuery("#tnpc-block-options").css("display","flex"),(a=container.find(".tnpc-block-content").attr("data-json"))||(a=target.attr("data-options")),jQuery("#tnpc-block-options-form").load(ajaxurl,
4
- {action:"tnpc_options",id:container.data("id"),context_type:tnp_context_type,options:a},function(){start_options=jQuery("#tnpc-block-options-form").serialize();tnp_controls_init();start_options=jQuery("#tnpc-block-options-form").serializeArray();tnpc_add_global_options(start_options)})):alert("This is deprecated block version and cannot be edited. Please replace it with a new one.")})};
5
- jQuery.fn.perform_clone=function(){jQuery(".tnpc-row-clone").click(function(a){a.preventDefault()});this.click(function(a){a.preventDefault();jQuery("#tnpc-block-options").hide();a=jQuery(this).closest(".tnpc-row");let b=a.clone();b.find(".tnpc-row-delete").remove();b.find(".tnpc-row-edit-block").remove();b.find(".tnpc-row-clone").remove();b.add_delete();b.add_block_edit();b.add_block_clone();b.insertAfter(a);tnpc_mobile_preview()})};
6
- jQuery(function(){function a(a){jQuery("#newsletter-builder-area-center-frame-content").css("background-color",a)}jQuery("body").addClass("folded");document.getElementById("defaultOpen").click();var b=jQuery('input[name="message"]').val();b||(b=jQuery('input[name="options[message]"]').val());b?(jQuery("#newsletter-builder-area-center-frame-content").html(b),start_composer()):tnpc_show_presets();jQuery("#options-title").val(jQuery('#tnpc-form input[name="options[subject]"]').val());a(document.getElementById("options-options_composer_background").value);
7
- jQuery("#options-options_composer_background").on("change",function(b){a(b.target.value)})});
8
- function start_composer(){jQuery("#newsletter-builder-area-center-frame-content").sortable({revert:!1,placeholder:"placeholder",forcePlaceholderSize:!0,opacity:.6,tolerance:"pointer",helper:function(a){return jQuery(document.getElementById("sortable-helper")).clone()},update:function(a,b){"draggable-helper"==b.item.attr("id")?(loading_row=jQuery('<div style="text-align: center; padding: 20px; background-color: #d4d5d6; color: #52BE7F;"><i class="fa fa-cog fa-2x fa-spin" /></div>'),b.item.before(loading_row),
9
- b.item.remove(),a=[{name:"action",value:"tnpc_render"},{name:"b",value:b.item.data("id")},{name:"full",value:1},{name:"_wpnonce",value:tnp_nonce}],tnpc_add_global_options(a),console.log(a),jQuery.post(ajaxurl,a,function(a){new_row=jQuery(a);loading_row.before(new_row);loading_row.remove();new_row.add_delete();new_row.add_block_edit();new_row.add_block_clone();new_row.hasClass("tnpc-row-block")&&new_row.find(".tnpc-row-edit-block").click();tnpc_mobile_preview()}).fail(function(){alert("Block rendering failed.");
10
- loading_row.remove()})):tnpc_mobile_preview()}});jQuery(".newsletter-sidebar-buttons-content-tab").draggable({connectToSortable:"#newsletter-builder-area-center-frame-content",helper:function(a){var b=jQuery(document.getElementById("draggable-helper")).clone();b.attr("data-id",a.currentTarget.dataset.id);b.html(a.currentTarget.dataset.name);return b},revert:!1,start:function(){jQuery(".tnpc-row").length||jQuery("#newsletter-builder-area-center-frame-content").append('<div class="tnpc-drop-here">Drag&Drop blocks here!</div>')},
11
- stop:function(a,b){jQuery(".tnpc-drop-here").remove()}});jQuery("#tnpc-block-options-cancel").click(function(){jQuery(this).parent().parent().fadeOut(500);jQuery("#newsletter-builder-sidebar").css("overflow-y","auto");jQuery.post(ajaxurl,start_options,function(a){target.html(a);jQuery("#tnpc-block-options-form").html("")})});jQuery("#tnpc-block-options-save").click(function(a){a.preventDefault();jQuery("#newsletter-builder-sidebar").css("overflow-y","auto");"undefined"!==typeof templateEditor&&templateEditor.save();
12
- window.tinymce&&window.tinymce.triggerSave();jQuery("#tnpc-block-options").fadeOut(500);a=jQuery("#tnpc-block-options-form").serializeArray();tnpc_add_global_options(a);jQuery.post(ajaxurl,a,function(a){target.html(a);tnpc_mobile_preview();jQuery("#tnpc-block-options-form").html("")})});jQuery("#tnpc-block-options-form").change(function(a){var b=jQuery("#tnpc-block-options-form").serializeArray();tnpc_add_global_options(b);jQuery.post(ajaxurl,b,function(b){target.html(b);"reload"===a.target.dataset.afterRendering&&
13
- container.find(".tnpc-row-edit-block").click()}).fail(function(){alert("Block rendering failed")})});jQuery(".tnpc-row").add_delete();jQuery(".tnpc-row").add_block_edit();jQuery(".tnpc-row").add_block_clone();tnpc_mobile_preview()}
14
- function tnpc_mobile_preview(){var a=document.getElementById("tnpc-mobile-preview").contentWindow.document;a.open();a.write("<!DOCTYPE html>\n<html>\n<head>\n");a.write("<link rel='stylesheet' href='"+TNP_HOME_URL+"?na=emails-composer-css&ver="+Math.random()+"' type='text/css'>");a.write("<style>.tnpc-row-delete, .tnpc-row-edit-block, .tnpc-row-clone { display: none; }</style>");a.write("<style>body::-webkit-scrollbar {width: 0px;background: transparent;}</style>");a.write("<style>body{scrollbar-width: none; -ms-overflow-style: none;}</style>");
15
- a.write("</head>\n<body style='margin: 0; padding: 0;'><div style='width: 320px!important'>");a.write(jQuery("#newsletter-builder-area-center-frame-content").html());a.write("</div>\n</body>\n</html>");a.close()}
16
- function tnpc_save(a){jQuery("#newsletter-preloaded-export").html(jQuery("#newsletter-builder-area-center-frame-content").html());jQuery("#newsletter-preloaded-export .tnpc-row-delete").remove();jQuery("#newsletter-preloaded-export .tnpc-row-edit-block").remove();jQuery("#newsletter-preloaded-export .tnpc-row-clone").remove();jQuery("#newsletter-preloaded-export .tnpc-row").removeClass("ui-draggable");jQuery("#newsletter-preloaded-export #sortable-helper").remove();a.elements["options[message]"].value=
17
- jQuery("#newsletter-preloaded-export").html();document.getElementById("options-title")?a.elements["options[subject]"].value=jQuery("#options-title").val():a.elements["options[subject]"].value="";var b=document.getElementById("tnpc-global-styles-form");tnpc_copy_form(b,a);jQuery("#newsletter-preloaded-export").html(" ")}
18
- function tnpc_copy_form(a,b){for(var c=0;c<a.elements.length;c++){var d=document.createElement("input");d.type="hidden";d.name=a.elements[c].name;d.value=a.elements[c].value;b.appendChild(d)}}function tnpc_test(){let a=document.getElementById("tnpc-form");tnpc_save(a);a.act.value="test";a.submit()}
19
- function openTab(a,b){a.preventDefault();var c;var d=document.getElementsByClassName("tabcontent");for(c=0;c<d.length;c++)d[c].style.display="none";d=document.getElementsByClassName("tablinks");for(c=0;c<d.length;c++)d[c].className=d[c].className.replace(" active","");document.getElementById(b).style.display="block";a.currentTarget.className+=" active"}
20
- function tnpc_show_presets(){jQuery(".tnpc-controls input").attr("disabled",!0);jQuery("#newsletter-builder-area-center-frame-content").load(ajaxurl,{action:"tnpc_presets"})}function tnpc_load_preset(a){jQuery("#newsletter-builder-area-center-frame-content").load(ajaxurl,{action:"tnpc_presets",id:a},function(){start_composer();jQuery(".tnpc-controls input").attr("disabled",!1)})}function tnpc_scratch(){jQuery("#newsletter-builder-area-center-frame-content").html(" ");start_composer()}
21
- function tnpc_reload_options(a){a.preventDefault();a=jQuery("#tnpc-block-options-form").serializeArray();for(let b=0;b<a.length;b++)"action"===a[b].name&&(a[b].value="tnpc_options");jQuery("#tnpc-block-options-form").load(ajaxurl,a)}function tnpc_add_global_options(a){let b=jQuery("#tnpc-global-styles-form").serializeArray();for(let c=0;c<b.length;c++)b[c].name=b[c].name.replace("[options_","[").replace("options[","composer[").replace("composer_",""),a.push(b[c])}
22
- jQuery(document).ready(function(){(function(){function a(){d.forEach(function(a){a.originalEl.show();a.newEl.off();a.newEl.remove()});d=[]}function b(a,b,c){var d="";switch(c){case "text":d="<textarea name='new_name' class='tnpc-inline-editable-textarea' rows='5'>"+a+"</textarea>";break;case "title":d="<textarea name='new_name' class='tnpc-inline-editable-textarea' rows='2'>"+a+"</textarea>"}var e="<td>"+("<form class='tnpc-inline-editable-form tnpc-inline-editable-form-"+c+b+"'>")+("<input type='hidden' name='id' value='"+
23
- b+"'>")+("<input type='hidden' name='type' value='"+c+"'>");e+="<input type='hidden' name='old_value' value='"+a+"'>";e+="<div class='tnpc-inline-editable-container'>";e+=d;e+="<div class='tnpc-inline-editable-form-actions'>";e+="<button type='submit'><span class='dashicons dashicons-yes-alt' title='save'></span></button>";e=e+("<span class='dashicons dashicons-dismiss tnpc-dismiss-"+c+b+"' title='close'></span>")+"</div></div>";e+="</form>";return e+="</td>"}function c(a,b,c,d){var e=a.closest(".edit-block");
24
- a=e.closest("table");var f=e.children(".tnpc-block-content");a.hasClass("tnpc-row-block")&&(b={action:"tnpc_render",b:a.data("id"),full:1,_wpnonce:tnp_nonce,options:{inline_edits:[{type:b,post_id:c,content:d}]},encoded_options:f.data("json")},tnpc_add_global_options(b),jQuery.post(ajaxurl,b,function(a){new_row=jQuery(a);e.before(new_row);e.remove();new_row.add_delete();new_row.add_block_edit();new_row.add_block_clone();new_row.hasClass("tnpc-row-block")&&new_row.find(".tnpc-row-edit-block").click();
25
- tnpc_mobile_preview()}).fail(function(){alert("Block rendering failed.")}))}var d=[];return{init:function(){jQuery("#newsletter-builder-area-center-frame-content").on("click",".tnpc-inline-editable",function(g){g.preventDefault();a();var h=jQuery(this).hide(),f=jQuery(b(this.innerText.trim(),this.dataset.id,this.dataset.type)).insertAfter(this);d.push({originalEl:h,newEl:f});jQuery(".tnpc-inline-editable-form-"+this.dataset.type+this.dataset.id).on("submit",function(a){var b=jQuery(h);a.preventDefault();
26
- a=f.find("form input[name=id]").val();var d=f.find("form input[name=type]").val(),g=f.find('form [name="new_name"]').val();c(b,d,a,g);f.remove();b.show()});jQuery(".tnpc-inline-editable-form-actions .tnpc-dismiss-"+this.dataset.type+this.dataset.id).on("click",function(b){a()})});jQuery("#newsletter-builder-area-center-frame-content").on("click",function(b){0<d.length&&!jQuery(b.target).hasClass("tnpc-inline-editable")&&0===jQuery(b.target).closest(".tnpc-inline-editable-container").length&&a()})}}})().init()});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
emails/tnp-composer/_scripts/newsletter-builder.js CHANGED
@@ -45,8 +45,6 @@ jQuery.fn.perform_block_edit = function () {
45
  jQuery("#tnpc-edit-block .bgcolor").val(target.css("background-color"));
46
  jQuery("#tnpc-edit-block .font").val(target.css("font-family"));
47
 
48
- //jQuery('.bgcolor').wpColorPicker().iris('color', target.css("background-color"));
49
-
50
  // The row container which is a global variable and used later after the options save
51
  container = jQuery(this).closest("table");
52
 
45
  jQuery("#tnpc-edit-block .bgcolor").val(target.css("background-color"));
46
  jQuery("#tnpc-edit-block .font").val(target.css("font-family"));
47
 
 
 
48
  // The row container which is a global variable and used later after the options save
49
  container = jQuery(this).closest("table");
50
 
emails/tnp-composer/_scripts/newsletter-builder.min.js DELETED
@@ -1,18 +0,0 @@
1
- jQuery.fn.add_delete=function(){this.append('<div class="tnpc-row-delete" title="Delete"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/delete.png" width="32"></div>');this.find(".tnpc-row-delete").perform_delete()};jQuery.fn.perform_delete=function(){this.click(function(){jQuery("#tnpc-block-options").hide();jQuery(this).parent().remove();tnpc_mobile_preview()})};
2
- jQuery.fn.add_block_edit=function(){this.append('<div class="tnpc-row-edit-block" title="Edit"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/edit.png" width="32"></div>');this.find(".tnpc-row-edit-block").perform_block_edit()};jQuery.fn.add_block_clone=function(){this.append('<div class="tnpc-row-clone" title="Clone"><img src="'+TNP_PLUGIN_URL+'/emails/tnp-composer/_assets/copy.png" width="32"></div>');this.find(".tnpc-row-clone").perform_clone()};let start_options=null,container=null;
3
- jQuery.fn.perform_block_edit=function(){jQuery(".tnpc-row-edit-block").click(function(a){a.preventDefault()});this.click(function(a){a.preventDefault();target=jQuery(this).parent().find(".edit-block");jQuery("#tnpc-edit-block .bgcolor").val(target.css("background-color"));jQuery("#tnpc-edit-block .font").val(target.css("font-family"));jQuery(".bgcolor").wpColorPicker().iris("color",target.css("background-color"));container=jQuery(this).closest("table");container.hasClass("tnpc-row-block")?(jQuery("#tnpc-block-options").fadeIn(500),
4
- (a=container.find(".tnpc-block-content").attr("data-json"))||(a=target.attr("data-options")),jQuery("#tnpc-block-options-form").load(ajaxurl,{action:"tnpc_options",id:container.data("id"),context_type:tnp_context_type,options:a},function(){start_options=jQuery("#tnpc-block-options-form").serialize()})):alert("This is deprecated block version and cannot be edited. Please replace it with a new one.")})};
5
- jQuery.fn.perform_clone=function(){jQuery(".tnpc-row-clone").click(function(a){a.preventDefault()});this.click(function(a){a.preventDefault();jQuery("#tnpc-block-options").hide();a=jQuery(this).closest(".tnpc-row");let b=a.clone();b.find(".tnpc-row-delete").remove();b.find(".tnpc-row-edit-block").remove();b.find(".tnpc-row-clone").remove();b.add_delete();b.add_block_edit();b.add_block_clone();b.insertAfter(a);tnpc_mobile_preview()})};
6
- jQuery(function(){jQuery("body").addClass("folded");document.getElementById("defaultOpen").click();var a=jQuery('input[name="body"]').val();a||(a=jQuery('input[name="options[body]"]').val());a?(jQuery("#newsletter-builder-area-center-frame-content").html(a),start_composer()):tnpc_show_presets();jQuery("#options-title").val(jQuery('#tnpc-form input[name="options[subject]"]').val())});
7
- function start_composer(){jQuery("#newsletter-builder-area-center-frame-content").sortable({revert:!1,placeholder:"placeholder",forcePlaceholderSize:!0,opacity:.6,tolerance:"pointer",helper:function(a){return jQuery(document.getElementById("sortable-helper")).clone()},update:function(a,b){"draggable-helper"==b.item.attr("id")?(loading_row=jQuery('<div style="text-align: center; padding: 20px; background-color: #d4d5d6; color: #52BE7F;"><i class="fa fa-cog fa-2x fa-spin" /></div>'),b.item.before(loading_row),
8
- b.item.remove(),a={action:"tnpc_render",b:b.item.data("id"),full:1},jQuery.post(ajaxurl,a,function(a){new_row=jQuery(a);loading_row.before(new_row);loading_row.remove();new_row.add_delete();new_row.add_block_edit();new_row.add_block_clone();new_row.hasClass("tnpc-row-block")&&new_row.find(".tnpc-row-edit-block").click();tnpc_mobile_preview()}).fail(function(){alert("Block rendering failed.");loading_row.remove()})):tnpc_mobile_preview()}});jQuery(".newsletter-sidebar-buttons-content-tab").draggable({connectToSortable:"#newsletter-builder-area-center-frame-content",
9
- helper:function(a){var b=jQuery(document.getElementById("draggable-helper")).clone();b.attr("data-id",a.currentTarget.dataset.id);b.html(a.currentTarget.dataset.name);return b},revert:!1,start:function(){jQuery(".tnpc-row").length||jQuery("#newsletter-builder-area-center-frame-content").append('<div class="tnpc-drop-here">Drag&Drop blocks here!</div>')},stop:function(a,b){jQuery(".tnpc-drop-here").remove()}});jQuery("#tnpc-block-options-cancel").click(function(){jQuery(this).parent().parent().fadeOut(500);
10
- jQuery.post(ajaxurl,start_options,function(a){target.html(a);jQuery("#tnpc-block-options-form").html("")})});jQuery("#tnpc-block-options-save").click(function(a){a.preventDefault();"undefined"!==typeof templateEditor&&templateEditor.save();window.tinymce&&window.tinymce.triggerSave();jQuery("#tnpc-block-options").fadeOut(500);a=jQuery("#tnpc-block-options-form").serialize();jQuery.post(ajaxurl,a,function(a){target.html(a);tnpc_mobile_preview();jQuery("#tnpc-block-options-form").html("")})});jQuery("#tnpc-block-options-form").change(function(a){var b=
11
- jQuery("#tnpc-block-options-form").serialize();jQuery.post(ajaxurl,b,function(b){target.html(b);"reload"===a.target.dataset.afterRendering&&container.find(".tnpc-row-edit-block").click()}).fail(function(){alert("Block rendering failed")})});jQuery(".tnpc-row").add_delete();jQuery(".tnpc-row").add_block_edit();jQuery(".tnpc-row").add_block_clone();tnpc_mobile_preview()}
12
- function tnpc_mobile_preview(){var a=document.getElementById("tnpc-mobile-preview").contentWindow.document;a.open();a.write("<!DOCTYPE html>\n<html>\n<head>\n");a.write("<link rel='stylesheet' href='"+TNP_HOME_URL+"?na=emails-composer-css&ver="+Math.random()+"' type='text/css'>");a.write("<style type='text/css'>.tnpc-row-delete, .tnpc-row-edit-block, .tnpc-row-clone { display: none; }</style>");a.write("</head>\n<body style='margin: 0; padding: 0;'><div style='width: 320px!important'>");a.write(jQuery("#newsletter-builder-area-center-frame-content").html());
13
- a.write("</div>\n</body>\n</html>");a.close()}
14
- function tnpc_save(a){jQuery("#newsletter-preloaded-export").html(jQuery("#newsletter-builder-area-center-frame-content").html());jQuery("#newsletter-preloaded-export .tnpc-row-delete").remove();jQuery("#newsletter-preloaded-export .tnpc-row-edit-block").remove();jQuery("#newsletter-preloaded-export .tnpc-row-clone").remove();jQuery("#newsletter-preloaded-export .tnpc-row").removeClass("ui-draggable");let b=jQuery("#newsletter-preloaded-export").html();b=jQuery.trim(b);let c;c='<!DOCTYPE html>\n<html>\n<head>\n<title>{email_subject}</title>\n<meta charset="utf-8">\n<meta name="viewport" content="width=device-width, initial-scale=1">\n<meta http-equiv="X-UA-Compatible" content="IE=edge">\n'+
15
- ('<style type="text/css">'+jQuery.trim(a.elements["options[css]"].value)+"</style>")+'</head>\n<body style="margin: 0; padding: 0;">\n';c=c+b+"\n</body>\n</html>";a.elements["options[body]"].value=c;a.elements["options[subject]"].value=jQuery("#options-title").val();jQuery("#newsletter-preloaded-export").html(" ")}function tnpc_test(){let a=document.getElementById("tnpc-form");tnpc_save(a);a.act.value="test";a.submit()}
16
- function openTab(a,b){a.preventDefault();var c;var d=document.getElementsByClassName("tabcontent");for(c=0;c<d.length;c++)d[c].style.display="none";d=document.getElementsByClassName("tablinks");for(c=0;c<d.length;c++)d[c].className=d[c].className.replace(" active","");document.getElementById(b).style.display="block";a.currentTarget.className+=" active"}
17
- function tnpc_show_presets(){jQuery(".tnpc-controls input").attr("disabled",!0);jQuery("#newsletter-builder-area-center-frame-content").load(ajaxurl,{action:"tnpc_presets"})}function tnpc_load_preset(a){jQuery("#newsletter-builder-area-center-frame-content").load(ajaxurl,{action:"tnpc_presets",id:a},function(){start_composer();jQuery(".tnpc-controls input").attr("disabled",!1)})}function tnpc_scratch(){jQuery("#newsletter-builder-area-center-frame-content").html(" ");start_composer()}
18
- function tnpc_reload_options(a){a.preventDefault();a=jQuery("#tnpc-block-options-form").serializeArray();for(let b=0;b<a.length;b++)"action"==a[b].name&&(a[b].value="tnpc_options");a.action="tnpc_options";a.id=container.data("id");jQuery("#tnpc-block-options-form").load(ajaxurl,a)};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
emails/tnp-composer/index-v2.php CHANGED
@@ -24,6 +24,9 @@ $blocks = array_merge(array_flip(array('header', 'content', 'footer')), $blocks)
24
  $block_options = get_option('newsletter_main');
25
 
26
  $fields = new NewsletterFields($controls);
 
 
 
27
  ?>
28
  <script type="text/javascript">
29
  // collapse wp menu
@@ -41,25 +44,35 @@ $fields = new NewsletterFields($controls);
41
  #newsletter-builder-area-center-frame-content {
42
  min-height: 300px!important;
43
  }
 
 
 
 
 
 
 
 
 
 
44
  </style>
45
 
46
  <style>
47
  <?php echo NewsletterEmails::instance()->get_composer_css(); ?>
48
  </style>
49
- <div id="newsletter-builder">
50
 
51
  <div id="newsletter-builder-area" class="tnp-builder-column">
52
 
53
  <?php if ($tnpc_show_subject) { ?>
54
- <div id="tnpc-subject-wrap">
55
  <table role="presentation" style="width: 100%">
56
  <tr>
57
- <th>From</th>
58
- <td style="text-align: left"><?php echo esc_html(Newsletter::instance()->options['sender_email']) ?></td>
59
  </tr>
60
  <tr>
61
- <th>Subject</th>
62
- <td style="text-align: left">
63
  <div id="tnpc-subject">
64
  <?php $this->subject('title'); ?>
65
  </div>
@@ -71,14 +84,14 @@ $fields = new NewsletterFields($controls);
71
  </div>
72
  <?php } ?>
73
 
74
- <div id="newsletter-builder-area-center-frame-content">
75
 
76
  <!-- Composer content -->
77
 
78
  </div>
79
  </div>
80
 
81
- <div id="newsletter-builder-sidebar">
82
 
83
  <div class="tnpc-tabs">
84
  <button class="tablinks" onclick="openTab(event, 'tnpc-blocks')" data-tab-id='tnpc-blocks' id="defaultOpen"><?php _e('Blocks', 'newsletter') ?></button>
24
  $block_options = get_option('newsletter_main');
25
 
26
  $fields = new NewsletterFields($controls);
27
+
28
+ $dir = is_rtl()?'rtl':'ltr';
29
+ $rev_dir = is_rtl()?'ltr':'rlt';
30
  ?>
31
  <script type="text/javascript">
32
  // collapse wp menu
44
  #newsletter-builder-area-center-frame-content {
45
  min-height: 300px!important;
46
  }
47
+
48
+ #tnpc-subject-wrap th[dir=rtl] {
49
+ text-align: left;
50
+ }
51
+ #tnpc-subject-wrap td[dir=rtl] {
52
+ text-align: right;
53
+ }
54
+ #tnpc-subject-wrap td[dir=rtl] #options-title {
55
+ margin-right: 0;
56
+ }
57
  </style>
58
 
59
  <style>
60
  <?php echo NewsletterEmails::instance()->get_composer_css(); ?>
61
  </style>
62
+ <div id="newsletter-builder" dir="ltr">
63
 
64
  <div id="newsletter-builder-area" class="tnp-builder-column">
65
 
66
  <?php if ($tnpc_show_subject) { ?>
67
+ <div id="tnpc-subject-wrap" dir="<?php echo $dir?>">
68
  <table role="presentation" style="width: 100%">
69
  <tr>
70
+ <th dir="<?php echo $dir?>">From</th>
71
+ <td dir="<?php echo $dir?>"><?php echo esc_html(Newsletter::instance()->options['sender_email']) ?></td>
72
  </tr>
73
  <tr>
74
+ <th dir="<?php echo $dir?>">Subject</th>
75
+ <td dir="<?php echo $dir?>">
76
  <div id="tnpc-subject">
77
  <?php $this->subject('title'); ?>
78
  </div>
84
  </div>
85
  <?php } ?>
86
 
87
+ <div id="newsletter-builder-area-center-frame-content" dir="<?php echo $dir?>">
88
 
89
  <!-- Composer content -->
90
 
91
  </div>
92
  </div>
93
 
94
+ <div id="newsletter-builder-sidebar" dir="<?php echo is_rtl()?'rtl':'ltr'?>">
95
 
96
  <div class="tnpc-tabs">
97
  <button class="tablinks" onclick="openTab(event, 'tnpc-blocks')" data-tab-id='tnpc-blocks' id="defaultOpen"><?php _e('Blocks', 'newsletter') ?></button>
includes/PHPMailerLoader.php CHANGED
@@ -1,40 +1,40 @@
1
- <?php
2
-
3
- namespace TNP\Mailer;
4
-
5
- class PHPMailerLoader {
6
-
7
- /**
8
- *
9
- */
10
- public static function load() {
11
-
12
- global $wp_version;
13
-
14
- if ( class_exists( 'PHPMailer' ) ) {
15
- return;
16
- }
17
-
18
- if ( version_compare( $wp_version, '5.4.9' ) > 0 ) {
19
- require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
20
- require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
21
- require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
22
-
23
- class_alias( \PHPMailer\PHPMailer\PHPMailer::class, 'PHPMailer' );
24
- class_alias( \PHPMailer\PHPMailer\SMTP::class, 'SMTP' );
25
- class_alias( \PHPMailer\PHPMailer\Exception::class, 'phpmailerException' );
26
- } else {
27
- require_once ABSPATH . WPINC . '/class-phpmailer.php';
28
- require_once ABSPATH . WPINC . '/class-smtp.php';
29
- }
30
-
31
- }
32
-
33
- public static function make_instance() {
34
- self::load();
35
-
36
- return new \PHPMailer( false );
37
- }
38
-
39
-
40
- }
1
+ <?php
2
+
3
+ namespace TNP\Mailer;
4
+
5
+ class PHPMailerLoader {
6
+
7
+ /**
8
+ *
9
+ */
10
+ public static function load() {
11
+
12
+ global $wp_version;
13
+
14
+ if ( class_exists( 'PHPMailer' ) ) {
15
+ return;
16
+ }
17
+
18
+ if ( version_compare( $wp_version, '5.4.9' ) > 0 ) {
19
+ require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
20
+ require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
21
+ require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
22
+
23
+ class_alias( \PHPMailer\PHPMailer\PHPMailer::class, 'PHPMailer' );
24
+ class_alias( \PHPMailer\PHPMailer\SMTP::class, 'SMTP' );
25
+ class_alias( \PHPMailer\PHPMailer\Exception::class, 'phpmailerException' );
26
+ } else {
27
+ require_once ABSPATH . WPINC . '/class-phpmailer.php';
28
+ require_once ABSPATH . WPINC . '/class-smtp.php';
29
+ }
30
+
31
+ }
32
+
33
+ public static function make_instance($exceptions = false) {
34
+ self::load();
35
+
36
+ return new \PHPMailer( $exceptions );
37
+ }
38
+
39
+
40
+ }
includes/composer.php CHANGED
@@ -229,8 +229,7 @@ class TNP_Composer {
229
  $controls->data['message'] = TNP_Composer::unwrap_email($email->message);
230
  $controls->data['subject'] = $email->subject;
231
 
232
- $controls->data = array_merge( TNP_Composer::get_global_style_defaults(), $controls->data );
233
-
234
  }
235
 
236
  /**
@@ -335,45 +334,45 @@ class TNP_Composer {
335
  */
336
  static function image($media, $attr = []) {
337
 
338
- $default_attrs = [
339
- 'style' => 'max-width: 100%; height: auto;',
340
- 'class' => null,
341
- 'link-style' => 'text-decoration: none;',
342
- 'link-class' => null,
343
- ];
344
-
345
- $attr = array_merge($default_attrs, $attr);
346
-
347
- //Class and style attribute are mutually exclusive.
348
- //Class take priority to style because classes will transform to inline style inside block rendering operation
349
- if ( ! empty( $attr['class'] ) ) {
350
- $styling = ' inline-class="' . $attr['class'] . '" ';
351
- } else {
352
- $styling = ' style="' . $attr['style'] . '" ';
353
- }
354
-
355
- //Class and style attribute are mutually exclusive.
356
- //Class take priority to style because classes will transform to inline style inside block rendering operation
357
- if ( ! empty( $attr['link-class'] ) ) {
358
- $link_styling = ' inline-class="' . $attr['link-class'] . '" ';
359
- } else {
360
- $link_styling = ' style="' . $attr['link-style'] . '" ';
361
- }
362
 
363
  $b = '';
364
- if ( $media->link ) {
365
- $b .= '<a href="' . $media->link . '" target="_blank" rel="noopener nofollow" ' . $link_styling . '>';
366
- }
367
-
368
- if ( $media ) {
369
- $b .= '<img src="' . $media->url . '" width="' . $media->width . '"'
370
- . ' height="auto"'
371
- . ' alt="' . esc_attr( $media->alt ) . '"'
372
- . ' border="0" '
373
- . $styling
374
- . ' class="responsive" '
375
- . '>';
376
- }
377
 
378
  if ($media->link) {
379
  $b .= '</a>';
@@ -419,57 +418,55 @@ class TNP_Composer {
419
  }
420
 
421
  static function post_content($post) {
422
- $content = $post->post_content;
423
- $content = wpautop( $content );
424
- if ( true || $options['enable shortcodes'] ) {
425
- remove_shortcode( 'gallery' );
426
- add_shortcode( 'gallery', 'tnp_gallery_shortcode' );
427
- $content = do_shortcode( $content );
428
- }
429
- $content = str_replace( '<p>', '<p class="paragraph">', $content );
430
-
431
- $selected_images = array();
432
- if ( preg_match_all( '/<img [^>]+>/', $content, $matches ) ) {
433
- foreach ( $matches[0] as $image ) {
434
- if ( preg_match( '/wp-image-([0-9]+)/i', $image, $class_id ) && ( $attachment_id = absint( $class_id[1] ) ) ) {
435
- $selected_images[ $image ] = $attachment_id;
436
- }
437
- }
438
- }
439
-
440
- foreach ( $selected_images as $image => $attachment_id ) {
441
- $src = tnp_media_resize( $attachment_id, array( 600, 0 ) );
442
- if ( is_wp_error( $src ) ) {
443
- continue;
444
- }
445
- $content = str_replace( $image, '<img src="' . $src . '" width="600" style="max-width: 100%">', $content );
446
- }
447
-
448
- return $content;
449
- }
450
-
451
- static function get_global_style_defaults() {
452
- return [
453
- 'options_composer_title_font_family' => 'Verdana, Geneva, sans-serif',
454
- 'options_composer_title_font_size' => 36,
455
- 'options_composer_title_font_weight' => 'bold',
456
- 'options_composer_title_font_color' => '#222222',
457
-
458
- 'options_composer_text_font_family' => 'Verdana, Geneva, sans-serif',
459
- 'options_composer_text_font_size' => 16,
460
- 'options_composer_text_font_weight' => 'normal',
461
- 'options_composer_text_font_color' => '#222222',
462
-
463
- 'options_composer_button_font_family' => 'Verdana, Geneva, sans-serif',
464
- 'options_composer_button_font_size' => 16,
465
- 'options_composer_button_font_weight' => 'bold',
466
- 'options_composer_button_font_color' => '#FFFFFF',
467
- 'options_composer_button_background_color' => '#256F9C',
468
-
469
- 'options_composer_background' => '#FFFFFF',
470
- 'options_composer_block_background' => '#FFFFFF',
471
- ];
472
- }
473
  }
474
 
475
  /**
@@ -582,18 +579,7 @@ class TNP_Composer_Grid_Row {
582
  }
583
 
584
  private function get_template() {
585
- return "<table border='0'
586
- cellpadding='0'
587
- cellspacing='0'
588
- width='100%'>
589
- <tbody>
590
- <tr>
591
- <td>
592
- TNP_ROW_CONTENT_PH
593
- </td>
594
- </tr>
595
- </tbody>
596
- </table>";
597
  }
598
 
599
  }
@@ -653,57 +639,50 @@ class TNP_Composer_Grid_Cell {
653
  }
654
 
655
  private function get_template() {
656
- return "<table border='0'
657
- cellpadding='0'
658
- cellspacing='0'
659
- width='TNP_WIDTH_PH'
660
- align='left'
661
- style='table-layout: fixed;'
662
- class='responsive-table'>
663
- <tbody>
664
- <tr>
665
- <td border='0'
666
- style='padding: 20px 10px 40px;'
667
- align='TNP_ALIGN_PH'
668
- valign='TNP_VALIGN_PH'
669
- class='TNP_CLASS_PH'>
670
- TNP_COLUMN_CONTENT_PH
671
- </td>
672
- </tr>
673
- </tbody>
674
- </table>";
675
  }
676
 
677
  }
678
 
679
  class TNP_Composer_Component_Factory {
680
 
681
- private $options;
682
 
683
- /**
684
- * TNP_Composer_Component_Factory constructor.
685
- *
686
- * @param Controller$controller
687
- */
688
- public function __construct($controller) {
689
- }
690
-
691
- function heading() {
692
- }
693
-
694
- function paragraph() {
695
-
696
- }
697
 
698
- function link() {
 
 
699
 
700
- }
 
 
701
 
702
- function button() {
703
- }
 
704
 
705
- function image() {
 
 
706
 
707
- }
 
 
708
 
709
  }
229
  $controls->data['message'] = TNP_Composer::unwrap_email($email->message);
230
  $controls->data['subject'] = $email->subject;
231
 
232
+ $controls->data = array_merge(TNP_Composer::get_global_style_defaults(), $controls->data);
 
233
  }
234
 
235
  /**
334
  */
335
  static function image($media, $attr = []) {
336
 
337
+ $default_attrs = [
338
+ 'style' => 'max-width: 100%; height: auto;',
339
+ 'class' => null,
340
+ 'link-style' => 'text-decoration: none;',
341
+ 'link-class' => null,
342
+ ];
343
+
344
+ $attr = array_merge($default_attrs, $attr);
345
+
346
+ //Class and style attribute are mutually exclusive.
347
+ //Class take priority to style because classes will transform to inline style inside block rendering operation
348
+ if (!empty($attr['class'])) {
349
+ $styling = ' inline-class="' . $attr['class'] . '" ';
350
+ } else {
351
+ $styling = ' style="' . $attr['style'] . '" ';
352
+ }
353
+
354
+ //Class and style attribute are mutually exclusive.
355
+ //Class take priority to style because classes will transform to inline style inside block rendering operation
356
+ if (!empty($attr['link-class'])) {
357
+ $link_styling = ' inline-class="' . $attr['link-class'] . '" ';
358
+ } else {
359
+ $link_styling = ' style="' . $attr['link-style'] . '" ';
360
+ }
361
 
362
  $b = '';
363
+ if ($media->link) {
364
+ $b .= '<a href="' . $media->link . '" target="_blank" rel="noopener nofollow" ' . $link_styling . '>';
365
+ }
366
+
367
+ if ($media) {
368
+ $b .= '<img src="' . $media->url . '" width="' . $media->width . '"'
369
+ . ' height="auto"'
370
+ . ' alt="' . esc_attr($media->alt) . '"'
371
+ . ' border="0" '
372
+ . $styling
373
+ . ' class="responsive" '
374
+ . '>';
375
+ }
376
 
377
  if ($media->link) {
378
  $b .= '</a>';
418
  }
419
 
420
  static function post_content($post) {
421
+ $content = $post->post_content;
422
+ $content = wpautop($content);
423
+ if (true || $options['enable shortcodes']) {
424
+ remove_shortcode('gallery');
425
+ add_shortcode('gallery', 'tnp_gallery_shortcode');
426
+ $content = do_shortcode($content);
427
+ }
428
+ $content = str_replace('<p>', '<p class="paragraph">', $content);
429
+
430
+ $selected_images = array();
431
+ if (preg_match_all('/<img [^>]+>/', $content, $matches)) {
432
+ foreach ($matches[0] as $image) {
433
+ if (preg_match('/wp-image-([0-9]+)/i', $image, $class_id) && ( $attachment_id = absint($class_id[1]) )) {
434
+ $selected_images[$image] = $attachment_id;
435
+ }
436
+ }
437
+ }
438
+
439
+ foreach ($selected_images as $image => $attachment_id) {
440
+ $src = tnp_media_resize($attachment_id, array(600, 0));
441
+ if (is_wp_error($src)) {
442
+ continue;
443
+ }
444
+ $content = str_replace($image, '<img src="' . $src . '" width="600" style="max-width: 100%">', $content);
445
+ }
446
+
447
+ return $content;
448
+ }
449
+
450
+ static function get_global_style_defaults() {
451
+ return [
452
+ 'options_composer_title_font_family' => 'Verdana, Geneva, sans-serif',
453
+ 'options_composer_title_font_size' => 36,
454
+ 'options_composer_title_font_weight' => 'bold',
455
+ 'options_composer_title_font_color' => '#222222',
456
+ 'options_composer_text_font_family' => 'Verdana, Geneva, sans-serif',
457
+ 'options_composer_text_font_size' => 16,
458
+ 'options_composer_text_font_weight' => 'normal',
459
+ 'options_composer_text_font_color' => '#222222',
460
+ 'options_composer_button_font_family' => 'Verdana, Geneva, sans-serif',
461
+ 'options_composer_button_font_size' => 16,
462
+ 'options_composer_button_font_weight' => 'bold',
463
+ 'options_composer_button_font_color' => '#FFFFFF',
464
+ 'options_composer_button_background_color' => '#256F9C',
465
+ 'options_composer_background' => '#FFFFFF',
466
+ 'options_composer_block_background' => '#FFFFFF',
467
+ ];
468
+ }
469
+
 
 
470
  }
471
 
472
  /**
579
  }
580
 
581
  private function get_template() {
582
+ return "<table border='0' cellpadding='0' cellspacing='0' width='100%'><tbody><tr><td>TNP_ROW_CONTENT_PH</td></tr></tbody></table>";
 
 
 
 
 
 
 
 
 
 
 
583
  }
584
 
585
  }
639
  }
640
 
641
  private function get_template() {
642
+ return "<table border='0' cellpadding='0' cellspacing='0' width='TNP_WIDTH_PH' align='left' style='table-layout: fixed;' class='responsive'>
643
+ <tbody>
644
+ <tr>
645
+ <td border='0' style='padding: 20px 10px 40px;' align='TNP_ALIGN_PH' valign='TNP_VALIGN_PH' class='TNP_CLASS_PH'>
646
+ TNP_COLUMN_CONTENT_PH
647
+ </td>
648
+ </tr>
649
+ </tbody>
650
+ </table>";
 
 
 
 
 
 
 
 
 
 
651
  }
652
 
653
  }
654
 
655
  class TNP_Composer_Component_Factory {
656
 
657
+ private $options;
658
 
659
+ /**
660
+ * TNP_Composer_Component_Factory constructor.
661
+ *
662
+ * @param Controller$controller
663
+ */
664
+ public function __construct($controller) {
665
+
666
+ }
 
 
 
 
 
 
667
 
668
+ function heading() {
669
+
670
+ }
671
 
672
+ function paragraph() {
673
+
674
+ }
675
 
676
+ function link() {
677
+
678
+ }
679
 
680
+ function button() {
681
+
682
+ }
683
 
684
+ function image() {
685
+
686
+ }
687
 
688
  }
includes/controls.php CHANGED
@@ -310,6 +310,16 @@ class NewsletterControls {
310
  }
311
  }
312
 
 
 
 
 
 
 
 
 
 
 
313
  function merge($options) {
314
  if (!is_array($options))
315
  return;
@@ -355,6 +365,18 @@ class NewsletterControls {
355
  return $this->data[$name];
356
  }
357
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  /**
359
  * Show the errors and messages.
360
  */
@@ -367,19 +389,19 @@ class NewsletterControls {
367
  $shown = true;
368
 
369
  if (!empty($this->errors)) {
370
- echo '<div class="tnp-error">';
371
  echo $this->errors;
372
  echo '</div>';
373
  }
374
  if (!empty($this->warnings)) {
375
  foreach ((array) $this->warnings as $warning) {
376
- echo '<div class="tnp-warning">';
377
  echo $warning;
378
  echo '</div>';
379
  }
380
  }
381
  if (!empty($this->messages)) {
382
- echo '<div class="tnp-message">';
383
  echo $this->messages;
384
  echo '</div>';
385
  }
@@ -431,13 +453,13 @@ class NewsletterControls {
431
  }
432
 
433
  function switch_to_all_languages_notice() {
434
- echo '<div class="tnp-control-all-languages-notice">';
435
  _e('Switch the administration side to "all languages" to set these options', 'newsletter');
436
  echo '</div>';
437
  }
438
 
439
  function hint($text, $url = '') {
440
- echo '<div class="hints">';
441
  // Do not escape that, it can be formatted
442
  echo $text;
443
  if (!empty($url)) {
@@ -524,20 +546,19 @@ class NewsletterControls {
524
  function checkboxes_group($name, $values_labels) {
525
  $value_array = $this->get_value_array($name);
526
 
527
- echo "<div class='newsletter-checkboxes-group'>";
528
  foreach ($values_labels as $value => $label) {
529
- echo "<div class='newsletter-checkboxes-item'>";
530
  echo '<label><input type="checkbox" id="' . esc_attr($name) . '" name="options[' . esc_attr($name) . '][]" value="' . esc_attr($value) . '"';
531
  if (array_search($value, $value_array) !== false) {
532
  echo ' checked';
533
  }
534
  echo '>';
535
  if ($label != '') {
536
- echo esc_html($label);
537
  }
538
- echo "</label></div>";
539
  }
540
- echo "</div><div style='clear: both'></div>";
541
  }
542
 
543
  /** Creates a checkbox group with all public post types.
@@ -639,17 +660,23 @@ class NewsletterControls {
639
  echo '</select>';
640
  }
641
 
642
- function select($name, $options, $first = null) {
643
- $value = $this->get_value($name);
644
-
645
- echo '<select id="options-' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']">';
 
 
 
 
646
  if (!empty($first)) {
647
  echo '<option value="">' . esc_html($first) . '</option>';
648
  }
 
649
  foreach ($options as $key => $label) {
650
  echo '<option value="' . esc_attr($key) . '"';
651
- if ($value == $key)
652
  echo ' selected';
 
653
  echo '>' . esc_html($label) . '</option>';
654
  }
655
  echo '</select>';
@@ -753,7 +780,7 @@ class NewsletterControls {
753
  }
754
 
755
  function value($name) {
756
- echo htmlspecialchars($this->data[$name]);
757
  }
758
 
759
  function value_date($name, $show_remaining = true) {
@@ -770,8 +797,9 @@ class NewsletterControls {
770
  $delta = $delta - $hours * 3600;
771
  $minutes = floor($delta / 60);
772
 
773
- if ($days > 0)
774
  echo $days . ' days ';
 
775
  echo $hours . ' hours ';
776
  echo $minutes . ' minutes ';
777
  }
@@ -790,7 +818,7 @@ class NewsletterControls {
790
  function text($name, $size = 20, $placeholder = '') {
791
  $value = $this->get_value($name);
792
  $name = esc_attr($name);
793
- echo '<input id="options-', $name, '" placeholder="' . esc_attr($placeholder) . '" name="options[', $name, ']" type="text" ';
794
  if (!empty($size)) {
795
  echo 'size="', esc_attr($size), '" ';
796
  }
@@ -818,119 +846,162 @@ class NewsletterControls {
818
  echo '<input name="options[', esc_attr($name), ']" id="options-', esc_attr($name), '" type="hidden" value="', esc_attr($value), '">';
819
  }
820
 
821
- function button( $action, $label, $function = null, $id = '' ) {
822
- $id = ! empty( $id ) ? " id=\"$id\" " : '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
823
  if ($function != null) {
824
- echo '<input ' . $id . ' class="button-secondary" type="button" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';' . esc_html($function) . '"/>';
825
  } else {
826
- echo '<input ' . $id . ' class="button-secondary" type="submit" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';return true;"/>';
827
  }
828
  }
829
 
830
  function action_link($action, $label, $function = null) {
831
  if ($function != null) {
832
- echo '<input class="button-link" type="button" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';' . esc_html($function) . '"/>';
833
  } else {
834
- echo '<input class="button-link" type="submit" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';return true;"/>';
835
  }
836
  }
837
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
838
  /**
839
- * With translated "Save" label.
 
840
  */
841
- function button_save($function = null) {
842
- $this->button_primary('save', '<i class="fas fa-save"></i> ' . __('Save', 'newsletter'), $function);
843
  }
844
 
845
- function button_reset($data = '') {
846
- echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'reset\';if (!confirm(\'';
847
- echo esc_attr(esc_js(__('Proceed?', 'newsletter')));
848
- echo '\')) return false;">';
849
- echo '<i class="fas fa-reply"></i> ';
850
- echo esc_html(__('Reset', 'newsletter'));
851
- echo '</button>';
852
  }
853
 
854
- function button_link($url, $label) {
855
- echo '<a href="', esc_attr($url), '" class="button-primary">', $label, '</a>';
856
  }
857
 
858
- function button_configure($url) {
859
- echo '<a href="', esc_attr($url), '" class="button-primary"><i class="fas fa-cog"></i>', _e('Configure', 'newsletter'), '</a>';
860
  }
861
 
862
- function button_back($url, $label = null) {
863
- echo '<a href="', esc_attr($url), '" class="button-primary"><i class="fas fa-chevron-left"></i>';
864
- if (is_null($label)) {
865
- echo '&nbsp;';
866
- _e('Back', 'newsletter');
867
- }
868
- echo '</a>';
869
  }
870
 
871
- /**
872
- * Creates a button with "copy" action.
873
- * @param type $data
874
- */
875
- function button_copy($data = '', $label = null) {
876
- echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'copy\';if (!confirm(\'';
877
- echo esc_attr(esc_js(__('Proceed with copy?', 'newsletter')));
878
- echo '\')) return false;"';
879
- if (empty($label)) {
880
- echo 'title="', esc_attr(__('Duplicate', 'newsletter')), '"';
881
- }
882
- echo '>';
883
- echo '<i class="fas fa-copy"></i>';
884
- if (is_null($label)) {
885
- echo ' ', esc_html(__('Duplicate', 'newsletter'));
886
- } else {
887
- if (!empty($label)) {
888
- echo ' ', $label;
889
- }
890
- }
891
- echo '</button>';
892
  }
893
 
894
- function button_test($action = 'test', $label = 'Test') {
895
- echo '<button class="button-secondary" onclick="this.form.act.value=\'' . esc_attr($action) . '\';if (!confirm(\'';
896
- echo esc_attr(esc_js(__('Proceed with a test?', 'newsletter')));
897
- echo '\')) return false;"';
898
- if (empty($label)) {
899
- echo 'title="', esc_attr(__('Run a test', 'newsletter')), '"';
900
- }
901
- echo '>';
902
- echo '<i class="fas fa-vial"></i>';
903
- if (is_null($label)) {
904
- echo ' ', esc_html(__('Run a test', 'newsletter'));
905
- } else {
906
- if (!empty($label)) {
907
- echo ' ', $label;
908
- }
909
- }
910
- echo '</button>';
911
  }
912
 
913
- /**
914
- * Creates a button with "delete" action.
915
- * @param type $data
916
- */
917
- function button_delete($data = '', $label = null) {
918
- echo '<button class="button-secondary" style="background-color: darkred; color: #ffffff" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'delete\';if (!confirm(\'';
919
- echo esc_attr(esc_js(__('Proceed with delete?', 'newsletter')));
920
- echo '\')) return false;"';
921
- if (empty($label)) {
922
- echo 'title="', esc_attr(__('Delete', 'newsletter')), '"';
923
- }
924
- echo '>';
925
- echo '<i class="fas fa-times"></i>';
926
- if (is_null($label)) {
927
- echo ' ', esc_html(__('Delete', 'newsletter'));
928
- } else {
929
- if (!empty($label)) {
930
- echo ' ', $label;
931
- }
932
- }
933
- echo '</button>';
 
 
 
 
 
934
  }
935
 
936
  function button_primary($action, $label, $function = null) {
@@ -942,16 +1013,16 @@ class NewsletterControls {
942
  }
943
 
944
  function button_confirm($action, $label, $message = '', $data = '') {
945
- if (empty($message)) {
946
- $message = __('Are you sure?', 'newsletter');
947
- }
948
-
949
- echo '<input class="button-primary" type="button" value="' . esc_attr($label) . '" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'' . esc_attr($action) . '\';if (confirm(\'' .
950
- esc_attr(esc_js($message)) . '\')) this.form.submit()"/>';
951
  }
952
 
953
- function button_statistics($url) {
954
- echo '<a class="button-primary" href="' . $url . '" title="Statistics"><i class="fas fa-chart-bar"></i></a>';
 
 
 
 
 
955
  }
956
 
957
  function editor($name, $rows = 5, $cols = 75) {
@@ -961,6 +1032,15 @@ class NewsletterControls {
961
  }
962
 
963
  function wp_editor($name, $settings = array()) {
 
 
 
 
 
 
 
 
 
964
  $value = $this->get_value($name);
965
  wp_editor($value, $name, array_merge(array(
966
  'tinymce' => array('content_css' => plugins_url('newsletter') . '/css/wp-editor.css?ver=' . filemtime(NEWSLETTER_DIR . '/css/wp-editor.css')),
@@ -1063,7 +1143,7 @@ class NewsletterControls {
1063
  echo '<input type="radio" id="' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']" value="' . esc_attr($value) . '"';
1064
  $v = $this->get_value($name);
1065
  if ($v == $value) {
1066
- echo ' checked="checked"';
1067
  }
1068
  echo '>';
1069
  if ($label != '') {
@@ -1088,7 +1168,7 @@ class NewsletterControls {
1088
  }
1089
 
1090
  function checkboxes($name, $options) {
1091
- echo '<div class="tnp-checkboxes">';
1092
  foreach ($options as $value => $label) {
1093
  $this->checkbox_group($name, $value, $label);
1094
  }
@@ -1099,21 +1179,18 @@ class NewsletterControls {
1099
  function color($name, $default = '') {
1100
  $value = esc_attr($this->get_value($name, $default));
1101
  $name = esc_attr($name);
1102
- echo '<input class="tnpf-color" id="options-', $name, '" name="options[', $name, ']" type="text" value="', $value, '">';
1103
  }
1104
 
1105
  /** Creates a set of checkbox named $name_[category id] (so they are posted with distinct names).
1106
  */
1107
  function categories($name = 'category') {
1108
  $categories = get_categories();
1109
- echo '<div class="newsletter-checkboxes-group">';
1110
  foreach ($categories as $c) {
1111
- echo '<div class="newsletter-checkboxes-item">';
1112
  $this->checkbox($name . '_' . $c->cat_ID, esc_html($c->cat_name));
1113
- echo '</div>';
1114
  }
1115
  echo '<div style="clear: both"></div>';
1116
- echo '</div>';
1117
  }
1118
 
1119
  /**
@@ -1125,14 +1202,11 @@ class NewsletterControls {
1125
  if ($show_mode) {
1126
  $this->select($name . '_mode', array('include' => 'To be included', 'exclude' => 'To be excluded'));
1127
  }
1128
- echo '<div class="newsletter-checkboxes-group">';
1129
  foreach ($categories as &$c) {
1130
- echo '<div class="newsletter-checkboxes-item">';
1131
  $this->checkbox_group($name, $c->cat_ID, esc_html($c->cat_name));
1132
- echo '</div>';
1133
  }
1134
  echo '<div style="clear: both"></div>';
1135
- echo '</div>';
1136
  }
1137
 
1138
  /**
@@ -1143,14 +1217,11 @@ class NewsletterControls {
1143
  function preferences($name = 'preferences') {
1144
  $lists = Newsletter::instance()->get_lists();
1145
 
1146
- echo '<div class="newsletter-preferences-group">';
1147
-
1148
  foreach ($lists as $list) {
1149
-
1150
- echo '<div class="newsletter-preferences-item">';
1151
  $this->checkbox2($name . '_' . $list->id, esc_html($list->name));
1152
- echo '</div>';
1153
  }
 
1154
  }
1155
 
1156
  function lists_checkboxes($name = 'lists') {
@@ -1215,6 +1286,36 @@ class NewsletterControls {
1215
  $this->select($name, $lists);
1216
  }
1217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1218
  function public_lists_select($name = 'list', $empty_label = null) {
1219
  $lists = $this->get_public_list_options($empty_label);
1220
  $this->select($name, $lists);
@@ -1513,6 +1614,7 @@ tnp_controls_init();
1513
  echo '<script>';
1514
  echo 'location.href="' . $url . '"';
1515
  echo '</script>';
 
1516
  }
1517
 
1518
  /**
@@ -1531,13 +1633,13 @@ tnp_controls_init();
1531
  * @param array $attrs
1532
  */
1533
  function css_font($name = 'font', $attrs = array()) {
1534
- $default = [
1535
- 'color' => true,
1536
- 'weight' => true,
1537
- 'hide_size' => false,
1538
- 'hide_weight' => false,
1539
- 'hide_color' => false,
1540
- ];
1541
  $attrs = array_merge($default, $attrs);
1542
  $this->css_font_family($name . '_family', !empty($attrs['family_default']));
1543
  if (!$attrs['hide_size']) {
@@ -1555,9 +1657,9 @@ tnp_controls_init();
1555
  $value = $this->get_value($name);
1556
 
1557
  echo '<select class="tnpf-font-size" id="options-', esc_attr($name), '" name="options[', esc_attr($name), ']">';
1558
- if ( $show_empty_option ) {
1559
- echo "<option value=''>-</option>";
1560
- }
1561
  for ($i = 8; $i <= 50; $i++) {
1562
  echo '<option value="' . $i . '"';
1563
  if ($value == $i) {
@@ -1574,9 +1676,9 @@ tnp_controls_init();
1574
  $fonts = array('normal' => 'Normal', 'bold' => 'Bold');
1575
 
1576
  echo '<select class="tnpf-font-weight" id="options-' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']">';
1577
- if ( $show_empty_option ) {
1578
- echo "<option value=''>-</option>";
1579
- }
1580
  foreach ($fonts as $key => $font) {
1581
  echo '<option value="', esc_attr($key), '"';
1582
  if ($value == $key) {
@@ -1606,7 +1708,7 @@ tnp_controls_init();
1606
  'Verdana, Geneva, sans-serif' => 'Verdana, Geneva']);
1607
 
1608
  echo '<select class="tnpf-font-family" id="options-', esc_attr($name), '" name="options[', esc_attr($name), ']">';
1609
- foreach ($fonts as $font=>$label) {
1610
  echo '<option value="', esc_attr($font), '"';
1611
  if ($value == $font) {
1612
  echo ' selected';
@@ -1918,7 +2020,7 @@ tnp_controls_init();
1918
  global $tnpc_show_subject;
1919
  $tnpc_show_subject = $show_subject;
1920
 
1921
- echo "<link href='" . plugins_url( 'newsletter' ) . "/emails/tnp-composer/_css/newsletter-builder-v2.css?ver=" . NEWSLETTER_VERSION . "' rel='stylesheet' type='text/css'>";
1922
 
1923
  wp_enqueue_style('tnp-modal-style', plugins_url('newsletter') . '/emails/tnp-composer/_css/tnp-modal.css', array(), NEWSLETTER_VERSION);
1924
  wp_enqueue_style('tnp-toast-style', plugins_url('newsletter') . '/emails/tnp-composer/_css/tnp-toast.css', array(), NEWSLETTER_VERSION);
310
  }
311
  }
312
 
313
+ function set_data($data) {
314
+ if (is_array($data)) {
315
+ $this->data = $data;
316
+ } else if (is_object($data)) {
317
+ $this->data = (array) $data;
318
+ } else {
319
+ $this->data = [];
320
+ }
321
+ }
322
+
323
  function merge($options) {
324
  if (!is_array($options))
325
  return;
365
  return $this->data[$name];
366
  }
367
 
368
+ function show_error($text) {
369
+ echo '<div class="tnp-error">', $text, '</div>';
370
+ }
371
+
372
+ function show_warning($text) {
373
+ echo '<div class="tnp-warning">', $text, '</div>';
374
+ }
375
+
376
+ function show_message($text) {
377
+ echo '<div class="tnpc-message">', $text, '</div>';
378
+ }
379
+
380
  /**
381
  * Show the errors and messages.
382
  */
389
  $shown = true;
390
 
391
  if (!empty($this->errors)) {
392
+ echo '<div class="tnpc-error">';
393
  echo $this->errors;
394
  echo '</div>';
395
  }
396
  if (!empty($this->warnings)) {
397
  foreach ((array) $this->warnings as $warning) {
398
+ echo '<div class="tnpc-warning">';
399
  echo $warning;
400
  echo '</div>';
401
  }
402
  }
403
  if (!empty($this->messages)) {
404
+ echo '<div class="tnpc-message">';
405
  echo $this->messages;
406
  echo '</div>';
407
  }
453
  }
454
 
455
  function switch_to_all_languages_notice() {
456
+ echo '<div class="tnpc-languages-notice">';
457
  _e('Switch the administration side to "all languages" to set these options', 'newsletter');
458
  echo '</div>';
459
  }
460
 
461
  function hint($text, $url = '') {
462
+ echo '<div class="tnpc-hint">';
463
  // Do not escape that, it can be formatted
464
  echo $text;
465
  if (!empty($url)) {
546
  function checkboxes_group($name, $values_labels) {
547
  $value_array = $this->get_value_array($name);
548
 
549
+ echo '<div class="tnpc-checkboxes">';
550
  foreach ($values_labels as $value => $label) {
 
551
  echo '<label><input type="checkbox" id="' . esc_attr($name) . '" name="options[' . esc_attr($name) . '][]" value="' . esc_attr($value) . '"';
552
  if (array_search($value, $value_array) !== false) {
553
  echo ' checked';
554
  }
555
  echo '>';
556
  if ($label != '') {
557
+ echo '&nbsp;' . esc_html($label);
558
  }
559
+ echo "</label>";
560
  }
561
+ echo "<div style='clear: both'></div>";
562
  }
563
 
564
  /** Creates a checkbox group with all public post types.
660
  echo '</select>';
661
  }
662
 
663
+ function select($name, $options, $first = null, $attrs = []) {
664
+ echo '<select id="options-' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']"';
665
+ if ($attrs) {
666
+ foreach ($attrs as $key => $value) {
667
+ echo ' ', $key, '="' . esc_attr($value), '"';
668
+ }
669
+ }
670
+ echo '>';
671
  if (!empty($first)) {
672
  echo '<option value="">' . esc_html($first) . '</option>';
673
  }
674
+ $value = $this->get_value($name);
675
  foreach ($options as $key => $label) {
676
  echo '<option value="' . esc_attr($key) . '"';
677
+ if ($value == $key) {
678
  echo ' selected';
679
+ }
680
  echo '>' . esc_html($label) . '</option>';
681
  }
682
  echo '</select>';
780
  }
781
 
782
  function value($name) {
783
+ echo esc_html($this->data[$name]);
784
  }
785
 
786
  function value_date($name, $show_remaining = true) {
797
  $delta = $delta - $hours * 3600;
798
  $minutes = floor($delta / 60);
799
 
800
+ if ($days > 0) {
801
  echo $days . ' days ';
802
+ }
803
  echo $hours . ' hours ';
804
  echo $minutes . ' minutes ';
805
  }
818
  function text($name, $size = 20, $placeholder = '') {
819
  $value = $this->get_value($name);
820
  $name = esc_attr($name);
821
+ echo '<input id="options-', $name, '" placeholder="' . esc_attr($placeholder) . '" title="' . esc_attr($placeholder) . '" name="options[', $name, ']" type="text" ';
822
  if (!empty($size)) {
823
  echo 'size="', esc_attr($size), '" ';
824
  }
846
  echo '<input name="options[', esc_attr($name), ']" id="options-', esc_attr($name), '" type="hidden" value="', esc_attr($value), '">';
847
  }
848
 
849
+ /**
850
+ * General button.
851
+ *
852
+ * @param type $action
853
+ * @param type $label
854
+ * @param type $attrs
855
+ */
856
+ function btn($action, $label, $attrs = []) {
857
+ echo '<button class="button-primary tnpc-button"';
858
+ if (isset($attrs['id'])) {
859
+ echo ' id="', esc_attrs($attrs['id']), '"';
860
+ }
861
+ $onclick = "this.form.act.value='" . esc_attr(esc_js($action)) . "';";
862
+ if (!empty($attrs['data'])) {
863
+ $onclick .= "this.form.btn.value='" . esc_attr(esc_js($attrs['data'])) . "';";
864
+ }
865
+ if (!empty($attrs['confirm'])) {
866
+ if (is_string($attrs['confirm'])) {
867
+ $onclick .= "if (!confirm('" . esc_attr(esc_js($attrs['confirm'])) . "')) return false;";
868
+ } else {
869
+ $onclick .= "if (!confirm('" . esc_attr(esc_js(__('Proceed?', 'newsletter'))) . "')) return false;";
870
+ }
871
+ }
872
+ echo 'onclick="', $onclick, '"';
873
+ if (!empty($attrs['title'])) {
874
+ echo ' title="', esc_attr($attrs['title']), '"';
875
+ }
876
+ if (!empty($attrs['style'])) {
877
+ echo ' style="', esc_attr($attrs['style']), '"';
878
+ }
879
+ echo '>';
880
+ if (!empty($attrs['icon'])) {
881
+ echo '<i class="fas ', esc_attr($attrs['icon']), '"></i>';
882
+ if (!empty($label)) {
883
+ echo '&nbsp;', esc_html($label);
884
+ }
885
+ } else {
886
+ echo esc_html($label);
887
+ }
888
+ echo '</button>';
889
+ }
890
+
891
+ function btn_link($url, $label, $attrs = []) {
892
+ echo '<a href="', esc_attr($url), '" class="button-primary tnpc-button"';
893
+ if (!empty($attrs['style'])) {
894
+ echo ' style="', esc_attr($attrs['style']), '"';
895
+ }
896
+ if (!empty($attrs['title'])) {
897
+ echo ' title="', esc_attr($attrs['title']), '"';
898
+ }
899
+ if (!empty($attrs['target'])) {
900
+ echo ' target="', esc_attr($attrs['target']), '"';
901
+ }
902
+ echo '>';
903
+ if (!empty($attrs['icon'])) {
904
+ echo '<i class="fas ', esc_attr($attrs['icon']), '"></i>';
905
+ if (!empty($label)) {
906
+ echo '&nbsp;', esc_html($label);
907
+ }
908
+ } else {
909
+ echo esc_html($label);
910
+ }
911
+ echo '</a>';
912
+ }
913
+
914
+ function button($action, $label, $function = '', $id = '') {
915
+ $id = !empty($id) ? " id=\"$id\" " : '';
916
  if ($function != null) {
917
+ echo '<input ' . $id . ' class="button-primary tnpc-button" type="button" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';' . esc_html($function) . '"/>';
918
  } else {
919
+ echo '<input ' . $id . ' class="button-primary tnpc-button" type="submit" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';return true;"/>';
920
  }
921
  }
922
 
923
  function action_link($action, $label, $function = null) {
924
  if ($function != null) {
925
+ echo '<input class="button-link tnpc-button" type="button" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';' . esc_html($function) . '"/>';
926
  } else {
927
+ echo '<input class="button-link tnpc-button" type="submit" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';return true;"/>';
928
  }
929
  }
930
 
931
+ function button_save() {
932
+ $this->btn('save', __('Save', 'newsletter'), ['icon' => 'fa-save']);
933
+ }
934
+
935
+ function button_reset() {
936
+ $this->btn('reset', __('Reset', 'newsletter'), ['icon' => 'fa-reply', 'confirm' => true]);
937
+ }
938
+
939
+ function button_copy($data = '') {
940
+ $this->btn('copy', __('Duplicate', 'newsletter'), ['data' => $data, 'icon' => 'fa-copy', 'confirm' => true]);
941
+ }
942
+
943
+ function button_icon_copy($data = '') {
944
+ $this->btn('copy', '', ['data' => $data, 'icon' => 'fa-copy', 'confirm' => true, 'title' => __('Duplicate', 'newsletter')]);
945
+ }
946
+
947
  /**
948
+ * Creates a button with "delete" action.
949
+ * @param type $data
950
  */
951
+ function button_delete($data = '') {
952
+ $this->btn('delete', __('Delete', 'newsletter'), ['data' => $data, 'icon' => 'fa-times', 'confirm' => true, 'style' => 'background-color: darkred; color: #ffffff']);
953
  }
954
 
955
+ function button_icon_delete($data = '') {
956
+ $this->btn('delete', '', ['data' => $data, 'icon' => 'fa-times', 'confirm' => true, 'title' => __('Delete', 'newsletter'), 'style' => 'background-color: darkred; color: #ffffff']);
 
 
 
 
 
957
  }
958
 
959
+ function button_icon_configure($url) {
960
+ $this->btn_link($url, '', ['icon' => 'fa-cog', 'title' => __('Configure', 'newsletter')]);
961
  }
962
 
963
+ function button_icon_subscribers($url) {
964
+ $this->btn_link($url, '', ['icon' => 'fa-users', 'title' => __('Subscribers', 'newsletter')]);
965
  }
966
 
967
+ function button_statistics($url) {
968
+ $this->btn_link($url, __('Statistics', 'newsletter'), ['icon' => 'fa-chart-bar']);
 
 
 
 
 
969
  }
970
 
971
+ function button_icon_statistics($url) {
972
+ $this->btn_link($url, '', ['icon' => 'fa-chart-bar', 'title' => __('Statistics', 'newsletter')]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
973
  }
974
 
975
+ function button_icon_view($url) {
976
+ $this->btn_link($url, '', ['icon' => 'fa-eye', 'title' => __('View', 'newsletter'), 'target' => '_blank']);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
977
  }
978
 
979
+ function button_icon_newsletters($url) {
980
+ $this->btn_link($url, '', ['icon' => 'fa-file-alt', 'title' => __('Newsletters', 'newsletter')]);
981
+ }
982
+
983
+ function button_icon_design($url) {
984
+ $this->btn_link($url, '', ['icon' => 'fa-paint-brush', 'title' => __('Design', 'newsletter')]);
985
+ }
986
+
987
+ function button_icon_edit($url) {
988
+ $this->btn_link($url, '', ['icon' => 'fa-edit', 'title' => __('Edit', 'newsletter')]);
989
+ }
990
+
991
+ function button_icon_back($url) {
992
+ $this->btn_link($url, '', ['icon' => 'fa-chevron-left', 'title' => __('Back', 'newsletter')]);
993
+ }
994
+
995
+ function button_icon($action, $icon, $title = '', $data = '', $confirm = false) {
996
+ $this->btn($action, '', ['data' => $data, 'icon' => $icon, 'title' => $title, 'confirm' => $confirm]);
997
+ }
998
+
999
+ function button_back($url) {
1000
+ $this->btn_link($url, __('Back', 'newsletter'), ['icon' => 'fa-chevron-left']);
1001
+ }
1002
+
1003
+ function button_test($action = 'test') {
1004
+ $this->btn($action, __('Test', 'newsletter'), ['icon' => 'fa-vial']);
1005
  }
1006
 
1007
  function button_primary($action, $label, $function = null) {
1013
  }
1014
 
1015
  function button_confirm($action, $label, $message = '', $data = '') {
1016
+ $this->btn($action, $label, ['data' => $data, 'confirm' => $message]);
 
 
 
 
 
1017
  }
1018
 
1019
+ /**
1020
+ * @deprecated
1021
+ * @param string $url
1022
+ * @param string $label Not escaped.
1023
+ */
1024
+ function button_link($url, $label = '') {
1025
+ echo '<a href="', esc_attr($url), '" class="button-primary">', $label, '</a>';
1026
  }
1027
 
1028
  function editor($name, $rows = 5, $cols = 75) {
1032
  }
1033
 
1034
  function wp_editor($name, $settings = array()) {
1035
+
1036
+ add_filter('mce_buttons', function ($mce_buttons) {
1037
+ $mce_buttons[] = 'wp_add_media';
1038
+ //$mce_buttons[] = 'wp_code';
1039
+ return $mce_buttons;
1040
+ });
1041
+
1042
+ $settings = array_merge(['media_buttons' => false], $settings);
1043
+
1044
  $value = $this->get_value($name);
1045
  wp_editor($value, $name, array_merge(array(
1046
  'tinymce' => array('content_css' => plugins_url('newsletter') . '/css/wp-editor.css?ver=' . filemtime(NEWSLETTER_DIR . '/css/wp-editor.css')),
1143
  echo '<input type="radio" id="' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']" value="' . esc_attr($value) . '"';
1144
  $v = $this->get_value($name);
1145
  if ($v == $value) {
1146
+ echo ' checked';
1147
  }
1148
  echo '>';
1149
  if ($label != '') {
1168
  }
1169
 
1170
  function checkboxes($name, $options) {
1171
+ echo '<div class="tnpc-checkboxes">';
1172
  foreach ($options as $value => $label) {
1173
  $this->checkbox_group($name, $value, $label);
1174
  }
1179
  function color($name, $default = '') {
1180
  $value = esc_attr($this->get_value($name, $default));
1181
  $name = esc_attr($name);
1182
+ echo '<input class="tnpc-color" id="options-', $name, '" name="options[', $name, ']" type="text" value="', $value, '">';
1183
  }
1184
 
1185
  /** Creates a set of checkbox named $name_[category id] (so they are posted with distinct names).
1186
  */
1187
  function categories($name = 'category') {
1188
  $categories = get_categories();
1189
+ echo '<div class="tnpc-checkboxes">';
1190
  foreach ($categories as $c) {
 
1191
  $this->checkbox($name . '_' . $c->cat_ID, esc_html($c->cat_name));
 
1192
  }
1193
  echo '<div style="clear: both"></div>';
 
1194
  }
1195
 
1196
  /**
1202
  if ($show_mode) {
1203
  $this->select($name . '_mode', array('include' => 'To be included', 'exclude' => 'To be excluded'));
1204
  }
1205
+ echo '<div class="tnpc-checkboxes">';
1206
  foreach ($categories as &$c) {
 
1207
  $this->checkbox_group($name, $c->cat_ID, esc_html($c->cat_name));
 
1208
  }
1209
  echo '<div style="clear: both"></div>';
 
1210
  }
1211
 
1212
  /**
1217
  function preferences($name = 'preferences') {
1218
  $lists = Newsletter::instance()->get_lists();
1219
 
1220
+ echo '<div class="tnpc-checkboxes">';
 
1221
  foreach ($lists as $list) {
 
 
1222
  $this->checkbox2($name . '_' . $list->id, esc_html($list->name));
 
1223
  }
1224
+ echo '<div style="clear: both"></div>';
1225
  }
1226
 
1227
  function lists_checkboxes($name = 'lists') {
1286
  $this->select($name, $lists);
1287
  }
1288
 
1289
+ function lists_select_with_notes($name = 'list', $empty_label = null) {
1290
+
1291
+ $value = $this->get_value($name);
1292
+
1293
+ $lists = Newsletter::instance()->get_lists();
1294
+ $options = [];
1295
+ if ($empty_label) {
1296
+ $options[''] = $empty_label;
1297
+ }
1298
+
1299
+ foreach ($lists as $list) {
1300
+ $options['' . $list->id] = '(' . $list->id . ') ' . esc_html($list->name);
1301
+ }
1302
+
1303
+ $this->select($name, $options, null, ['onchange' => 'tnp_lists_toggle(this); return true;']);
1304
+ echo '<div id="options-', esc_attr($name), '-notes" class="tnpc_lists_notes">';
1305
+ foreach ($lists as $list) {
1306
+ $id = $list->id;
1307
+ $notes = apply_filters('newsletter_lists_notes', [], $id);
1308
+
1309
+ echo '<div class="list_', $id, '" style="display: ', ($value == $id ? 'block' : 'none'), '">';
1310
+ if ($list->forced) {
1311
+ echo 'Enforced on subscription<br>';
1312
+ }
1313
+ echo implode('<br>', $notes);
1314
+ echo '</div>';
1315
+ }
1316
+ echo '</div>';
1317
+ }
1318
+
1319
  function public_lists_select($name = 'list', $empty_label = null) {
1320
  $lists = $this->get_public_list_options($empty_label);
1321
  $this->select($name, $lists);
1614
  echo '<script>';
1615
  echo 'location.href="' . $url . '"';
1616
  echo '</script>';
1617
+ die();
1618
  }
1619
 
1620
  /**
1633
  * @param array $attrs
1634
  */
1635
  function css_font($name = 'font', $attrs = array()) {
1636
+ $default = [
1637
+ 'color' => true,
1638
+ 'weight' => true,
1639
+ 'hide_size' => false,
1640
+ 'hide_weight' => false,
1641
+ 'hide_color' => false,
1642
+ ];
1643
  $attrs = array_merge($default, $attrs);
1644
  $this->css_font_family($name . '_family', !empty($attrs['family_default']));
1645
  if (!$attrs['hide_size']) {
1657
  $value = $this->get_value($name);
1658
 
1659
  echo '<select class="tnpf-font-size" id="options-', esc_attr($name), '" name="options[', esc_attr($name), ']">';
1660
+ if ($show_empty_option) {
1661
+ echo "<option value=''>-</option>";
1662
+ }
1663
  for ($i = 8; $i <= 50; $i++) {
1664
  echo '<option value="' . $i . '"';
1665
  if ($value == $i) {
1676
  $fonts = array('normal' => 'Normal', 'bold' => 'Bold');
1677
 
1678
  echo '<select class="tnpf-font-weight" id="options-' . esc_attr($name) . '" name="options[' . esc_attr($name) . ']">';
1679
+ if ($show_empty_option) {
1680
+ echo "<option value=''>-</option>";
1681
+ }
1682
  foreach ($fonts as $key => $font) {
1683
  echo '<option value="', esc_attr($key), '"';
1684
  if ($value == $key) {
1708
  'Verdana, Geneva, sans-serif' => 'Verdana, Geneva']);
1709
 
1710
  echo '<select class="tnpf-font-family" id="options-', esc_attr($name), '" name="options[', esc_attr($name), ']">';
1711
+ foreach ($fonts as $font => $label) {
1712
  echo '<option value="', esc_attr($font), '"';
1713
  if ($value == $font) {
1714
  echo ' selected';
2020
  global $tnpc_show_subject;
2021
  $tnpc_show_subject = $show_subject;
2022
 
2023
+ echo "<link href='" . plugins_url('newsletter') . "/emails/tnp-composer/_css/newsletter-builder-v2.css?ver=" . NEWSLETTER_VERSION . "' rel='stylesheet' type='text/css'>";
2024
 
2025
  wp_enqueue_style('tnp-modal-style', plugins_url('newsletter') . '/emails/tnp-composer/_css/tnp-modal.css', array(), NEWSLETTER_VERSION);
2026
  wp_enqueue_style('tnp-toast-style', plugins_url('newsletter') . '/emails/tnp-composer/_css/tnp-toast.css', array(), NEWSLETTER_VERSION);
includes/helper.php CHANGED
@@ -221,6 +221,9 @@ function tnp_resize($media_id, $size) {
221
 
222
  if (substr($relative_file, -4) === '.gif') {
223
  $editor = wp_get_image_editor($absolute_file);
 
 
 
224
  $new_size = $editor->get_size();
225
  $media = new TNP_Media();
226
  $media->width = $new_size['width'];
221
 
222
  if (substr($relative_file, -4) === '.gif') {
223
  $editor = wp_get_image_editor($absolute_file);
224
+ if (is_wp_error($editor)) {
225
+ return _tnp_get_default_media($media_id, $size);
226
+ }
227
  $new_size = $editor->get_size();
228
  $media = new TNP_Media();
229
  $media->width = $new_size['width'];
includes/mailer.php CHANGED
@@ -1,547 +1,547 @@
1
- <?php
2
-
3
- use TNP\Mailer\PHPMailerLoader;
4
-
5
- /**
6
- *
7
- */
8
- class NewsletterMailer {
9
-
10
- const ERROR_GENERIC = '1';
11
- const ERROR_FATAL = '2';
12
-
13
- /* @var NewsletterLogger */
14
-
15
- var $logger;
16
- var $name;
17
- var $options;
18
- private $delta;
19
- protected $batch_size = 1;
20
-
21
- public function __construct($name, $options = array()) {
22
- $this->name = $name;
23
- $this->options = $options;
24
- }
25
-
26
- public function get_name() {
27
- return $this->name;
28
- }
29
-
30
- public function get_description() {
31
- return $this->name;
32
- }
33
-
34
- public function get_batch_size() {
35
- return $this->batch_size;
36
- }
37
-
38
- function send_with_stats($message) {
39
- $this->delta = microtime(true);
40
- $r = $this->send($message);
41
- $this->delta = microtime(true) - $this->delta;
42
- return $r;
43
- }
44
-
45
- /**
46
- *
47
- * @param TNP_Mailer_Message $message
48
- * @return bool|WP_Error
49
- */
50
- public function send($message) {
51
- $message->error = 'No mailing system available';
52
- return new WP_Error(self::ERROR_FATAL, 'No mailing system available');
53
- }
54
-
55
- public function send_batch_with_stats($messages) {
56
- $this->delta = microtime(true);
57
- $r = $this->send_batch($messages);
58
- $this->delta = microtime(true) - $this->delta;
59
- return $r;
60
- }
61
-
62
- function get_capability() {
63
- return (int) (3600 * $this->batch_size / $this->delta);
64
- }
65
-
66
- /**
67
- *
68
- * @param TNP_Mailer_Message[] $messages
69
- * @return bool|WP_Error
70
- */
71
- public function send_batch($messages) {
72
-
73
- // We should not get there is the batch size is one, the caller should use "send()". We can get
74
- // there if the array of messages counts to one, since could be the last of a series of chunks.
75
- if ($this->batch_size == 1 || count($messages) == 1) {
76
- $last_result = true;
77
- foreach ($messages as $message) {
78
- $r = $this->send($message);
79
- if (is_wp_error($r)) {
80
- $last_result = $r;
81
- }
82
- }
83
- return $last_result;
84
- }
85
-
86
- // We should always get there
87
- if (count($messages) <= $this->batch_size) {
88
- return $this->send_chunk($messages);
89
- }
90
-
91
- // We should not get here, since it is not optimized
92
- $chunks = array_chunk($message, $this->batch_size);
93
- $last_result = true;
94
- foreach ($chunks as $chunk) {
95
- $r = $this->send_chunk($chunk);
96
- if (is_wp_error($r)) {
97
- $last_result = $r;
98
- }
99
- }
100
- return $last_result;
101
- }
102
-
103
- protected function send_chunk($messages) {
104
- $last_result = true;
105
- foreach ($messages as $message) {
106
- $r = $this->send($message);
107
- if (is_wp_error($r)) {
108
- $last_result = $r;
109
- }
110
- }
111
- return $last_result;
112
- }
113
-
114
- /**
115
- * @return NewsletterLogger
116
- */
117
- function get_logger() {
118
- if ($this->logger) {
119
- return $this->logger;
120
- }
121
- $this->logger = new NewsletterLogger($this->name . '-mailer');
122
- return $this->logger;
123
- }
124
-
125
- /**
126
- *
127
- * @param TNP_Mailer_Message $message
128
- * @return bool|WP_Error
129
- */
130
- public function enqueue(TNP_Mailer_Message $message) {
131
- // Optimization when there is no queue
132
- if ($this->queue_max == 0) {
133
- $r = $this->send($message);
134
- return $r;
135
- }
136
-
137
- $this->queue[] = $message;
138
- if (count($this->queue) >= $this->queue_max) {
139
- return $this->flush();
140
- }
141
- return true;
142
- }
143
-
144
- public function flush() {
145
- $undelivered = array();
146
- foreach ($this->queue as $message) {
147
- $r = $this->deliver($message);
148
- if (is_wp_error($r)) {
149
- $message->error = $r;
150
- $undelivered[] = $message;
151
- }
152
- }
153
-
154
- $this->queue = array();
155
-
156
- if ($undelivered) {
157
- return new WP_Error(self::ERROR_GENERAL, 'Error while flushing messages', $undelivered);
158
- }
159
-
160
- return true;
161
- }
162
-
163
- /**
164
- * Original mail function simulation for compatibility.
165
- * @deprecated
166
- *
167
- * @param string $to
168
- * @param string $subject
169
- * @param array $message
170
- * @param array $headers
171
- * @param bool $enqueue
172
- * @param type $from Actually ignored
173
- * @return type
174
- */
175
- public function mail($to, $subject, $message, $headers = null, $enqueue = false, $from = false) {
176
- $mailer_message = new TNP_Mailer_Message();
177
- $mailer_message->to = $to;
178
- $mailer_message->subject = $subject;
179
- $mailer_message->headers = $headers;
180
- $mailer_message->body = $message['html'];
181
- $mailer_message->body_text = $message['text'];
182
-
183
- if ($enqueue) {
184
- return !is_wp_error($this->enqueue($mailer_message));
185
- }
186
- return !is_wp_error($this->send($mailer_message));
187
- }
188
-
189
- function save_last_run($time) {
190
- update_option($this->prefix . '_last_run', $time);
191
- }
192
-
193
- function get_last_run() {
194
- return (int) get_option($this->prefix . '_last_run', 0);
195
- }
196
-
197
- }
198
-
199
- /**
200
- * @property string $to
201
- * @property string $subject
202
- * @property string $body
203
- * @property array $headers
204
- * @property string $from
205
- * @property string $from_name
206
- */
207
- class TNP_Mailer_Message {
208
-
209
- var $to_name = '';
210
- var $headers = array();
211
- var $user_id = 0;
212
- var $email_id = 0;
213
- var $error = '';
214
- var $subject = '';
215
- var $body = '';
216
- var $body_text = '';
217
-
218
- }
219
-
220
- /**
221
- * Wrapper mailer for old addons registering the "mail" method (ultra deprecated).
222
- */
223
- class NewsletterMailMethodWrapper extends NewsletterMailer {
224
-
225
- var $mail_method;
226
-
227
- /**
228
- * The reference to the mail method.
229
- *
230
- * @param callback $callable Must be an array with object and method to call, no other callback formats allowed.
231
- */
232
- function __construct($callable) {
233
- parent::__construct(strtolower(get_class($callable[0])), array());
234
- $this->mail_method = $callable;
235
- }
236
-
237
- function get_description() {
238
- if ($this->mail_method != null) {
239
- return 'Mail method of ' . get_class($this->mail_method[0]);
240
- } else {
241
- return 'Undetectable mailer class';
242
- }
243
- }
244
-
245
- function send($message) {
246
- if ($this->mail_method != null) {
247
- $r = call_user_func($this->mail_method, $message->to, $message->subject, array('html' => $message->body, 'text' => $message->body_text), $message->headers);
248
- if (!$r) {
249
- $message->error = 'Unreported error';
250
- return new WP_Error(self::ERROR_GENERIC, 'Unreported error');
251
- }
252
- } else {
253
- $message->error = 'Mail method not available';
254
- return new WP_Error(self::ERROR_FATAL, 'Mail method not available');
255
- }
256
- return true;
257
- }
258
-
259
- }
260
-
261
- /**
262
- * Wrapper Mailer for old addons registering the "mail" method (deprecated).
263
- */
264
- class NewsletterOldMailerWrapper extends NewsletterMailer {
265
-
266
- var $mailer;
267
-
268
- /**
269
- * Old mailer plugin (actually untyped object)
270
- * @param object $mailer
271
- */
272
- function __construct($mailer) {
273
- $this->mailer = $mailer;
274
- // We have not a name, build it from the class name... and of course, no options.
275
- parent::__construct(strtolower(get_class($mailer)), array());
276
- $this->description = 'Mailer wrapper for ' . get_class($mailer);
277
- }
278
-
279
- /**
280
- * Only send() needs to be implemented all other method will use the defail base-class implementation
281
- *
282
- * @param TNP_Mailer_Message $message
283
- * @return \WP_Error|boolean
284
- */
285
- function send($message) {
286
- // The old mailer manages itself the from field
287
- $r = $this->mailer->mail($message->to, $message->subject, array('html' => $message->body, 'text' => $message->body_text), $message->headers);
288
- if (!$r) {
289
- if (isset($this->mailer->result)) {
290
- $message->error = $this->mailer->result;
291
- return new WP_Error(self::ERROR_GENERIC, $this->mailer->result);
292
- } else {
293
- $message->error = 'Unknown error';
294
- return new WP_Error(self::ERROR_GENERIC, 'Unknown error');
295
- }
296
- }
297
- return true;
298
- }
299
-
300
- }
301
-
302
- /**
303
- * Standard Mailer which uses the wp_mail() function of WP.
304
- */
305
- class NewsletterDefaultMailer extends NewsletterMailer {
306
-
307
- var $filter_active = false;
308
-
309
- /**
310
- * Static to be accessed in the hook: on some installation the object $this is not working, we're still trying to understand why
311
- * @var TNP_Mailer_Message
312
- */
313
- var $current_message = null;
314
-
315
- function __construct() {
316
- parent::__construct('default', Newsletter::instance()->get_options('smtp'));
317
- }
318
-
319
- function get_description() {
320
- // TODO: check if overloaded
321
- return 'wp_mail() WordPress function (could be extended by a SMTP plugin)';
322
- }
323
-
324
- function fix_mailer($mailer) {
325
- // If there is not a current message, wp_mail() was not called by us
326
- if (is_null($this->current_message)) {
327
- return;
328
- }
329
-
330
- $newsletter = Newsletter::instance();
331
- if (isset($this->current_message->encoding)) {
332
- $mailer->Encoding = $this->current_message->encoding;
333
- } else {
334
- if (!empty($newsletter->options['content_transfer_encoding'])) {
335
- $mailer->Encoding = $newsletter->options['content_transfer_encoding'];
336
- } else {
337
- $mailer->Encoding = 'base64';
338
- }
339
- }
340
-
341
- /* @var $mailer PHPMailer */
342
- $mailer->Sender = $newsletter->options['return_path'];
343
-
344
- // If there is an HTML body AND a text body, add the text part.
345
- if (!empty($this->current_message->body) && !empty($this->current_message->body_text)) {
346
- $mailer->AltBody = $this->current_message->body_text;
347
- }
348
- }
349
-
350
- function send($message) {
351
-
352
- if (!$this->filter_active) {
353
- add_action('phpmailer_init', array($this, 'fix_mailer'), 100);
354
- $this->filter_active = true;
355
- }
356
-
357
- $newsletter = Newsletter::instance();
358
- $wp_mail_headers = array();
359
- // TODO: Manage the from address
360
- $wp_mail_headers[] = 'From: "' . $newsletter->options['sender_name'] . '" <' . $newsletter->options['sender_email'] . '>';
361
-
362
- if (!empty($newsletter->options['reply_to'])) {
363
- $wp_mail_headers[] = 'Reply-To: ' . $newsletter->options['reply_to'];
364
- }
365
-
366
- // Manage from and from name
367
-
368
- if (!empty($message->headers)) {
369
- foreach ($message->headers as $key => $value) {
370
- $wp_mail_headers[] = $key . ': ' . $value;
371
- }
372
- }
373
-
374
- if (!empty($message->body)) {
375
- $wp_mail_headers[] = 'Content-Type: text/html;charset=UTF-8';
376
- $body = $message->body;
377
- } else if (!empty($message->body_text)) {
378
- $wp_mail_headers[] = 'Content-Type: text/plain;charset=UTF-8';
379
- $body = $message->body_text;
380
- } else {
381
- $message->error = 'Empty body';
382
- return new WP_Error(self::ERROR_GENERIC, 'Message format');
383
- }
384
-
385
- $this->current_message = $message;
386
- $r = wp_mail($message->to, $message->subject, $body, $wp_mail_headers);
387
- $this->current_message = null;
388
-
389
- if (!$r) {
390
- $last_error = error_get_last();
391
- if (is_array($last_error)) {
392
- $message->error = $last_error['message'];
393
- if (stripos($message->error, 'Could not instantiate mail function') || stripos($message->error, 'Failed to connect to mailserver')) {
394
- return new WP_Error(self::ERROR_FATAL, $last_error['message']);
395
- } else {
396
- return new WP_Error(self::ERROR_GENERIC, $last_error['message']);
397
- }
398
- } else {
399
- $message->error = 'No error explanation reported';
400
- return new WP_Error(self::ERROR_GENERIC, 'No error message reported');
401
- }
402
- }
403
- return true;
404
- }
405
-
406
- }
407
-
408
- /**
409
- * Standard Mailer which uses the wp_mail() function of WP.
410
- */
411
- class NewsletterDefaultSMTPMailer extends NewsletterMailer {
412
-
413
- var $mailer = null;
414
-
415
- function __construct($options) {
416
- parent::__construct('internal-smtp', $options);
417
- }
418
-
419
- function get_description() {
420
- return 'Internal SMTP';
421
- }
422
-
423
- /**
424
- *
425
- * @param TNP_Mailer_Message $message
426
- * @return \WP_Error|boolean
427
- */
428
- public function send($message) {
429
- $logger = $this->get_logger();
430
- $logger->debug('Start sending to ' . $message->to);
431
- $mailer = $this->get_mailer();
432
-
433
- if (!empty($message->body)) {
434
- $mailer->IsHTML(true);
435
- $mailer->Body = $message->body;
436
- $mailer->AltBody = $message->body_text;
437
- } else {
438
- $mailer->IsHTML(false);
439
- $mailer->Body = $message->body_text;
440
- $mailer->AltBody = '';
441
- }
442
-
443
- $mailer->Subject = $message->subject;
444
-
445
- $mailer->ClearCustomHeaders();
446
- if (!empty($message->headers)) {
447
- foreach ($message->headers as $key => $value) {
448
- $mailer->AddCustomHeader($key . ': ' . $value);
449
- }
450
- }
451
-
452
- if ($message->from) {
453
- $logger->debug('Alternative from available');
454
- $mailer->setFrom($message->from, $message->from_name);
455
- } else {
456
- $newsletter = Newsletter::instance();
457
- $mailer->setFrom($newsletter->options['sender_email'], $newsletter->options['sender_name']);
458
- }
459
-
460
- $mailer->ClearAddresses();
461
- $mailer->AddAddress($message->to);
462
- $mailer->Send();
463
-
464
- if ($mailer->IsError()) {
465
-
466
- $logger->error($mailer->ErrorInfo);
467
- // If the error is due to SMTP connection, the mailer cannot be reused since it does not clean up the connection
468
- // on error.
469
- //$this->mailer = null;
470
- $message->error = $mailer->ErrorInfo;
471
- return new WP_Error(self::ERROR_GENERIC, $mailer->ErrorInfo);
472
- }
473
-
474
- $logger->debug('Sent ' . $message->to);
475
- //$logger->error('Time: ' . (microtime(true) - $start) . ' seconds');
476
- return true;
477
- }
478
-
479
- /**
480
- *
481
- * @return PHPMailer
482
- */
483
- function get_mailer() {
484
- global $wp_version;
485
-
486
- if ($this->mailer) {
487
- return $this->mailer;
488
- }
489
-
490
- $logger = $this->get_logger();
491
- $logger->debug('Setting up PHP mailer');
492
-
493
- require_once 'PHPMailerLoader.php';
494
- $this->mailer = PHPMailerLoader::make_instance();
495
-
496
- $this->mailer->XMailer = ' '; // A space!
497
-
498
- $this->mailer->IsSMTP();
499
- $this->mailer->Host = $this->options['host'];
500
- if (!empty($this->options['port'])) {
501
- $this->mailer->Port = (int) $this->options['port'];
502
- }
503
-
504
- if (!empty($this->options['user'])) {
505
- $this->mailer->SMTPAuth = true;
506
- $this->mailer->Username = $this->options['user'];
507
- $this->mailer->Password = $this->options['pass'];
508
- }
509
- $this->mailer->SMTPKeepAlive = true;
510
- $this->mailer->SMTPSecure = $this->options['secure'];
511
- $this->mailer->SMTPAutoTLS = false;
512
-
513
- if ($this->options['ssl_insecure'] == 1) {
514
- $this->mailer->SMTPOptions = array(
515
- 'ssl' => array(
516
- 'verify_peer' => false,
517
- 'verify_peer_name' => false,
518
- 'allow_self_signed' => true
519
- )
520
- );
521
- }
522
-
523
- $newsletter = Newsletter::instance();
524
-
525
- // if (!empty($newsletter->options['content_transfer_encoding'])) {
526
- // $this->mailer->Encoding = $newsletter->options['content_transfer_encoding'];
527
- // } else {
528
- // $this->mailer->Encoding = 'base64';
529
- // }
530
-
531
- $this->mailer->CharSet = 'UTF-8';
532
- $this->mailer->From = $newsletter->options['sender_email'];
533
-
534
- if (!empty($newsletter->options['return_path'])) {
535
- $this->mailer->Sender = $newsletter->options['return_path'];
536
- }
537
- if (!empty($newsletter->options['reply_to'])) {
538
- $this->mailer->AddReplyTo($newsletter->options['reply_to']);
539
- }
540
-
541
- $this->mailer->FromName = $newsletter->options['sender_name'];
542
-
543
-
544
- return $this->mailer;
545
- }
546
-
547
- }
1
+ <?php
2
+
3
+ use TNP\Mailer\PHPMailerLoader;
4
+
5
+ /**
6
+ *
7
+ */
8
+ class NewsletterMailer {
9
+
10
+ const ERROR_GENERIC = '1';
11
+ const ERROR_FATAL = '2';
12
+
13
+ /* @var NewsletterLogger */
14
+
15
+ var $logger;
16
+ var $name;
17
+ var $options;
18
+ private $delta;
19
+ protected $batch_size = 1;
20
+
21
+ public function __construct($name, $options = array()) {
22
+ $this->name = $name;
23
+ $this->options = $options;
24
+ }
25
+
26
+ public function get_name() {
27
+ return $this->name;
28
+ }
29
+
30
+ public function get_description() {
31
+ return $this->name;
32
+ }
33
+
34
+ public function get_batch_size() {
35
+ return $this->batch_size;
36
+ }
37
+
38
+ function send_with_stats($message) {
39
+ $this->delta = microtime(true);
40
+ $r = $this->send($message);
41
+ $this->delta = microtime(true) - $this->delta;
42
+ return $r;
43
+ }
44
+
45
+ /**
46
+ *
47
+ * @param TNP_Mailer_Message $message
48
+ * @return bool|WP_Error
49
+ */
50
+ public function send($message) {
51
+ $message->error = 'No mailing system available';
52
+ return new WP_Error(self::ERROR_FATAL, 'No mailing system available');
53
+ }
54
+
55
+ public function send_batch_with_stats($messages) {
56
+ $this->delta = microtime(true);
57
+ $r = $this->send_batch($messages);
58
+ $this->delta = microtime(true) - $this->delta;
59
+ return $r;
60
+ }
61
+
62
+ function get_capability() {
63
+ return (int) (3600 * $this->batch_size / $this->delta);
64
+ }
65
+
66
+ /**
67
+ *
68
+ * @param TNP_Mailer_Message[] $messages
69
+ * @return bool|WP_Error
70
+ */
71
+ public function send_batch($messages) {
72
+
73
+ // We should not get there is the batch size is one, the caller should use "send()". We can get
74
+ // there if the array of messages counts to one, since could be the last of a series of chunks.
75
+ if ($this->batch_size == 1 || count($messages) == 1) {
76
+ $last_result = true;
77
+ foreach ($messages as $message) {
78
+ $r = $this->send($message);
79
+ if (is_wp_error($r)) {
80
+ $last_result = $r;
81
+ }
82
+ }
83
+ return $last_result;
84
+ }
85
+
86
+ // We should always get there
87
+ if (count($messages) <= $this->batch_size) {
88
+ return $this->send_chunk($messages);
89
+ }
90
+
91
+ // We should not get here, since it is not optimized
92
+ $chunks = array_chunk($message, $this->batch_size);
93
+ $last_result = true;
94
+ foreach ($chunks as $chunk) {
95
+ $r = $this->send_chunk($chunk);
96
+ if (is_wp_error($r)) {
97
+ $last_result = $r;
98
+ }
99
+ }
100
+ return $last_result;
101
+ }
102
+
103
+ protected function send_chunk($messages) {
104
+ $last_result = true;
105
+ foreach ($messages as $message) {
106
+ $r = $this->send($message);
107
+ if (is_wp_error($r)) {
108
+ $last_result = $r;
109
+ }
110
+ }
111
+ return $last_result;
112
+ }
113
+
114
+ /**
115
+ * @return NewsletterLogger
116
+ */
117
+ function get_logger() {
118
+ if ($this->logger) {
119
+ return $this->logger;
120
+ }
121
+ $this->logger = new NewsletterLogger($this->name . '-mailer');
122
+ return $this->logger;
123
+ }
124
+
125
+ /**
126
+ *
127
+ * @param TNP_Mailer_Message $message
128
+ * @return bool|WP_Error
129
+ */
130
+ public function enqueue(TNP_Mailer_Message $message) {
131
+ // Optimization when there is no queue
132
+ if ($this->queue_max == 0) {
133
+ $r = $this->send($message);
134
+ return $r;
135
+ }
136
+
137
+ $this->queue[] = $message;
138
+ if (count($this->queue) >= $this->queue_max) {
139
+ return $this->flush();
140
+ }
141
+ return true;
142
+ }
143
+
144
+ public function flush() {
145
+ $undelivered = array();
146
+ foreach ($this->queue as $message) {
147
+ $r = $this->deliver($message);
148
+ if (is_wp_error($r)) {
149
+ $message->error = $r;
150
+ $undelivered[] = $message;
151
+ }
152
+ }
153
+
154
+ $this->queue = array();
155
+
156
+ if ($undelivered) {
157
+ return new WP_Error(self::ERROR_GENERAL, 'Error while flushing messages', $undelivered);
158
+ }
159
+
160
+ return true;
161
+ }
162
+
163
+ /**
164
+ * Original mail function simulation for compatibility.
165
+ * @deprecated
166
+ *
167
+ * @param string $to
168
+ * @param string $subject
169
+ * @param array $message
170
+ * @param array $headers
171
+ * @param bool $enqueue
172
+ * @param type $from Actually ignored
173
+ * @return type
174
+ */
175
+ public function mail($to, $subject, $message, $headers = null, $enqueue = false, $from = false) {
176
+ $mailer_message = new TNP_Mailer_Message();
177
+ $mailer_message->to = $to;
178
+ $mailer_message->subject = $subject;
179
+ $mailer_message->headers = $headers;
180
+ $mailer_message->body = $message['html'];
181
+ $mailer_message->body_text = $message['text'];
182
+
183
+ if ($enqueue) {
184
+ return !is_wp_error($this->enqueue($mailer_message));
185
+ }
186
+ return !is_wp_error($this->send($mailer_message));
187
+ }
188
+
189
+ function save_last_run($time) {
190
+ update_option($this->prefix . '_last_run', $time);
191
+ }
192
+
193
+ function get_last_run() {
194
+ return (int) get_option($this->prefix . '_last_run', 0);
195
+ }
196
+
197
+ }
198
+
199
+ /**
200
+ * @property string $to
201
+ * @property string $subject
202
+ * @property string $body
203
+ * @property array $headers
204
+ * @property string $from
205
+ * @property string $from_name
206
+ */
207
+ class TNP_Mailer_Message {
208
+
209
+ var $to_name = '';
210
+ var $headers = array();
211
+ var $user_id = 0;
212
+ var $email_id = 0;
213
+ var $error = '';
214
+ var $subject = '';
215
+ var $body = '';
216
+ var $body_text = '';
217
+
218
+ }
219
+
220
+ /**
221
+ * Wrapper mailer for old addons registering the "mail" method (ultra deprecated).
222
+ */
223
+ class NewsletterMailMethodWrapper extends NewsletterMailer {
224
+
225
+ var $mail_method;
226
+
227
+ /**
228
+ * The reference to the mail method.
229
+ *
230
+ * @param callback $callable Must be an array with object and method to call, no other callback formats allowed.
231
+ */
232
+ function __construct($callable) {
233
+ parent::__construct(strtolower(get_class($callable[0])), array());
234
+ $this->mail_method = $callable;
235
+ }
236
+
237
+ function get_description() {
238
+ if ($this->mail_method != null) {
239
+ return 'Mail method of ' . get_class($this->mail_method[0]);
240
+ } else {
241
+ return 'Undetectable mailer class';
242
+ }
243
+ }
244
+
245
+ function send($message) {
246
+ if ($this->mail_method != null) {
247
+ $r = call_user_func($this->mail_method, $message->to, $message->subject, array('html' => $message->body, 'text' => $message->body_text), $message->headers);
248
+ if (!$r) {
249
+ $message->error = 'Unreported error';
250
+ return new WP_Error(self::ERROR_GENERIC, 'Unreported error');
251
+ }
252
+ } else {
253
+ $message->error = 'Mail method not available';
254
+ return new WP_Error(self::ERROR_FATAL, 'Mail method not available');
255
+ }
256
+ return true;
257
+ }
258
+
259
+ }
260
+
261
+ /**
262
+ * Wrapper Mailer for old addons registering the "mail" method (deprecated).
263
+ */
264
+ class NewsletterOldMailerWrapper extends NewsletterMailer {
265
+
266
+ var $mailer;
267
+
268
+ /**
269
+ * Old mailer plugin (actually untyped object)
270
+ * @param object $mailer
271
+ */
272
+ function __construct($mailer) {
273
+ $this->mailer = $mailer;
274
+ // We have not a name, build it from the class name... and of course, no options.
275
+ parent::__construct(strtolower(get_class($mailer)), array());
276
+ $this->description = 'Mailer wrapper for ' . get_class($mailer);
277
+ }
278
+
279
+ /**
280
+ * Only send() needs to be implemented all other method will use the defail base-class implementation
281
+ *
282
+ * @param TNP_Mailer_Message $message
283
+ * @return \WP_Error|boolean
284
+ */
285
+ function send($message) {
286
+ // The old mailer manages itself the from field
287
+ $r = $this->mailer->mail($message->to, $message->subject, array('html' => $message->body, 'text' => $message->body_text), $message->headers);
288
+ if (!$r) {
289
+ if (isset($this->mailer->result)) {
290
+ $message->error = $this->mailer->result;
291
+ return new WP_Error(self::ERROR_GENERIC, $this->mailer->result);
292
+ } else {
293
+ $message->error = 'Unknown error';
294
+ return new WP_Error(self::ERROR_GENERIC, 'Unknown error');
295
+ }
296
+ }
297
+ return true;
298
+ }
299
+
300
+ }
301
+
302
+ /**
303
+ * Standard Mailer which uses the wp_mail() function of WP.
304
+ */
305
+ class NewsletterDefaultMailer extends NewsletterMailer {
306
+
307
+ var $filter_active = false;
308
+
309
+ /**
310
+ * Static to be accessed in the hook: on some installation the object $this is not working, we're still trying to understand why
311
+ * @var TNP_Mailer_Message
312
+ */
313
+ var $current_message = null;
314
+
315
+ function __construct() {
316
+ parent::__construct('default', Newsletter::instance()->get_options('smtp'));
317
+ }
318
+
319
+ function get_description() {
320
+ // TODO: check if overloaded
321
+ return 'wp_mail() WordPress function (could be extended by a SMTP plugin)';
322
+ }
323
+
324
+ function fix_mailer($mailer) {
325
+ // If there is not a current message, wp_mail() was not called by us
326
+ if (is_null($this->current_message)) {
327
+ return;
328
+ }
329
+
330
+ $newsletter = Newsletter::instance();
331
+ if (isset($this->current_message->encoding)) {
332
+ $mailer->Encoding = $this->current_message->encoding;
333
+ } else {
334
+ if (!empty($newsletter->options['content_transfer_encoding'])) {
335
+ $mailer->Encoding = $newsletter->options['content_transfer_encoding'];
336
+ } else {
337
+ $mailer->Encoding = 'base64';
338
+ }
339
+ }
340
+
341
+ /* @var $mailer PHPMailer */
342
+ $mailer->Sender = $newsletter->options['return_path'];
343
+
344
+ // If there is an HTML body AND a text body, add the text part.
345
+ if (!empty($this->current_message->body) && !empty($this->current_message->body_text)) {
346
+ $mailer->AltBody = $this->current_message->body_text;
347
+ }
348
+ }
349
+
350
+ function send($message) {
351
+
352
+ if (!$this->filter_active) {
353
+ add_action('phpmailer_init', array($this, 'fix_mailer'), 100);
354
+ $this->filter_active = true;
355
+ }
356
+
357
+ $newsletter = Newsletter::instance();
358
+ $wp_mail_headers = array();
359
+ // TODO: Manage the from address
360
+ $wp_mail_headers[] = 'From: "' . $newsletter->options['sender_name'] . '" <' . $newsletter->options['sender_email'] . '>';
361
+
362
+ if (!empty($newsletter->options['reply_to'])) {
363
+ $wp_mail_headers[] = 'Reply-To: ' . $newsletter->options['reply_to'];
364
+ }
365
+
366
+ // Manage from and from name
367
+
368
+ if (!empty($message->headers)) {
369
+ foreach ($message->headers as $key => $value) {
370
+ $wp_mail_headers[] = $key . ': ' . $value;
371
+ }
372
+ }
373
+
374
+ if (!empty($message->body)) {
375
+ $wp_mail_headers[] = 'Content-Type: text/html;charset=UTF-8';
376
+ $body = $message->body;
377
+ } else if (!empty($message->body_text)) {
378
+ $wp_mail_headers[] = 'Content-Type: text/plain;charset=UTF-8';
379
+ $body = $message->body_text;
380
+ } else {
381
+ $message->error = 'Empty body';
382
+ return new WP_Error(self::ERROR_GENERIC, 'Message format');
383
+ }
384
+
385
+ $this->current_message = $message;
386
+ $r = wp_mail($message->to, $message->subject, $body, $wp_mail_headers);
387
+ $this->current_message = null;
388
+
389
+ if (!$r) {
390
+ $last_error = error_get_last();
391
+ if (is_array($last_error)) {
392
+ $message->error = $last_error['message'];
393
+ if (stripos($message->error, 'Could not instantiate mail function') || stripos($message->error, 'Failed to connect to mailserver')) {
394
+ return new WP_Error(self::ERROR_FATAL, $last_error['message']);
395
+ } else {
396
+ return new WP_Error(self::ERROR_GENERIC, $last_error['message']);
397
+ }
398
+ } else {
399
+ $message->error = 'No error explanation reported';
400
+ return new WP_Error(self::ERROR_GENERIC, 'No error message reported');
401
+ }
402
+ }
403
+ return true;
404
+ }
405
+
406
+ }
407
+
408
+ /**
409
+ * Standard Mailer which uses the wp_mail() function of WP.
410
+ */
411
+ class NewsletterDefaultSMTPMailer extends NewsletterMailer {
412
+
413
+ var $mailer = null;
414
+
415
+ function __construct($options) {
416
+ parent::__construct('internal-smtp', $options);
417
+ }
418
+
419
+ function get_description() {
420
+ return 'Internal SMTP';
421
+ }
422
+
423
+ /**
424
+ *
425
+ * @param TNP_Mailer_Message $message
426
+ * @return \WP_Error|boolean
427
+ */
428
+ public function send($message) {
429
+ $logger = $this->get_logger();
430
+ $logger->debug('Start sending to ' . $message->to);
431
+ $mailer = $this->get_mailer();
432
+
433
+ if (!empty($message->body)) {
434
+ $mailer->IsHTML(true);
435
+ $mailer->Body = $message->body;
436
+ $mailer->AltBody = $message->body_text;
437
+ } else {
438
+ $mailer->IsHTML(false);
439
+ $mailer->Body = $message->body_text;
440
+ $mailer->AltBody = '';
441
+ }
442
+
443
+ $mailer->Subject = $message->subject;
444
+
445
+ $mailer->ClearCustomHeaders();
446
+ if (!empty($message->headers)) {
447
+ foreach ($message->headers as $key => $value) {
448
+ $mailer->AddCustomHeader($key . ': ' . $value);
449
+ }
450
+ }
451
+
452
+ if ($message->from) {
453
+ $logger->debug('Alternative from available');
454
+ $mailer->setFrom($message->from, $message->from_name);
455
+ } else {
456
+ $newsletter = Newsletter::instance();
457
+ $mailer->setFrom($newsletter->options['sender_email'], $newsletter->options['sender_name']);
458
+ }
459
+
460
+ $mailer->ClearAddresses();
461
+ $mailer->AddAddress($message->to);
462
+ $mailer->Send();
463
+
464
+ if ($mailer->IsError()) {
465
+
466
+ $logger->error($mailer->ErrorInfo);
467
+ // If the error is due to SMTP connection, the mailer cannot be reused since it does not clean up the connection
468
+ // on error.
469
+ //$this->mailer = null;
470
+ $message->error = $mailer->ErrorInfo;
471
+ return new WP_Error(self::ERROR_GENERIC, $mailer->ErrorInfo);
472
+ }
473
+
474
+ $logger->debug('Sent ' . $message->to);
475
+ //$logger->error('Time: ' . (microtime(true) - $start) . ' seconds');
476
+ return true;
477
+ }
478
+
479
+ /**
480
+ *
481
+ * @return PHPMailer
482
+ */
483
+ function get_mailer() {
484
+ global $wp_version;
485
+
486
+ if ($this->mailer) {
487
+ return $this->mailer;
488
+ }
489
+
490
+ $logger = $this->get_logger();
491
+ $logger->debug('Setting up PHP mailer');
492
+
493
+ require_once 'PHPMailerLoader.php';
494
+ $this->mailer = PHPMailerLoader::make_instance();
495
+
496
+ $this->mailer->XMailer = ' '; // A space!
497
+
498
+ $this->mailer->IsSMTP();
499
+ $this->mailer->Host = $this->options['host'];
500
+ if (!empty($this->options['port'])) {
501
+ $this->mailer->Port = (int) $this->options['port'];
502
+ }
503
+
504
+ if (!empty($this->options['user'])) {
505
+ $this->mailer->SMTPAuth = true;
506
+ $this->mailer->Username = $this->options['user'];
507
+ $this->mailer->Password = $this->options['pass'];
508
+ }
509
+
510
+ $this->mailer->SMTPSecure = $this->options['secure'];
511
+ $this->mailer->SMTPAutoTLS = false;
512
+
513
+ if ($this->options['ssl_insecure'] == 1) {
514
+ $this->mailer->SMTPOptions = array(
515
+ 'ssl' => array(
516
+ 'verify_peer' => false,
517
+ 'verify_peer_name' => false,
518
+ 'allow_self_signed' => true
519
+ )
520
+ );
521
+ }
522
+
523
+ $newsletter = Newsletter::instance();
524
+
525
+ // if (!empty($newsletter->options['content_transfer_encoding'])) {
526
+ // $this->mailer->Encoding = $newsletter->options['content_transfer_encoding'];
527
+ // } else {
528
+ // $this->mailer->Encoding = 'base64';
529
+ // }
530
+
531
+ $this->mailer->CharSet = 'UTF-8';
532
+ $this->mailer->From = $newsletter->options['sender_email'];
533
+
534
+ if (!empty($newsletter->options['return_path'])) {
535
+ $this->mailer->Sender = $newsletter->options['return_path'];
536
+ }
537
+ if (!empty($newsletter->options['reply_to'])) {
538
+ $this->mailer->AddReplyTo($newsletter->options['reply_to']);
539
+ }
540
+
541
+ $this->mailer->FromName = $newsletter->options['sender_name'];
542
+
543
+
544
+ return $this->mailer;
545
+ }
546
+
547
+ }
includes/module.php CHANGED
@@ -302,6 +302,18 @@ class TNP_User {
302
  const STATUS_UNSUBSCRIBED = 'U';
303
  const STATUS_BOUNCED = 'B';
304
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  }
306
 
307
  /**
@@ -848,7 +860,7 @@ class NewsletterModule {
848
  }
849
 
850
  function admin_menu() {
851
-
852
  }
853
 
854
  function add_menu_page($page, $title, $capability = '') {
@@ -965,12 +977,14 @@ class NewsletterModule {
965
  $email = $this->store->save(NEWSLETTER_EMAILS_TABLE, $email, $return_format);
966
  if ($return_format == OBJECT) {
967
  $email->options = maybe_unserialize($email->options);
968
- if (!is_array($email->options))
969
- $email->options = array();
 
970
  } else if ($return_format == ARRAY_A) {
971
  $email['options'] = maybe_unserialize($email['options']);
972
- if (!is_array($email['options']))
973
- $email['options'] = array();
 
974
  }
975
  return $email;
976
  }
302
  const STATUS_UNSUBSCRIBED = 'U';
303
  const STATUS_BOUNCED = 'B';
304
 
305
+ public static function get_status_label($status) {
306
+ switch ($status) {
307
+ case self::STATUS_NOT_CONFIRMED: return __('NOT CONFIRMED', 'newsletter');
308
+ break;
309
+ case self::STATUS_CONFIRMED: return __('CONFIRMED', 'newsletter');
310
+ break;
311
+ case self::STATUS_UNSUBSCRIBED: return __('UNSUBSCRIBED', 'newsletter');
312
+ break;
313
+ case self::STATUS_BOUNCED: return __('BOUNCED', 'newsletter');
314
+ break;
315
+ }
316
+ }
317
  }
318
 
319
  /**
860
  }
861
 
862
  function admin_menu() {
863
+
864
  }
865
 
866
  function add_menu_page($page, $title, $capability = '') {
977
  $email = $this->store->save(NEWSLETTER_EMAILS_TABLE, $email, $return_format);
978
  if ($return_format == OBJECT) {
979
  $email->options = maybe_unserialize($email->options);
980
+ if (!is_array($email->options)) {
981
+ $email->options = [];
982
+ }
983
  } else if ($return_format == ARRAY_A) {
984
  $email['options'] = maybe_unserialize($email['options']);
985
+ if (!is_array($email['options'])) {
986
+ $email['options'] = [];
987
+ }
988
  }
989
  return $email;
990
  }
main/extensions.php CHANGED
@@ -6,24 +6,6 @@ include_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
6
  $controls = new NewsletterControls();
7
  $extensions = $this->getTnpExtensions();
8
 
9
- $controls->data = get_option('newsletter_main');
10
-
11
- if (isset($_POST['email']) && check_admin_referer('subscribe')) {
12
- $body = array();
13
- $body['ne'] = $_POST['email'];
14
- $body['nr'] = 'extensions';
15
- $body['nl'] = array('3', '4', '1');
16
- $body['optin'] = 'single';
17
-
18
- wp_remote_post('http://www.thenewsletterplugin.com/?na=ajaxsub', array('body' => $body));
19
-
20
- update_option('newsletter_subscribed', time(), false);
21
-
22
- $id = (int) $_POST['id'];
23
- wp_redirect(wp_nonce_url(admin_url('admin.php'), 'save') . '&page=newsletter_main_extensions&act=install&id=' . $id);
24
- die();
25
- }
26
-
27
  if ($controls->is_action('activate')) {
28
  $result = activate_plugin('newsletter-extensions/extensions.php');
29
  if (is_wp_error($result)) {
@@ -42,7 +24,6 @@ if ($controls->is_action('activate')) {
42
 
43
  <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
44
 
45
-
46
  <div id="tnp-body">
47
  <?php if (is_wp_error(validate_plugin('newsletter-extensions/extensions.php'))) { ?>
48
  <div id="tnp-promo">
@@ -142,30 +123,3 @@ if ($controls->is_action('activate')) {
142
  <?php include NEWSLETTER_DIR . '/tnp-footer.php'; ?>
143
 
144
  </div>
145
-
146
- <script>
147
- function newsletter_subscribe(id) {
148
- document.getElementById("tnp-extension-id").value = id;
149
- jQuery("#tnp-subscribe-overlay").fadeIn(500);
150
- }
151
- </script>
152
-
153
- <div id="tnp-subscribe-overlay">
154
- <div id="tnp-subscribe-modal">
155
- <div>
156
- <img src="https://cdn.thenewsletterplugin.com/newsletters-img/tnp-logo-colore-text-white@2x.png">
157
- </div>
158
- <div id="tnp-subscribe-title">
159
- Subscribe our newsletter to get this extension<br>
160
- and be informed about updates and best practices.</div>
161
- <form method="post" action="?page=newsletter_main_extensions&noheader=true">
162
- <?php wp_nonce_field('subscribe'); ?>
163
- <input type="hidden" value="id" name="id" id="tnp-extension-id">
164
- <div id="tnp-subscribe-email-wrapper"><input type="email" id="tnp-subscribe-email" name="email" value="<?php echo esc_attr(get_option('admin_email')) ?>"></div>
165
- <div id="tnp-subscribe-submit-wrapper"><input type="submit" id="tnp-subscribe-submit" value="<?php esc_attr_e('Subscribe', 'newsletter') ?>"></div>
166
- </form>
167
- <div class="tnp-subscribe-no-thanks">
168
- <a href="javascript:void(jQuery('#tnp-subscribe-overlay').hide())">No thanks, I don't want to install the free extension</a>
169
- </div>
170
- </div>
171
- </div>
6
  $controls = new NewsletterControls();
7
  $extensions = $this->getTnpExtensions();
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  if ($controls->is_action('activate')) {
10
  $result = activate_plugin('newsletter-extensions/extensions.php');
11
  if (is_wp_error($result)) {
24
 
25
  <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
26
 
 
27
  <div id="tnp-body">
28
  <?php if (is_wp_error(validate_plugin('newsletter-extensions/extensions.php'))) { ?>
29
  <div id="tnp-promo">
123
  <?php include NEWSLETTER_DIR . '/tnp-footer.php'; ?>
124
 
125
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
main/index.php CHANGED
@@ -69,6 +69,10 @@ $labels = array_reverse($labels);
69
  $lists = $this->get_lists();
70
  ?>
71
 
 
 
 
 
72
  <div class="wrap" id="tnp-wrap">
73
 
74
  <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
@@ -231,55 +235,55 @@ $lists = $this->get_lists();
231
  <div class="tnp-card">
232
  <div class="tnp-card-title"><?php _e('Documentation', 'newsletter') ?></div>
233
  <div class="break"></div>
234
- <a href="https://www.thenewsletterplugin.com/documentation/installation/">
235
  <div class="tnp-card-documentation-index">
236
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
237
  Installation
238
  </div>
239
  </a>
240
- <a href="https://www.thenewsletterplugin.com/documentation/subscription/">
241
  <div class="tnp-card-documentation-index">
242
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
243
  Subscription
244
  </div>
245
  </a>
246
- <a href="https://www.thenewsletterplugin.com/category/tips">
247
  <div class="tnp-card-documentation-index">
248
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
249
  Tips & Tricks
250
  </div>
251
  </a>
252
- <a href="https://www.thenewsletterplugin.com/documentation/subscribers-and-management/">
253
  <div class="tnp-card-documentation-index">
254
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
255
  Subscribers and management
256
  </div>
257
  </a>
258
- <a href="https://www.thenewsletterplugin.com/documentation/newsletters/newsletters-module/">
259
  <div class="tnp-card-documentation-index">
260
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
261
  Creating Newsletters
262
  </div>
263
  </a>
264
- <a href="https://www.thenewsletterplugin.com/documentation/addons/">
265
  <div class="tnp-card-documentation-index">
266
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
267
  Premium Addons
268
  </div>
269
  </a>
270
- <a href="https://www.thenewsletterplugin.com/documentation/customization/">
271
  <div class="tnp-card-documentation-index">
272
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
273
  Customization
274
  </div>
275
  </a>
276
- <a href="https://www.thenewsletterplugin.com/documentation/delivery-and-spam/">
277
  <div class="tnp-card-documentation-index">
278
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
279
  Delivery and spam
280
  </div>
281
  </a>
282
- <a href="https://www.thenewsletterplugin.com/documentation/developers/">
283
  <div class="tnp-card-documentation-index">
284
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
285
  Developers & Advanced Topics
@@ -292,7 +296,7 @@ $lists = $this->get_lists();
292
  <div class="tnp-card-title"><?php _e('Developers', 'newsletter') ?></div>
293
  <div class="tnp-card-description">Extending Newsletter by yourself? There is something for you as well!</div>
294
  <div class="tnp-card-button-container">
295
- <a href="https://www.thenewsletterplugin.com/documentation/developers/">Developer's love 💛</a>
296
  </div>
297
  </div>
298
  <div class="tnp-card">
@@ -302,7 +306,7 @@ $lists = $this->get_lists();
302
  <iframe width="560" height="315" src="https://www.youtube.com/embed/zmVmW84Bw9A" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
303
  </div>
304
  <div class="tnp-card-button-container">
305
- <a href="?https://www.thenewsletterplugin.com/video-tutorials">See the videos</a>
306
  </div>
307
  </div>
308
  </div>
69
  $lists = $this->get_lists();
70
  ?>
71
 
72
+ <style>
73
+ <?php include NEWSLETTER_DIR . '/css/dashboard.css' ?>
74
+ </style>
75
+
76
  <div class="wrap" id="tnp-wrap">
77
 
78
  <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
235
  <div class="tnp-card">
236
  <div class="tnp-card-title"><?php _e('Documentation', 'newsletter') ?></div>
237
  <div class="break"></div>
238
+ <a href="https://www.thenewsletterplugin.com/documentation/installation/" target="_blank">
239
  <div class="tnp-card-documentation-index">
240
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
241
  Installation
242
  </div>
243
  </a>
244
+ <a href="https://www.thenewsletterplugin.com/documentation/subscription/" target="_blank">
245
  <div class="tnp-card-documentation-index">
246
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
247
  Subscription
248
  </div>
249
  </a>
250
+ <a href="https://www.thenewsletterplugin.com/category/tips" target="_blank">
251
  <div class="tnp-card-documentation-index">
252
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
253
  Tips & Tricks
254
  </div>
255
  </a>
256
+ <a href="https://www.thenewsletterplugin.com/documentation/subscribers-and-management/" target="_blank">
257
  <div class="tnp-card-documentation-index">
258
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
259
  Subscribers and management
260
  </div>
261
  </a>
262
+ <a href="https://www.thenewsletterplugin.com/documentation/newsletters/newsletters-module/" target="_blank">
263
  <div class="tnp-card-documentation-index">
264
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
265
  Creating Newsletters
266
  </div>
267
  </a>
268
+ <a href="https://www.thenewsletterplugin.com/documentation/addons/" target="_blank">
269
  <div class="tnp-card-documentation-index">
270
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
271
  Premium Addons
272
  </div>
273
  </a>
274
+ <a href="https://www.thenewsletterplugin.com/documentation/customization/" target="_blank">
275
  <div class="tnp-card-documentation-index">
276
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
277
  Customization
278
  </div>
279
  </a>
280
+ <a href="https://www.thenewsletterplugin.com/documentation/delivery-and-spam/" target="_blank">
281
  <div class="tnp-card-documentation-index">
282
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
283
  Delivery and spam
284
  </div>
285
  </a>
286
+ <a href="https://www.thenewsletterplugin.com/documentation/developers/" target="_blank">
287
  <div class="tnp-card-documentation-index">
288
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="20" height="20"><title>saved items</title><g class="nc-icon-wrapper" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" ><path d="M37,4h3a4,4,0,0,1,4,4V40a4,4,0,0,1-4,4H8a4,4,0,0,1-4-4V8A4,4,0,0,1,8,4h3" fill="none" stroke-miterlimit="10"/> <polygon points="32 24 24 18 16 24 16 4 32 4 32 24" fill="none" stroke-miterlimit="10" data-color="color-2"/></g></svg>
289
  Developers & Advanced Topics
296
  <div class="tnp-card-title"><?php _e('Developers', 'newsletter') ?></div>
297
  <div class="tnp-card-description">Extending Newsletter by yourself? There is something for you as well!</div>
298
  <div class="tnp-card-button-container">
299
+ <a href="https://www.thenewsletterplugin.com/documentation/developers/" target="_blank">Developer's love 💛</a>
300
  </div>
301
  </div>
302
  <div class="tnp-card">
306
  <iframe width="560" height="315" src="https://www.youtube.com/embed/zmVmW84Bw9A" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
307
  </div>
308
  <div class="tnp-card-button-container">
309
+ <a href="https://www.thenewsletterplugin.com/video-tutorials" target="_blank">See the videos</a>
310
  </div>
311
  </div>
312
  </div>
main/info.php CHANGED
@@ -170,9 +170,9 @@ if (!$controls->is_action()) {
170
  </div>
171
  </div>
172
 
173
- <p>
174
  <?php $controls->button_save(); ?>
175
- </p>
176
 
177
  </form>
178
  </div>
170
  </div>
171
  </div>
172
 
173
+ <div class="tnp-buttons">
174
  <?php $controls->button_save(); ?>
175
+ </div>
176
 
177
  </form>
178
  </div>
main/logs.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* @var $this Newsletter */
3
+ /* @var $wpdb wpdb */
4
+
5
+ defined('ABSPATH') || exit;
6
+
7
+ include_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
8
+ $controls = new NewsletterControls();
9
+
10
+ if ($controls->is_action('delete_logs')) {
11
+ $files = glob(WP_CONTENT_DIR . '/logs/newsletter/*.txt');
12
+ foreach ($files as $file) {
13
+ if (is_file($file))
14
+ unlink($file);
15
+ }
16
+ $secret = NewsletterModule::get_token(8);
17
+ update_option('newsletter_logger_secret', $secret);
18
+ $controls->messages = 'Logs deleted';
19
+ }
20
+
21
+ ?>
22
+
23
+
24
+ <div class="wrap tnp-main-status" id="tnp-wrap">
25
+
26
+ <?php include NEWSLETTER_DIR . '/tnp-header.php'; ?>
27
+
28
+ <div id="tnp-heading">
29
+
30
+ <h2><?php _e('Logs', 'newsletter') ?></h2>
31
+
32
+ </div>
33
+
34
+ <div id="tnp-body">
35
+
36
+ <form method="post" action="">
37
+ <?php $controls->init(); ?>
38
+
39
+ <ul class="tnp-log-files">
40
+ <?php
41
+ $files = glob(WP_CONTENT_DIR . '/logs/newsletter/*.txt'); // get all file names
42
+ foreach ($files as $file) { // iterate files
43
+ echo '<li><a href="' . WP_CONTENT_URL . '/logs/newsletter/' . basename($file) . '" target="_blank">' . basename($file) . '</a>';
44
+ echo ' <span class="tnp-log-size">(' . size_format(filesize($file)) . ')</span>';
45
+ echo '</li>';
46
+ }
47
+ ?>
48
+ </ul>
49
+
50
+ <?php $controls->button('delete_logs', 'Delete all'); ?>
51
+
52
+ </form>
53
+ </div>
54
+
55
+ <?php include NEWSLETTER_DIR . '/tnp-footer.php'; ?>
56
+
57
+ </div>
main/main.php CHANGED
@@ -364,9 +364,9 @@ if (!empty($return_path)) {
364
 
365
  </div> <!-- tabs -->
366
 
367
- <p>
368
  <?php $controls->button_save(); ?>
369
- </p>
370
 
371
  </form>
372
 
364
 
365
  </div> <!-- tabs -->
366
 
367
+ <div class="tnp-buttons">
368
  <?php $controls->button_save(); ?>
369
+ </div>
370
 
371
  </form>
372
 
main/status.php CHANGED
@@ -1324,25 +1324,9 @@ function tnp_status_print_flag($condition) {
1324
  </tbody>
1325
  </table>
1326
 
1327
- <h3>Log files</h3>
1328
-
1329
- <ul class="tnp-log-files">
1330
- <?php
1331
- $files = glob(WP_CONTENT_DIR . '/logs/newsletter/*.txt'); // get all file names
1332
- foreach ($files as $file) { // iterate files
1333
- echo '<li><a href="' . WP_CONTENT_URL . '/logs/newsletter/' . basename($file) . '" target="_blank">' . basename($file) . '</a>';
1334
- echo ' <span class="tnp-log-size">(' . size_format(filesize($file)) . ')</span>';
1335
- echo '</li>';
1336
- }
1337
- ?>
1338
- </ul>
1339
-
1340
- <?php $controls->button('delete_logs', 'Delete all'); ?>
1341
-
1342
 
1343
  <?php if (isset($_GET['debug'])) { ?>
1344
 
1345
-
1346
  <h3>Database Tables</h3>
1347
  <h4><?php echo $wpdb->prefix ?>newsletter</h4>
1348
  <?php
1324
  </tbody>
1325
  </table>
1326
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1327
 
1328
  <?php if (isset($_GET['debug'])) { ?>
1329
 
 
1330
  <h3>Database Tables</h3>
1331
  <h4><?php echo $wpdb->prefix ?>newsletter</h4>
1332
  <?php
main/welcome.php CHANGED
@@ -99,7 +99,9 @@ if (empty($page_exists)) {
99
  $logger->info('Dedicated page already exists');
100
  }
101
  ?>
102
-
 
 
103
  <script src="<?php echo plugins_url('newsletter') ?>/main/js/snap.svg-min.js"></script>
104
  <script src="<?php echo plugins_url('newsletter') ?>/main/js/main.js"></script>
105
  <script>
99
  $logger->info('Dedicated page already exists');
100
  }
101
  ?>
102
+ <style>
103
+ <?php include NEWSLETTER_DIR . '/css/welcome.css' ?>
104
+ </style>
105
  <script src="<?php echo plugins_url('newsletter') ?>/main/js/snap.svg-min.js"></script>
106
  <script src="<?php echo plugins_url('newsletter') ?>/main/js/main.js"></script>
107
  <script>
plugin.php CHANGED
@@ -4,7 +4,7 @@
4
  Plugin Name: Newsletter
5
  Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
6
  Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
7
- Version: 7.0.7
8
  Author: Stefano Lissa & The Newsletter Team
9
  Author URI: https://www.thenewsletterplugin.com
10
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
@@ -35,10 +35,13 @@ if (version_compare(phpversion(), '5.6', '<')) {
35
  return;
36
  }
37
 
38
- define('NEWSLETTER_VERSION', '7.0.7');
39
 
40
  global $newsletter, $wpdb;
41
 
 
 
 
42
  if (!defined('NEWSLETTER_BETA'))
43
  define('NEWSLETTER_BETA', false);
44
 
@@ -468,6 +471,7 @@ class Newsletter extends NewsletterModule {
468
  $this->add_menu_page('main', __('Settings and More', 'newsletter'));
469
  $this->add_admin_page('smtp', 'SMTP');
470
  $this->add_admin_page('status', __('Status', 'newsletter'));
 
471
  $this->add_admin_page('diagnostic', __('Diagnostic', 'newsletter'));
472
  $this->add_admin_page('test', __('Test', 'newsletter'));
473
  }
@@ -504,7 +508,7 @@ class Newsletter extends NewsletterModule {
504
 
505
  function hook_wp_enqueue_scripts() {
506
  if (empty($this->options['css_disabled']) && apply_filters('newsletter_enqueue_style', true)) {
507
- wp_enqueue_style('newsletter', plugins_url('newsletter') . '/style.css', array(), NEWSLETTER_VERSION);
508
  if (!empty($this->options['css'])) {
509
  wp_add_inline_style('newsletter', $this->options['css']);
510
  }
@@ -519,22 +523,24 @@ class Newsletter extends NewsletterModule {
519
  wp_enqueue_script('jquery-ui-draggable');
520
  wp_enqueue_media();
521
 
 
 
 
522
  wp_enqueue_style('tnp-admin-font', 'https://use.typekit.net/jlj2wjy.css');
523
  wp_enqueue_style('tnp-admin-fontawesome', $newsletter_url . '/vendor/fa/css/all.min.css', [], NEWSLETTER_VERSION);
524
  wp_enqueue_style('tnp-admin-jquery-ui', $newsletter_url . '/vendor/jquery-ui/jquery-ui.min.css', [], NEWSLETTER_VERSION);
 
525
  wp_enqueue_style('tnp-admin-dropdown', $newsletter_url . '/css/dropdown.css', [], NEWSLETTER_VERSION);
526
- wp_enqueue_style('tnp-admin-dashboard', $newsletter_url . '/css/dashboard.css', [], NEWSLETTER_VERSION);
 
527
  wp_enqueue_style('tnp-admin-fields', $newsletter_url . '/css/fields.css', [], NEWSLETTER_VERSION);
528
  wp_enqueue_style('tnp-admin-widgets', $newsletter_url . '/css/widgets.css', [], NEWSLETTER_VERSION);
529
- wp_enqueue_style('tnp-admin', $newsletter_url . '/admin.css',
530
- [
531
- 'tnp-admin-font',
532
- 'tnp-admin-fontawesome',
533
- 'tnp-admin-jquery-ui',
534
- 'tnp-admin-dropdown',
535
- 'tnp-admin-fields',
536
- 'tnp-admin-widgets'
537
- ], NEWSLETTER_VERSION);
538
 
539
  wp_enqueue_script('tnp-admin', $newsletter_url . '/admin.js', ['jquery'], NEWSLETTER_VERSION);
540
 
@@ -542,9 +548,7 @@ class Newsletter extends NewsletterModule {
542
  'save_to_update_counter' => __('Save the newsletter to update the counter!', 'newsletter')
543
  );
544
  wp_localize_script('tnp-admin', 'tnp_translations', $translations_array);
545
-
546
- wp_enqueue_style('tnp-select2', $newsletter_url . '/vendor/select2/select2.css', [], NEWSLETTER_VERSION);
547
- wp_enqueue_script('tnp-select2', $newsletter_url . '/vendor/select2/select2.min.js', [], NEWSLETTER_VERSION);
548
  wp_enqueue_script('tnp-jquery-vmap', $newsletter_url . '/vendor/jqvmap/jquery.vmap.min.js', ['jquery'], NEWSLETTER_VERSION);
549
  wp_enqueue_script('tnp-jquery-vmap-world', $newsletter_url . '/vendor/jqvmap/jquery.vmap.world.js', ['tnp-jquery-vmap'], NEWSLETTER_VERSION);
550
  wp_enqueue_style('tnp-jquery-vmap', $newsletter_url . '/vendor/jqvmap/jqvmap.min.css', [], NEWSLETTER_VERSION);
4
  Plugin Name: Newsletter
5
  Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
6
  Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
7
+ Version: 7.0.8
8
  Author: Stefano Lissa & The Newsletter Team
9
  Author URI: https://www.thenewsletterplugin.com
10
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
35
  return;
36
  }
37
 
38
+ define('NEWSLETTER_VERSION', '7.0.8');
39
 
40
  global $newsletter, $wpdb;
41
 
42
+ if (!defined('NEWSLETTER_DARK'))
43
+ define('NEWSLETTER_DARK', false);
44
+
45
  if (!defined('NEWSLETTER_BETA'))
46
  define('NEWSLETTER_BETA', false);
47
 
471
  $this->add_menu_page('main', __('Settings and More', 'newsletter'));
472
  $this->add_admin_page('smtp', 'SMTP');
473
  $this->add_admin_page('status', __('Status', 'newsletter'));
474
+ $this->add_admin_page('logs', __('Logs', 'newsletter'));
475
  $this->add_admin_page('diagnostic', __('Diagnostic', 'newsletter'));
476
  $this->add_admin_page('test', __('Test', 'newsletter'));
477
  }
508
 
509
  function hook_wp_enqueue_scripts() {
510
  if (empty($this->options['css_disabled']) && apply_filters('newsletter_enqueue_style', true)) {
511
+ wp_enqueue_style('newsletter', plugins_url('newsletter') . '/style.css', [], NEWSLETTER_VERSION);
512
  if (!empty($this->options['css'])) {
513
  wp_add_inline_style('newsletter', $this->options['css']);
514
  }
523
  wp_enqueue_script('jquery-ui-draggable');
524
  wp_enqueue_media();
525
 
526
+ wp_enqueue_style('tnp-select2', $newsletter_url . '/vendor/select2/css/select2.min.css', [], NEWSLETTER_VERSION);
527
+ wp_enqueue_script('tnp-select2', $newsletter_url . '/vendor/select2/js/select2.min.js', [], NEWSLETTER_VERSION);
528
+
529
  wp_enqueue_style('tnp-admin-font', 'https://use.typekit.net/jlj2wjy.css');
530
  wp_enqueue_style('tnp-admin-fontawesome', $newsletter_url . '/vendor/fa/css/all.min.css', [], NEWSLETTER_VERSION);
531
  wp_enqueue_style('tnp-admin-jquery-ui', $newsletter_url . '/vendor/jquery-ui/jquery-ui.min.css', [], NEWSLETTER_VERSION);
532
+ wp_enqueue_style('tnp-admin', $newsletter_url . '/admin.css', [], NEWSLETTER_VERSION);
533
  wp_enqueue_style('tnp-admin-dropdown', $newsletter_url . '/css/dropdown.css', [], NEWSLETTER_VERSION);
534
+ wp_enqueue_style('tnp-admin-tabs', $newsletter_url . '/css/tabs.css', [], NEWSLETTER_VERSION);
535
+ wp_enqueue_style('tnp-admin-controls', $newsletter_url . '/css/controls.css', [], NEWSLETTER_VERSION);
536
  wp_enqueue_style('tnp-admin-fields', $newsletter_url . '/css/fields.css', [], NEWSLETTER_VERSION);
537
  wp_enqueue_style('tnp-admin-widgets', $newsletter_url . '/css/widgets.css', [], NEWSLETTER_VERSION);
538
+ wp_enqueue_style('tnp-admin-extensions', $newsletter_url . '/css/extensions.css', [], NEWSLETTER_VERSION);
539
+
540
+ if (NEWSLETTER_DARK) {
541
+ wp_enqueue_style('tnp-admin-dark', $newsletter_url . '/admin-dark.css', ['tnp-admin'], NEWSLETTER_VERSION);
542
+ wp_enqueue_style('tnp-admin-controls-dark', $newsletter_url . '/css/controls-dark.css', ['tnp-admin-controls'], NEWSLETTER_VERSION);
543
+ }
 
 
 
544
 
545
  wp_enqueue_script('tnp-admin', $newsletter_url . '/admin.js', ['jquery'], NEWSLETTER_VERSION);
546
 
548
  'save_to_update_counter' => __('Save the newsletter to update the counter!', 'newsletter')
549
  );
550
  wp_localize_script('tnp-admin', 'tnp_translations', $translations_array);
551
+
 
 
552
  wp_enqueue_script('tnp-jquery-vmap', $newsletter_url . '/vendor/jqvmap/jquery.vmap.min.js', ['jquery'], NEWSLETTER_VERSION);
553
  wp_enqueue_script('tnp-jquery-vmap-world', $newsletter_url . '/vendor/jqvmap/jquery.vmap.world.js', ['tnp-jquery-vmap'], NEWSLETTER_VERSION);
554
  wp_enqueue_style('tnp-jquery-vmap', $newsletter_url . '/vendor/jqvmap/jqvmap.min.css', [], NEWSLETTER_VERSION);
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
3
  Requires at least: 3.4.0
4
  Tested up to: 5.7
5
- Stable tag: 7.0.7
6
  Requires PHP: 5.6
7
  Contributors: satollo,webagile,michael-travan
8
  License: GPLv2 or later
@@ -118,6 +118,15 @@ Thank you, The Newsletter Team
118
 
119
  == Changelog ==
120
 
 
 
 
 
 
 
 
 
 
121
  = 7.0.7 =
122
 
123
  * [COMPOSER] Fixed a warning in some inline editable blocks
2
  Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
3
  Requires at least: 3.4.0
4
  Tested up to: 5.7
5
+ Stable tag: 7.0.8
6
  Requires PHP: 5.6
7
  Contributors: satollo,webagile,michael-travan
8
  License: GPLv2 or later
118
 
119
  == Changelog ==
120
 
121
+ = 7.0.8 =
122
+
123
+ * [SUBSCRIBERS] Changed action buttons
124
+ * [GENERAL] Reoganization of CSS and removal of unused files
125
+ * [DASHBOARD] New window open for links and fix of invalid URLs
126
+ * [NEWSLETTERS] New action buttons
127
+ * [GENERAL] Minor fixes and optimizations
128
+ * [COMPOSER] Fixed rare size error on gif images
129
+
130
  = 7.0.7 =
131
 
132
  * [COMPOSER] Fixed a warning in some inline editable blocks
style.min.css DELETED
@@ -1 +0,0 @@
1
- .tnp-subscription{display:block;margin:15px auto;max-width:500px;width:100%}.tnp-subscription div.tnp-field{margin-bottom:10px;border:0;padding:0}.tnp-subscription label{display:block;color:inherit;font-weight:700;line-height:normal;padding:5px;margin:0}.tnp-subscription input[type=text],.tnp-subscription input[type=email],.tnp-subscription input[type=submit],.tnp-subscription select{width:100%;height:50px;padding:10px;display:block;border:1px;border-color:#ddd;background-color:#f4f4f4;background-image:none;text-shadow:none;color:#444;font-size:14px;line-height:20px;margin:0;line-height:normal;box-sizing:border-box}.tnp-subscription input[type=checkbox],.tnp-widget input[type=radio]{max-width:20px;display:inline-block}.tnp-subscription select option{margin-right:10px}.tnp-subscription input.tnp-submit{background-color:#444;color:#fff;width:auto;height:auto;margin:0}@media all and (max-width:480px){.tnp-subscription input[type=submit]{width:100%}}.tnp-profile form .tnp-field{margin-bottom:10px;border:0;padding:0}.tnp-profile form .tnp-field label{display:block;color:#333}.tnp-profile form .tnp-field input[type=text],.tnp-profile form .tnp-field input[type=email],.tnp-profile form .tnp-field input[type=submit],.tnp-profile form .tnp-field textarea,.tnp-profile form .tnp-field select{padding:10px;display:block;border:1px;border-color:#ddd;background-color:#f4f4f4;background-image:none;text-shadow:none;color:#444;font-size:14px;margin:0;line-height:normal;box-sizing:border-box;border-radius:0;height:auto;float:none}.tnp-profile form input[type=checkbox],.tnp-profile input[type=radio]{max-width:20px;display:inline-block}.tnp-profile form .tnp-list-label{margin-left:15px}.tnp-profile form select option{margin-right:10px}.tnp-profile form .tnp-field input[type=submit]{background-color:#444;color:#fff;width:auto;height:auto;margin:0}@media all and (max-width:480px){.tnp-profile input[type=submit]{width:100%;margin:0}}.tnp-widget{width:100%;display:block;box-sizing:border-box}.tnp-widget .tnp-field{margin-bottom:10px;border:0;padding:0}.tnp-widget label{display:block;color:inherit;font-size:14px}.tnp-widget input[type=text],.tnp-widget input[type=email],.tnp-widget input[type=submit],.tnp-widget select{width:100%;padding:10px;display:block;border:1px solid #ddd;border-color:#ddd;background-color:#f4f4f4;background-image:none;text-shadow:none;color:#444;font-size:14px;line-height:normal;box-sizing:border-box;height:auto}.tnp-widget input[type=checkbox],.tnp-widget input[type=radio]{width:auto;display:inline-block}.tnp-widget select option{margin-right:10px}.tnp-widget input.tnp-submit{background-color:#444;background-image:none;text-shadow:none;color:#fff;margin:0}.tnp-field input[type="submit"]{position:inherit}.tnp-widget-minimal{width:100%}.tnp-widget-minimal form{margin:0;padding:0;border:0}.tnp-widget-minimal input.tnp-email{width:100%;box-sizing:border-box;padding:10px;display:inline-block;border:1px solid #ddd;background-color:#f4f4f4;color:#444;font-size:14px}.tnp-widget-minimal input.tnp-submit{width:100%;box-sizing:border-box;padding:10px;display:inline-block;border:1px;border-color:#ddd;background-color:#444;background-image:none;text-shadow:none;color:#fff;font-size:14px;line-height:normal;border-radius:0;height:auto;margin:0}.tnp-subscription-minimal{width:100%;box-sizing:border-box}.tnp-subscription-minimal form{margin:0;padding:0;border:0}.tnp-subscription-minimal input.tnp-email{width:70%;max-width:300px;box-sizing:border-box;padding:10px;display:inline-block;border:1px solid #ddd;background-color:#f4f4f4;color:#444;font-size:14px;line-height:20px;border-radius:0}.tnp-subscription-minimal .tnp-privacy-field{margin-top:10px}.tnp-subscription-minimal input.tnp-submit{width:29%;box-sizing:border-box;display:inline-block;padding:10px;border:1px;border-color:#ddd;background-color:#444;background-image:none;text-shadow:none;color:#fff;font-size:14px;line-height:20px;border-radius:0;margin:0}.tnp-comments{clear:both;margin-top:15px;margin-bottom:15px}.tnp-comments label{display:block}.tnp-comments input[type=checkbox]{display:inline-block;width:auto!important}.tnp-lock{clear:both;display:block;box-sizing:border-box;box-shadow:none;margin:20px;padding:15px;background-color:#fff;border:1px solid #ddd}.tnp-nl-checkout{margin-bottom:1em}
 
subscription/profile.php CHANGED
@@ -67,7 +67,7 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
67
  <tr>
68
  <th>Email</th>
69
  <td>
70
- <table class="newsletter-option-grid">
71
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('email', 50); ?></td></tr>
72
  <tr><th><?php _e('Error message', 'newsletter') ?></th><td><?php $controls->text('email_error', 50); ?></td></tr>
73
  </table>
@@ -76,11 +76,11 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
76
  <tr>
77
  <th><?php _e('First name', 'newsletter') ?></th>
78
  <td>
79
- <table class="newsletter-option-grid">
80
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('name', 50); ?></td></tr>
81
  <?php if ($is_all_languages) { ?>
82
- <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('name_status', $status); ?></td></tr>
83
- <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('name_rules', $rules); ?></td></tr>
84
  <?php } ?>
85
  </table>
86
  <p class="description">
@@ -91,11 +91,11 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
91
  <tr>
92
  <th><?php _e('Last name', 'newsletter') ?></th>
93
  <td>
94
- <table class="newsletter-option-grid">
95
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('surname', 50); ?></td></tr>
96
  <?php if ($is_all_languages) { ?>
97
- <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('surname_status', $status); ?></td></tr>
98
- <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('surname_rules', $rules); ?></td></tr>
99
  <?php } ?>
100
  </table>
101
  </td>
@@ -103,18 +103,18 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
103
  <tr>
104
  <th><?php _e('Gender', 'newsletter') ?></th>
105
  <td>
106
- <table class="newsletter-option-grid">
107
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('sex', 50); ?></td></tr>
108
  <?php if ($is_all_languages) { ?>
109
- <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('sex_status', $status); ?></td></tr>
110
- <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('sex_rules', $rules); ?></td></tr>
111
  <?php } ?>
112
  <tr>
113
  <th><?php _e('Value labels', 'newsletter') ?></th>
114
  <td>
115
- <?php _e('not specified', 'newsletter') ?>: <?php $controls->text('sex_none'); ?>
116
- <?php _e('female', 'newsletter') ?>: <?php $controls->text('sex_female'); ?>
117
- <?php _e('male', 'newsletter') ?>: <?php $controls->text('sex_male'); ?>
118
  </td>
119
  </tr>
120
  <tr>
@@ -146,9 +146,9 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
146
  <tr>
147
  <th><?php _e('Privacy checkbox/notice', 'newsletter') ?></th>
148
  <td>
149
- <table class="newsletter-option-grid">
150
  <?php if ($is_all_languages) { ?>
151
- <tr><th><?php _e('Enabled?', 'newsletter') ?></th><td><?php $controls->select('privacy_status', array(0 => __('No', 'newsletter'), 1 => __('Yes', 'newsletter'), 2 => __('Only the notice', 'newsletter'))); ?></td></tr>
152
  <?php } ?>
153
  <tr><th><?php _e('Label', 'newsletter') ?></th><td><?php $controls->text('privacy', 50); ?></td></tr>
154
  <tr>
@@ -172,9 +172,9 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
172
  </td>
173
  </tr>
174
  </table>
175
- <p class="description">
176
  <?php _e('The privacy acceptance checkbox (required in many Europen countries) forces the subscriber to check it before proceeding. If an URL is specified the label becomes a link.', 'newsletter') ?>
177
- </p>
178
  </td>
179
  </tr>
180
 
@@ -194,17 +194,17 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
194
 
195
  <table class="widefat">
196
  <thead>
197
- <tr>
198
- <th><?php _e('Field', 'newsletter') ?></th>
199
- <th><?php _e('Name/Label', 'newsletter') ?></th>
200
- <th><?php _e('Placeholder', 'newsletter') ?></th>
201
-
202
  <th><?php _e('When/Where', 'newsletter') ?></th>
203
  <th><?php _e('Type', 'newsletter') ?></th>
204
  <th><?php _e('Rule', 'newsletter') ?></th>
205
-
206
- <th><?php _e('List values comma separated', 'newsletter') ?></th>
207
- </tr>
208
  </thead>
209
  <?php for ($i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i++) { ?>
210
  <tr>
@@ -212,13 +212,13 @@ $extra_type = array('text' => __('Text', 'newsletter'), 'select' => __('List', '
212
  <td><?php $controls->text('profile_' . $i); ?></td>
213
  <td><?php $controls->text('profile_' . $i . '_placeholder'); ?></td>
214
  <?php if ($is_all_languages) { ?>
215
- <td><?php $controls->select('profile_' . $i . '_status', $status); ?></td>
216
- <td><?php $controls->select('profile_' . $i . '_type', $extra_type); ?></td>
217
- <td><?php $controls->select('profile_' . $i . '_rules', $rules); ?></td>
218
  <?php } else { ?>
219
- <td><?php echo esc_html($status[$controls->get_value('profile_' . $i . '_status')]) ?></td>
220
- <td><?php echo esc_html($extra_type[$controls->get_value('profile_' . $i . '_type')]) ?></td>
221
- <td><?php echo esc_html($rules[$controls->get_value('profile_' . $i . '_rules')]) ?></td>
222
  <?php } ?>
223
  <td>
224
  <?php $controls->textarea_fixed('profile_' . $i . '_options', '200px', '50px'); ?>
67
  <tr>
68
  <th>Email</th>
69
  <td>
70
+ <table class="tnpc-grid">
71
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('email', 50); ?></td></tr>
72
  <tr><th><?php _e('Error message', 'newsletter') ?></th><td><?php $controls->text('email_error', 50); ?></td></tr>
73
  </table>
76
  <tr>
77
  <th><?php _e('First name', 'newsletter') ?></th>
78
  <td>
79
+ <table class="tnpc-grid">
80
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('name', 50); ?></td></tr>
81
  <?php if ($is_all_languages) { ?>
82
+ <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('name_status', $status); ?></td></tr>
83
+ <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('name_rules', $rules); ?></td></tr>
84
  <?php } ?>
85
  </table>
86
  <p class="description">
91
  <tr>
92
  <th><?php _e('Last name', 'newsletter') ?></th>
93
  <td>
94
+ <table class="tnpc-grid">
95
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('surname', 50); ?></td></tr>
96
  <?php if ($is_all_languages) { ?>
97
+ <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('surname_status', $status); ?></td></tr>
98
+ <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('surname_rules', $rules); ?></td></tr>
99
  <?php } ?>
100
  </table>
101
  </td>
103
  <tr>
104
  <th><?php _e('Gender', 'newsletter') ?></th>
105
  <td>
106
+ <table class="tnpc-grid">
107
  <tr><th><?php _e('Field label', 'newsletter') ?></th><td><?php $controls->text('sex', 50); ?></td></tr>
108
  <?php if ($is_all_languages) { ?>
109
+ <tr><th><?php _e('When to show', 'newsletter') ?></th><td><?php $controls->select('sex_status', $status); ?></td></tr>
110
+ <tr><th><?php _e('Rules', 'newsletter') ?></th><td><?php $controls->select('sex_rules', $rules); ?></td></tr>
111
  <?php } ?>
112
  <tr>
113
  <th><?php _e('Value labels', 'newsletter') ?></th>
114
  <td>
115
+ <?php $controls->text('sex_none', 20, __('not specified', 'newsletter')); ?>
116
+ <?php $controls->text('sex_female', 20, __('female', 'newsletter')); ?>
117
+ <?php $controls->text('sex_male', 20, __('male', 'newsletter')); ?>
118
  </td>
119
  </tr>
120
  <tr>
146
  <tr>
147
  <th><?php _e('Privacy checkbox/notice', 'newsletter') ?></th>
148
  <td>
149
+ <table>
150
  <?php if ($is_all_languages) { ?>
151
+ <tr><th><?php _e('Enabled?', 'newsletter') ?></th><td><?php $controls->select('privacy_status', array(0 => __('No', 'newsletter'), 1 => __('Yes', 'newsletter'), 2 => __('Only the notice', 'newsletter'))); ?></td></tr>
152
  <?php } ?>
153
  <tr><th><?php _e('Label', 'newsletter') ?></th><td><?php $controls->text('privacy', 50); ?></td></tr>
154
  <tr>
172
  </td>
173
  </tr>
174
  </table>
175
+ <div class="tnpc-hint">
176
  <?php _e('The privacy acceptance checkbox (required in many Europen countries) forces the subscriber to check it before proceeding. If an URL is specified the label becomes a link.', 'newsletter') ?>
177
+ </div>
178
  </td>
179
  </tr>
180
 
194
 
195
  <table class="widefat">
196
  <thead>
197
+ <tr>
198
+ <th><?php _e('Field', 'newsletter') ?></th>
199
+ <th><?php _e('Name/Label', 'newsletter') ?></th>
200
+ <th><?php _e('Placeholder', 'newsletter') ?></th>
201
+
202
  <th><?php _e('When/Where', 'newsletter') ?></th>
203
  <th><?php _e('Type', 'newsletter') ?></th>
204
  <th><?php _e('Rule', 'newsletter') ?></th>
205
+
206
+ <th><?php _e('List values comma separated', 'newsletter') ?></th>
207
+ </tr>
208
  </thead>
209
  <?php for ($i = 1; $i <= NEWSLETTER_PROFILE_MAX; $i++) { ?>
210
  <tr>
212
  <td><?php $controls->text('profile_' . $i); ?></td>
213
  <td><?php $controls->text('profile_' . $i . '_placeholder'); ?></td>
214
  <?php if ($is_all_languages) { ?>
215
+ <td><?php $controls->select('profile_' . $i . '_status', $status); ?></td>
216
+ <td><?php $controls->select('profile_' . $i . '_type', $extra_type); ?></td>
217
+ <td><?php $controls->select('profile_' . $i . '_rules', $rules); ?></td>
218
  <?php } else { ?>
219
+ <td><?php echo esc_html($status[$controls->get_value('profile_' . $i . '_status')]) ?></td>
220
+ <td><?php echo esc_html($extra_type[$controls->get_value('profile_' . $i . '_type')]) ?></td>
221
+ <td><?php echo esc_html($rules[$controls->get_value('profile_' . $i . '_rules')]) ?></td>
222
  <?php } ?>
223
  <td>
224
  <?php $controls->textarea_fixed('profile_' . $i . '_options', '200px', '50px'); ?>
subscription/subscription.php CHANGED
@@ -285,7 +285,7 @@ class NewsletterSubscription extends NewsletterModule {
285
  }
286
 
287
  function first_install() {
288
-
289
  }
290
 
291
  function admin_menu() {
@@ -464,9 +464,9 @@ class NewsletterSubscription extends NewsletterModule {
464
  function get_default_subscription($language = null) {
465
  $subscription = new TNP_Subscription();
466
 
467
- $language = is_null( $language ) ? $this->get_current_language() : $language;
468
 
469
- $subscription->data->language = $language ;
470
  $subscription->optin = $this->is_double_optin() ? 'double' : 'single';
471
  $subscription->if_exists = empty($this->options['multiple']) ? TNP_Subscription::EXISTING_ERROR : TNP_Subscription::EXISTING_MERGE;
472
 
@@ -787,7 +787,6 @@ class NewsletterSubscription extends NewsletterModule {
787
  continue;
788
  }
789
  $data->lists['' . $list_id] = 1;
790
-
791
  }
792
  } else {
793
  $this->logger->debug('No lists received');
@@ -937,8 +936,7 @@ class NewsletterSubscription extends NewsletterModule {
937
  $message['html'] = str_replace('{message}', $message['html'], $template);
938
  $message['html'] = $this->replace($message['html'], $user);
939
  $message['text'] = $this->replace($message['text'], $user);
940
- }
941
- else {
942
  $message = str_replace('{message}', $message, $template);
943
  $message = $this->replace($message, $user);
944
  }
@@ -983,7 +981,7 @@ class NewsletterSubscription extends NewsletterModule {
983
  } else {
984
  $new_email = get_transient('newsletter_user_' . $user->id . '_email');
985
  if ($new_email) {
986
- $data = ['id'=>$user->id, 'email'=>$new_email];
987
  $this->save_user($data);
988
  delete_transient('newsletter_user_' . $user->id . '_email');
989
  }
@@ -1032,7 +1030,7 @@ class NewsletterSubscription extends NewsletterModule {
1032
 
1033
  $options = $this->get_options('', $language);
1034
  $message = [];
1035
- $message['html'] = do_shortcode( $options[ $type . '_message' ] );
1036
  $message['text'] = $this->get_text_message($type);
1037
  if ($user->status == Newsletter::STATUS_NOT_CONFIRMED) {
1038
  $message['html'] = $this->add_microdata($message['html']);
@@ -1127,7 +1125,7 @@ class NewsletterSubscription extends NewsletterModule {
1127
  }
1128
 
1129
  function get_form_javascript() {
1130
-
1131
  }
1132
 
1133
  /**
@@ -1191,7 +1189,8 @@ class NewsletterSubscription extends NewsletterModule {
1191
 
1192
  foreach ($arr as $a) {
1193
  $a = trim($a);
1194
- if (empty($a)) continue;
 
1195
 
1196
  $list = $this->get_list($a);
1197
  if (!$list) {
@@ -1410,8 +1409,8 @@ class NewsletterSubscription extends NewsletterModule {
1410
  if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
1411
 
1412
  $buffer .= '<div class="tnp-field tnp-lists">';
1413
- // There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
1414
- $buffer .= $this->_shortcode_label('lists', $attrs);
1415
  $buffer .= '<select class="tnp-lists" name="nl[]" required>';
1416
 
1417
  if (!empty($attrs['first_option_label'])) {
@@ -1633,9 +1632,9 @@ class NewsletterSubscription extends NewsletterModule {
1633
  if (empty($attrs['lists_field_empty_label'])) {
1634
  $attrs['lists_field_empty_label'] = '';
1635
  }
1636
- if (empty($attrs['lists_field_label'])) {
1637
- $attrs['lists_field_label'] = '';
1638
- }
1639
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists', 'layout' => 'dropdown', 'first_option_label' => $attrs['lists_field_empty_label'], 'label' => $attrs['lists_field_label']]);
1640
  } else {
1641
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
285
  }
286
 
287
  function first_install() {
288
+
289
  }
290
 
291
  function admin_menu() {
464
  function get_default_subscription($language = null) {
465
  $subscription = new TNP_Subscription();
466
 
467
+ $language = is_null($language) ? $this->get_current_language() : $language;
468
 
469
+ $subscription->data->language = $language;
470
  $subscription->optin = $this->is_double_optin() ? 'double' : 'single';
471
  $subscription->if_exists = empty($this->options['multiple']) ? TNP_Subscription::EXISTING_ERROR : TNP_Subscription::EXISTING_MERGE;
472
 
787
  continue;
788
  }
789
  $data->lists['' . $list_id] = 1;
 
790
  }
791
  } else {
792
  $this->logger->debug('No lists received');
936
  $message['html'] = str_replace('{message}', $message['html'], $template);
937
  $message['html'] = $this->replace($message['html'], $user);
938
  $message['text'] = $this->replace($message['text'], $user);
939
+ } else {
 
940
  $message = str_replace('{message}', $message, $template);
941
  $message = $this->replace($message, $user);
942
  }
981
  } else {
982
  $new_email = get_transient('newsletter_user_' . $user->id . '_email');
983
  if ($new_email) {
984
+ $data = ['id' => $user->id, 'email' => $new_email];
985
  $this->save_user($data);
986
  delete_transient('newsletter_user_' . $user->id . '_email');
987
  }
1030
 
1031
  $options = $this->get_options('', $language);
1032
  $message = [];
1033
+ $message['html'] = do_shortcode($options[$type . '_message']);
1034
  $message['text'] = $this->get_text_message($type);
1035
  if ($user->status == Newsletter::STATUS_NOT_CONFIRMED) {
1036
  $message['html'] = $this->add_microdata($message['html']);
1125
  }
1126
 
1127
  function get_form_javascript() {
1128
+
1129
  }
1130
 
1131
  /**
1189
 
1190
  foreach ($arr as $a) {
1191
  $a = trim($a);
1192
+ if (empty($a))
1193
+ continue;
1194
 
1195
  $list = $this->get_list($a);
1196
  if (!$list) {
1409
  if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
1410
 
1411
  $buffer .= '<div class="tnp-field tnp-lists">';
1412
+ // There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
1413
+ $buffer .= $this->_shortcode_label('lists', $attrs);
1414
  $buffer .= '<select class="tnp-lists" name="nl[]" required>';
1415
 
1416
  if (!empty($attrs['first_option_label'])) {
1632
  if (empty($attrs['lists_field_empty_label'])) {
1633
  $attrs['lists_field_empty_label'] = '';
1634
  }
1635
+ if (empty($attrs['lists_field_label'])) {
1636
+ $attrs['lists_field_label'] = '';
1637
+ }
1638
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists', 'layout' => 'dropdown', 'first_option_label' => $attrs['lists_field_empty_label'], 'label' => $attrs['lists_field_label']]);
1639
  } else {
1640
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
tnp-header.php CHANGED
@@ -159,6 +159,12 @@ $warning |= empty($status_options['mail']);
159
  <i class="fas fa-exclamation-triangle" style="color: red;"></i>
160
  <?php } ?>
161
  </a>
 
 
 
 
 
 
162
  </li>
163
  <?php } ?>
164
 
@@ -259,9 +265,9 @@ $warning |= empty($status_options['mail']);
259
  <?php if (!defined('NEWSLETTER_CRON_WARNINGS') || NEWSLETTER_CRON_WARNINGS) {
260
  $x = wp_next_scheduled('newsletter');
261
  if ($x === false) {
262
- echo '<div class="tnp-warning">The Newsletter delivery engine is off (it should never be off). Deactivate and reactivate the Newsletter plugin.</div>';
263
  } else if (time() - $x > 900) {
264
- echo '<div class="tnp-warning">The WP scheduler doesn\'t seem to be running correctly for Newsletter. <a href="https://www.thenewsletterplugin.com/documentation/?p=6128" target="_blank"><strong>Read this page to solve the problem</strong></a>. Check even the WP Tools&gt;Site Health panel. A good plugin to check the status of the WP internal scheduler is <a href="https://wordpress.org/plugins/wp-crontrol/" target="_blank">WP Control</a>.</div>';
265
  } else {
266
  // if (empty($this->options['disable_cron_notice'])) {
267
  // $cron_data = get_option('newsletter_diagnostic_cron_data');
159
  <i class="fas fa-exclamation-triangle" style="color: red;"></i>
160
  <?php } ?>
161
  </a>
162
+ <ul>
163
+ <li>
164
+ <a href="?page=newsletter_main_logs"><i class="fas fa-file"></i> <?php _e('Logs', 'newsletter') ?>
165
+ <small><?php _e('Plugin and addons logs', 'newsletter') ?></small></a>
166
+ </li>
167
+ </ul>
168
  </li>
169
  <?php } ?>
170
 
265
  <?php if (!defined('NEWSLETTER_CRON_WARNINGS') || NEWSLETTER_CRON_WARNINGS) {
266
  $x = wp_next_scheduled('newsletter');
267
  if ($x === false) {
268
+ echo '<div class="tnpc-warning">The Newsletter delivery engine is off (it should never be off). Deactivate and reactivate the Newsletter plugin.</div>';
269
  } else if (time() - $x > 900) {
270
+ echo '<div class="tnpc-warning">The WP scheduler doesn\'t seem to be running correctly for Newsletter. <a href="https://www.thenewsletterplugin.com/documentation/?p=6128" target="_blank"><strong>Read this page to solve the problem</strong></a>.</div>';
271
  } else {
272
  // if (empty($this->options['disable_cron_notice'])) {
273
  // $cron_data = get_option('newsletter_diagnostic_cron_data');
users/edit.php CHANGED
@@ -96,7 +96,7 @@ function percentValue($value, $total) {
96
 
97
  <form method="post" action="">
98
  <p>
99
- <?php $controls->button_back('?page=newsletter_users_index'); ?>
100
  <?php $controls->button_save(); ?>
101
  </p>
102
  <?php $controls->init(); ?>
96
 
97
  <form method="post" action="">
98
  <p>
99
+ <?php $controls->button_icon_back('?page=newsletter_users_index'); ?>
100
  <?php $controls->button_save(); ?>
101
  </p>
102
  <?php $controls->init(); ?>
users/import.php CHANGED
@@ -17,13 +17,13 @@ $controls = new NewsletterControls();
17
 
18
  <div id="tnp-body" class="tnp-users tnp-users-import">
19
  <p>
20
- The import features have been consolidated in the <strong>free</strong> "Adacanced Import" addon you can find on
21
- <a href="?page=newsletter_main_extensions">addons management panel</a>. Please install that addon to have:
22
  </p>
23
  <ul style="color: #fff; margin-left: 1em;">
24
  <li>File upload or copy and paste of data</li>
25
  <li>Background processing for long set of data</li>
26
- <li>Quick bounceed address import</li>
27
  </ul>
28
 
29
  <p>
17
 
18
  <div id="tnp-body" class="tnp-users tnp-users-import">
19
  <p>
20
+ The import features have been consolidated in the <strong>free</strong> "Advanced Import" addon you can find on
21
+ <a href="?page=<?php echo class_exists('NewsletterExtensions') ? 'newsletter_extensions_index' : 'newsletter_main_extensions' ?>">addons management panel</a>. Please install that addon to have:
22
  </p>
23
  <ul style="color: #fff; margin-left: 1em;">
24
  <li>File upload or copy and paste of data</li>
25
  <li>Background processing for long set of data</li>
26
+ <li>Quick bounced address import</li>
27
  </ul>
28
 
29
  <p>
users/index.php CHANGED
@@ -36,7 +36,7 @@ if ($controls->is_action('resend_welcome')) {
36
  $controls->messages = __('Welcome email sent.', 'newsletter');
37
  }
38
 
39
- if ($controls->is_action('remove')) {
40
  $this->delete_user($controls->button_data);
41
  unset($controls->data['subscriber_id']);
42
  }
@@ -169,7 +169,7 @@ $controls->data['search_page'] ++;
169
  <table class="widefat">
170
  <thead>
171
  <tr>
172
- <th><input type="checkbox" onchange="jQuery('input.tnp-selector').prop('checked', this.checked)"></th>
173
  <th>Id</th>
174
  <th>Email</th>
175
  <th><?php _e('Name', 'newsletter') ?></th>
@@ -178,14 +178,14 @@ $controls->data['search_page'] ++;
178
  <th><?php _e('Lists', 'newsletter') ?></th>
179
  <?php } ?>
180
  <th>&nbsp;</th>
181
- <th>&nbsp;</th>
182
  <th>&nbsp;</th>
183
  </tr>
184
  </thead>
185
  <?php $i = 0; ?>
186
  <?php foreach ($list as $s) { ?>
187
- <tr class="<?php echo ($i++ % 2 == 0) ? 'alternate' : ''; ?>">
188
- <td><input class="tnp-selector" type="checkbox" name="ids[]" value="<?php echo $s->id; ?>"/></td>
189
  <td>
190
  <?php echo $s->id; ?>
191
  </td>
@@ -220,16 +220,16 @@ $controls->data['search_page'] ++;
220
  <?php } ?>
221
 
222
  <td>
223
- <a class="button-secondary" href="<?php echo $this->get_admin_page_url('edit'); ?>&amp;id=<?php echo $s->id; ?>"><?php _e('Edit', 'newsletter') ?></a>
224
  </td>
225
- <td>
226
- <?php $controls->button_confirm('remove', __('Remove', 'newsletter'), '', $s->id); ?>
227
- </td>
228
- <td style="text-align: center">
229
  <?php if ($s->status == "C") { ?>
230
- <?php $controls->button_confirm('resend_welcome', __('Resend welcome', 'newsletter'), '', $s->id); ?>
231
  <?php } else { ?>
232
- <?php $controls->button_confirm('resend', __('Resend activation', 'newsletter'), '', $s->id); ?>
233
  <?php } ?>
234
  </td>
235
 
36
  $controls->messages = __('Welcome email sent.', 'newsletter');
37
  }
38
 
39
+ if ($controls->is_action('delete')) {
40
  $this->delete_user($controls->button_data);
41
  unset($controls->data['subscriber_id']);
42
  }
169
  <table class="widefat">
170
  <thead>
171
  <tr>
172
+ <td class="check-column"><input type="checkbox" onchange="jQuery('input.tnp-selector').prop('checked', this.checked)"></th>
173
  <th>Id</th>
174
  <th>Email</th>
175
  <th><?php _e('Name', 'newsletter') ?></th>
178
  <th><?php _e('Lists', 'newsletter') ?></th>
179
  <?php } ?>
180
  <th>&nbsp;</th>
181
+
182
  <th>&nbsp;</th>
183
  </tr>
184
  </thead>
185
  <?php $i = 0; ?>
186
  <?php foreach ($list as $s) { ?>
187
+ <tr>
188
+ <th scope="row" class="check-column" style="vertical-align: middle"><input class="tnp-selector" type="checkbox" name="ids[]" value="<?php echo $s->id; ?>"/></td>
189
  <td>
190
  <?php echo $s->id; ?>
191
  </td>
220
  <?php } ?>
221
 
222
  <td>
223
+ <?php $controls->button_icon_edit($this->get_admin_page_url('edit') . '&amp;id=' . $s->id)?>
224
  </td>
225
+
226
+ <td style="white-space: nowrap">
227
+ <?php $controls->button_icon_delete($s->id); ?>
228
+
229
  <?php if ($s->status == "C") { ?>
230
+ <?php $controls->button_icon('resend_welcome', 'fa-redo', __('Resend welcome', 'newsletter'), $s->id, true); ?>
231
  <?php } else { ?>
232
+ <?php $controls->button_icon('resend', 'fa-redo', __('Resend activation', 'newsletter'), $s->id, true); ?>
233
  <?php } ?>
234
  </td>
235
 
vendor/select2/LICENSE DELETED
@@ -1,18 +0,0 @@
1
- Copyright 2014 Igor Vaynberg
2
-
3
- Version: @@ver@@ Timestamp: @@timestamp@@
4
-
5
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
6
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
7
- use of this software only upon the condition that you accept all of the terms of either the Apache
8
- License or the GPL License.
9
-
10
- You may obtain a copy of the Apache License and the GPL License at:
11
-
12
- http://www.apache.org/licenses/LICENSE-2.0
13
- http://www.gnu.org/licenses/gpl-2.0.html
14
-
15
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
16
- or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17
- either express or implied. See the Apache License and the GPL License for the specific language governing
18
- permissions and limitations under the Apache License and the GPL License.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/select2/LICENSE.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
vendor/select2/css/select2.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
vendor/select2/js/select2.min.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u<e.length;u++)if("."===(p=e[u]))e.splice(u,1),u-=1;else if(".."===p){if(0===u||1===u&&".."===e[2]||".."===e[u-1])continue;0<u&&(e.splice(u-1,2),u-=2)}e=e.join("/")}if((h||g)&&f){for(u=(n=e.split("/")).length;0<u;u-=1){if(r=n.slice(0,u).join("/"),h)for(d=h.length;0<d;d-=1)if(i=(i=f[h.slice(0,d).join("/")])&&i[r]){o=i,a=u;break}if(o)break;!l&&g&&g[r]&&(l=g[r],c=u)}!o&&l&&(o=l,a=c),o&&(n.splice(0,a,o),e=n.join("/"))}return e}function A(t,n){return function(){var e=a.call(arguments,0);return"string"!=typeof e[0]&&1===e.length&&e.push(null),s.apply(h,e.concat([t,n]))}}function x(t){return function(e){m[t]=e}}function D(e){if(w(v,e)){var t=v[e];delete v[e],_[e]=!0,o.apply(h,t)}if(!w(m,e)&&!w(_,e))throw new Error("No "+e);return m[e]}function c(e){var t,n=e?e.indexOf("!"):-1;return-1<n&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function S(e){return e?c(e):[]}return e&&e.requirejs||(e?n=e:e={},m={},v={},y={},_={},i=Object.prototype.hasOwnProperty,a=[].slice,b=/\.js$/,f=function(e,t){var n,r=c(e),i=r[0],o=t[1];return e=r[1],i&&(n=D(i=l(i,o))),i?e=n&&n.normalize?n.normalize(e,function(t){return function(e){return l(e,t)}}(o)):l(e,o):(i=(r=c(e=l(e,o)))[0],e=r[1],i&&(n=D(i))),{f:i?i+"!"+e:e,n:e,pr:i,p:n}},g={require:function(e){return A(e)},exports:function(e){var t=m[e];return void 0!==t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:function(e){return function(){return y&&y.config&&y.config[e]||{}}}(e)}}},o=function(e,t,n,r){var i,o,s,a,l,c,u,d=[],p=typeof n;if(c=S(r=r||e),"undefined"==p||"function"==p){for(t=!t.length&&n.length?["require","exports","module"]:t,l=0;l<t.length;l+=1)if("require"===(o=(a=f(t[l],c)).f))d[l]=g.require(e);else if("exports"===o)d[l]=g.exports(e),u=!0;else if("module"===o)i=d[l]=g.module(e);else if(w(m,o)||w(v,o)||w(_,o))d[l]=D(o);else{if(!a.p)throw new Error(e+" missing "+o);a.p.load(a.n,A(r,!0),x(o),{}),d[l]=m[o]}s=n?n.apply(m[e],d):void 0,e&&(i&&i.exports!==h&&i.exports!==m[e]?m[e]=i.exports:s===h&&u||(m[e]=s))}else e&&(m[e]=n)},t=n=s=function(e,t,n,r,i){if("string"==typeof e)return g[e]?g[e](t):D(f(e,S(t)).f);if(!e.splice){if((y=e).deps&&s(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=h}return t=t||function(){},"function"==typeof n&&(n=r,r=i),r?o(h,e,t,n):setTimeout(function(){o(h,e,t,n)},4),s},s.config=function(e){return s(e)},t._defined=m,(r=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),w(m,e)||w(v,e)||(v[e]=[e,t,n])}).amd={jQuery:!0},e.requirejs=t,e.require=n,e.define=r),e.define("almond",function(){}),e.define("jquery",[],function(){var e=u||$;return null==e&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),e}),e.define("select2/utils",["jquery"],function(o){var i={};function u(e){var t=e.prototype,n=[];for(var r in t){"function"==typeof t[r]&&"constructor"!==r&&n.push(r)}return n}i.Extend=function(e,t){var n={}.hasOwnProperty;function r(){this.constructor=e}for(var i in t)n.call(t,i)&&(e[i]=t[i]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e},i.Decorate=function(r,i){var e=u(i),t=u(r);function o(){var e=Array.prototype.unshift,t=i.prototype.constructor.length,n=r.prototype.constructor;0<t&&(e.call(arguments,r.prototype.constructor),n=i.prototype.constructor),n.apply(this,arguments)}i.displayName=r.displayName,o.prototype=new function(){this.constructor=o};for(var n=0;n<t.length;n++){var s=t[n];o.prototype[s]=r.prototype[s]}function a(e){var t=function(){};e in o.prototype&&(t=o.prototype[e]);var n=i.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),n.apply(this,arguments)}}for(var l=0;l<e.length;l++){var c=e[l];o.prototype[c]=a(c)}return o};function e(){this.listeners={}}e.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},e.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},null==n&&(n=[]),0===n.length&&n.push({}),(n[0]._type=e)in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},e.prototype.invoke=function(e,t){for(var n=0,r=e.length;n<r;n++)e[n].apply(this,t)},i.Observable=e,i.generateChars=function(e){for(var t="",n=0;n<e;n++){t+=Math.floor(36*Math.random()).toString(36)}return t},i.bind=function(e,t){return function(){e.apply(t,arguments)}},i._convertData=function(e){for(var t in e){var n=t.split("-"),r=e;if(1!==n.length){for(var i=0;i<n.length;i++){var o=n[i];(o=o.substring(0,1).toLowerCase()+o.substring(1))in r||(r[o]={}),i==n.length-1&&(r[o]=e[t]),r=r[o]}delete e[t]}}return e},i.hasScroll=function(e,t){var n=o(t),r=t.style.overflowX,i=t.style.overflowY;return(r!==i||"hidden"!==i&&"visible"!==i)&&("scroll"===r||"scroll"===i||(n.innerHeight()<t.scrollHeight||n.innerWidth()<t.scrollWidth))},i.escapeMarkup=function(e){var t={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('<ul class="select2-results__options" role="listbox"></ul>');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h('<li role="alert" aria-live="assertive" class="select2-results__option"></li>'),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var r=e.results[n],i=this.option(r);t.push(i)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},r.prototype.position=function(e,t){t.find(".select2-results").append(e)},r.prototype.sort=function(e){return this.options.get("sorter")(e)},r.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option[aria-selected]"),t=e.filter("[aria-selected=true]");0<t.length?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},r.prototype.setClasses=function(){var t=this;this.data.current(function(e){var r=h.map(e,function(e){return e.id.toString()});t.$results.find(".select2-results__option[aria-selected]").each(function(){var e=h(this),t=f.GetData(this,"data"),n=""+t.id;null!=t.element&&t.element.selected||null==t.element&&-1<h.inArray(n,r)?e.attr("aria-selected","true"):e.attr("aria-selected","false")})})},r.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},r.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},r.prototype.option=function(e){var t=document.createElement("li");t.className="select2-results__option";var n={role:"option","aria-selected":"false"},r=window.Element.prototype.matches||window.Element.prototype.msMatchesSelector||window.Element.prototype.webkitMatchesSelector;for(var i in(null!=e.element&&r.call(e.element,":disabled")||null==e.element&&e.disabled)&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==e.id&&delete n["aria-selected"],null!=e._resultId&&(t.id=e._resultId),e.title&&(t.title=e.title),e.children&&(n.role="group",n["aria-label"]=e.text,delete n["aria-selected"]),n){var o=n[i];t.setAttribute(i,o)}if(e.children){var s=h(t),a=document.createElement("strong");a.className="select2-results__group";h(a);this.template(e,a);for(var l=[],c=0;c<e.children.length;c++){var u=e.children[c],d=this.option(u);l.push(d)}var p=h("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):i<o&&l.$results.scrollTop(s)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){l.displayMessage(e)}),h.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=l.$results.scrollTop(),n=l.$results.get(0).scrollHeight-t+e.deltaY,r=0<e.deltaY&&t-e.deltaY<=0,i=e.deltaY<0&&n<=l.$results.height();r?(l.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):i&&(l.$results.scrollTop(l.$results.get(0).scrollHeight-l.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(e){var t=h(this),n=f.GetData(this,"data");"true"!==t.attr("aria-selected")?l.trigger("select",{originalEvent:e,data:n}):l.options.get("multiple")?l.trigger("unselect",{originalEvent:e,data:n}):l.trigger("close",{})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(e){var t=f.GetData(this,"data");l.getHighlightedResults().removeClass("select2-results__option--highlighted"),l.trigger("results:focus",{data:t,element:h(this)})})},r.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},r.prototype.destroy=function(){this.$results.remove()},r.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]").index(e),n=this.$results.offset().top,r=e.offset().top,i=this.$results.scrollTop()+(r-n),o=r-n;i-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("<span></span>")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered"></ul>'),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n<e.length;n++){var r=e[n],i=this.selectionContainer(),o=this.display(r,i);i.append(o);var s=r.title||r.text;s&&i.attr("title",s),l.StoreData(i[0],"data",r),t.push(i)}var a=this.$selection.find(".select2-selection__rendered");l.appendMany(a,t)}},n}),e.define("select2/selection/placeholder",["../utils"],function(e){function t(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return t.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},t.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();return n.html(this.display(t)),n.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),n},t.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(1<t.length||n)return e.call(this,t);this.clear();var r=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(r)},t}),e.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(i,r,a){function e(){}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){r._handleClear(e)}),t.on("keypress",function(e){r._handleKeyboardClear(e,t)})},e.prototype._handleClear=function(e,t){if(!this.isDisabled()){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();var r=a.GetData(n[0],"data"),i=this.$element.val();this.$element.val(this.placeholder.id);var o={data:r};if(this.trigger("clear",o),o.prevented)this.$element.val(i);else{for(var s=0;s<r.length;s++)if(o={data:r[s]},this.trigger("unselect",o),o.prevented)return void this.$element.val(i);this.$element.trigger("input").trigger("change"),this.trigger("toggle",{})}}}},e.prototype._handleKeyboardClear=function(e,t,n){n.isOpen()||t.which!=r.DELETE&&t.which!=r.BACKSPACE||this._handleClear(t)},e.prototype.update=function(e,t){if(e.call(this,t),!(0<this.$selection.find(".select2-selection__placeholder").length||0===t.length)){var n=this.options.get("translations").get("removeAllItems"),r=i('<span class="select2-selection__clear" title="'+n()+'">&times;</span>');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></li>');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0<t.length){var n=a.GetData(t[0],"data");r.searchRemoveChoice(n),e.preventDefault()}}}),this.$selection.on("click",".select2-search--inline",function(e){r.$search.val()&&e.stopPropagation()});var o=document.documentMode,s=o&&o<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){s?r.$selection.off("input.search input.searchcheck"):r.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(s&&"input"===e.type)r.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&r.handleSearch(e)}})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";""!==this.$search.attr("placeholder")?e=this.$selection.find(".select2-selection__rendered").width():e=.75*(this.$search.val().length+1)+"em";this.$search.css("width",e)},e}),e.define("select2/selection/eventRelay",["jquery"],function(s){function e(){}return e.prototype.bind=function(e,t,n){var r=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],o=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){if(-1!==s.inArray(e,i)){t=t||{};var n=s.Event("select2:"+e,{params:t});r.$element.trigger(n),-1!==s.inArray(e,o)&&(t.prevented=n.isDefaultPrevented())}})},e}),e.define("select2/translation",["jquery","require"],function(t,n){function r(e){this.dict=e||{}}return r.prototype.all=function(){return this.dict},r.prototype.get=function(e){return this.dict[e]},r.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},r._cache={},r.loadPath=function(e){if(!(e in r._cache)){var t=n(e);r._cache[e]=t}return new r(r._cache[e])},r}),e.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),e.define("select2/data/base",["../utils"],function(r){function n(e,t){n.__super__.constructor.call(this)}return r.Extend(n,r.Observable),n.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},n.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},n.prototype.bind=function(e,t){},n.prototype.destroy=function(){},n.prototype.generateResultId=function(e,t){var n=e.id+"-result-";return n+=r.generateChars(4),null!=t.id?n+="-"+t.id.toString():n+="-"+r.generateChars(4),n},n}),e.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var n=[],r=this;this.$element.find(":selected").each(function(){var e=l(this),t=r.item(e);n.push(t)}),e(n)},n.prototype.select=function(i){var o=this;if(i.selected=!0,l(i.element).is("option"))return i.element.selected=!0,void this.$element.trigger("input").trigger("change");if(this.$element.prop("multiple"))this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;n<i.length;n++){var r=i[n].id;-1===l.inArray(r,t)&&t.push(r)}o.$element.val(t),o.$element.trigger("input").trigger("change")});else{var e=i.id;this.$element.val(e),this.$element.trigger("input").trigger("change")}},n.prototype.unselect=function(i){var o=this;if(this.$element.prop("multiple")){if(i.selected=!1,l(i.element).is("option"))return i.element.selected=!1,void this.$element.trigger("input").trigger("change");this.current(function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n].id;r!==i.id&&-1===l.inArray(r,t)&&t.push(r)}o.$element.val(t),o.$element.trigger("input").trigger("change")})}},n.prototype.bind=function(e,t){var n=this;(this.container=e).on("select",function(e){n.select(e.data)}),e.on("unselect",function(e){n.unselect(e.data)})},n.prototype.destroy=function(){this.$element.find("*").each(function(){a.RemoveData(this)})},n.prototype.query=function(r,e){var i=[],o=this;this.$element.children().each(function(){var e=l(this);if(e.is("option")||e.is("optgroup")){var t=o.item(e),n=o.matches(r,t);null!==n&&i.push(n)}}),e({results:i})},n.prototype.addOptions=function(e){a.appendMany(this.$element,e)},n.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:void 0!==(t=document.createElement("option")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);var n=l(t),r=this._normalizeItem(e);return r.element=t,a.StoreData(t,"data",r),n},n.prototype.item=function(e){var t={};if(null!=(t=a.GetData(e[0],"data")))return t;if(e.is("option"))t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if(e.is("optgroup")){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var n=e.children("option"),r=[],i=0;i<n.length;i++){var o=l(n[i]),s=this.item(o);r.push(s)}t.children=r}return(t=this._normalizeItem(t)).element=e[0],a.StoreData(e[0],"data",t),t},n.prototype._normalizeItem=function(e){e!==Object(e)&&(e={id:e,text:e});return null!=(e=l.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),l.extend({},{selected:!1,disabled:!1},e)},n.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},n}),e.define("select2/data/array",["./select","../utils","jquery"],function(e,f,g){function r(e,t){this._dataToConvert=t.get("data")||[],r.__super__.constructor.call(this,e,t)}return f.Extend(r,e),r.prototype.bind=function(e,t){r.__super__.bind.call(this,e,t),this.addOptions(this.convertToOptions(this._dataToConvert))},r.prototype.select=function(n){var e=this.$element.find("option").filter(function(e,t){return t.value==n.id.toString()});0===e.length&&(e=this.option(n),this.addOptions(e)),r.__super__.select.call(this,n)},r.prototype.convertToOptions=function(e){var t=this,n=this.$element.find("option"),r=n.map(function(){return t.item(g(this)).id}).get(),i=[];function o(e){return function(){return g(this).val()==e.id}}for(var s=0;s<e.length;s++){var a=this._normalizeItem(e[s]);if(0<=g.inArray(a.id,r)){var l=n.filter(o(a)),c=this.item(l),u=g.extend(!0,{},a,c),d=this.option(u);l.replaceWith(d)}else{var p=this.option(a);if(a.children){var h=this.convertToOptions(a.children);f.appendMany(p,h)}i.push(p)}}return i},r}),e.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,o){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return o.extend({},e,{q:e.term})},transport:function(e,t,n){var r=o.ajax(e);return r.then(t),r.fail(n),r}};return o.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(n,r){var i=this;null!=this._request&&(o.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var t=o.extend({type:"GET"},this.ajaxOptions);function e(){var e=t.transport(t,function(e){var t=i.processResults(e,n);i.options.get("debug")&&window.console&&console.error&&(t&&t.results&&o.isArray(t.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),r(t)},function(){"status"in e&&(0===e.status||"0"===e.status)||i.trigger("results:message",{message:"errorLoading"})});i._request=e}"function"==typeof t.url&&(t.url=t.url.call(this.$element,n)),"function"==typeof t.data&&(t.data=t.data.call(this.$element,n)),this.ajaxOptions.delay&&null!=n.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(e,this.ajaxOptions.delay)):e()},n}),e.define("select2/data/tags",["jquery"],function(u){function e(e,t,n){var r=n.get("tags"),i=n.get("createTag");void 0!==i&&(this.createTag=i);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),e.call(this,t,n),u.isArray(r))for(var s=0;s<r.length;s++){var a=r[s],l=this._normalizeItem(a),c=this.option(l);this.$element.append(c)}}return e.prototype.query=function(e,c,u){var d=this;this._removeOldTags(),null!=c.term&&null==c.page?e.call(this,c,function e(t,n){for(var r=t.results,i=0;i<r.length;i++){var o=r[i],s=null!=o.children&&!e({results:o.children},!0);if((o.text||"").toUpperCase()===(c.term||"").toUpperCase()||s)return!n&&(t.data=r,void u(t))}if(n)return!0;var a=d.createTag(c);if(null!=a){var l=d.option(a);l.attr("data-select2-tag",!0),d.addOptions([l]),d.insertTag(r,a)}t.results=r,u(t)}):e.call(this,c,u)},e.prototype.createTag=function(e,t){var n=u.trim(t.term);return""===n?null:{id:n,text:n}},e.prototype.insertTag=function(e,t,n){t.unshift(n)},e.prototype._removeOldTags=function(e){this.$element.find("option[data-select2-tag]").each(function(){this.selected||u(this).remove()})},e}),e.define("select2/data/tokenizer",["jquery"],function(d){function e(e,t,n){var r=n.get("tokenizer");void 0!==r&&(this.tokenizer=r),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},e.prototype.query=function(e,t,n){var r=this;t.term=t.term||"";var i=this.tokenizer(t,this.options,function(e){var t=r._normalizeItem(e);if(!r.$element.find("option").filter(function(){return d(this).val()===t.id}).length){var n=r.option(t);n.attr("data-select2-tag",!0),r._removeOldTags(),r.addOptions([n])}!function(e){r.trigger("select",{data:e})}(t)});i.term!==t.term&&(this.$search.length&&(this.$search.val(i.term),this.$search.trigger("focus")),t.term=i.term),e.call(this,t,n)},e.prototype.tokenizer=function(e,t,n,r){for(var i=n.get("tokenSeparators")||[],o=t.term,s=0,a=this.createTag||function(e){return{id:e.term,text:e.term}};s<o.length;){var l=o[s];if(-1!==d.inArray(l,i)){var c=o.substr(0,s),u=a(d.extend({},t,{term:c}));null!=u?(r(u),o=o.substr(s+1)||"",s=0):s++}else s++}return{term:o}},e}),e.define("select2/data/minimumInputLength",[],function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumInputLength",[],function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",0<this.maximumInputLength&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0<r.maximumSelectionLength&&t>=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class="select2-dropdown"><span class="select2-results"></span></span>');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></span>');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('<li class="select2-results__option select2-results__option--load-more"role="option" aria-disabled="true"></li>'),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f("<span></span>"),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a<i.top-s,u=l>i.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r<t.length;r++){var i=t[r];i.children?n+=e(i.children):n++}return n}(t.data.results)<this.minimumResultsForSearch)&&e.call(this,t)},e}),e.define("select2/dropdown/selectOnClose",["../utils"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("close",function(e){r._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}var r=this.getHighlightedResults();if(!(r.length<1)){var i=o.GetData(r[0],"data");null!=i.element&&i.element.selected||null==i.element&&i.selected||this.trigger("select",{data:i})}},e}),e.define("select2/dropdown/closeOnSelect",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(e){r._selectTriggered(e)}),t.on("unselect",function(e){r._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&(n.ctrlKey||n.metaKey)||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e}),e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return 1!=t&&(n+="s"),n},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(c,u,d,p,h,f,g,m,v,y,s,t,_,$,b,w,A,x,D,S,E,C,O,T,q,L,I,j,e){function n(){this.reset()}return n.prototype.apply=function(e){if(null==(e=c.extend(!0,{},this.defaults,e)).dataAdapter){if(null!=e.ajax?e.dataAdapter=b:null!=e.data?e.dataAdapter=$:e.dataAdapter=_,0<e.minimumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,x)),0<e.maximumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,D)),0<e.maximumSelectionLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,S)),e.tags&&(e.dataAdapter=y.Decorate(e.dataAdapter,w)),null==e.tokenSeparators&&null==e.tokenizer||(e.dataAdapter=y.Decorate(e.dataAdapter,A)),null!=e.query){var t=u(e.amdBase+"compat/query");e.dataAdapter=y.Decorate(e.dataAdapter,t)}if(null!=e.initSelection){var n=u(e.amdBase+"compat/initSelection");e.dataAdapter=y.Decorate(e.dataAdapter,n)}}if(null==e.resultsAdapter&&(e.resultsAdapter=d,null!=e.ajax&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,T)),null!=e.placeholder&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,O)),e.selectOnClose&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,I))),null==e.dropdownAdapter){if(e.multiple)e.dropdownAdapter=E;else{var r=y.Decorate(E,C);e.dropdownAdapter=r}if(0!==e.minimumResultsForSearch&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,L)),e.closeOnSelect&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,j)),null!=e.dropdownCssClass||null!=e.dropdownCss||null!=e.adaptDropdownCssClass){var i=u(e.amdBase+"compat/dropdownCss");e.dropdownAdapter=y.Decorate(e.dropdownAdapter,i)}e.dropdownAdapter=y.Decorate(e.dropdownAdapter,q)}if(null==e.selectionAdapter){if(e.multiple?e.selectionAdapter=h:e.selectionAdapter=p,null!=e.placeholder&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,f)),e.allowClear&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,g)),e.multiple&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,m)),null!=e.containerCssClass||null!=e.containerCss||null!=e.adaptContainerCssClass){var o=u(e.amdBase+"compat/containerCss");e.selectionAdapter=y.Decorate(e.selectionAdapter,o)}e.selectionAdapter=y.Decorate(e.selectionAdapter,v)}e.language=this._resolveLanguage(e.language),e.language.push("en");for(var s=[],a=0;a<e.language.length;a++){var l=e.language[a];-1===s.indexOf(l)&&s.push(l)}return e.language=s,e.translations=this._processTranslations(e.language,e.debug),e},n.prototype.reset=function(){function a(e){return e.replace(/[^\u0000-\u007E]/g,function(e){return t[e]||e})}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:y.escapeMarkup,language:{},matcher:function e(t,n){if(""===c.trim(t.term))return n;if(n.children&&0<n.children.length){for(var r=c.extend(!0,{},n),i=n.children.length-1;0<=i;i--)null==e(t,n.children[i])&&r.children.splice(i,1);return 0<r.children.length?r:e(t,r)}var o=a(n.text).toUpperCase(),s=a(t.term).toUpperCase();return-1<o.indexOf(s)?n:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},n.prototype.applyFromElement=function(e,t){var n=e.language,r=this.defaults.language,i=t.prop("lang"),o=t.closest("[lang]").prop("lang"),s=Array.prototype.concat.call(this._resolveLanguage(i),this._resolveLanguage(n),this._resolveLanguage(r),this._resolveLanguage(o));return e.language=s,e},n.prototype._resolveLanguage=function(e){if(!e)return[];if(c.isEmptyObject(e))return[];if(c.isPlainObject(e))return[e];var t;t=c.isArray(e)?e:[e];for(var n=[],r=0;r<t.length;r++)if(n.push(t[r]),"string"==typeof t[r]&&0<t[r].indexOf("-")){var i=t[r].split("-")[0];n.push(i)}return n},n.prototype._processTranslations=function(e,t){for(var n=new s,r=0;r<e.length;r++){var i=new s,o=e[r];if("string"==typeof o)try{i=s.loadPath(o)}catch(e){try{o=this.defaults.amdLanguageBase+o,i=s.loadPath(o)}catch(e){t&&window.console&&console.warn&&console.warn('Select2: The language file for "'+o+'" could not be automatically loaded. A fallback will be used instead.')}}else i=c.isPlainObject(o)?new s(o):o;n.extend(i)}return n},n.prototype.set=function(e,t){var n={};n[c.camelCase(e)]=t;var r=y._convertData(n);c.extend(!0,this.defaults,r)},new n}),e.define("select2/options",["require","jquery","./defaults","./utils"],function(r,d,i,p){function e(e,t){if(this.options=e,null!=t&&this.fromElement(t),null!=t&&(this.options=i.applyFromElement(this.options,t)),this.options=i.apply(this.options),t&&t.is("input")){var n=r(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=p.Decorate(this.options.dataAdapter,n)}}return e.prototype.fromElement=function(e){var t=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),p.GetData(e[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),p.StoreData(e[0],"data",p.GetData(e[0],"select2Tags")),p.StoreData(e[0],"tags",!0)),p.GetData(e[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",p.GetData(e[0],"ajaxUrl")),p.StoreData(e[0],"ajax-Url",p.GetData(e[0],"ajaxUrl")));var n={};function r(e,t){return t.toUpperCase()}for(var i=0;i<e[0].attributes.length;i++){var o=e[0].attributes[i].name,s="data-";if(o.substr(0,s.length)==s){var a=o.substring(s.length),l=p.GetData(e[0],a);n[a.replace(/-([a-z])/g,r)]=l}}d.fn.jquery&&"1."==d.fn.jquery.substr(0,2)&&e[0].dataset&&(n=d.extend(!0,{},e[0].dataset,n));var c=d.extend(!0,{},p.GetData(e[0]),n);for(var u in c=p._convertData(c))-1<d.inArray(u,t)||(d.isPlainObject(this.options[u])?d.extend(this.options[u],c[u]):this.options[u]=c[u]);return this},e.prototype.get=function(e){return this.options[e]},e.prototype.set=function(e,t){this.options[e]=t},e}),e.define("select2/core",["jquery","./options","./utils","./keys"],function(o,c,u,r){var d=function(e,t){null!=u.GetData(e[0],"select2")&&u.GetData(e[0],"select2").destroy(),this.$element=e,this.id=this._generateId(e),t=t||{},this.options=new c(t,e),d.__super__.constructor.call(this);var n=e.attr("tabindex")||0;u.StoreData(e[0],"old-tabindex",n),e.attr("tabindex","-1");var r=this.options.get("dataAdapter");this.dataAdapter=new r(e,this.options);var i=this.render();this._placeContainer(i);var o=this.options.get("selectionAdapter");this.selection=new o(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,i);var s=this.options.get("dropdownAdapter");this.dropdown=new s(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,i);var a=this.options.get("resultsAdapter");this.results=new a(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){l.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),u.StoreData(e[0],"select2",this),e.data("select2",this)};return u.Extend(d,u.Observable),d.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+u.generateChars(2):u.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},d.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},d.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var r=this._resolveWidth(e,"style");return null!=r?r:this._resolveWidth(e,"element")}if("element"==t){var i=e.outerWidth(!1);return i<=0?"auto":i+"px"}if("style"!=t)return"computedstyle"!=t?t:window.getComputedStyle(e[0]).width;var o=e.attr("style");if("string"!=typeof o)return null;for(var s=o.split(";"),a=0,l=s.length;a<l;a+=1){var c=s[a].replace(/\s/g,"").match(n);if(null!==c&&1<=c.length)return c[1]}return null},d.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},d.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=u.bind(this._syncAttributes,this),this._syncS=u.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var e=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=e?(this._observer=new e(function(e){t._syncA(),t._syncS(null,e)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},d.prototype._registerDataEvents=function(){var n=this;this.dataAdapter.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerSelectionEvents=function(){var n=this,r=["toggle","focus"];this.selection.on("toggle",function(){n.toggleDropdown()}),this.selection.on("focus",function(e){n.focus(e)}),this.selection.on("*",function(e,t){-1===o.inArray(e,r)&&n.trigger(e,t)})},d.prototype._registerDropdownEvents=function(){var n=this;this.dropdown.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerResultsEvents=function(){var n=this;this.results.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerEvents=function(){var n=this;this.on("open",function(){n.$container.addClass("select2-container--open")}),this.on("close",function(){n.$container.removeClass("select2-container--open")}),this.on("enable",function(){n.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){n.$container.addClass("select2-container--disabled")}),this.on("blur",function(){n.$container.removeClass("select2-container--focus")}),this.on("query",function(t){n.isOpen()||n.trigger("open",{}),this.dataAdapter.query(t,function(e){n.trigger("results:all",{data:e,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(e){n.trigger("results:append",{data:e,query:t})})}),this.on("keypress",function(e){var t=e.which;n.isOpen()?t===r.ESC||t===r.TAB||t===r.UP&&e.altKey?(n.close(e),e.preventDefault()):t===r.ENTER?(n.trigger("results:select",{}),e.preventDefault()):t===r.SPACE&&e.ctrlKey?(n.trigger("results:toggle",{}),e.preventDefault()):t===r.UP?(n.trigger("results:previous",{}),e.preventDefault()):t===r.DOWN&&(n.trigger("results:next",{}),e.preventDefault()):(t===r.ENTER||t===r.SPACE||t===r.DOWN&&e.altKey)&&(n.open(),e.preventDefault())})},d.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.isDisabled()?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},d.prototype._isChangeMutation=function(e,t){var n=!1,r=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&0<t.addedNodes.length)for(var i=0;i<t.addedNodes.length;i++){t.addedNodes[i].selected&&(n=!0)}else t.removedNodes&&0<t.removedNodes.length?n=!0:o.isArray(t)&&o.each(t,function(e,t){if(r._isChangeMutation(e,t))return!(n=!0)});else n=!0;return n}},d.prototype._syncSubtree=function(e,t){var n=this._isChangeMutation(e,t),r=this;n&&this.dataAdapter.current(function(e){r.trigger("selection:update",{data:e})})},d.prototype.trigger=function(e,t){var n=d.__super__.trigger,r={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===t&&(t={}),e in r){var i=r[e],o={prevented:!1,name:e,args:t};if(n.call(this,i,o),o.prevented)return void(t.prevented=!0)}n.call(this,e,t)},d.prototype.toggleDropdown=function(){this.isDisabled()||(this.isOpen()?this.close():this.open())},d.prototype.open=function(){this.isOpen()||this.isDisabled()||this.trigger("query",{})},d.prototype.close=function(e){this.isOpen()&&this.trigger("close",{originalEvent:e})},d.prototype.isEnabled=function(){return!this.isDisabled()},d.prototype.isDisabled=function(){return this.options.get("disabled")},d.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},d.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},d.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},d.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},d.prototype.data=function(){this.options.get("debug")&&0<arguments.length&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var t=[];return this.dataAdapter.current(function(e){t=e}),t},d.prototype.val=function(e){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==e||0===e.length)return this.$element.val();var t=e[0];o.isArray(t)&&(t=o.map(t,function(e){return e.toString()})),this.$element.val(t).trigger("input").trigger("change")},d.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",u.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),u.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},d.prototype.render=function(){var e=o('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1<i.inArray(t,a)?this:n}}return null==i.fn.select2.defaults&&(i.fn.select2.defaults=t),o}),{define:e.define,require:e.require}}(),t=e.require("jquery.select2");return u.fn.select2.amd=e,t});
vendor/select2/select2-spinner.gif DELETED
Binary file
vendor/select2/select2.css DELETED
@@ -1,692 +0,0 @@
1
- /*
2
- Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015
3
- */
4
- .select2-container {
5
- margin: 0;
6
- position: relative;
7
- display: inline-block;
8
- vertical-align: middle;
9
- }
10
-
11
- .select2-container,
12
- .select2-drop,
13
- .select2-search,
14
- .select2-search input {
15
- /*
16
- Force border-box so that % widths fit the parent
17
- container without overlap because of margin/padding.
18
- More Info : http://www.quirksmode.org/css/box.html
19
- */
20
- -webkit-box-sizing: border-box; /* webkit */
21
- -moz-box-sizing: border-box; /* firefox */
22
- box-sizing: border-box; /* css3 */
23
- }
24
-
25
- .select2-container .select2-choice {
26
- display: block;
27
- height: 26px;
28
- padding: 0 0 0 8px;
29
- overflow: hidden;
30
- position: relative;
31
-
32
- border: 1px solid #aaa;
33
- white-space: nowrap;
34
- line-height: 26px;
35
- color: #444;
36
- text-decoration: none;
37
-
38
- border-radius: 4px;
39
-
40
- background-clip: padding-box;
41
-
42
- -webkit-touch-callout: none;
43
- -webkit-user-select: none;
44
- -moz-user-select: none;
45
- -ms-user-select: none;
46
- user-select: none;
47
-
48
- background-color: #fff;
49
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
50
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
51
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
52
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
53
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
54
- }
55
-
56
- html[dir="rtl"] .select2-container .select2-choice {
57
- padding: 0 8px 0 0;
58
- }
59
-
60
- .select2-container.select2-drop-above .select2-choice {
61
- border-bottom-color: #aaa;
62
-
63
- border-radius: 0 0 4px 4px;
64
-
65
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
66
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
67
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
68
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
69
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
70
- }
71
-
72
- .select2-container.select2-allowclear .select2-choice .select2-chosen {
73
- margin-right: 42px;
74
- }
75
-
76
- .select2-container .select2-choice > .select2-chosen {
77
- margin-right: 26px;
78
- display: block;
79
- overflow: hidden;
80
-
81
- white-space: nowrap;
82
-
83
- text-overflow: ellipsis;
84
- float: none;
85
- width: auto;
86
- }
87
-
88
- html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
89
- margin-left: 26px;
90
- margin-right: 0;
91
- }
92
-
93
- .select2-container .select2-choice abbr {
94
- display: none;
95
- width: 12px;
96
- height: 12px;
97
- position: absolute;
98
- right: 24px;
99
- top: 8px;
100
-
101
- font-size: 1px;
102
- text-decoration: none;
103
-
104
- border: 0;
105
- background: url('select2.png') right top no-repeat;
106
- cursor: pointer;
107
- outline: 0;
108
- }
109
-
110
- .select2-container.select2-allowclear .select2-choice abbr {
111
- display: inline-block;
112
- }
113
-
114
- .select2-container .select2-choice abbr:hover {
115
- background-position: right -11px;
116
- cursor: pointer;
117
- }
118
-
119
- .select2-drop-mask {
120
- border: 0;
121
- margin: 0;
122
- padding: 0;
123
- position: fixed;
124
- left: 0;
125
- top: 0;
126
- min-height: 100%;
127
- min-width: 100%;
128
- height: auto;
129
- width: auto;
130
- opacity: 0;
131
- z-index: 9998;
132
- /* styles required for IE to work */
133
- background-color: #fff;
134
- filter: alpha(opacity=0);
135
- }
136
-
137
- .select2-drop {
138
- width: 100%;
139
- margin-top: -1px;
140
- position: absolute;
141
- z-index: 9999;
142
- top: 100%;
143
-
144
- background: #fff;
145
- color: #000;
146
- border: 1px solid #aaa;
147
- border-top: 0;
148
-
149
- border-radius: 0 0 4px 4px;
150
-
151
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
152
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
153
- }
154
-
155
- .select2-drop.select2-drop-above {
156
- margin-top: 1px;
157
- border-top: 1px solid #aaa;
158
- border-bottom: 0;
159
-
160
- border-radius: 4px 4px 0 0;
161
-
162
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
163
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
164
- }
165
-
166
- .select2-drop-active {
167
- border: 1px solid #5897fb;
168
- border-top: none;
169
- }
170
-
171
- .select2-drop.select2-drop-above.select2-drop-active {
172
- border-top: 1px solid #5897fb;
173
- }
174
-
175
- .select2-drop-auto-width {
176
- border-top: 1px solid #aaa;
177
- width: auto;
178
- }
179
-
180
- .select2-container .select2-choice .select2-arrow {
181
- display: inline-block;
182
- width: 18px;
183
- height: 100%;
184
- position: absolute;
185
- right: 0;
186
- top: 0;
187
-
188
- border-left: 1px solid #aaa;
189
- border-radius: 0 4px 4px 0;
190
-
191
- background-clip: padding-box;
192
-
193
- background: #ccc;
194
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
195
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
196
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
197
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
198
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
199
- }
200
-
201
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
202
- left: 0;
203
- right: auto;
204
-
205
- border-left: none;
206
- border-right: 1px solid #aaa;
207
- border-radius: 4px 0 0 4px;
208
- }
209
-
210
- .select2-container .select2-choice .select2-arrow b {
211
- display: block;
212
- width: 100%;
213
- height: 100%;
214
- background: url('select2.png') no-repeat 0 1px;
215
- }
216
-
217
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
218
- background-position: 2px 1px;
219
- }
220
-
221
- .select2-search {
222
- display: inline-block;
223
- width: 100%;
224
- min-height: 26px;
225
- margin: 0;
226
- padding: 4px 4px 0 4px;
227
-
228
- position: relative;
229
- z-index: 10000;
230
-
231
- white-space: nowrap;
232
- }
233
-
234
- .select2-search input {
235
- width: 100%;
236
- height: auto !important;
237
- min-height: 26px;
238
- padding: 4px 20px 4px 5px;
239
- margin: 0;
240
-
241
- outline: 0;
242
- font-family: sans-serif;
243
- font-size: 1em;
244
-
245
- border: 1px solid #aaa;
246
- border-radius: 0;
247
-
248
- -webkit-box-shadow: none;
249
- box-shadow: none;
250
-
251
- background: #fff url('select2.png') no-repeat 100% -22px;
252
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
253
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
254
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
255
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
256
- }
257
-
258
- html[dir="rtl"] .select2-search input {
259
- padding: 4px 5px 4px 20px;
260
-
261
- background: #fff url('select2.png') no-repeat -37px -22px;
262
- background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
263
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
264
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
265
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
266
- }
267
-
268
- .select2-search input.select2-active {
269
- background: #fff url('select2-spinner.gif') no-repeat 100%;
270
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
271
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
- }
275
-
276
- .select2-container-active .select2-choice,
277
- .select2-container-active .select2-choices {
278
- border: 1px solid #5897fb;
279
- outline: none;
280
-
281
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
282
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
283
- }
284
-
285
- .select2-dropdown-open .select2-choice {
286
- border-bottom-color: transparent;
287
- -webkit-box-shadow: 0 1px 0 #fff inset;
288
- box-shadow: 0 1px 0 #fff inset;
289
-
290
- border-bottom-left-radius: 0;
291
- border-bottom-right-radius: 0;
292
-
293
- background-color: #eee;
294
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
295
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
296
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
297
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
298
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
299
- }
300
-
301
- .select2-dropdown-open.select2-drop-above .select2-choice,
302
- .select2-dropdown-open.select2-drop-above .select2-choices {
303
- border: 1px solid #5897fb;
304
- border-top-color: transparent;
305
-
306
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
307
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
308
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
309
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
311
- }
312
-
313
- .select2-dropdown-open .select2-choice .select2-arrow {
314
- background: transparent;
315
- border-left: none;
316
- filter: none;
317
- }
318
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
319
- border-right: none;
320
- }
321
-
322
- .select2-dropdown-open .select2-choice .select2-arrow b {
323
- background-position: -18px 1px;
324
- }
325
-
326
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
327
- background-position: -16px 1px;
328
- }
329
-
330
- .select2-hidden-accessible {
331
- border: 0;
332
- clip: rect(0 0 0 0);
333
- height: 1px;
334
- margin: -1px;
335
- overflow: hidden;
336
- padding: 0;
337
- position: absolute;
338
- width: 1px;
339
- }
340
-
341
- /* results */
342
- .select2-results {
343
- max-height: 200px;
344
- padding: 0 0 0 4px;
345
- margin: 4px 4px 4px 0;
346
- position: relative;
347
- overflow-x: hidden;
348
- overflow-y: auto;
349
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
350
- }
351
-
352
- html[dir="rtl"] .select2-results {
353
- padding: 0 4px 0 0;
354
- margin: 4px 0 4px 4px;
355
- }
356
-
357
- .select2-results ul.select2-result-sub {
358
- margin: 0;
359
- padding-left: 0;
360
- }
361
-
362
- .select2-results li {
363
- list-style: none;
364
- display: list-item;
365
- background-image: none;
366
- }
367
-
368
- .select2-results li.select2-result-with-children > .select2-result-label {
369
- font-weight: bold;
370
- }
371
-
372
- .select2-results .select2-result-label {
373
- padding: 3px 7px 4px;
374
- margin: 0;
375
- cursor: pointer;
376
-
377
- min-height: 1em;
378
-
379
- -webkit-touch-callout: none;
380
- -webkit-user-select: none;
381
- -moz-user-select: none;
382
- -ms-user-select: none;
383
- user-select: none;
384
- }
385
-
386
- .select2-results-dept-1 .select2-result-label { padding-left: 20px }
387
- .select2-results-dept-2 .select2-result-label { padding-left: 40px }
388
- .select2-results-dept-3 .select2-result-label { padding-left: 60px }
389
- .select2-results-dept-4 .select2-result-label { padding-left: 80px }
390
- .select2-results-dept-5 .select2-result-label { padding-left: 100px }
391
- .select2-results-dept-6 .select2-result-label { padding-left: 110px }
392
- .select2-results-dept-7 .select2-result-label { padding-left: 120px }
393
-
394
- .select2-results .select2-highlighted {
395
- background: #3875d7;
396
- color: #fff;
397
- }
398
-
399
- .select2-results li em {
400
- background: #feffde;
401
- font-style: normal;
402
- }
403
-
404
- .select2-results .select2-highlighted em {
405
- background: transparent;
406
- }
407
-
408
- .select2-results .select2-highlighted ul {
409
- background: #fff;
410
- color: #000;
411
- }
412
-
413
- .select2-results .select2-no-results,
414
- .select2-results .select2-searching,
415
- .select2-results .select2-ajax-error,
416
- .select2-results .select2-selection-limit {
417
- background: #f4f4f4;
418
- display: list-item;
419
- padding-left: 5px;
420
- }
421
-
422
- /*
423
- disabled look for disabled choices in the results dropdown
424
- */
425
- .select2-results .select2-disabled.select2-highlighted {
426
- color: #666;
427
- background: #f4f4f4;
428
- display: list-item;
429
- cursor: default;
430
- }
431
- .select2-results .select2-disabled {
432
- background: #f4f4f4;
433
- display: list-item;
434
- cursor: default;
435
- }
436
-
437
- .select2-results .select2-selected {
438
- display: none;
439
- }
440
-
441
- .select2-more-results.select2-active {
442
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
443
- }
444
-
445
- .select2-results .select2-ajax-error {
446
- background: rgba(255, 50, 50, .2);
447
- }
448
-
449
- .select2-more-results {
450
- background: #f4f4f4;
451
- display: list-item;
452
- }
453
-
454
- /* disabled styles */
455
-
456
- .select2-container.select2-container-disabled .select2-choice {
457
- background-color: #f4f4f4;
458
- background-image: none;
459
- border: 1px solid #ddd;
460
- cursor: default;
461
- }
462
-
463
- .select2-container.select2-container-disabled .select2-choice .select2-arrow {
464
- background-color: #f4f4f4;
465
- background-image: none;
466
- border-left: 0;
467
- }
468
-
469
- .select2-container.select2-container-disabled .select2-choice abbr {
470
- display: none;
471
- }
472
-
473
-
474
- /* multiselect */
475
-
476
- .select2-container-multi .select2-choices {
477
- height: auto !important;
478
- height: 1%;
479
- margin: 0;
480
- padding: 0 5px 0 0;
481
- position: relative;
482
-
483
- border: 1px solid #aaa;
484
- cursor: text;
485
- overflow: hidden;
486
-
487
- background-color: #fff;
488
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
489
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
490
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
491
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
492
- }
493
-
494
- html[dir="rtl"] .select2-container-multi .select2-choices {
495
- padding: 0 0 0 5px;
496
- }
497
-
498
- .select2-locked {
499
- padding: 3px 5px 3px 5px !important;
500
- }
501
-
502
- .select2-container-multi .select2-choices {
503
- min-height: 26px;
504
- }
505
-
506
- .select2-container-multi.select2-container-active .select2-choices {
507
- border: 1px solid #5897fb;
508
- outline: none;
509
-
510
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
511
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
512
- }
513
- .select2-container-multi .select2-choices li {
514
- float: left;
515
- list-style: none;
516
- }
517
- html[dir="rtl"] .select2-container-multi .select2-choices li
518
- {
519
- float: right;
520
- }
521
- .select2-container-multi .select2-choices .select2-search-field {
522
- margin: 0;
523
- padding: 0;
524
- white-space: nowrap;
525
- }
526
-
527
- .select2-container-multi .select2-choices .select2-search-field input {
528
- padding: 5px;
529
- margin: 1px 0;
530
-
531
- font-family: sans-serif;
532
- font-size: 100%;
533
- color: #666;
534
- outline: 0;
535
- border: 0;
536
- -webkit-box-shadow: none;
537
- box-shadow: none;
538
- background: transparent !important;
539
- }
540
-
541
- .select2-container-multi .select2-choices .select2-search-field input.select2-active {
542
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
543
- }
544
-
545
- .select2-default {
546
- color: #999 !important;
547
- }
548
-
549
- .select2-container-multi .select2-choices .select2-search-choice {
550
- padding: 3px 5px 3px 18px;
551
- margin: 3px 0 3px 5px;
552
- position: relative;
553
-
554
- line-height: 13px;
555
- color: #333;
556
- cursor: default;
557
- border: 1px solid #aaaaaa;
558
-
559
- border-radius: 3px;
560
-
561
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
562
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
563
-
564
- background-clip: padding-box;
565
-
566
- -webkit-touch-callout: none;
567
- -webkit-user-select: none;
568
- -moz-user-select: none;
569
- -ms-user-select: none;
570
- user-select: none;
571
-
572
- background-color: #e4e4e4;
573
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
574
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
575
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
576
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
577
- background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
578
- }
579
- html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
580
- {
581
- margin: 3px 5px 3px 0;
582
- padding: 3px 18px 3px 5px;
583
- }
584
- .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
585
- cursor: default;
586
- }
587
- .select2-container-multi .select2-choices .select2-search-choice-focus {
588
- background: #d4d4d4;
589
- }
590
-
591
- .select2-search-choice-close {
592
- display: block;
593
- width: 12px;
594
- height: 13px;
595
- position: absolute;
596
- right: 3px;
597
- top: 4px;
598
-
599
- font-size: 1px;
600
- outline: none;
601
- background: url('select2.png') right top no-repeat;
602
- }
603
- html[dir="rtl"] .select2-search-choice-close {
604
- right: auto;
605
- left: 3px;
606
- }
607
-
608
- .select2-container-multi .select2-search-choice-close {
609
- left: 3px;
610
- }
611
-
612
- html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
613
- left: auto;
614
- right: 2px;
615
- }
616
-
617
- .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
618
- background-position: right -11px;
619
- }
620
- .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
621
- background-position: right -11px;
622
- }
623
-
624
- /* disabled styles */
625
- .select2-container-multi.select2-container-disabled .select2-choices {
626
- background-color: #f4f4f4;
627
- background-image: none;
628
- border: 1px solid #ddd;
629
- cursor: default;
630
- }
631
-
632
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
633
- padding: 3px 5px 3px 5px;
634
- border: 1px solid #ddd;
635
- background-image: none;
636
- background-color: #f4f4f4;
637
- }
638
-
639
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
640
- background: none;
641
- }
642
- /* end multiselect */
643
-
644
-
645
- .select2-result-selectable .select2-match,
646
- .select2-result-unselectable .select2-match {
647
- text-decoration: underline;
648
- }
649
-
650
- .select2-offscreen, .select2-offscreen:focus {
651
- clip: rect(0 0 0 0) !important;
652
- width: 1px !important;
653
- height: 1px !important;
654
- border: 0 !important;
655
- margin: 0 !important;
656
- padding: 0 !important;
657
- overflow: hidden !important;
658
- position: absolute !important;
659
- outline: 0 !important;
660
- left: 0px !important;
661
- top: 0px !important;
662
- }
663
-
664
- .select2-display-none {
665
- display: none;
666
- }
667
-
668
- .select2-measure-scrollbar {
669
- position: absolute;
670
- top: -10000px;
671
- left: -10000px;
672
- width: 100px;
673
- height: 100px;
674
- overflow: scroll;
675
- }
676
-
677
- /* Retina-ize icons */
678
-
679
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
680
- .select2-search input,
681
- .select2-search-choice-close,
682
- .select2-container .select2-choice abbr,
683
- .select2-container .select2-choice .select2-arrow b {
684
- background-image: url('select2x2.png') !important;
685
- background-repeat: no-repeat !important;
686
- background-size: 60px 40px !important;
687
- }
688
-
689
- .select2-search input {
690
- background-position: 100% -21px !important;
691
- }
692
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/select2/select2.js DELETED
@@ -1,3729 +0,0 @@
1
- /*
2
- Copyright 2012 Igor Vaynberg
3
-
4
- Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the
17
- Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
18
- CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
19
- the specific language governing permissions and limitations under the Apache License and the GPL License.
20
- */
21
- (function ($) {
22
- if(typeof $.fn.each2 == "undefined") {
23
- $.extend($.fn, {
24
- /*
25
- * 4-10 times faster .each replacement
26
- * use it carefully, as it overrides jQuery context of element on each iteration
27
- */
28
- each2 : function (c) {
29
- var j = $([0]), i = -1, l = this.length;
30
- while (
31
- ++i < l
32
- && (j.context = j[0] = this[i])
33
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
34
- );
35
- return this;
36
- }
37
- });
38
- }
39
- })(jQuery);
40
-
41
- (function ($, undefined) {
42
- "use strict";
43
- /*global document, window, jQuery, console */
44
-
45
- if (window.Select2 !== undefined) {
46
- return;
47
- }
48
-
49
- var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
50
- lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
51
-
52
- KEY = {
53
- TAB: 9,
54
- ENTER: 13,
55
- ESC: 27,
56
- SPACE: 32,
57
- LEFT: 37,
58
- UP: 38,
59
- RIGHT: 39,
60
- DOWN: 40,
61
- SHIFT: 16,
62
- CTRL: 17,
63
- ALT: 18,
64
- PAGE_UP: 33,
65
- PAGE_DOWN: 34,
66
- HOME: 36,
67
- END: 35,
68
- BACKSPACE: 8,
69
- DELETE: 46,
70
- isArrow: function (k) {
71
- k = k.which ? k.which : k;
72
- switch (k) {
73
- case KEY.LEFT:
74
- case KEY.RIGHT:
75
- case KEY.UP:
76
- case KEY.DOWN:
77
- return true;
78
- }
79
- return false;
80
- },
81
- isControl: function (e) {
82
- var k = e.which;
83
- switch (k) {
84
- case KEY.SHIFT:
85
- case KEY.CTRL:
86
- case KEY.ALT:
87
- return true;
88
- }
89
-
90
- if (e.metaKey) return true;
91
-
92
- return false;
93
- },
94
- isFunctionKey: function (k) {
95
- k = k.which ? k.which : k;
96
- return k >= 112 && k <= 123;
97
- }
98
- },
99
- MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
100
-
101
- DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
102
-
103
- $document = $(document);
104
-
105
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
106
-
107
-
108
- function reinsertElement(element) {
109
- var placeholder = $(document.createTextNode(''));
110
-
111
- element.before(placeholder);
112
- placeholder.before(element);
113
- placeholder.remove();
114
- }
115
-
116
- function stripDiacritics(str) {
117
- // Used 'uni range + named function' from http://jsperf.com/diacritics/18
118
- function match(a) {
119
- return DIACRITICS[a] || a;
120
- }
121
-
122
- return str.replace(/[^\u0000-\u007E]/g, match);
123
- }
124
-
125
- function indexOf(value, array) {
126
- var i = 0, l = array.length;
127
- for (; i < l; i = i + 1) {
128
- if (equal(value, array[i])) return i;
129
- }
130
- return -1;
131
- }
132
-
133
- function measureScrollbar () {
134
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
135
- $template.appendTo(document.body);
136
-
137
- var dim = {
138
- width: $template.width() - $template[0].clientWidth,
139
- height: $template.height() - $template[0].clientHeight
140
- };
141
- $template.remove();
142
-
143
- return dim;
144
- }
145
-
146
- /**
147
- * Compares equality of a and b
148
- * @param a
149
- * @param b
150
- */
151
- function equal(a, b) {
152
- if (a === b) return true;
153
- if (a === undefined || b === undefined) return false;
154
- if (a === null || b === null) return false;
155
- // Check whether 'a' or 'b' is a string (primitive or object).
156
- // The concatenation of an empty string (+'') converts its argument to a string's primitive.
157
- if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
158
- if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
159
- return false;
160
- }
161
-
162
- /**
163
- * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty
164
- * strings
165
- * @param string
166
- * @param separator
167
- */
168
- function splitVal(string, separator, transform) {
169
- var val, i, l;
170
- if (string === null || string.length < 1) return [];
171
- val = string.split(separator);
172
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);
173
- return val;
174
- }
175
-
176
- function getSideBorderPadding(element) {
177
- return element.outerWidth(false) - element.width();
178
- }
179
-
180
- function installKeyUpChangeEvent(element) {
181
- var key="keyup-change-value";
182
- element.on("keydown", function () {
183
- if ($.data(element, key) === undefined) {
184
- $.data(element, key, element.val());
185
- }
186
- });
187
- element.on("keyup", function () {
188
- var val= $.data(element, key);
189
- if (val !== undefined && element.val() !== val) {
190
- $.removeData(element, key);
191
- element.trigger("keyup-change");
192
- }
193
- });
194
- }
195
-
196
-
197
- /**
198
- * filters mouse events so an event is fired only if the mouse moved.
199
- *
200
- * filters out mouse events that occur when mouse is stationary but
201
- * the elements under the pointer are scrolled.
202
- */
203
- function installFilteredMouseMove(element) {
204
- element.on("mousemove", function (e) {
205
- var lastpos = lastMousePosition;
206
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
207
- $(e.target).trigger("mousemove-filtered", e);
208
- }
209
- });
210
- }
211
-
212
- /**
213
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
214
- * within the last quietMillis milliseconds.
215
- *
216
- * @param quietMillis number of milliseconds to wait before invoking fn
217
- * @param fn function to be debounced
218
- * @param ctx object to be used as this reference within fn
219
- * @return debounced version of fn
220
- */
221
- function debounce(quietMillis, fn, ctx) {
222
- ctx = ctx || undefined;
223
- var timeout;
224
- return function () {
225
- var args = arguments;
226
- window.clearTimeout(timeout);
227
- timeout = window.setTimeout(function() {
228
- fn.apply(ctx, args);
229
- }, quietMillis);
230
- };
231
- }
232
-
233
- function installDebouncedScroll(threshold, element) {
234
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
235
- element.on("scroll", function (e) {
236
- if (indexOf(e.target, element.get()) >= 0) notify(e);
237
- });
238
- }
239
-
240
- function focus($el) {
241
- if ($el[0] === document.activeElement) return;
242
-
243
- /* set the focus in a 0 timeout - that way the focus is set after the processing
244
- of the current event has finished - which seems like the only reliable way
245
- to set focus */
246
- window.setTimeout(function() {
247
- var el=$el[0], pos=$el.val().length, range;
248
-
249
- $el.focus();
250
-
251
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
252
- sometimes modals or others listeners may steal it after its set */
253
- var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
254
- if (isVisible && el === document.activeElement) {
255
-
256
- /* after the focus is set move the caret to the end, necessary when we val()
257
- just before setting focus */
258
- if(el.setSelectionRange)
259
- {
260
- el.setSelectionRange(pos, pos);
261
- }
262
- else if (el.createTextRange) {
263
- range = el.createTextRange();
264
- range.collapse(false);
265
- range.select();
266
- }
267
- }
268
- }, 0);
269
- }
270
-
271
- function getCursorInfo(el) {
272
- el = $(el)[0];
273
- var offset = 0;
274
- var length = 0;
275
- if ('selectionStart' in el) {
276
- offset = el.selectionStart;
277
- length = el.selectionEnd - offset;
278
- } else if ('selection' in document) {
279
- el.focus();
280
- var sel = document.selection.createRange();
281
- length = document.selection.createRange().text.length;
282
- sel.moveStart('character', -el.value.length);
283
- offset = sel.text.length - length;
284
- }
285
- return { offset: offset, length: length };
286
- }
287
-
288
- function killEvent(event) {
289
- event.preventDefault();
290
- event.stopPropagation();
291
- }
292
- function killEventImmediately(event) {
293
- event.preventDefault();
294
- event.stopImmediatePropagation();
295
- }
296
-
297
- function measureTextWidth(e) {
298
- if (!sizer){
299
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
300
- sizer = $(document.createElement("div")).css({
301
- position: "absolute",
302
- left: "-10000px",
303
- top: "-10000px",
304
- display: "none",
305
- fontSize: style.fontSize,
306
- fontFamily: style.fontFamily,
307
- fontStyle: style.fontStyle,
308
- fontWeight: style.fontWeight,
309
- letterSpacing: style.letterSpacing,
310
- textTransform: style.textTransform,
311
- whiteSpace: "nowrap"
312
- });
313
- sizer.attr("class","select2-sizer");
314
- $(document.body).append(sizer);
315
- }
316
- sizer.text(e.val());
317
- return sizer.width();
318
- }
319
-
320
- function syncCssClasses(dest, src, adapter) {
321
- var classes, replacements = [], adapted;
322
-
323
- classes = $.trim(dest.attr("class"));
324
-
325
- if (classes) {
326
- classes = '' + classes; // for IE which returns object
327
-
328
- $(classes.split(/\s+/)).each2(function() {
329
- if (this.indexOf("select2-") === 0) {
330
- replacements.push(this);
331
- }
332
- });
333
- }
334
-
335
- classes = $.trim(src.attr("class"));
336
-
337
- if (classes) {
338
- classes = '' + classes; // for IE which returns object
339
-
340
- $(classes.split(/\s+/)).each2(function() {
341
- if (this.indexOf("select2-") !== 0) {
342
- adapted = adapter(this);
343
-
344
- if (adapted) {
345
- replacements.push(adapted);
346
- }
347
- }
348
- });
349
- }
350
-
351
- dest.attr("class", replacements.join(" "));
352
- }
353
-
354
-
355
- function markMatch(text, term, markup, escapeMarkup) {
356
- var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
357
- tl=term.length;
358
-
359
- if (match<0) {
360
- markup.push(escapeMarkup(text));
361
- return;
362
- }
363
-
364
- markup.push(escapeMarkup(text.substring(0, match)));
365
- markup.push("<span class='select2-match'>");
366
- markup.push(escapeMarkup(text.substring(match, match + tl)));
367
- markup.push("</span>");
368
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
369
- }
370
-
371
- function defaultEscapeMarkup(markup) {
372
- var replace_map = {
373
- '\\': '&#92;',
374
- '&': '&amp;',
375
- '<': '&lt;',
376
- '>': '&gt;',
377
- '"': '&quot;',
378
- "'": '&#39;',
379
- "/": '&#47;'
380
- };
381
-
382
- return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
383
- return replace_map[match];
384
- });
385
- }
386
-
387
- /**
388
- * Produces an ajax-based query function
389
- *
390
- * @param options object containing configuration parameters
391
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
392
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
393
- * @param options.url url for the data
394
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
395
- * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
396
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
397
- * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
398
- * The expected format is an object containing the following keys:
399
- * results array of objects that will be used as choices
400
- * more (optional) boolean indicating whether there are more results available
401
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
402
- */
403
- function ajax(options) {
404
- var timeout, // current scheduled but not yet executed request
405
- handler = null,
406
- quietMillis = options.quietMillis || 100,
407
- ajaxUrl = options.url,
408
- self = this;
409
-
410
- return function (query) {
411
- window.clearTimeout(timeout);
412
- timeout = window.setTimeout(function () {
413
- var data = options.data, // ajax data function
414
- url = ajaxUrl, // ajax url string or function
415
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
416
- // deprecated - to be removed in 4.0 - use params instead
417
- deprecated = {
418
- type: options.type || 'GET', // set type of request (GET or POST)
419
- cache: options.cache || false,
420
- jsonpCallback: options.jsonpCallback||undefined,
421
- dataType: options.dataType||"json"
422
- },
423
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
424
-
425
- data = data ? data.call(self, query.term, query.page, query.context) : null;
426
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
427
-
428
- if (handler && typeof handler.abort === "function") { handler.abort(); }
429
-
430
- if (options.params) {
431
- if ($.isFunction(options.params)) {
432
- $.extend(params, options.params.call(self));
433
- } else {
434
- $.extend(params, options.params);
435
- }
436
- }
437
-
438
- $.extend(params, {
439
- url: url,
440
- dataType: options.dataType,
441
- data: data,
442
- success: function (data) {
443
- // TODO - replace query.page with query so users have access to term, page, etc.
444
- // added query as third paramter to keep backwards compatibility
445
- var results = options.results(data, query.page, query);
446
- query.callback(results);
447
- },
448
- error: function(jqXHR, textStatus, errorThrown){
449
- var results = {
450
- hasError: true,
451
- jqXHR: jqXHR,
452
- textStatus: textStatus,
453
- errorThrown: errorThrown
454
- };
455
-
456
- query.callback(results);
457
- }
458
- });
459
- handler = transport.call(self, params);
460
- }, quietMillis);
461
- };
462
- }
463
-
464
- /**
465
- * Produces a query function that works with a local array
466
- *
467
- * @param options object containing configuration parameters. The options parameter can either be an array or an
468
- * object.
469
- *
470
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
471
- *
472
- * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
473
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
474
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
475
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
476
- * the text.
477
- */
478
- function local(options) {
479
- var data = options, // data elements
480
- dataText,
481
- tmp,
482
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
483
-
484
- if ($.isArray(data)) {
485
- tmp = data;
486
- data = { results: tmp };
487
- }
488
-
489
- if ($.isFunction(data) === false) {
490
- tmp = data;
491
- data = function() { return tmp; };
492
- }
493
-
494
- var dataItem = data();
495
- if (dataItem.text) {
496
- text = dataItem.text;
497
- // if text is not a function we assume it to be a key name
498
- if (!$.isFunction(text)) {
499
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
500
- text = function (item) { return item[dataText]; };
501
- }
502
- }
503
-
504
- return function (query) {
505
- var t = query.term, filtered = { results: [] }, process;
506
- if (t === "") {
507
- query.callback(data());
508
- return;
509
- }
510
-
511
- process = function(datum, collection) {
512
- var group, attr;
513
- datum = datum[0];
514
- if (datum.children) {
515
- group = {};
516
- for (attr in datum) {
517
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
518
- }
519
- group.children=[];
520
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
521
- if (group.children.length || query.matcher(t, text(group), datum)) {
522
- collection.push(group);
523
- }
524
- } else {
525
- if (query.matcher(t, text(datum), datum)) {
526
- collection.push(datum);
527
- }
528
- }
529
- };
530
-
531
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
532
- query.callback(filtered);
533
- };
534
- }
535
-
536
- // TODO javadoc
537
- function tags(data) {
538
- var isFunc = $.isFunction(data);
539
- return function (query) {
540
- var t = query.term, filtered = {results: []};
541
- var result = isFunc ? data(query) : data;
542
- if ($.isArray(result)) {
543
- $(result).each(function () {
544
- var isObject = this.text !== undefined,
545
- text = isObject ? this.text : this;
546
- if (t === "" || query.matcher(t, text)) {
547
- filtered.results.push(isObject ? this : {id: this, text: this});
548
- }
549
- });
550
- query.callback(filtered);
551
- }
552
- };
553
- }
554
-
555
- /**
556
- * Checks if the formatter function should be used.
557
- *
558
- * Throws an error if it is not a function. Returns true if it should be used,
559
- * false if no formatting should be performed.
560
- *
561
- * @param formatter
562
- */
563
- function checkFormatter(formatter, formatterName) {
564
- if ($.isFunction(formatter)) return true;
565
- if (!formatter) return false;
566
- if (typeof(formatter) === 'string') return true;
567
- throw new Error(formatterName +" must be a string, function, or falsy value");
568
- }
569
-
570
- /**
571
- * Returns a given value
572
- * If given a function, returns its output
573
- *
574
- * @param val string|function
575
- * @param context value of "this" to be passed to function
576
- * @returns {*}
577
- */
578
- function evaluate(val, context) {
579
- if ($.isFunction(val)) {
580
- var args = Array.prototype.slice.call(arguments, 2);
581
- return val.apply(context, args);
582
- }
583
- return val;
584
- }
585
-
586
- function countResults(results) {
587
- var count = 0;
588
- $.each(results, function(i, item) {
589
- if (item.children) {
590
- count += countResults(item.children);
591
- } else {
592
- count++;
593
- }
594
- });
595
- return count;
596
- }
597
-
598
- /**
599
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
600
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
601
- * two options have to be defined in order for the tokenizer to work.
602
- *
603
- * @param input text user has typed so far or pasted into the search field
604
- * @param selection currently selected choices
605
- * @param selectCallback function(choice) callback tho add the choice to selection
606
- * @param opts select2's opts
607
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
608
- */
609
- function defaultTokenizer(input, selection, selectCallback, opts) {
610
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
611
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
612
- token, // token
613
- index, // position at which the separator was found
614
- i, l, // looping variables
615
- separator; // the matched separator
616
-
617
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
618
-
619
- while (true) {
620
- index = -1;
621
-
622
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
623
- separator = opts.tokenSeparators[i];
624
- index = input.indexOf(separator);
625
- if (index >= 0) break;
626
- }
627
-
628
- if (index < 0) break; // did not find any token separator in the input string, bail
629
-
630
- token = input.substring(0, index);
631
- input = input.substring(index + separator.length);
632
-
633
- if (token.length > 0) {
634
- token = opts.createSearchChoice.call(this, token, selection);
635
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
636
- dupe = false;
637
- for (i = 0, l = selection.length; i < l; i++) {
638
- if (equal(opts.id(token), opts.id(selection[i]))) {
639
- dupe = true; break;
640
- }
641
- }
642
-
643
- if (!dupe) selectCallback(token);
644
- }
645
- }
646
- }
647
-
648
- if (original!==input) return input;
649
- }
650
-
651
- function cleanupJQueryElements() {
652
- var self = this;
653
-
654
- $.each(arguments, function (i, element) {
655
- self[element].remove();
656
- self[element] = null;
657
- });
658
- }
659
-
660
- /**
661
- * Creates a new class
662
- *
663
- * @param superClass
664
- * @param methods
665
- */
666
- function clazz(SuperClass, methods) {
667
- var constructor = function () {};
668
- constructor.prototype = new SuperClass;
669
- constructor.prototype.constructor = constructor;
670
- constructor.prototype.parent = SuperClass.prototype;
671
- constructor.prototype = $.extend(constructor.prototype, methods);
672
- return constructor;
673
- }
674
-
675
- AbstractSelect2 = clazz(Object, {
676
-
677
- // abstract
678
- bind: function (func) {
679
- var self = this;
680
- return function () {
681
- func.apply(self, arguments);
682
- };
683
- },
684
-
685
- // abstract
686
- init: function (opts) {
687
- var results, search, resultsSelector = ".select2-results";
688
-
689
- // prepare options
690
- this.opts = opts = this.prepareOpts(opts);
691
-
692
- this.id=opts.id;
693
-
694
- // destroy if called on an existing component
695
- if (opts.element.data("select2") !== undefined &&
696
- opts.element.data("select2") !== null) {
697
- opts.element.data("select2").destroy();
698
- }
699
-
700
- this.container = this.createContainer();
701
-
702
- this.liveRegion = $('.select2-hidden-accessible');
703
- if (this.liveRegion.length == 0) {
704
- this.liveRegion = $("<span>", {
705
- role: "status",
706
- "aria-live": "polite"
707
- })
708
- .addClass("select2-hidden-accessible")
709
- .appendTo(document.body);
710
- }
711
-
712
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
713
- this.containerEventName= this.containerId
714
- .replace(/([.])/g, '_')
715
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
716
- this.container.attr("id", this.containerId);
717
-
718
- this.container.attr("title", opts.element.attr("title"));
719
-
720
- this.body = $(document.body);
721
-
722
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
723
-
724
- this.container.attr("style", opts.element.attr("style"));
725
- this.container.css(evaluate(opts.containerCss, this.opts.element));
726
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
727
-
728
- this.elementTabIndex = this.opts.element.attr("tabindex");
729
-
730
- // swap container for the element
731
- this.opts.element
732
- .data("select2", this)
733
- .attr("tabindex", "-1")
734
- .before(this.container)
735
- .on("click.select2", killEvent); // do not leak click events
736
-
737
- this.container.data("select2", this);
738
-
739
- this.dropdown = this.container.find(".select2-drop");
740
-
741
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
742
-
743
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
744
- this.dropdown.data("select2", this);
745
- this.dropdown.on("click", killEvent);
746
-
747
- this.results = results = this.container.find(resultsSelector);
748
- this.search = search = this.container.find("input.select2-input");
749
-
750
- this.queryCount = 0;
751
- this.resultsPage = 0;
752
- this.context = null;
753
-
754
- // initialize the container
755
- this.initContainer();
756
-
757
- this.container.on("click", killEvent);
758
-
759
- installFilteredMouseMove(this.results);
760
-
761
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
762
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
763
- this._touchEvent = true;
764
- this.highlightUnderEvent(event);
765
- }));
766
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
767
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
768
-
769
- // Waiting for a click event on touch devices to select option and hide dropdown
770
- // otherwise click will be triggered on an underlying element
771
- this.dropdown.on('click', this.bind(function (event) {
772
- if (this._touchEvent) {
773
- this._touchEvent = false;
774
- this.selectHighlighted();
775
- }
776
- }));
777
-
778
- installDebouncedScroll(80, this.results);
779
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
780
-
781
- // do not propagate change event from the search field out of the component
782
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
783
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
784
-
785
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
786
- if ($.fn.mousewheel) {
787
- results.mousewheel(function (e, delta, deltaX, deltaY) {
788
- var top = results.scrollTop();
789
- if (deltaY > 0 && top - deltaY <= 0) {
790
- results.scrollTop(0);
791
- killEvent(e);
792
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
793
- results.scrollTop(results.get(0).scrollHeight - results.height());
794
- killEvent(e);
795
- }
796
- });
797
- }
798
-
799
- installKeyUpChangeEvent(search);
800
- search.on("keyup-change input paste", this.bind(this.updateResults));
801
- search.on("focus", function () { search.addClass("select2-focused"); });
802
- search.on("blur", function () { search.removeClass("select2-focused");});
803
-
804
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
805
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
806
- this.highlightUnderEvent(e);
807
- this.selectHighlighted(e);
808
- }
809
- }));
810
-
811
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
812
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
813
- // dom it will trigger the popup close, which is not what we want
814
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
815
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
816
-
817
- this.lastSearchTerm = undefined;
818
-
819
- if ($.isFunction(this.opts.initSelection)) {
820
- // initialize selection based on the current value of the source element
821
- this.initSelection();
822
-
823
- // if the user has provided a function that can set selection based on the value of the source element
824
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
825
- this.monitorSource();
826
- }
827
-
828
- if (opts.maximumInputLength !== null) {
829
- this.search.attr("maxlength", opts.maximumInputLength);
830
- }
831
-
832
- var disabled = opts.element.prop("disabled");
833
- if (disabled === undefined) disabled = false;
834
- this.enable(!disabled);
835
-
836
- var readonly = opts.element.prop("readonly");
837
- if (readonly === undefined) readonly = false;
838
- this.readonly(readonly);
839
-
840
- // Calculate size of scrollbar
841
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
842
-
843
- this.autofocus = opts.element.prop("autofocus");
844
- opts.element.prop("autofocus", false);
845
- if (this.autofocus) this.focus();
846
-
847
- this.search.attr("placeholder", opts.searchInputPlaceholder);
848
- },
849
-
850
- // abstract
851
- destroy: function () {
852
- var element=this.opts.element, select2 = element.data("select2"), self = this;
853
-
854
- this.close();
855
-
856
- if (element.length && element[0].detachEvent && self._sync) {
857
- element.each(function () {
858
- if (self._sync) {
859
- this.detachEvent("onpropertychange", self._sync);
860
- }
861
- });
862
- }
863
- if (this.propertyObserver) {
864
- this.propertyObserver.disconnect();
865
- this.propertyObserver = null;
866
- }
867
- this._sync = null;
868
-
869
- if (select2 !== undefined) {
870
- select2.container.remove();
871
- select2.liveRegion.remove();
872
- select2.dropdown.remove();
873
- element.removeData("select2")
874
- .off(".select2");
875
- if (!element.is("input[type='hidden']")) {
876
- element
877
- .show()
878
- .prop("autofocus", this.autofocus || false);
879
- if (this.elementTabIndex) {
880
- element.attr({tabindex: this.elementTabIndex});
881
- } else {
882
- element.removeAttr("tabindex");
883
- }
884
- element.show();
885
- } else {
886
- element.css("display", "");
887
- }
888
- }
889
-
890
- cleanupJQueryElements.call(this,
891
- "container",
892
- "liveRegion",
893
- "dropdown",
894
- "results",
895
- "search"
896
- );
897
- },
898
-
899
- // abstract
900
- optionToData: function(element) {
901
- if (element.is("option")) {
902
- return {
903
- id:element.prop("value"),
904
- text:element.text(),
905
- element: element.get(),
906
- css: element.attr("class"),
907
- disabled: element.prop("disabled"),
908
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
909
- };
910
- } else if (element.is("optgroup")) {
911
- return {
912
- text:element.attr("label"),
913
- children:[],
914
- element: element.get(),
915
- css: element.attr("class")
916
- };
917
- }
918
- },
919
-
920
- // abstract
921
- prepareOpts: function (opts) {
922
- var element, select, idKey, ajaxUrl, self = this;
923
-
924
- element = opts.element;
925
-
926
- if (element.get(0).tagName.toLowerCase() === "select") {
927
- this.select = select = opts.element;
928
- }
929
-
930
- if (select) {
931
- // these options are not allowed when attached to a select because they are picked up off the element itself
932
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
933
- if (this in opts) {
934
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
935
- }
936
- });
937
- }
938
-
939
- opts.debug = opts.debug || $.fn.select2.defaults.debug;
940
-
941
- // Warnings for options renamed/removed in Select2 4.0.0
942
- // Only when it's enabled through debug mode
943
- if (opts.debug && console && console.warn) {
944
- // id was removed
945
- if (opts.id != null) {
946
- console.warn(
947
- 'Select2: The `id` option has been removed in Select2 4.0.0, ' +
948
- 'consider renaming your `id` property or mapping the property before your data makes it to Select2. ' +
949
- 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id'
950
- );
951
- }
952
-
953
- // text was removed
954
- if (opts.text != null) {
955
- console.warn(
956
- 'Select2: The `text` option has been removed in Select2 4.0.0, ' +
957
- 'consider renaming your `text` property or mapping the property before your data makes it to Select2. ' +
958
- 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id'
959
- );
960
- }
961
-
962
- // sortResults was renamed to results
963
- if (opts.sortResults != null) {
964
- console.warn(
965
- 'Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. '
966
- );
967
- }
968
-
969
- // selectOnBlur was renamed to selectOnClose
970
- if (opts.selectOnBlur != null) {
971
- console.warn(
972
- 'Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0.'
973
- );
974
- }
975
-
976
- // ajax.results was renamed to ajax.processResults
977
- if (opts.ajax != null && opts.ajax.results != null) {
978
- console.warn(
979
- 'Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0.'
980
- );
981
- }
982
-
983
- // format* options were renamed to language.*
984
- if (opts.formatNoResults != null) {
985
- console.warn(
986
- 'Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0.'
987
- );
988
- }
989
- if (opts.formatSearching != null) {
990
- console.warn(
991
- 'Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0.'
992
- );
993
- }
994
- if (opts.formatInputTooShort != null) {
995
- console.warn(
996
- 'Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0.'
997
- );
998
- }
999
- if (opts.formatInputTooLong != null) {
1000
- console.warn(
1001
- 'Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0.'
1002
- );
1003
- }
1004
- if (opts.formatLoading != null) {
1005
- console.warn(
1006
- 'Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0.'
1007
- );
1008
- }
1009
- if (opts.formatSelectionTooBig != null) {
1010
- console.warn(
1011
- 'Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0.'
1012
- );
1013
- }
1014
-
1015
- if (opts.element.data('select2Tags')) {
1016
- console.warn(
1017
- 'Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.'
1018
- );
1019
- }
1020
- }
1021
-
1022
- // Aliasing options renamed in Select2 4.0.0
1023
-
1024
- // data-select2-tags -> data-tags
1025
- if (opts.element.data('tags') != null) {
1026
- var elemTags = opts.element.data('tags');
1027
-
1028
- // data-tags should actually be a boolean
1029
- if (!$.isArray(elemTags)) {
1030
- elemTags = [];
1031
- }
1032
-
1033
- opts.element.data('select2Tags', elemTags);
1034
- }
1035
-
1036
- // sortResults -> sorter
1037
- if (opts.sorter != null) {
1038
- opts.sortResults = opts.sorter;
1039
- }
1040
-
1041
- // selectOnBlur -> selectOnClose
1042
- if (opts.selectOnClose != null) {
1043
- opts.selectOnBlur = opts.selectOnClose;
1044
- }
1045
-
1046
- // ajax.results -> ajax.processResults
1047
- if (opts.ajax != null) {
1048
- if ($.isFunction(opts.ajax.processResults)) {
1049
- opts.ajax.results = opts.ajax.processResults;
1050
- }
1051
- }
1052
-
1053
- // Formatters/language options
1054
- if (opts.language != null) {
1055
- var lang = opts.language;
1056
-
1057
- // formatNoMatches -> language.noMatches
1058
- if ($.isFunction(lang.noMatches)) {
1059
- opts.formatNoMatches = lang.noMatches;
1060
- }
1061
-
1062
- // formatSearching -> language.searching
1063
- if ($.isFunction(lang.searching)) {
1064
- opts.formatSearching = lang.searching;
1065
- }
1066
-
1067
- // formatInputTooShort -> language.inputTooShort
1068
- if ($.isFunction(lang.inputTooShort)) {
1069
- opts.formatInputTooShort = lang.inputTooShort;
1070
- }
1071
-
1072
- // formatInputTooLong -> language.inputTooLong
1073
- if ($.isFunction(lang.inputTooLong)) {
1074
- opts.formatInputTooLong = lang.inputTooLong;
1075
- }
1076
-
1077
- // formatLoading -> language.loadingMore
1078
- if ($.isFunction(lang.loadingMore)) {
1079
- opts.formatLoading = lang.loadingMore;
1080
- }
1081
-
1082
- // formatSelectionTooBig -> language.maximumSelected
1083
- if ($.isFunction(lang.maximumSelected)) {
1084
- opts.formatSelectionTooBig = lang.maximumSelected;
1085
- }
1086
- }
1087
-
1088
- opts = $.extend({}, {
1089
- populateResults: function(container, results, query) {
1090
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
1091
-
1092
- populate=function(results, container, depth) {
1093
-
1094
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
1095
-
1096
- results = opts.sortResults(results, container, query);
1097
-
1098
- // collect the created nodes for bulk append
1099
- var nodes = [];
1100
- for (i = 0, l = results.length; i < l; i = i + 1) {
1101
-
1102
- result=results[i];
1103
-
1104
- disabled = (result.disabled === true);
1105
- selectable = (!disabled) && (id(result) !== undefined);
1106
-
1107
- compound=result.children && result.children.length > 0;
1108
-
1109
- node=$("<li></li>");
1110
- node.addClass("select2-results-dept-"+depth);
1111
- node.addClass("select2-result");
1112
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
1113
- if (disabled) { node.addClass("select2-disabled"); }
1114
- if (compound) { node.addClass("select2-result-with-children"); }
1115
- node.addClass(self.opts.formatResultCssClass(result));
1116
- node.attr("role", "presentation");
1117
-
1118
- label=$(document.createElement("div"));
1119
- label.addClass("select2-result-label");
1120
- label.attr("id", "select2-result-label-" + nextUid());
1121
- label.attr("role", "option");
1122
-
1123
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
1124
- if (formatted!==undefined) {
1125
- label.html(formatted);
1126
- node.append(label);
1127
- }
1128
-
1129
-
1130
- if (compound) {
1131
- innerContainer=$("<ul></ul>");
1132
- innerContainer.addClass("select2-result-sub");
1133
- populate(result.children, innerContainer, depth+1);
1134
- node.append(innerContainer);
1135
- }
1136
-
1137
- node.data("select2-data", result);
1138
- nodes.push(node[0]);
1139
- }
1140
-
1141
- // bulk append the created nodes
1142
- container.append(nodes);
1143
- liveRegion.text(opts.formatMatches(results.length));
1144
- };
1145
-
1146
- populate(results, container, 0);
1147
- }
1148
- }, $.fn.select2.defaults, opts);
1149
-
1150
- if (typeof(opts.id) !== "function") {
1151
- idKey = opts.id;
1152
- opts.id = function (e) { return e[idKey]; };
1153
- }
1154
-
1155
- if ($.isArray(opts.element.data("select2Tags"))) {
1156
- if ("tags" in opts) {
1157
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1158
- }
1159
- opts.tags=opts.element.data("select2Tags");
1160
- }
1161
-
1162
- if (select) {
1163
- opts.query = this.bind(function (query) {
1164
- var data = { results: [], more: false },
1165
- term = query.term,
1166
- children, placeholderOption, process;
1167
-
1168
- process=function(element, collection) {
1169
- var group;
1170
- if (element.is("option")) {
1171
- if (query.matcher(term, element.text(), element)) {
1172
- collection.push(self.optionToData(element));
1173
- }
1174
- } else if (element.is("optgroup")) {
1175
- group=self.optionToData(element);
1176
- element.children().each2(function(i, elm) { process(elm, group.children); });
1177
- if (group.children.length>0) {
1178
- collection.push(group);
1179
- }
1180
- }
1181
- };
1182
-
1183
- children=element.children();
1184
-
1185
- // ignore the placeholder option if there is one
1186
- if (this.getPlaceholder() !== undefined && children.length > 0) {
1187
- placeholderOption = this.getPlaceholderOption();
1188
- if (placeholderOption) {
1189
- children=children.not(placeholderOption);
1190
- }
1191
- }
1192
-
1193
- children.each2(function(i, elm) { process(elm, data.results); });
1194
-
1195
- query.callback(data);
1196
- });
1197
- // this is needed because inside val() we construct choices from options and their id is hardcoded
1198
- opts.id=function(e) { return e.id; };
1199
- } else {
1200
- if (!("query" in opts)) {
1201
- if ("ajax" in opts) {
1202
- ajaxUrl = opts.element.data("ajax-url");
1203
- if (ajaxUrl && ajaxUrl.length > 0) {
1204
- opts.ajax.url = ajaxUrl;
1205
- }
1206
- opts.query = ajax.call(opts.element, opts.ajax);
1207
- } else if ("data" in opts) {
1208
- opts.query = local(opts.data);
1209
- } else if ("tags" in opts) {
1210
- opts.query = tags(opts.tags);
1211
- if (opts.createSearchChoice === undefined) {
1212
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1213
- }
1214
- if (opts.initSelection === undefined) {
1215
- opts.initSelection = function (element, callback) {
1216
- var data = [];
1217
- $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () {
1218
- var obj = { id: this, text: this },
1219
- tags = opts.tags;
1220
- if ($.isFunction(tags)) tags=tags();
1221
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1222
- data.push(obj);
1223
- });
1224
-
1225
- callback(data);
1226
- };
1227
- }
1228
- }
1229
- }
1230
- }
1231
- if (typeof(opts.query) !== "function") {
1232
- throw "query function not defined for Select2 " + opts.element.attr("id");
1233
- }
1234
-
1235
- if (opts.createSearchChoicePosition === 'top') {
1236
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1237
- }
1238
- else if (opts.createSearchChoicePosition === 'bottom') {
1239
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1240
- }
1241
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
1242
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1243
- }
1244
-
1245
- return opts;
1246
- },
1247
-
1248
- /**
1249
- * Monitor the original element for changes and update select2 accordingly
1250
- */
1251
- // abstract
1252
- monitorSource: function () {
1253
- var el = this.opts.element, observer, self = this;
1254
-
1255
- el.on("change.select2", this.bind(function (e) {
1256
- if (this.opts.element.data("select2-change-triggered") !== true) {
1257
- this.initSelection();
1258
- }
1259
- }));
1260
-
1261
- this._sync = this.bind(function () {
1262
-
1263
- // sync enabled state
1264
- var disabled = el.prop("disabled");
1265
- if (disabled === undefined) disabled = false;
1266
- this.enable(!disabled);
1267
-
1268
- var readonly = el.prop("readonly");
1269
- if (readonly === undefined) readonly = false;
1270
- this.readonly(readonly);
1271
-
1272
- if (this.container) {
1273
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1274
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1275
- }
1276
-
1277
- if (this.dropdown) {
1278
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1279
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1280
- }
1281
-
1282
- });
1283
-
1284
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1285
- if (el.length && el[0].attachEvent) {
1286
- el.each(function() {
1287
- this.attachEvent("onpropertychange", self._sync);
1288
- });
1289
- }
1290
-
1291
- // safari, chrome, firefox, IE11
1292
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1293
- if (observer !== undefined) {
1294
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1295
- this.propertyObserver = new observer(function (mutations) {
1296
- $.each(mutations, self._sync);
1297
- });
1298
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1299
- }
1300
- },
1301
-
1302
- // abstract
1303
- triggerSelect: function(data) {
1304
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1305
- this.opts.element.trigger(evt);
1306
- return !evt.isDefaultPrevented();
1307
- },
1308
-
1309
- /**
1310
- * Triggers the change event on the source element
1311
- */
1312
- // abstract
1313
- triggerChange: function (details) {
1314
-
1315
- details = details || {};
1316
- details= $.extend({}, details, { type: "change", val: this.val() });
1317
- // prevents recursive triggering
1318
- this.opts.element.data("select2-change-triggered", true);
1319
- this.opts.element.trigger(details);
1320
- this.opts.element.data("select2-change-triggered", false);
1321
-
1322
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1323
- // so here we trigger the click event manually
1324
- this.opts.element.click();
1325
-
1326
- // ValidationEngine ignores the change event and listens instead to blur
1327
- // so here we trigger the blur event manually if so desired
1328
- if (this.opts.blurOnChange)
1329
- this.opts.element.blur();
1330
- },
1331
-
1332
- //abstract
1333
- isInterfaceEnabled: function()
1334
- {
1335
- return this.enabledInterface === true;
1336
- },
1337
-
1338
- // abstract
1339
- enableInterface: function() {
1340
- var enabled = this._enabled && !this._readonly,
1341
- disabled = !enabled;
1342
-
1343
- if (enabled === this.enabledInterface) return false;
1344
-
1345
- this.container.toggleClass("select2-container-disabled", disabled);
1346
- this.close();
1347
- this.enabledInterface = enabled;
1348
-
1349
- return true;
1350
- },
1351
-
1352
- // abstract
1353
- enable: function(enabled) {
1354
- if (enabled === undefined) enabled = true;
1355
- if (this._enabled === enabled) return;
1356
- this._enabled = enabled;
1357
-
1358
- this.opts.element.prop("disabled", !enabled);
1359
- this.enableInterface();
1360
- },
1361
-
1362
- // abstract
1363
- disable: function() {
1364
- this.enable(false);
1365
- },
1366
-
1367
- // abstract
1368
- readonly: function(enabled) {
1369
- if (enabled === undefined) enabled = false;
1370
- if (this._readonly === enabled) return;
1371
- this._readonly = enabled;
1372
-
1373
- this.opts.element.prop("readonly", enabled);
1374
- this.enableInterface();
1375
- },
1376
-
1377
- // abstract
1378
- opened: function () {
1379
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1380
- },
1381
-
1382
- // abstract
1383
- positionDropdown: function() {
1384
- var $dropdown = this.dropdown,
1385
- container = this.container,
1386
- offset = container.offset(),
1387
- height = container.outerHeight(false),
1388
- width = container.outerWidth(false),
1389
- dropHeight = $dropdown.outerHeight(false),
1390
- $window = $(window),
1391
- windowWidth = $window.width(),
1392
- windowHeight = $window.height(),
1393
- viewPortRight = $window.scrollLeft() + windowWidth,
1394
- viewportBottom = $window.scrollTop() + windowHeight,
1395
- dropTop = offset.top + height,
1396
- dropLeft = offset.left,
1397
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1398
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1399
- dropWidth = $dropdown.outerWidth(false),
1400
- enoughRoomOnRight = function() {
1401
- return dropLeft + dropWidth <= viewPortRight;
1402
- },
1403
- enoughRoomOnLeft = function() {
1404
- return offset.left + viewPortRight + container.outerWidth(false) > dropWidth;
1405
- },
1406
- aboveNow = $dropdown.hasClass("select2-drop-above"),
1407
- bodyOffset,
1408
- above,
1409
- changeDirection,
1410
- css,
1411
- resultsListNode;
1412
-
1413
- // always prefer the current above/below alignment, unless there is not enough room
1414
- if (aboveNow) {
1415
- above = true;
1416
- if (!enoughRoomAbove && enoughRoomBelow) {
1417
- changeDirection = true;
1418
- above = false;
1419
- }
1420
- } else {
1421
- above = false;
1422
- if (!enoughRoomBelow && enoughRoomAbove) {
1423
- changeDirection = true;
1424
- above = true;
1425
- }
1426
- }
1427
-
1428
- //if we are changing direction we need to get positions when dropdown is hidden;
1429
- if (changeDirection) {
1430
- $dropdown.hide();
1431
- offset = this.container.offset();
1432
- height = this.container.outerHeight(false);
1433
- width = this.container.outerWidth(false);
1434
- dropHeight = $dropdown.outerHeight(false);
1435
- viewPortRight = $window.scrollLeft() + windowWidth;
1436
- viewportBottom = $window.scrollTop() + windowHeight;
1437
- dropTop = offset.top + height;
1438
- dropLeft = offset.left;
1439
- dropWidth = $dropdown.outerWidth(false);
1440
- $dropdown.show();
1441
-
1442
- // fix so the cursor does not move to the left within the search-textbox in IE
1443
- this.focusSearch();
1444
- }
1445
-
1446
- if (this.opts.dropdownAutoWidth) {
1447
- resultsListNode = $('.select2-results', $dropdown)[0];
1448
- $dropdown.addClass('select2-drop-auto-width');
1449
- $dropdown.css('width', '');
1450
- // Add scrollbar width to dropdown if vertical scrollbar is present
1451
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1452
- dropWidth > width ? width = dropWidth : dropWidth = width;
1453
- dropHeight = $dropdown.outerHeight(false);
1454
- }
1455
- else {
1456
- this.container.removeClass('select2-drop-auto-width');
1457
- }
1458
-
1459
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1460
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1461
-
1462
- // fix positioning when body has an offset and is not position: static
1463
- if (this.body.css('position') !== 'static') {
1464
- bodyOffset = this.body.offset();
1465
- dropTop -= bodyOffset.top;
1466
- dropLeft -= bodyOffset.left;
1467
- }
1468
-
1469
- if (!enoughRoomOnRight() && enoughRoomOnLeft()) {
1470
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1471
- }
1472
-
1473
- css = {
1474
- left: dropLeft,
1475
- width: width
1476
- };
1477
-
1478
- if (above) {
1479
- this.container.addClass("select2-drop-above");
1480
- $dropdown.addClass("select2-drop-above");
1481
- dropHeight = $dropdown.outerHeight(false);
1482
- css.top = offset.top - dropHeight;
1483
- css.bottom = 'auto';
1484
- }
1485
- else {
1486
- css.top = dropTop;
1487
- css.bottom = 'auto';
1488
- this.container.removeClass("select2-drop-above");
1489
- $dropdown.removeClass("select2-drop-above");
1490
- }
1491
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1492
-
1493
- $dropdown.css(css);
1494
- },
1495
-
1496
- // abstract
1497
- shouldOpen: function() {
1498
- var event;
1499
-
1500
- if (this.opened()) return false;
1501
-
1502
- if (this._enabled === false || this._readonly === true) return false;
1503
-
1504
- event = $.Event("select2-opening");
1505
- this.opts.element.trigger(event);
1506
- return !event.isDefaultPrevented();
1507
- },
1508
-
1509
- // abstract
1510
- clearDropdownAlignmentPreference: function() {
1511
- // clear the classes used to figure out the preference of where the dropdown should be opened
1512
- this.container.removeClass("select2-drop-above");
1513
- this.dropdown.removeClass("select2-drop-above");
1514
- },
1515
-
1516
- /**
1517
- * Opens the dropdown
1518
- *
1519
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1520
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1521
- */
1522
- // abstract
1523
- open: function () {
1524
-
1525
- if (!this.shouldOpen()) return false;
1526
-
1527
- this.opening();
1528
-
1529
- // Only bind the document mousemove when the dropdown is visible
1530
- $document.on("mousemove.select2Event", function (e) {
1531
- lastMousePosition.x = e.pageX;
1532
- lastMousePosition.y = e.pageY;
1533
- });
1534
-
1535
- return true;
1536
- },
1537
-
1538
- /**
1539
- * Performs the opening of the dropdown
1540
- */
1541
- // abstract
1542
- opening: function() {
1543
- var cid = this.containerEventName,
1544
- scroll = "scroll." + cid,
1545
- resize = "resize."+cid,
1546
- orient = "orientationchange."+cid,
1547
- mask;
1548
-
1549
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1550
-
1551
- this.clearDropdownAlignmentPreference();
1552
-
1553
- if(this.dropdown[0] !== this.body.children().last()[0]) {
1554
- this.dropdown.detach().appendTo(this.body);
1555
- }
1556
-
1557
- // create the dropdown mask if doesn't already exist
1558
- mask = $("#select2-drop-mask");
1559
- if (mask.length === 0) {
1560
- mask = $(document.createElement("div"));
1561
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1562
- mask.hide();
1563
- mask.appendTo(this.body);
1564
- mask.on("mousedown touchstart click", function (e) {
1565
- // Prevent IE from generating a click event on the body
1566
- reinsertElement(mask);
1567
-
1568
- var dropdown = $("#select2-drop"), self;
1569
- if (dropdown.length > 0) {
1570
- self=dropdown.data("select2");
1571
- if (self.opts.selectOnBlur) {
1572
- self.selectHighlighted({noFocus: true});
1573
- }
1574
- self.close();
1575
- e.preventDefault();
1576
- e.stopPropagation();
1577
- }
1578
- });
1579
- }
1580
-
1581
- // ensure the mask is always right before the dropdown
1582
- if (this.dropdown.prev()[0] !== mask[0]) {
1583
- this.dropdown.before(mask);
1584
- }
1585
-
1586
- // move the global id to the correct dropdown
1587
- $("#select2-drop").removeAttr("id");
1588
- this.dropdown.attr("id", "select2-drop");
1589
-
1590
- // show the elements
1591
- mask.show();
1592
-
1593
- this.positionDropdown();
1594
- this.dropdown.show();
1595
- this.positionDropdown();
1596
-
1597
- this.dropdown.addClass("select2-drop-active");
1598
-
1599
- // attach listeners to events that can change the position of the container and thus require
1600
- // the position of the dropdown to be updated as well so it does not come unglued from the container
1601
- var that = this;
1602
- this.container.parents().add(window).each(function () {
1603
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
1604
- if (that.opened()) that.positionDropdown();
1605
- });
1606
- });
1607
-
1608
-
1609
- },
1610
-
1611
- // abstract
1612
- close: function () {
1613
- if (!this.opened()) return;
1614
-
1615
- var cid = this.containerEventName,
1616
- scroll = "scroll." + cid,
1617
- resize = "resize."+cid,
1618
- orient = "orientationchange."+cid;
1619
-
1620
- // unbind event listeners
1621
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1622
-
1623
- this.clearDropdownAlignmentPreference();
1624
-
1625
- $("#select2-drop-mask").hide();
1626
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1627
- this.dropdown.hide();
1628
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1629
- this.results.empty();
1630
-
1631
- // Now that the dropdown is closed, unbind the global document mousemove event
1632
- $document.off("mousemove.select2Event");
1633
-
1634
- this.clearSearch();
1635
- this.search.removeClass("select2-active");
1636
-
1637
- // Remove the aria active descendant for highlighted element
1638
- this.search.removeAttr("aria-activedescendant");
1639
- this.opts.element.trigger($.Event("select2-close"));
1640
- },
1641
-
1642
- /**
1643
- * Opens control, sets input value, and updates results.
1644
- */
1645
- // abstract
1646
- externalSearch: function (term) {
1647
- this.open();
1648
- this.search.val(term);
1649
- this.updateResults(false);
1650
- },
1651
-
1652
- // abstract
1653
- clearSearch: function () {
1654
-
1655
- },
1656
-
1657
- /**
1658
- * @return {Boolean} Whether or not search value was changed.
1659
- * @private
1660
- */
1661
- prefillNextSearchTerm: function () {
1662
- // initializes search's value with nextSearchTerm (if defined by user)
1663
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
1664
- if(this.search.val() !== "") {
1665
- return false;
1666
- }
1667
-
1668
- var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm);
1669
- if(nextSearchTerm !== undefined){
1670
- this.search.val(nextSearchTerm);
1671
- this.search.select();
1672
- return true;
1673
- }
1674
-
1675
- return false;
1676
- },
1677
-
1678
- //abstract
1679
- getMaximumSelectionSize: function() {
1680
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1681
- },
1682
-
1683
- // abstract
1684
- ensureHighlightVisible: function () {
1685
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1686
-
1687
- index = this.highlight();
1688
-
1689
- if (index < 0) return;
1690
-
1691
- if (index == 0) {
1692
-
1693
- // if the first element is highlighted scroll all the way to the top,
1694
- // that way any unselectable headers above it will also be scrolled
1695
- // into view
1696
-
1697
- results.scrollTop(0);
1698
- return;
1699
- }
1700
-
1701
- children = this.findHighlightableChoices().find('.select2-result-label');
1702
-
1703
- child = $(children[index]);
1704
-
1705
- topOffset = (child.offset() || {}).top || 0;
1706
-
1707
- hb = topOffset + child.outerHeight(true);
1708
-
1709
- // if this is the last child lets also make sure select2-more-results is visible
1710
- if (index === children.length - 1) {
1711
- more = results.find("li.select2-more-results");
1712
- if (more.length > 0) {
1713
- hb = more.offset().top + more.outerHeight(true);
1714
- }
1715
- }
1716
-
1717
- rb = results.offset().top + results.outerHeight(false);
1718
- if (hb > rb) {
1719
- results.scrollTop(results.scrollTop() + (hb - rb));
1720
- }
1721
- y = topOffset - results.offset().top;
1722
-
1723
- // make sure the top of the element is visible
1724
- if (y < 0 && child.css('display') != 'none' ) {
1725
- results.scrollTop(results.scrollTop() + y); // y is negative
1726
- }
1727
- },
1728
-
1729
- // abstract
1730
- findHighlightableChoices: function() {
1731
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1732
- },
1733
-
1734
- // abstract
1735
- moveHighlight: function (delta) {
1736
- var choices = this.findHighlightableChoices(),
1737
- index = this.highlight();
1738
-
1739
- while (index > -1 && index < choices.length) {
1740
- index += delta;
1741
- var choice = $(choices[index]);
1742
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1743
- this.highlight(index);
1744
- break;
1745
- }
1746
- }
1747
- },
1748
-
1749
- // abstract
1750
- highlight: function (index) {
1751
- var choices = this.findHighlightableChoices(),
1752
- choice,
1753
- data;
1754
-
1755
- if (arguments.length === 0) {
1756
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1757
- }
1758
-
1759
- if (index >= choices.length) index = choices.length - 1;
1760
- if (index < 0) index = 0;
1761
-
1762
- this.removeHighlight();
1763
-
1764
- choice = $(choices[index]);
1765
- choice.addClass("select2-highlighted");
1766
-
1767
- // ensure assistive technology can determine the active choice
1768
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1769
-
1770
- this.ensureHighlightVisible();
1771
-
1772
- this.liveRegion.text(choice.text());
1773
-
1774
- data = choice.data("select2-data");
1775
- if (data) {
1776
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1777
- }
1778
- },
1779
-
1780
- removeHighlight: function() {
1781
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1782
- },
1783
-
1784
- touchMoved: function() {
1785
- this._touchMoved = true;
1786
- },
1787
-
1788
- clearTouchMoved: function() {
1789
- this._touchMoved = false;
1790
- },
1791
-
1792
- // abstract
1793
- countSelectableResults: function() {
1794
- return this.findHighlightableChoices().length;
1795
- },
1796
-
1797
- // abstract
1798
- highlightUnderEvent: function (event) {
1799
- var el = $(event.target).closest(".select2-result-selectable");
1800
- if (el.length > 0 && !el.is(".select2-highlighted")) {
1801
- var choices = this.findHighlightableChoices();
1802
- this.highlight(choices.index(el));
1803
- } else if (el.length == 0) {
1804
- // if we are over an unselectable item remove all highlights
1805
- this.removeHighlight();
1806
- }
1807
- },
1808
-
1809
- // abstract
1810
- loadMoreIfNeeded: function () {
1811
- var results = this.results,
1812
- more = results.find("li.select2-more-results"),
1813
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1814
- page = this.resultsPage + 1,
1815
- self=this,
1816
- term=this.search.val(),
1817
- context=this.context;
1818
-
1819
- if (more.length === 0) return;
1820
- below = more.offset().top - results.offset().top - results.height();
1821
-
1822
- if (below <= this.opts.loadMorePadding) {
1823
- more.addClass("select2-active");
1824
- this.opts.query({
1825
- element: this.opts.element,
1826
- term: term,
1827
- page: page,
1828
- context: context,
1829
- matcher: this.opts.matcher,
1830
- callback: this.bind(function (data) {
1831
-
1832
- // ignore a response if the select2 has been closed before it was received
1833
- if (!self.opened()) return;
1834
-
1835
-
1836
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1837
- self.postprocessResults(data, false, false);
1838
-
1839
- if (data.more===true) {
1840
- more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
1841
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1842
- } else {
1843
- more.remove();
1844
- }
1845
- self.positionDropdown();
1846
- self.resultsPage = page;
1847
- self.context = data.context;
1848
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1849
- })});
1850
- }
1851
- },
1852
-
1853
- /**
1854
- * Default tokenizer function which does nothing
1855
- */
1856
- tokenize: function() {
1857
-
1858
- },
1859
-
1860
- /**
1861
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
1862
- */
1863
- // abstract
1864
- updateResults: function (initial) {
1865
- var search = this.search,
1866
- results = this.results,
1867
- opts = this.opts,
1868
- data,
1869
- self = this,
1870
- input,
1871
- term = search.val(),
1872
- lastTerm = $.data(this.container, "select2-last-term"),
1873
- // sequence number used to drop out-of-order responses
1874
- queryNumber;
1875
-
1876
- // prevent duplicate queries against the same term
1877
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1878
-
1879
- $.data(this.container, "select2-last-term", term);
1880
-
1881
- // if the search is currently hidden we do not alter the results
1882
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1883
- return;
1884
- }
1885
-
1886
- function postRender() {
1887
- search.removeClass("select2-active");
1888
- self.positionDropdown();
1889
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1890
- self.liveRegion.text(results.text());
1891
- }
1892
- else {
1893
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length));
1894
- }
1895
- }
1896
-
1897
- function render(html) {
1898
- results.html(html);
1899
- postRender();
1900
- }
1901
-
1902
- queryNumber = ++this.queryCount;
1903
-
1904
- var maxSelSize = this.getMaximumSelectionSize();
1905
- if (maxSelSize >=1) {
1906
- data = this.data();
1907
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1908
- render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1909
- return;
1910
- }
1911
- }
1912
-
1913
- if (search.val().length < opts.minimumInputLength) {
1914
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1915
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1916
- } else {
1917
- render("");
1918
- }
1919
- if (initial && this.showSearch) this.showSearch(true);
1920
- return;
1921
- }
1922
-
1923
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1924
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1925
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1926
- } else {
1927
- render("");
1928
- }
1929
- return;
1930
- }
1931
-
1932
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1933
- render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1934
- }
1935
-
1936
- search.addClass("select2-active");
1937
-
1938
- this.removeHighlight();
1939
-
1940
- // give the tokenizer a chance to pre-process the input
1941
- input = this.tokenize();
1942
- if (input != undefined && input != null) {
1943
- search.val(input);
1944
- }
1945
-
1946
- this.resultsPage = 1;
1947
-
1948
- opts.query({
1949
- element: opts.element,
1950
- term: search.val(),
1951
- page: this.resultsPage,
1952
- context: null,
1953
- matcher: opts.matcher,
1954
- callback: this.bind(function (data) {
1955
- var def; // default choice
1956
-
1957
- // ignore old responses
1958
- if (queryNumber != this.queryCount) {
1959
- return;
1960
- }
1961
-
1962
- // ignore a response if the select2 has been closed before it was received
1963
- if (!this.opened()) {
1964
- this.search.removeClass("select2-active");
1965
- return;
1966
- }
1967
-
1968
- // handle ajax error
1969
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1970
- render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1971
- return;
1972
- }
1973
-
1974
- // save context, if any
1975
- this.context = (data.context===undefined) ? null : data.context;
1976
- // create a default choice and prepend it to the list
1977
- if (this.opts.createSearchChoice && search.val() !== "") {
1978
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1979
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1980
- if ($(data.results).filter(
1981
- function () {
1982
- return equal(self.id(this), self.id(def));
1983
- }).length === 0) {
1984
- this.opts.createSearchChoicePosition(data.results, def);
1985
- }
1986
- }
1987
- }
1988
-
1989
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1990
- render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1991
- if(this.showSearch){
1992
- this.showSearch(search.val());
1993
- }
1994
- return;
1995
- }
1996
-
1997
- results.empty();
1998
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1999
-
2000
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
2001
- results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
2002
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
2003
- }
2004
-
2005
- this.postprocessResults(data, initial);
2006
-
2007
- postRender();
2008
-
2009
- this.opts.element.trigger({ type: "select2-loaded", items: data });
2010
- })});
2011
- },
2012
-
2013
- // abstract
2014
- cancel: function () {
2015
- this.close();
2016
- },
2017
-
2018
- // abstract
2019
- blur: function () {
2020
- // if selectOnBlur == true, select the currently highlighted option
2021
- if (this.opts.selectOnBlur)
2022
- this.selectHighlighted({noFocus: true});
2023
-
2024
- this.close();
2025
- this.container.removeClass("select2-container-active");
2026
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
2027
- if (this.search[0] === document.activeElement) { this.search.blur(); }
2028
- this.clearSearch();
2029
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
2030
- },
2031
-
2032
- // abstract
2033
- focusSearch: function () {
2034
- focus(this.search);
2035
- },
2036
-
2037
- // abstract
2038
- selectHighlighted: function (options) {
2039
- if (this._touchMoved) {
2040
- this.clearTouchMoved();
2041
- return;
2042
- }
2043
- var index=this.highlight(),
2044
- highlighted=this.results.find(".select2-highlighted"),
2045
- data = highlighted.closest('.select2-result').data("select2-data");
2046
-
2047
- if (data) {
2048
- this.highlight(index);
2049
- this.onSelect(data, options);
2050
- } else if (options && options.noFocus) {
2051
- this.close();
2052
- }
2053
- },
2054
-
2055
- // abstract
2056
- getPlaceholder: function () {
2057
- var placeholderOption;
2058
- return this.opts.element.attr("placeholder") ||
2059
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
2060
- this.opts.element.data("placeholder") ||
2061
- this.opts.placeholder ||
2062
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
2063
- },
2064
-
2065
- // abstract
2066
- getPlaceholderOption: function() {
2067
- if (this.select) {
2068
- var firstOption = this.select.children('option').first();
2069
- if (this.opts.placeholderOption !== undefined ) {
2070
- //Determine the placeholder option based on the specified placeholderOption setting
2071
- return (this.opts.placeholderOption === "first" && firstOption) ||
2072
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
2073
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
2074
- //No explicit placeholder option specified, use the first if it's blank
2075
- return firstOption;
2076
- }
2077
- }
2078
- },
2079
-
2080
- /**
2081
- * Get the desired width for the container element. This is
2082
- * derived first from option `width` passed to select2, then
2083
- * the inline 'style' on the original element, and finally
2084
- * falls back to the jQuery calculated element width.
2085
- */
2086
- // abstract
2087
- initContainerWidth: function () {
2088
- function resolveContainerWidth() {
2089
- var style, attrs, matches, i, l, attr;
2090
-
2091
- if (this.opts.width === "off") {
2092
- return null;
2093
- } else if (this.opts.width === "element"){
2094
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
2095
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
2096
- // check if there is inline style on the element that contains width
2097
- style = this.opts.element.attr('style');
2098
- if (typeof(style) === "string") {
2099
- attrs = style.split(';');
2100
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
2101
- attr = attrs[i].replace(/\s/g, '');
2102
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
2103
- if (matches !== null && matches.length >= 1)
2104
- return matches[1];
2105
- }
2106
- }
2107
-
2108
- if (this.opts.width === "resolve") {
2109
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
2110
- // when attached to input type=hidden or elements hidden via css
2111
- style = this.opts.element.css('width');
2112
- if (style.indexOf("%") > 0) return style;
2113
-
2114
- // finally, fallback on the calculated width of the element
2115
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
2116
- }
2117
-
2118
- return null;
2119
- } else if ($.isFunction(this.opts.width)) {
2120
- return this.opts.width();
2121
- } else {
2122
- return this.opts.width;
2123
- }
2124
- };
2125
-
2126
- var width = resolveContainerWidth.call(this);
2127
- if (width !== null) {
2128
- this.container.css("width", width);
2129
- }
2130
- }
2131
- });
2132
-
2133
- SingleSelect2 = clazz(AbstractSelect2, {
2134
-
2135
- // single
2136
-
2137
- createContainer: function () {
2138
- var container = $(document.createElement("div")).attr({
2139
- "class": "select2-container"
2140
- }).html([
2141
- "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
2142
- " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
2143
- " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
2144
- "</a>",
2145
- "<label for='' class='select2-offscreen'></label>",
2146
- "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
2147
- "<div class='select2-drop select2-display-none'>",
2148
- " <div class='select2-search'>",
2149
- " <label for='' class='select2-offscreen'></label>",
2150
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
2151
- " aria-autocomplete='list' />",
2152
- " </div>",
2153
- " <ul class='select2-results' role='listbox'>",
2154
- " </ul>",
2155
- "</div>"].join(""));
2156
- return container;
2157
- },
2158
-
2159
- // single
2160
- enableInterface: function() {
2161
- if (this.parent.enableInterface.apply(this, arguments)) {
2162
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
2163
- }
2164
- },
2165
-
2166
- // single
2167
- opening: function () {
2168
- var el, range, len;
2169
-
2170
- if (this.opts.minimumResultsForSearch >= 0) {
2171
- this.showSearch(true);
2172
- }
2173
-
2174
- this.parent.opening.apply(this, arguments);
2175
-
2176
- if (this.showSearchInput !== false) {
2177
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
2178
- // all other browsers handle this just fine
2179
-
2180
- this.search.val(this.focusser.val());
2181
- }
2182
- if (this.opts.shouldFocusInput(this)) {
2183
- this.search.focus();
2184
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
2185
- // new text will appear *before* focusser.val()
2186
- el = this.search.get(0);
2187
- if (el.createTextRange) {
2188
- range = el.createTextRange();
2189
- range.collapse(false);
2190
- range.select();
2191
- } else if (el.setSelectionRange) {
2192
- len = this.search.val().length;
2193
- el.setSelectionRange(len, len);
2194
- }
2195
- }
2196
-
2197
- this.prefillNextSearchTerm();
2198
-
2199
- this.focusser.prop("disabled", true).val("");
2200
- this.updateResults(true);
2201
- this.opts.element.trigger($.Event("select2-open"));
2202
- },
2203
-
2204
- // single
2205
- close: function () {
2206
- if (!this.opened()) return;
2207
- this.parent.close.apply(this, arguments);
2208
-
2209
- this.focusser.prop("disabled", false);
2210
-
2211
- if (this.opts.shouldFocusInput(this)) {
2212
- this.focusser.focus();
2213
- }
2214
- },
2215
-
2216
- // single
2217
- focus: function () {
2218
- if (this.opened()) {
2219
- this.close();
2220
- } else {
2221
- this.focusser.prop("disabled", false);
2222
- if (this.opts.shouldFocusInput(this)) {
2223
- this.focusser.focus();
2224
- }
2225
- }
2226
- },
2227
-
2228
- // single
2229
- isFocused: function () {
2230
- return this.container.hasClass("select2-container-active");
2231
- },
2232
-
2233
- // single
2234
- cancel: function () {
2235
- this.parent.cancel.apply(this, arguments);
2236
- this.focusser.prop("disabled", false);
2237
-
2238
- if (this.opts.shouldFocusInput(this)) {
2239
- this.focusser.focus();
2240
- }
2241
- },
2242
-
2243
- // single
2244
- destroy: function() {
2245
- $("label[for='" + this.focusser.attr('id') + "']")
2246
- .attr('for', this.opts.element.attr("id"));
2247
- this.parent.destroy.apply(this, arguments);
2248
-
2249
- cleanupJQueryElements.call(this,
2250
- "selection",
2251
- "focusser"
2252
- );
2253
- },
2254
-
2255
- // single
2256
- initContainer: function () {
2257
-
2258
- var selection,
2259
- container = this.container,
2260
- dropdown = this.dropdown,
2261
- idSuffix = nextUid(),
2262
- elementLabel;
2263
-
2264
- if (this.opts.minimumResultsForSearch < 0) {
2265
- this.showSearch(false);
2266
- } else {
2267
- this.showSearch(true);
2268
- }
2269
-
2270
- this.selection = selection = container.find(".select2-choice");
2271
-
2272
- this.focusser = container.find(".select2-focusser");
2273
-
2274
- // add aria associations
2275
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2276
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2277
- this.results.attr("id", "select2-results-"+idSuffix);
2278
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
2279
-
2280
- // rewrite labels from original element to focusser
2281
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
2282
-
2283
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2284
- this.opts.element.on('focus.select2', this.bind(function () { this.focus(); }));
2285
-
2286
- this.focusser.prev()
2287
- .text(elementLabel.text())
2288
- .attr('for', this.focusser.attr('id'));
2289
-
2290
- // Ensure the original element retains an accessible name
2291
- var originalTitle = this.opts.element.attr("title");
2292
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2293
-
2294
- this.focusser.attr("tabindex", this.elementTabIndex);
2295
-
2296
- // write label for search field using the label from the focusser element
2297
- this.search.attr("id", this.focusser.attr('id') + '_search');
2298
-
2299
- this.search.prev()
2300
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
2301
- .attr('for', this.search.attr('id'));
2302
-
2303
- this.search.on("keydown", this.bind(function (e) {
2304
- if (!this.isInterfaceEnabled()) return;
2305
-
2306
- // filter 229 keyCodes (input method editor is processing key input)
2307
- if (229 == e.keyCode) return;
2308
-
2309
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2310
- // prevent the page from scrolling
2311
- killEvent(e);
2312
- return;
2313
- }
2314
-
2315
- switch (e.which) {
2316
- case KEY.UP:
2317
- case KEY.DOWN:
2318
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2319
- killEvent(e);
2320
- return;
2321
- case KEY.ENTER:
2322
- this.selectHighlighted();
2323
- killEvent(e);
2324
- return;
2325
- case KEY.TAB:
2326
- this.selectHighlighted({noFocus: true});
2327
- return;
2328
- case KEY.ESC:
2329
- this.cancel(e);
2330
- killEvent(e);
2331
- return;
2332
- }
2333
- }));
2334
-
2335
- this.search.on("blur", this.bind(function(e) {
2336
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2337
- // without this the search field loses focus which is annoying
2338
- if (document.activeElement === this.body.get(0)) {
2339
- window.setTimeout(this.bind(function() {
2340
- if (this.opened() && this.results && this.results.length > 1) {
2341
- this.search.focus();
2342
- }
2343
- }), 0);
2344
- }
2345
- }));
2346
-
2347
- this.focusser.on("keydown", this.bind(function (e) {
2348
- if (!this.isInterfaceEnabled()) return;
2349
-
2350
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2351
- return;
2352
- }
2353
-
2354
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2355
- killEvent(e);
2356
- return;
2357
- }
2358
-
2359
- if (e.which == KEY.DOWN || e.which == KEY.UP
2360
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2361
-
2362
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2363
-
2364
- this.open();
2365
- killEvent(e);
2366
- return;
2367
- }
2368
-
2369
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2370
- if (this.opts.allowClear) {
2371
- this.clear();
2372
- }
2373
- killEvent(e);
2374
- return;
2375
- }
2376
- }));
2377
-
2378
-
2379
- installKeyUpChangeEvent(this.focusser);
2380
- this.focusser.on("keyup-change input", this.bind(function(e) {
2381
- if (this.opts.minimumResultsForSearch >= 0) {
2382
- e.stopPropagation();
2383
- if (this.opened()) return;
2384
- this.open();
2385
- }
2386
- }));
2387
-
2388
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2389
- if (!this.isInterfaceEnabled()) {
2390
- return;
2391
- }
2392
-
2393
- this.clear();
2394
- killEventImmediately(e);
2395
- this.close();
2396
-
2397
- if (this.selection) {
2398
- this.selection.focus();
2399
- }
2400
- }));
2401
-
2402
- selection.on("mousedown touchstart", this.bind(function (e) {
2403
- // Prevent IE from generating a click event on the body
2404
- reinsertElement(selection);
2405
-
2406
- if (!this.container.hasClass("select2-container-active")) {
2407
- this.opts.element.trigger($.Event("select2-focus"));
2408
- }
2409
-
2410
- if (this.opened()) {
2411
- this.close();
2412
- } else if (this.isInterfaceEnabled()) {
2413
- this.open();
2414
- }
2415
-
2416
- killEvent(e);
2417
- }));
2418
-
2419
- dropdown.on("mousedown touchstart", this.bind(function() {
2420
- if (this.opts.shouldFocusInput(this)) {
2421
- this.search.focus();
2422
- }
2423
- }));
2424
-
2425
- selection.on("focus", this.bind(function(e) {
2426
- killEvent(e);
2427
- }));
2428
-
2429
- this.focusser.on("focus", this.bind(function(){
2430
- if (!this.container.hasClass("select2-container-active")) {
2431
- this.opts.element.trigger($.Event("select2-focus"));
2432
- }
2433
- this.container.addClass("select2-container-active");
2434
- })).on("blur", this.bind(function() {
2435
- if (!this.opened()) {
2436
- this.container.removeClass("select2-container-active");
2437
- this.opts.element.trigger($.Event("select2-blur"));
2438
- }
2439
- }));
2440
- this.search.on("focus", this.bind(function(){
2441
- if (!this.container.hasClass("select2-container-active")) {
2442
- this.opts.element.trigger($.Event("select2-focus"));
2443
- }
2444
- this.container.addClass("select2-container-active");
2445
- }));
2446
-
2447
- this.initContainerWidth();
2448
- this.opts.element.hide();
2449
- this.setPlaceholder();
2450
-
2451
- },
2452
-
2453
- // single
2454
- clear: function(triggerChange) {
2455
- var data=this.selection.data("select2-data");
2456
- if (data) { // guard against queued quick consecutive clicks
2457
- var evt = $.Event("select2-clearing");
2458
- this.opts.element.trigger(evt);
2459
- if (evt.isDefaultPrevented()) {
2460
- return;
2461
- }
2462
- var placeholderOption = this.getPlaceholderOption();
2463
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2464
- this.selection.find(".select2-chosen").empty();
2465
- this.selection.removeData("select2-data");
2466
- this.setPlaceholder();
2467
-
2468
- if (triggerChange !== false){
2469
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2470
- this.triggerChange({removed:data});
2471
- }
2472
- }
2473
- },
2474
-
2475
- /**
2476
- * Sets selection based on source element's value
2477
- */
2478
- // single
2479
- initSelection: function () {
2480
- var selected;
2481
- if (this.isPlaceholderOptionSelected()) {
2482
- this.updateSelection(null);
2483
- this.close();
2484
- this.setPlaceholder();
2485
- } else {
2486
- var self = this;
2487
- this.opts.initSelection.call(null, this.opts.element, function(selected){
2488
- if (selected !== undefined && selected !== null) {
2489
- self.updateSelection(selected);
2490
- self.close();
2491
- self.setPlaceholder();
2492
- self.lastSearchTerm = self.search.val();
2493
- }
2494
- });
2495
- }
2496
- },
2497
-
2498
- isPlaceholderOptionSelected: function() {
2499
- var placeholderOption;
2500
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2501
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2502
- || (this.opts.element.val() === "")
2503
- || (this.opts.element.val() === undefined)
2504
- || (this.opts.element.val() === null);
2505
- },
2506
-
2507
- // single
2508
- prepareOpts: function () {
2509
- var opts = this.parent.prepareOpts.apply(this, arguments),
2510
- self=this;
2511
-
2512
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2513
- // install the selection initializer
2514
- opts.initSelection = function (element, callback) {
2515
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2516
- // a single select box always has a value, no need to null check 'selected'
2517
- callback(self.optionToData(selected));
2518
- };
2519
- } else if ("data" in opts) {
2520
- // install default initSelection when applied to hidden input and data is local
2521
- opts.initSelection = opts.initSelection || function (element, callback) {
2522
- var id = element.val();
2523
- //search in data by id, storing the actual matching item
2524
- var match = null;
2525
- opts.query({
2526
- matcher: function(term, text, el){
2527
- var is_match = equal(id, opts.id(el));
2528
- if (is_match) {
2529
- match = el;
2530
- }
2531
- return is_match;
2532
- },
2533
- callback: !$.isFunction(callback) ? $.noop : function() {
2534
- callback(match);
2535
- }
2536
- });
2537
- };
2538
- }
2539
-
2540
- return opts;
2541
- },
2542
-
2543
- // single
2544
- getPlaceholder: function() {
2545
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
2546
- if (this.select) {
2547
- if (this.getPlaceholderOption() === undefined) {
2548
- return undefined;
2549
- }
2550
- }
2551
-
2552
- return this.parent.getPlaceholder.apply(this, arguments);
2553
- },
2554
-
2555
- // single
2556
- setPlaceholder: function () {
2557
- var placeholder = this.getPlaceholder();
2558
-
2559
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2560
-
2561
- // check for a placeholder option if attached to a select
2562
- if (this.select && this.getPlaceholderOption() === undefined) return;
2563
-
2564
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2565
-
2566
- this.selection.addClass("select2-default");
2567
-
2568
- this.container.removeClass("select2-allowclear");
2569
- }
2570
- },
2571
-
2572
- // single
2573
- postprocessResults: function (data, initial, noHighlightUpdate) {
2574
- var selected = 0, self = this, showSearchInput = true;
2575
-
2576
- // find the selected element in the result list
2577
-
2578
- this.findHighlightableChoices().each2(function (i, elm) {
2579
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2580
- selected = i;
2581
- return false;
2582
- }
2583
- });
2584
-
2585
- // and highlight it
2586
- if (noHighlightUpdate !== false) {
2587
- if (initial === true && selected >= 0) {
2588
- this.highlight(selected);
2589
- } else {
2590
- this.highlight(0);
2591
- }
2592
- }
2593
-
2594
- // hide the search box if this is the first we got the results and there are enough of them for search
2595
-
2596
- if (initial === true) {
2597
- var min = this.opts.minimumResultsForSearch;
2598
- if (min >= 0) {
2599
- this.showSearch(countResults(data.results) >= min);
2600
- }
2601
- }
2602
- },
2603
-
2604
- // single
2605
- showSearch: function(showSearchInput) {
2606
- if (this.showSearchInput === showSearchInput) return;
2607
-
2608
- this.showSearchInput = showSearchInput;
2609
-
2610
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2611
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2612
- //add "select2-with-searchbox" to the container if search box is shown
2613
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2614
- },
2615
-
2616
- // single
2617
- onSelect: function (data, options) {
2618
-
2619
- if (!this.triggerSelect(data)) { return; }
2620
-
2621
- var old = this.opts.element.val(),
2622
- oldData = this.data();
2623
-
2624
- this.opts.element.val(this.id(data));
2625
- this.updateSelection(data);
2626
-
2627
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2628
-
2629
- this.lastSearchTerm = this.search.val();
2630
- this.close();
2631
-
2632
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2633
- this.focusser.focus();
2634
- }
2635
-
2636
- if (!equal(old, this.id(data))) {
2637
- this.triggerChange({ added: data, removed: oldData });
2638
- }
2639
- },
2640
-
2641
- // single
2642
- updateSelection: function (data) {
2643
-
2644
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2645
-
2646
- this.selection.data("select2-data", data);
2647
-
2648
- container.empty();
2649
- if (data !== null) {
2650
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2651
- }
2652
- if (formatted !== undefined) {
2653
- container.append(formatted);
2654
- }
2655
- cssClass=this.opts.formatSelectionCssClass(data, container);
2656
- if (cssClass !== undefined) {
2657
- container.addClass(cssClass);
2658
- }
2659
-
2660
- this.selection.removeClass("select2-default");
2661
-
2662
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2663
- this.container.addClass("select2-allowclear");
2664
- }
2665
- },
2666
-
2667
- // single
2668
- val: function () {
2669
- var val,
2670
- triggerChange = false,
2671
- data = null,
2672
- self = this,
2673
- oldData = this.data();
2674
-
2675
- if (arguments.length === 0) {
2676
- return this.opts.element.val();
2677
- }
2678
-
2679
- val = arguments[0];
2680
-
2681
- if (arguments.length > 1) {
2682
- triggerChange = arguments[1];
2683
-
2684
- if (this.opts.debug && console && console.warn) {
2685
- console.warn(
2686
- 'Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. ' +
2687
- 'The `change` event will always be triggered in 4.0.0.'
2688
- );
2689
- }
2690
- }
2691
-
2692
- if (this.select) {
2693
- if (this.opts.debug && console && console.warn) {
2694
- console.warn(
2695
- 'Select2: Setting the value on a <select> using `select2("val")` is no longer supported in 4.0.0. ' +
2696
- 'You can use the `.val(newValue).trigger("change")` method provided by jQuery instead.'
2697
- );
2698
- }
2699
-
2700
- this.select
2701
- .val(val)
2702
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2703
- data = self.optionToData(elm);
2704
- return false;
2705
- });
2706
- this.updateSelection(data);
2707
- this.setPlaceholder();
2708
- if (triggerChange) {
2709
- this.triggerChange({added: data, removed:oldData});
2710
- }
2711
- } else {
2712
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2713
- if (!val && val !== 0) {
2714
- this.clear(triggerChange);
2715
- return;
2716
- }
2717
- if (this.opts.initSelection === undefined) {
2718
- throw new Error("cannot call val() if initSelection() is not defined");
2719
- }
2720
- this.opts.element.val(val);
2721
- this.opts.initSelection(this.opts.element, function(data){
2722
- self.opts.element.val(!data ? "" : self.id(data));
2723
- self.updateSelection(data);
2724
- self.setPlaceholder();
2725
- if (triggerChange) {
2726
- self.triggerChange({added: data, removed:oldData});
2727
- }
2728
- });
2729
- }
2730
- },
2731
-
2732
- // single
2733
- clearSearch: function () {
2734
- this.search.val("");
2735
- this.focusser.val("");
2736
- },
2737
-
2738
- // single
2739
- data: function(value) {
2740
- var data,
2741
- triggerChange = false;
2742
-
2743
- if (arguments.length === 0) {
2744
- data = this.selection.data("select2-data");
2745
- if (data == undefined) data = null;
2746
- return data;
2747
- } else {
2748
- if (this.opts.debug && console && console.warn) {
2749
- console.warn(
2750
- 'Select2: The `select2("data")` method can no longer set selected values in 4.0.0, ' +
2751
- 'consider using the `.val()` method instead.'
2752
- );
2753
- }
2754
-
2755
- if (arguments.length > 1) {
2756
- triggerChange = arguments[1];
2757
- }
2758
- if (!value) {
2759
- this.clear(triggerChange);
2760
- } else {
2761
- data = this.data();
2762
- this.opts.element.val(!value ? "" : this.id(value));
2763
- this.updateSelection(value);
2764
- if (triggerChange) {
2765
- this.triggerChange({added: value, removed:data});
2766
- }
2767
- }
2768
- }
2769
- }
2770
- });
2771
-
2772
- MultiSelect2 = clazz(AbstractSelect2, {
2773
-
2774
- // multi
2775
- createContainer: function () {
2776
- var container = $(document.createElement("div")).attr({
2777
- "class": "select2-container select2-container-multi"
2778
- }).html([
2779
- "<ul class='select2-choices'>",
2780
- " <li class='select2-search-field'>",
2781
- " <label for='' class='select2-offscreen'></label>",
2782
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2783
- " </li>",
2784
- "</ul>",
2785
- "<div class='select2-drop select2-drop-multi select2-display-none'>",
2786
- " <ul class='select2-results'>",
2787
- " </ul>",
2788
- "</div>"].join(""));
2789
- return container;
2790
- },
2791
-
2792
- // multi
2793
- prepareOpts: function () {
2794
- var opts = this.parent.prepareOpts.apply(this, arguments),
2795
- self=this;
2796
-
2797
- // TODO validate placeholder is a string if specified
2798
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2799
- // install the selection initializer
2800
- opts.initSelection = function (element, callback) {
2801
-
2802
- var data = [];
2803
-
2804
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2805
- data.push(self.optionToData(elm));
2806
- });
2807
- callback(data);
2808
- };
2809
- } else if ("data" in opts) {
2810
- // install default initSelection when applied to hidden input and data is local
2811
- opts.initSelection = opts.initSelection || function (element, callback) {
2812
- var ids = splitVal(element.val(), opts.separator, opts.transformVal);
2813
- //search in data by array of ids, storing matching items in a list
2814
- var matches = [];
2815
- opts.query({
2816
- matcher: function(term, text, el){
2817
- var is_match = $.grep(ids, function(id) {
2818
- return equal(id, opts.id(el));
2819
- }).length;
2820
- if (is_match) {
2821
- matches.push(el);
2822
- }
2823
- return is_match;
2824
- },
2825
- callback: !$.isFunction(callback) ? $.noop : function() {
2826
- // reorder matches based on the order they appear in the ids array because right now
2827
- // they are in the order in which they appear in data array
2828
- var ordered = [];
2829
- for (var i = 0; i < ids.length; i++) {
2830
- var id = ids[i];
2831
- for (var j = 0; j < matches.length; j++) {
2832
- var match = matches[j];
2833
- if (equal(id, opts.id(match))) {
2834
- ordered.push(match);
2835
- matches.splice(j, 1);
2836
- break;
2837
- }
2838
- }
2839
- }
2840
- callback(ordered);
2841
- }
2842
- });
2843
- };
2844
- }
2845
-
2846
- return opts;
2847
- },
2848
-
2849
- // multi
2850
- selectChoice: function (choice) {
2851
-
2852
- var selected = this.container.find(".select2-search-choice-focus");
2853
- if (selected.length && choice && choice[0] == selected[0]) {
2854
-
2855
- } else {
2856
- if (selected.length) {
2857
- this.opts.element.trigger("choice-deselected", selected);
2858
- }
2859
- selected.removeClass("select2-search-choice-focus");
2860
- if (choice && choice.length) {
2861
- this.close();
2862
- choice.addClass("select2-search-choice-focus");
2863
- this.opts.element.trigger("choice-selected", choice);
2864
- }
2865
- }
2866
- },
2867
-
2868
- // multi
2869
- destroy: function() {
2870
- $("label[for='" + this.search.attr('id') + "']")
2871
- .attr('for', this.opts.element.attr("id"));
2872
- this.parent.destroy.apply(this, arguments);
2873
-
2874
- cleanupJQueryElements.call(this,
2875
- "searchContainer",
2876
- "selection"
2877
- );
2878
- },
2879
-
2880
- // multi
2881
- initContainer: function () {
2882
-
2883
- var selector = ".select2-choices", selection;
2884
-
2885
- this.searchContainer = this.container.find(".select2-search-field");
2886
- this.selection = selection = this.container.find(selector);
2887
-
2888
- var _this = this;
2889
- this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) {
2890
- _this.search[0].focus();
2891
- _this.selectChoice($(this));
2892
- });
2893
-
2894
- // rewrite labels from original element to focusser
2895
- this.search.attr("id", "s2id_autogen"+nextUid());
2896
-
2897
- this.search.prev()
2898
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2899
- .attr('for', this.search.attr('id'));
2900
- this.opts.element.on('focus.select2', this.bind(function () { this.focus(); }));
2901
-
2902
- this.search.on("input paste", this.bind(function() {
2903
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2904
- if (!this.isInterfaceEnabled()) return;
2905
- if (!this.opened()) {
2906
- this.open();
2907
- }
2908
- }));
2909
-
2910
- this.search.attr("tabindex", this.elementTabIndex);
2911
-
2912
- this.keydowns = 0;
2913
- this.search.on("keydown", this.bind(function (e) {
2914
- if (!this.isInterfaceEnabled()) return;
2915
-
2916
- ++this.keydowns;
2917
- var selected = selection.find(".select2-search-choice-focus");
2918
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2919
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
2920
- var pos = getCursorInfo(this.search);
2921
-
2922
- if (selected.length &&
2923
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2924
- var selectedChoice = selected;
2925
- if (e.which == KEY.LEFT && prev.length) {
2926
- selectedChoice = prev;
2927
- }
2928
- else if (e.which == KEY.RIGHT) {
2929
- selectedChoice = next.length ? next : null;
2930
- }
2931
- else if (e.which === KEY.BACKSPACE) {
2932
- if (this.unselect(selected.first())) {
2933
- this.search.width(10);
2934
- selectedChoice = prev.length ? prev : next;
2935
- }
2936
- } else if (e.which == KEY.DELETE) {
2937
- if (this.unselect(selected.first())) {
2938
- this.search.width(10);
2939
- selectedChoice = next.length ? next : null;
2940
- }
2941
- } else if (e.which == KEY.ENTER) {
2942
- selectedChoice = null;
2943
- }
2944
-
2945
- this.selectChoice(selectedChoice);
2946
- killEvent(e);
2947
- if (!selectedChoice || !selectedChoice.length) {
2948
- this.open();
2949
- }
2950
- return;
2951
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2952
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2953
-
2954
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2955
- killEvent(e);
2956
- return;
2957
- } else {
2958
- this.selectChoice(null);
2959
- }
2960
-
2961
- if (this.opened()) {
2962
- switch (e.which) {
2963
- case KEY.UP:
2964
- case KEY.DOWN:
2965
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2966
- killEvent(e);
2967
- return;
2968
- case KEY.ENTER:
2969
- this.selectHighlighted();
2970
- killEvent(e);
2971
- return;
2972
- case KEY.TAB:
2973
- this.selectHighlighted({noFocus:true});
2974
- this.close();
2975
- return;
2976
- case KEY.ESC:
2977
- this.cancel(e);
2978
- killEvent(e);
2979
- return;
2980
- }
2981
- }
2982
-
2983
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2984
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2985
- return;
2986
- }
2987
-
2988
- if (e.which === KEY.ENTER) {
2989
- if (this.opts.openOnEnter === false) {
2990
- return;
2991
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2992
- return;
2993
- }
2994
- }
2995
-
2996
- this.open();
2997
-
2998
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2999
- // prevent the page from scrolling
3000
- killEvent(e);
3001
- }
3002
-
3003
- if (e.which === KEY.ENTER) {
3004
- // prevent form from being submitted
3005
- killEvent(e);
3006
- }
3007
-
3008
- }));
3009
-
3010
- this.search.on("keyup", this.bind(function (e) {
3011
- this.keydowns = 0;
3012
- this.resizeSearch();
3013
- })
3014
- );
3015
-
3016
- this.search.on("blur", this.bind(function(e) {
3017
- this.container.removeClass("select2-container-active");
3018
- this.search.removeClass("select2-focused");
3019
- this.selectChoice(null);
3020
- if (!this.opened()) this.clearSearch();
3021
- e.stopImmediatePropagation();
3022
- this.opts.element.trigger($.Event("select2-blur"));
3023
- }));
3024
-
3025
- this.container.on("click", selector, this.bind(function (e) {
3026
- if (!this.isInterfaceEnabled()) return;
3027
- if ($(e.target).closest(".select2-search-choice").length > 0) {
3028
- // clicked inside a select2 search choice, do not open
3029
- return;
3030
- }
3031
- this.selectChoice(null);
3032
- this.clearPlaceholder();
3033
- if (!this.container.hasClass("select2-container-active")) {
3034
- this.opts.element.trigger($.Event("select2-focus"));
3035
- }
3036
- this.open();
3037
- this.focusSearch();
3038
- e.preventDefault();
3039
- }));
3040
-
3041
- this.container.on("focus", selector, this.bind(function () {
3042
- if (!this.isInterfaceEnabled()) return;
3043
- if (!this.container.hasClass("select2-container-active")) {
3044
- this.opts.element.trigger($.Event("select2-focus"));
3045
- }
3046
- this.container.addClass("select2-container-active");
3047
- this.dropdown.addClass("select2-drop-active");
3048
- this.clearPlaceholder();
3049
- }));
3050
-
3051
- this.initContainerWidth();
3052
- this.opts.element.hide();
3053
-
3054
- // set the placeholder if necessary
3055
- this.clearSearch();
3056
- },
3057
-
3058
- // multi
3059
- enableInterface: function() {
3060
- if (this.parent.enableInterface.apply(this, arguments)) {
3061
- this.search.prop("disabled", !this.isInterfaceEnabled());
3062
- }
3063
- },
3064
-
3065
- // multi
3066
- initSelection: function () {
3067
- var data;
3068
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
3069
- this.updateSelection([]);
3070
- this.close();
3071
- // set the placeholder if necessary
3072
- this.clearSearch();
3073
- }
3074
- if (this.select || this.opts.element.val() !== "") {
3075
- var self = this;
3076
- this.opts.initSelection.call(null, this.opts.element, function(data){
3077
- if (data !== undefined && data !== null) {
3078
- self.updateSelection(data);
3079
- self.close();
3080
- // set the placeholder if necessary
3081
- self.clearSearch();
3082
- }
3083
- });
3084
- }
3085
- },
3086
-
3087
- // multi
3088
- clearSearch: function () {
3089
- var placeholder = this.getPlaceholder(),
3090
- maxWidth = this.getMaxSearchWidth();
3091
-
3092
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
3093
- this.search.val(placeholder).addClass("select2-default");
3094
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
3095
- // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
3096
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
3097
- } else {
3098
- this.search.val("").width(10);
3099
- }
3100
- },
3101
-
3102
- // multi
3103
- clearPlaceholder: function () {
3104
- if (this.search.hasClass("select2-default")) {
3105
- this.search.val("").removeClass("select2-default");
3106
- }
3107
- },
3108
-
3109
- // multi
3110
- opening: function () {
3111
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
3112
- this.resizeSearch();
3113
-
3114
- this.parent.opening.apply(this, arguments);
3115
-
3116
- this.focusSearch();
3117
-
3118
- this.prefillNextSearchTerm();
3119
- this.updateResults(true);
3120
-
3121
- if (this.opts.shouldFocusInput(this)) {
3122
- this.search.focus();
3123
- }
3124
- this.opts.element.trigger($.Event("select2-open"));
3125
- },
3126
-
3127
- // multi
3128
- close: function () {
3129
- if (!this.opened()) return;
3130
- this.parent.close.apply(this, arguments);
3131
- },
3132
-
3133
- // multi
3134
- focus: function () {
3135
- this.close();
3136
- this.search.focus();
3137
- },
3138
-
3139
- // multi
3140
- isFocused: function () {
3141
- return this.search.hasClass("select2-focused");
3142
- },
3143
-
3144
- // multi
3145
- updateSelection: function (data) {
3146
- var ids = {}, filtered = [], self = this;
3147
-
3148
- // filter out duplicates
3149
- $(data).each(function () {
3150
- if (!(self.id(this) in ids)) {
3151
- ids[self.id(this)] = 0;
3152
- filtered.push(this);
3153
- }
3154
- });
3155
-
3156
- this.selection.find(".select2-search-choice").remove();
3157
- this.addSelectedChoice(filtered);
3158
- self.postprocessResults();
3159
- },
3160
-
3161
- // multi
3162
- tokenize: function() {
3163
- var input = this.search.val();
3164
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
3165
- if (input != null && input != undefined) {
3166
- this.search.val(input);
3167
- if (input.length > 0) {
3168
- this.open();
3169
- }
3170
- }
3171
-
3172
- },
3173
-
3174
- // multi
3175
- onSelect: function (data, options) {
3176
-
3177
- if (!this.triggerSelect(data) || data.text === "") { return; }
3178
-
3179
- this.addSelectedChoice(data);
3180
-
3181
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
3182
-
3183
- // keep track of the search's value before it gets cleared
3184
- this.lastSearchTerm = this.search.val();
3185
-
3186
- this.clearSearch();
3187
- this.updateResults();
3188
-
3189
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
3190
-
3191
- if (this.opts.closeOnSelect) {
3192
- this.close();
3193
- this.search.width(10);
3194
- } else {
3195
- if (this.countSelectableResults()>0) {
3196
- this.search.width(10);
3197
- this.resizeSearch();
3198
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
3199
- // if we reached max selection size repaint the results so choices
3200
- // are replaced with the max selection reached message
3201
- this.updateResults(true);
3202
- } else {
3203
- // initializes search's value with nextSearchTerm and update search result
3204
- if (this.prefillNextSearchTerm()) {
3205
- this.updateResults();
3206
- }
3207
- }
3208
- this.positionDropdown();
3209
- } else {
3210
- // if nothing left to select close
3211
- this.close();
3212
- this.search.width(10);
3213
- }
3214
- }
3215
-
3216
- // since its not possible to select an element that has already been
3217
- // added we do not need to check if this is a new element before firing change
3218
- this.triggerChange({ added: data });
3219
-
3220
- if (!options || !options.noFocus)
3221
- this.focusSearch();
3222
- },
3223
-
3224
- // multi
3225
- cancel: function () {
3226
- this.close();
3227
- this.focusSearch();
3228
- },
3229
-
3230
- addSelectedChoice: function (data) {
3231
- var val = this.getVal(), self = this;
3232
- $(data).each(function () {
3233
- val.push(self.createChoice(this));
3234
- });
3235
- this.setVal(val);
3236
- },
3237
-
3238
- createChoice: function (data) {
3239
- var enableChoice = !data.locked,
3240
- enabledItem = $(
3241
- "<li class='select2-search-choice'>" +
3242
- " <div></div>" +
3243
- " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3244
- "</li>"),
3245
- disabledItem = $(
3246
- "<li class='select2-search-choice select2-locked'>" +
3247
- "<div></div>" +
3248
- "</li>");
3249
- var choice = enableChoice ? enabledItem : disabledItem,
3250
- id = this.id(data),
3251
- formatted,
3252
- cssClass;
3253
-
3254
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3255
- if (formatted != undefined) {
3256
- choice.find("div").replaceWith($("<div></div>").html(formatted));
3257
- }
3258
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3259
- if (cssClass != undefined) {
3260
- choice.addClass(cssClass);
3261
- }
3262
-
3263
- if(enableChoice){
3264
- choice.find(".select2-search-choice-close")
3265
- .on("mousedown", killEvent)
3266
- .on("click dblclick", this.bind(function (e) {
3267
- if (!this.isInterfaceEnabled()) return;
3268
-
3269
- this.unselect($(e.target));
3270
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3271
- killEvent(e);
3272
- this.close();
3273
- this.focusSearch();
3274
- })).on("focus", this.bind(function () {
3275
- if (!this.isInterfaceEnabled()) return;
3276
- this.container.addClass("select2-container-active");
3277
- this.dropdown.addClass("select2-drop-active");
3278
- }));
3279
- }
3280
-
3281
- choice.data("select2-data", data);
3282
- choice.insertBefore(this.searchContainer);
3283
-
3284
- return id;
3285
- },
3286
-
3287
- // multi
3288
- unselect: function (selected) {
3289
- var val = this.getVal(),
3290
- data,
3291
- index;
3292
- selected = selected.closest(".select2-search-choice");
3293
-
3294
- if (selected.length === 0) {
3295
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3296
- }
3297
-
3298
- data = selected.data("select2-data");
3299
-
3300
- if (!data) {
3301
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3302
- // and invoked on an element already removed
3303
- return;
3304
- }
3305
-
3306
- var evt = $.Event("select2-removing");
3307
- evt.val = this.id(data);
3308
- evt.choice = data;
3309
- this.opts.element.trigger(evt);
3310
-
3311
- if (evt.isDefaultPrevented()) {
3312
- return false;
3313
- }
3314
-
3315
- while((index = indexOf(this.id(data), val)) >= 0) {
3316
- val.splice(index, 1);
3317
- this.setVal(val);
3318
- if (this.select) this.postprocessResults();
3319
- }
3320
-
3321
- selected.remove();
3322
-
3323
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3324
- this.triggerChange({ removed: data });
3325
-
3326
- return true;
3327
- },
3328
-
3329
- // multi
3330
- postprocessResults: function (data, initial, noHighlightUpdate) {
3331
- var val = this.getVal(),
3332
- choices = this.results.find(".select2-result"),
3333
- compound = this.results.find(".select2-result-with-children"),
3334
- self = this;
3335
-
3336
- choices.each2(function (i, choice) {
3337
- var id = self.id(choice.data("select2-data"));
3338
- if (indexOf(id, val) >= 0) {
3339
- choice.addClass("select2-selected");
3340
- // mark all children of the selected parent as selected
3341
- choice.find(".select2-result-selectable").addClass("select2-selected");
3342
- }
3343
- });
3344
-
3345
- compound.each2(function(i, choice) {
3346
- // hide an optgroup if it doesn't have any selectable children
3347
- if (!choice.is('.select2-result-selectable')
3348
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3349
- choice.addClass("select2-selected");
3350
- }
3351
- });
3352
-
3353
- if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){
3354
- self.highlight(0);
3355
- }
3356
-
3357
- //If all results are chosen render formatNoMatches
3358
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3359
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3360
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3361
- this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3362
- }
3363
- }
3364
- }
3365
-
3366
- },
3367
-
3368
- // multi
3369
- getMaxSearchWidth: function() {
3370
- return this.selection.width() - getSideBorderPadding(this.search);
3371
- },
3372
-
3373
- // multi
3374
- resizeSearch: function () {
3375
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3376
- sideBorderPadding = getSideBorderPadding(this.search);
3377
-
3378
- minimumWidth = measureTextWidth(this.search) + 10;
3379
-
3380
- left = this.search.offset().left;
3381
-
3382
- maxWidth = this.selection.width();
3383
- containerLeft = this.selection.offset().left;
3384
-
3385
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3386
-
3387
- if (searchWidth < minimumWidth) {
3388
- searchWidth = maxWidth - sideBorderPadding;
3389
- }
3390
-
3391
- if (searchWidth < 40) {
3392
- searchWidth = maxWidth - sideBorderPadding;
3393
- }
3394
-
3395
- if (searchWidth <= 0) {
3396
- searchWidth = minimumWidth;
3397
- }
3398
-
3399
- this.search.width(Math.floor(searchWidth));
3400
- },
3401
-
3402
- // multi
3403
- getVal: function () {
3404
- var val;
3405
- if (this.select) {
3406
- val = this.select.val();
3407
- return val === null ? [] : val;
3408
- } else {
3409
- val = this.opts.element.val();
3410
- return splitVal(val, this.opts.separator, this.opts.transformVal);
3411
- }
3412
- },
3413
-
3414
- // multi
3415
- setVal: function (val) {
3416
- if (this.select) {
3417
- this.select.val(val);
3418
- } else {
3419
- var unique = [], valMap = {};
3420
- // filter out duplicates
3421
- $(val).each(function () {
3422
- if (!(this in valMap)) {
3423
- unique.push(this);
3424
- valMap[this] = 0;
3425
- }
3426
- });
3427
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3428
- }
3429
- },
3430
-
3431
- // multi
3432
- buildChangeDetails: function (old, current) {
3433
- var current = current.slice(0),
3434
- old = old.slice(0);
3435
-
3436
- // remove intersection from each array
3437
- for (var i = 0; i < current.length; i++) {
3438
- for (var j = 0; j < old.length; j++) {
3439
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3440
- current.splice(i, 1);
3441
- i--;
3442
- old.splice(j, 1);
3443
- break;
3444
- }
3445
- }
3446
- }
3447
-
3448
- return {added: current, removed: old};
3449
- },
3450
-
3451
-
3452
- // multi
3453
- val: function (val, triggerChange) {
3454
- var oldData, self=this;
3455
-
3456
- if (arguments.length === 0) {
3457
- return this.getVal();
3458
- }
3459
-
3460
- oldData=this.data();
3461
- if (!oldData.length) oldData=[];
3462
-
3463
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3464
- if (!val && val !== 0) {
3465
- this.opts.element.val("");
3466
- this.updateSelection([]);
3467
- this.clearSearch();
3468
- if (triggerChange) {
3469
- this.triggerChange({added: this.data(), removed: oldData});
3470
- }
3471
- return;
3472
- }
3473
-
3474
- // val is a list of ids
3475
- this.setVal(val);
3476
-
3477
- if (this.select) {
3478
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
3479
- if (triggerChange) {
3480
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3481
- }
3482
- } else {
3483
- if (this.opts.initSelection === undefined) {
3484
- throw new Error("val() cannot be called if initSelection() is not defined");
3485
- }
3486
-
3487
- this.opts.initSelection(this.opts.element, function(data){
3488
- var ids=$.map(data, self.id);
3489
- self.setVal(ids);
3490
- self.updateSelection(data);
3491
- self.clearSearch();
3492
- if (triggerChange) {
3493
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3494
- }
3495
- });
3496
- }
3497
- this.clearSearch();
3498
- },
3499
-
3500
- // multi
3501
- onSortStart: function() {
3502
- if (this.select) {
3503
- throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3504
- }
3505
-
3506
- // collapse search field into 0 width so its container can be collapsed as well
3507
- this.search.width(0);
3508
- // hide the container
3509
- this.searchContainer.hide();
3510
- },
3511
-
3512
- // multi
3513
- onSortEnd:function() {
3514
-
3515
- var val=[], self=this;
3516
-
3517
- // show search and move it to the end of the list
3518
- this.searchContainer.show();
3519
- // make sure the search container is the last item in the list
3520
- this.searchContainer.appendTo(this.searchContainer.parent());
3521
- // since we collapsed the width in dragStarted, we resize it here
3522
- this.resizeSearch();
3523
-
3524
- // update selection
3525
- this.selection.find(".select2-search-choice").each(function() {
3526
- val.push(self.opts.id($(this).data("select2-data")));
3527
- });
3528
- this.setVal(val);
3529
- this.triggerChange();
3530
- },
3531
-
3532
- // multi
3533
- data: function(values, triggerChange) {
3534
- var self=this, ids, old;
3535
- if (arguments.length === 0) {
3536
- return this.selection
3537
- .children(".select2-search-choice")
3538
- .map(function() { return $(this).data("select2-data"); })
3539
- .get();
3540
- } else {
3541
- old = this.data();
3542
- if (!values) { values = []; }
3543
- ids = $.map(values, function(e) { return self.opts.id(e); });
3544
- this.setVal(ids);
3545
- this.updateSelection(values);
3546
- this.clearSearch();
3547
- if (triggerChange) {
3548
- this.triggerChange(this.buildChangeDetails(old, this.data()));
3549
- }
3550
- }
3551
- }
3552
- });
3553
-
3554
- $.fn.select2 = function () {
3555
-
3556
- var args = Array.prototype.slice.call(arguments, 0),
3557
- opts,
3558
- select2,
3559
- method, value, multiple,
3560
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3561
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
3562
- propertyMethods = ["val", "data"],
3563
- methodsMap = { search: "externalSearch" };
3564
-
3565
- this.each(function () {
3566
- if (args.length === 0 || typeof(args[0]) === "object") {
3567
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
3568
- opts.element = $(this);
3569
-
3570
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
3571
- multiple = opts.element.prop("multiple");
3572
- } else {
3573
- multiple = opts.multiple || false;
3574
- if ("tags" in opts) {opts.multiple = multiple = true;}
3575
- }
3576
-
3577
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3578
- select2.init(opts);
3579
- } else if (typeof(args[0]) === "string") {
3580
-
3581
- if (indexOf(args[0], allowedMethods) < 0) {
3582
- throw "Unknown method: " + args[0];
3583
- }
3584
-
3585
- value = undefined;
3586
- select2 = $(this).data("select2");
3587
- if (select2 === undefined) return;
3588
-
3589
- method=args[0];
3590
-
3591
- if (method === "container") {
3592
- value = select2.container;
3593
- } else if (method === "dropdown") {
3594
- value = select2.dropdown;
3595
- } else {
3596
- if (methodsMap[method]) method = methodsMap[method];
3597
-
3598
- value = select2[method].apply(select2, args.slice(1));
3599
- }
3600
- if (indexOf(args[0], valueMethods) >= 0
3601
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3602
- return false; // abort the iteration, ready to return first matched value
3603
- }
3604
- } else {
3605
- throw "Invalid arguments to select2 plugin: " + args;
3606
- }
3607
- });
3608
- return (value === undefined) ? this : value;
3609
- };
3610
-
3611
- // plugin defaults, accessible to users
3612
- $.fn.select2.defaults = {
3613
- debug: false,
3614
- width: "copy",
3615
- loadMorePadding: 0,
3616
- closeOnSelect: true,
3617
- openOnEnter: true,
3618
- containerCss: {},
3619
- dropdownCss: {},
3620
- containerCssClass: "",
3621
- dropdownCssClass: "",
3622
- formatResult: function(result, container, query, escapeMarkup) {
3623
- var markup=[];
3624
- markMatch(this.text(result), query.term, markup, escapeMarkup);
3625
- return markup.join("");
3626
- },
3627
- transformVal: function(val) {
3628
- return $.trim(val);
3629
- },
3630
- formatSelection: function (data, container, escapeMarkup) {
3631
- return data ? escapeMarkup(this.text(data)) : undefined;
3632
- },
3633
- sortResults: function (results, container, query) {
3634
- return results;
3635
- },
3636
- formatResultCssClass: function(data) {return data.css;},
3637
- formatSelectionCssClass: function(data, container) {return undefined;},
3638
- minimumResultsForSearch: 0,
3639
- minimumInputLength: 0,
3640
- maximumInputLength: null,
3641
- maximumSelectionSize: 0,
3642
- id: function (e) { return e == undefined ? null : e.id; },
3643
- text: function (e) {
3644
- if (e && this.data && this.data.text) {
3645
- if ($.isFunction(this.data.text)) {
3646
- return this.data.text(e);
3647
- } else {
3648
- return e[this.data.text];
3649
- }
3650
- } else {
3651
- return e.text;
3652
- }
3653
- },
3654
- matcher: function(term, text) {
3655
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3656
- },
3657
- separator: ",",
3658
- tokenSeparators: [],
3659
- tokenizer: defaultTokenizer,
3660
- escapeMarkup: defaultEscapeMarkup,
3661
- blurOnChange: false,
3662
- selectOnBlur: false,
3663
- adaptContainerCssClass: function(c) { return c; },
3664
- adaptDropdownCssClass: function(c) { return null; },
3665
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3666
- searchInputPlaceholder: '',
3667
- createSearchChoicePosition: 'top',
3668
- shouldFocusInput: function (instance) {
3669
- // Attempt to detect touch devices
3670
- var supportsTouchEvents = (('ontouchstart' in window) ||
3671
- (navigator.msMaxTouchPoints > 0));
3672
-
3673
- // Only devices which support touch events should be special cased
3674
- if (!supportsTouchEvents) {
3675
- return true;
3676
- }
3677
-
3678
- // Never focus the input if search is disabled
3679
- if (instance.opts.minimumResultsForSearch < 0) {
3680
- return false;
3681
- }
3682
-
3683
- return true;
3684
- }
3685
- };
3686
-
3687
- $.fn.select2.locales = [];
3688
-
3689
- $.fn.select2.locales['en'] = {
3690
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
3691
- formatNoMatches: function () { return "No matches found"; },
3692
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3693
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3694
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3695
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3696
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3697
- formatSearching: function () { return "Searching…"; }
3698
- };
3699
-
3700
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3701
-
3702
- $.fn.select2.ajaxDefaults = {
3703
- transport: $.ajax,
3704
- params: {
3705
- type: "GET",
3706
- cache: false,
3707
- dataType: "json"
3708
- }
3709
- };
3710
-
3711
- // exports
3712
- window.Select2 = {
3713
- query: {
3714
- ajax: ajax,
3715
- local: local,
3716
- tags: tags
3717
- }, util: {
3718
- debounce: debounce,
3719
- markMatch: markMatch,
3720
- escapeMarkup: defaultEscapeMarkup,
3721
- stripDiacritics: stripDiacritics
3722
- }, "class": {
3723
- "abstract": AbstractSelect2,
3724
- "single": SingleSelect2,
3725
- "multi": MultiSelect2
3726
- }
3727
- };
3728
-
3729
- }(jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/select2/select2.min.js DELETED
@@ -1,23 +0,0 @@
1
- /*
2
- Copyright 2014 Igor Vaynberg
3
-
4
- Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
17
- or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18
- either express or implied. See the Apache License and the GPL License for the specific language governing
19
- permissions and limitations under the Apache License and the GPL License.
20
- */
21
- !function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo(document.body);var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(a,b,c){var d,e,f;if(null===a||a.length<1)return[];for(d=a.split(b),e=0,f=d.length;f>e;e+=1)d[e]=c(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=h;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!g){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);g=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),g.attr("class","select2-sizer"),a(document.body).append(g)}return g.text(b.val()),g.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?void c.push(d(a)):(c.push(d(a.substring(0,e))),c.push("<span class='select2-match'>"),c.push(d(a.substring(e,e+f))),c.push("</span>"),void c.push(d(a.substring(e+f,a.length))))}function F(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?void b.callback(c()):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),void b.callback(e))}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,i,j,h={x:0,y:0},k={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case k.LEFT:case k.RIGHT:case k.UP:case k.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case k.SHIFT:case k.CTRL:case k.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="<div class='select2-measure-scrollbar'></div>",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};i=a(document),f=function(){var a=1;return function(){return a++}}(),c=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,g=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a(".select2-hidden-accessible"),0==this.liveRegion.length&&(this.liveRegion=a("<span>",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body)),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+f()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a(document.body),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(g),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",g,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",g,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",g,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",g,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(a){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",g,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",g,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.lastSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),j=j||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&d._sync&&a.each(function(){d._sync&&this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeData("select2").off(".select2"),a.is("input[type='hidden']")?a.css("display",""):(a.show().prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show())),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,g,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a <select> element.")}),c.debug=c.debug||a.fn.select2.defaults.debug,c.debug&&console&&console.warn&&(null!=c.id&&console.warn("Select2: The `id` option has been removed in Select2 4.0.0, consider renaming your `id` property or mapping the property before your data makes it to Select2. You can read more at https://select2.github.io/announcements-4.0.html#changed-id"),null!=c.text&&console.warn("Select2: The `text` option has been removed in Select2 4.0.0, consider renaming your `text` property or mapping the property before your data makes it to Select2. You can read more at https://select2.github.io/announcements-4.0.html#changed-id"),null!=c.sortResults&&console.warn("Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. "),null!=c.selectOnBlur&&console.warn("Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0."),null!=c.ajax&&null!=c.ajax.results&&console.warn("Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0."),null!=c.formatNoResults&&console.warn("Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0."),null!=c.formatSearching&&console.warn("Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0."),null!=c.formatInputTooShort&&console.warn("Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0."),null!=c.formatInputTooLong&&console.warn("Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0."),null!=c.formatLoading&&console.warn("Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0."),null!=c.formatSelectionTooBig&&console.warn("Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0."),c.element.data("select2Tags")&&console.warn("Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.")),null!=c.element.data("tags")){var j=c.element.data("tags");a.isArray(j)||(j=[]),c.element.data("select2Tags",j)}if(null!=c.sorter&&(c.sortResults=c.sorter),null!=c.selectOnClose&&(c.selectOnBlur=c.selectOnClose),null!=c.ajax&&a.isFunction(c.ajax.processResults)&&(c.ajax.results=c.ajax.processResults),null!=c.language){var k=c.language;a.isFunction(k.noMatches)&&(c.formatNoMatches=k.noMatches),a.isFunction(k.searching)&&(c.formatSearching=k.searching),a.isFunction(k.inputTooShort)&&(c.formatInputTooShort=k.inputTooShort),a.isFunction(k.inputTooLong)&&(c.formatInputTooLong=k.inputTooLong),a.isFunction(k.loadingMore)&&(c.formatLoading=k.loadingMore),a.isFunction(k.maximumSelected)&&(c.formatSelectionTooBig=k.maximumSelected)}if(c=a.extend({},{populateResults:function(d,e,g){var h,j=this.opts.id,k=this.liveRegion;(h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,g);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("<li></li>"),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+f()),t.attr("role","option"),v=c.formatResult(o,t,g,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("<ul></ul>"),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))})(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(g=c.id,c.id=function(a){return a[g]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator,c.transformVal)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(a){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),this.container&&(D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element))),this.dropdown&&(D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element)))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var v,w,x,y,z,b=this.dropdown,c=this.container,d=c.offset(),e=c.outerHeight(!1),f=c.outerWidth(!1),g=b.outerHeight(!1),h=a(window),i=h.width(),k=h.height(),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,p=m>=n+g,q=d.top-g>=h.scrollTop(),r=b.outerWidth(!1),s=function(){return l>=o+r},t=function(){return d.left+l+c.outerWidth(!1)>r},u=b.hasClass("select2-drop-above");u?(w=!0,!q&&p&&(x=!0,w=!1)):(w=!1,!p&&q&&(x=!0,w=!0)),x&&(b.hide(),d=this.container.offset(),e=this.container.outerHeight(!1),f=this.container.outerWidth(!1),g=b.outerHeight(!1),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,r=b.outerWidth(!1),b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(z=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),r=b.outerWidth(!1)+(z.scrollHeight===z.clientHeight?0:j.width),r>f?f=r:r=f,g=b.outerHeight(!1)):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(v=this.body.offset(),n-=v.top,o-=v.left),!s()&&t()&&(o=d.left+this.container.outerWidth(!1)-r),y={left:o,width:f},w?(this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above"),g=b.outerHeight(!1),y.top=d.top-g,y.bottom="auto"):(y.top=n,y.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),y=a.extend(y,K(this.opts.dropdownCss,this.opts.element)),b.css(y)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),
22
- this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),i.on("mousemove.select2Event",function(a){h.x=a.pageX,h.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0===f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(a){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),i.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.search.removeAttr("aria-activedescendant"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},prefillNextSearchTerm:function(){if(""!==this.search.val())return!1;var a=this.opts.nextSearchTerm(this.data(),this.lastSearchTerm);return a!==b?(this.search.val(a),this.search.select(),!0):!1},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return void b.scrollTop(0);c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!1),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d<c.length;){d+=b;var e=a(c[d]);if(e.hasClass("select2-result-selectable")&&!e.hasClass("select2-disabled")&&!e.hasClass("select2-selected")){this.highlight(d);break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),void(e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e})))},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).html(e.opts.escapeMarkup(K(e.opts.formatLoadMore,e.opts.element,d+1))),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find('.select2-result-selectable:not(".select2-selected")').length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return void n("<li class='select2-selection-limit'>"+K(f.formatSelectionTooBig,f.element,o)+"</li>");if(d.val().length<f.minimumInputLength)return n(J(f.formatInputTooShort,"formatInputTooShort")?"<li class='select2-no-results'>"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+"</li>":""),void(c&&this.showSearch&&this.showSearch(!0));if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return void n(J(f.formatInputTooLong,"formatInputTooLong")?"<li class='select2-no-results'>"+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+"</li>":"");f.formatSearching&&0===this.findHighlightableChoices().length&&n("<li class='select2-searching'>"+K(f.formatSearching,f.element)+"</li>"),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return void this.search.removeClass("select2-active");if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return void n("<li class='select2-ajax-error'>"+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+"</li>");if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("<li class='select2-no-results'>"+K(f.formatNoMatches,f.element,d.val())+"</li>"),void(this.showSearch&&this.showSearch(d.val()));e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("<li class='select2-more-results'>"+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+"</li>"),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return void this.clearTouchMoved();var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function b(){var b,c,d,e,f,g;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(b=this.opts.element.attr("style"),"string"==typeof b)for(c=b.split(";"),e=0,f=c.length;f>e;e+=1)if(g=c[e].replace(/\s/g,""),d=g.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==d&&d.length>=1)return d[1];return"resolve"===this.opts.width?(b=this.opts.element.css("width"),b.indexOf("%")>0?b:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var c=b.call(this);null!==c&&this.container.css("width",c)}}),d=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>"," <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>"," <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>","</a>","<label for='' class='select2-offscreen'></label>","<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />","<div class='select2-drop select2-display-none'>"," <div class='select2-search'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'"," aria-autocomplete='list' />"," </div>"," <ul class='select2-results' role='listbox'>"," </ul>","</div>"].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var b,c,d;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),b=this.search.get(0),b.createTextRange?(c=b.createTextRange(),c.collapse(!1),c.select()):b.setSelectionRange&&(d=this.search.val().length,b.setSelectionRange(d,d))),this.prefillNextSearchTerm(),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,g,c=this.container,d=this.dropdown,e=f();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=c.find(".select2-choice"),this.focusser=c.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+e),this.focusser.attr("aria-labelledby","select2-chosen-"+e),this.results.attr("id","select2-results-"+e),this.search.attr("aria-owns","select2-results-"+e),this.focusser.attr("id","s2id_autogen"+e),g=a("label[for='"+this.opts.element.attr("id")+"']"),this.opts.element.on("focus.select2",this.bind(function(){this.focus()})),this.focusser.prev().text(g.text()).attr("for",this.focusser.attr("id"));var h=this.opts.element.attr("title");this.opts.element.attr("title",h||g.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)return void A(a);switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),void A(a);case k.ENTER:return this.selectHighlighted(),void A(a);case k.TAB:return void this.selectHighlighted({noFocus:!0});case k.ESC:return this.cancel(a),void A(a)}}})),this.search.on("blur",this.bind(function(a){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.results&&this.results.length>1&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.ESC){if(this.opts.openOnEnter===!1&&a.which===k.ENTER)return void A(a);if(a.which==k.DOWN||a.which==k.UP||a.which==k.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),void A(a)}return a.which==k.DELETE||a.which==k.BACKSPACE?(this.opts.allowClear&&this.clear(),void A(a)):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection&&this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),d.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.hide(),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.lastSearchTerm=c.search.val())})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1],this.opts.debug&&console&&console.warn&&console.warn('Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. The `change` event will always be triggered in 4.0.0.')),this.select)this.opts.debug&&console&&console.warn&&console.warn('Select2: Setting the value on a <select> using `select2("val")` is no longer supported in 4.0.0. You can use the `.val(newValue).trigger("change")` method provided by jQuery instead.'),this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return void this.clear(c);if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(this.opts.debug&&console&&console.warn&&console.warn('Select2: The `select2("data")` method can no longer set selected values in 4.0.0, consider using the `.val()` method instead.'),arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),e=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["<ul class='select2-choices'>"," <li class='select2-search-field'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>"," </li>","</ul>","<div class='select2-drop select2-drop-multi select2-display-none'>"," <ul class='select2-results'>"," </ul>","</div>"].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator,b.transformVal),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c<e.length;c++)for(var g=e[c],h=0;h<f.length;h++){var i=f[h];if(r(g,b.id(i))){a.push(i),f.splice(h,1);break}}d(a)}:a.noop})}),b},selectChoice:function(a){var b=this.container.find(".select2-search-choice-focus");b.length&&a&&a[0]==b[0]||(b.length&&this.opts.element.trigger("choice-deselected",b),b.removeClass("select2-search-choice-focus"),a&&a.length&&(this.close(),a.addClass("select2-search-choice-focus"),this.opts.element.trigger("choice-selected",a)))},destroy:function(){a("label[for='"+this.search.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"searchContainer","selection")},initContainer:function(){var c,b=".select2-choices";this.searchContainer=this.container.find(".select2-search-field"),this.selection=c=this.container.find(b);var d=this;this.selection.on("click",".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)",function(b){d.search[0].focus(),d.selectChoice(a(this))}),this.search.attr("id","s2id_autogen"+f()),this.search.prev().text(a("label[for='"+this.opts.element.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.opts.element.on("focus.select2",this.bind(function(){this.focus()})),this.search.on("input paste",this.bind(function(){this.search.attr("placeholder")&&0==this.search.val().length||this.isInterfaceEnabled()&&(this.opened()||this.open())})),this.search.attr("tabindex",this.elementTabIndex),this.keydowns=0,this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){++this.keydowns;var b=c.find(".select2-search-choice-focus"),d=b.prev(".select2-search-choice:not(.select2-locked)"),e=b.next(".select2-search-choice:not(.select2-locked)"),f=z(this.search);if(b.length&&(a.which==k.LEFT||a.which==k.RIGHT||a.which==k.BACKSPACE||a.which==k.DELETE||a.which==k.ENTER)){var g=b;return a.which==k.LEFT&&d.length?g=d:a.which==k.RIGHT?g=e.length?e:null:a.which===k.BACKSPACE?this.unselect(b.first())&&(this.search.width(10),g=d.length?d:e):a.which==k.DELETE?this.unselect(b.first())&&(this.search.width(10),g=e.length?e:null):a.which==k.ENTER&&(g=null),this.selectChoice(g),A(a),void(g&&g.length||this.open())}if((a.which===k.BACKSPACE&&1==this.keydowns||a.which==k.LEFT)&&0==f.offset&&!f.length)return this.selectChoice(c.find(".select2-search-choice:not(.select2-locked)").last()),void A(a);if(this.selectChoice(null),this.opened())switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),void A(a);case k.ENTER:return this.selectHighlighted(),void A(a);case k.TAB:return this.selectHighlighted({noFocus:!0}),void this.close();case k.ESC:return this.cancel(a),void A(a)}if(a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.BACKSPACE&&a.which!==k.ESC){if(a.which===k.ENTER){if(this.opts.openOnEnter===!1)return;if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return}this.open(),(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)&&A(a),a.which===k.ENTER&&A(a)}}})),this.search.on("keyup",this.bind(function(a){this.keydowns=0,this.resizeSearch()})),this.search.on("blur",this.bind(function(b){this.container.removeClass("select2-container-active"),this.search.removeClass("select2-focused"),this.selectChoice(null),this.opened()||this.clearSearch(),b.stopImmediatePropagation(),this.opts.element.trigger(a.Event("select2-blur"))})),this.container.on("click",b,this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").length>0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.hide(),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),this.prefillNextSearchTerm(),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c={},d=[],e=this;a(b).each(function(){e.id(this)in c||(c[e.id(this)]=0,d.push(this))}),this.selection.find(".select2-search-choice").remove(),this.addSelectedChoice(d),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,b){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.prefillNextSearchTerm()&&this.updateResults(),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),b&&b.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(b){var c=this.getVal(),d=this;a(b).each(function(){c.push(d.createChoice(this))}),this.setVal(c)},createChoice:function(c){var i,j,d=!c.locked,e=a("<li class='select2-search-choice'> <div></div> <a href='#' class='select2-search-choice-close' tabindex='-1'></a></li>"),f=a("<li class='select2-search-choice select2-locked'><div></div></li>"),g=d?e:f,h=this.id(c);return i=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),i!=b&&g.find("div").replaceWith(a("<div></div>").html(i)),j=this.opts.formatSelectionCssClass(c,g.find("div")),j!=b&&g.addClass(j),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),h},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&this.opts.closeOnSelect===!0&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("<li class='select2-no-results'>"+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"</li>")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator,this.opts.transformVal))},setVal:function(b){if(this.select)this.select.val(b);else{var c=[],d={};a(b).each(function(){this in d||(c.push(this),d[this]=0)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator))}},buildChangeDetails:function(a,b){
23
- for(var b=b.slice(0),a=a.slice(0),c=0;c<b.length;c++)for(var d=0;d<a.length;d++)if(r(this.opts.id(b[c]),this.opts.id(a[d]))){b.splice(c,1),c--,a.splice(d,1);break}return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),void(d&&this.triggerChange({added:this.data(),removed:e}));if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={debug:!1,width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(this.text(a),c.term,e,d),e.join("")},transformVal:function(b){return a.trim(b)},formatSelection:function(a,c,d){return a?d(this.text(a)):b},sortResults:function(a,b,c){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(a,c){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},text:function(b){return b&&this.data&&this.data.text?a.isFunction(this.data.text)?this.data.text(b):b[this.data.text]:b.text},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(a){return null},nextSearchTerm:function(a,c){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b&&a.opts.minimumResultsForSearch<0?!1:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(a,b,c){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(a){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":c,single:d,multi:e}}}}(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/select2/select2.png DELETED
Binary file
vendor/select2/select2x2.png DELETED
Binary file