Shortlinks by Pretty Links – Best WordPress Link Tracking Plugin - Version 3.0.0

Version Description

  • Re-designed Admin UI especially the Admin Links UI including links listing, adding new links and editing links
  • Added an Insert Pretty Link button for Gutenberg Paragraph Blocks
  • Security fixes and hardening
  • Fixed Slug is not Available Error
  • Removed Pretty Links Groups (lite users will still be able to access legacy groups on the links listing page but pro users & lite users who upgrade to pro will have their groups migrated to become link categories)
  • PRO ONLY: Added Pretty Link Categories
  • PRO ONLY: Added Pretty Link Tags
  • PRO ONLY: Fixed some issues with Pretty Link Imports and Exports
  • Many other small fixes and enhancements
Download this release

Release Info

Developer supercleanse
Plugin Icon 128x128 Shortlinks by Pretty Links – Best WordPress Link Tracking Plugin
Version 3.0.0
Comparing to
See all releases

Code changes from version 2.1.10 to 3.0.0

Files changed (105) hide show
  1. LICENSE +339 -0
  2. app/controllers/PrliAppController.php +400 -112
  3. app/controllers/PrliClicksController.php +21 -34
  4. app/controllers/PrliGroupsController.php +0 -253
  5. app/controllers/PrliLinksController.php +560 -374
  6. app/controllers/PrliLocalApiController.php +18 -18
  7. app/controllers/PrliOnboardingController.php +61 -0
  8. app/controllers/PrliOptionsController.php +5 -5
  9. app/controllers/PrliPopupController.php +27 -30
  10. app/controllers/PrliPostsController.php +56 -13
  11. app/controllers/PrliReportsController.php +1 -1
  12. app/controllers/PrliToolsController.php +9 -4
  13. app/controllers/PrliUpdateController.php +6 -7
  14. app/helpers/PrliAppHelper.php +11 -21
  15. app/helpers/PrliClicksHelper.php +1 -1
  16. app/helpers/PrliLinksHelper.php +130 -71
  17. app/models/PrliClick.php +12 -15
  18. app/models/PrliDb.php +27 -30
  19. app/models/PrliGroup.php +13 -18
  20. app/models/PrliLink.php +411 -316
  21. app/models/PrliOptions.php +5 -5
  22. app/models/PrliUtils.php +154 -237
  23. app/views/admin/errors.php +2 -2
  24. app/views/admin/onboarding/update.php +148 -0
  25. app/views/admin/onboarding/welcome.php +120 -0
  26. app/views/admin/popups/rating.php +37 -11
  27. app/views/admin/popups/upgrade.php +13 -15
  28. app/views/admin/update/activation_warning.php +55 -9
  29. app/views/admin/update/addon_popup.php +19 -10
  30. app/views/admin/update/addons.php +11 -11
  31. app/views/admin/update/edge_updates.php +2 -2
  32. app/views/admin/update/license.php +59 -29
  33. app/views/admin/update/ui.php +3 -3
  34. app/views/clicks/csv_download.php +5 -5
  35. app/views/clicks/list.php +47 -49
  36. app/views/groups/edit.php +35 -17
  37. app/views/groups/list.php +33 -21
  38. app/views/groups/new.php +30 -17
  39. app/views/links/edit.php +0 -19
  40. app/views/links/form.php +37 -233
  41. app/views/links/form_advanced.php +92 -0
  42. app/views/links/form_basic.php +70 -0
  43. app/views/links/form_pro.php +104 -0
  44. app/views/links/list.php +0 -163
  45. app/views/links/new.php +0 -18
  46. app/views/options/form.php +856 -51
  47. app/views/shared/errors.php +1 -1
  48. app/views/shared/jsredirect.php +0 -7
  49. app/views/shared/link-table-nav.php +20 -21
  50. app/views/shared/nav.php +5 -5
  51. app/views/shared/public_link.php +21 -30
  52. app/views/shared/table-nav.php +17 -14
  53. app/views/shared/tinymce_form_popup.php +41 -70
  54. app/views/shared/title_text.php +1 -2
  55. app/views/tools/form.php +49 -27
  56. app/views/widgets/widget.php +17 -18
  57. css/admin_shared.css +187 -2
  58. css/cloaked-redirect.css +16 -0
  59. css/menu-styles.css +2 -2
  60. css/prli-admin-links.css +115 -26
  61. css/settings_table.css +45 -1
  62. i18n/pretty-link.pot +2972 -2579
  63. images/dark_add_twitter_account.png +0 -0
  64. images/pbar_grad.png +0 -0
  65. images/pl-logo-horiz-RGB.png +0 -0
  66. images/pretty-links-logo-color-white.svg +76 -0
  67. images/pretty-links-plugin-header.jpg +0 -0
  68. images/twitter.png +0 -0
  69. images/update-3-0.png +0 -0
  70. images/update-all-new-link-listing.png +0 -0
  71. images/update-categories-tags.png +0 -0
  72. images/update-gutenberg-editor.png +0 -0
  73. images/update-new-link-editor-1.png +0 -0
  74. images/update-new-link-editor-2.png +0 -0
  75. images/welcome-add-new.png +0 -0
  76. images/welcome-advanced-redirects.png +0 -0
  77. images/welcome-categories.png +0 -0
  78. images/welcome-click-update.png +0 -0
  79. images/welcome-copy-url.png +0 -0
  80. images/welcome-customize-slug.png +0 -0
  81. images/welcome-desk.png +0 -0
  82. images/welcome-dynamic-redirects.png +0 -0
  83. images/welcome-enter-url.png +0 -0
  84. images/welcome-import-export.png +0 -0
  85. images/welcome-link.png +0 -0
  86. js/admin_link_form.js +65 -0
  87. js/admin_popup.js +25 -1
  88. js/admin_shared.js +16 -0
  89. js/editor.deps.json +1 -0
  90. js/editor.js +12 -0
  91. js/editor.js.map +1 -0
  92. js/editor/components/index.js +1 -0
  93. js/editor/components/link-editor/index.js +409 -0
  94. js/editor/components/link-editor/style.scss +8 -0
  95. js/editor/components/link-editor/utils.js +110 -0
  96. js/editor/components/url-input/index.js +316 -0
  97. js/editor/formats/pretty-link/index.js +118 -0
  98. js/prli-admin-links.js +18 -125
  99. js/quick_create.js +44 -0
  100. js/tinymce_form_popup.js +14 -14
  101. js/vendor/jquery.form-validator.min.js +10 -0
  102. pretty-link.php +5 -5
  103. readme.txt +13 -3
  104. vendor/lib/bootstrap/bootstrap-theme.min.css +5 -0
  105. vendor/lib/bootstrap/bootstrap.min.css +5 -0
LICENSE ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
app/controllers/PrliAppController.php CHANGED
@@ -1,16 +1,37 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  class PrliAppController extends PrliBaseController {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  public function load_hooks() {
5
  global $prli_options;
6
 
7
- add_action('init', array($this, 'parse_standalone_request'));
8
  add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
9
  add_action('admin_menu', array($this, 'menu'), 3); //Hooking in earlier - there's a plugin out there somewhere breaking this action for later plugins
10
 
 
 
 
 
11
  //Where the magic happens when not in wp-admin nor !GET request
12
  if($_SERVER["REQUEST_METHOD"] == 'GET' && !is_admin()) {
13
- add_action('plugins_loaded', array($this, 'redirect'), 1); // Redirect
14
  }
15
 
16
  // Hook into the 'wp_dashboard_setup' action to register our other functions
@@ -23,88 +44,218 @@ class PrliAppController extends PrliBaseController {
23
  add_action('init', array($this, 'install'));
24
 
25
  add_filter( 'plugin_action_links_' . PRLI_PLUGIN_SLUG, array($this,'add_plugin_action_links') );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
27
 
28
  public function menu() {
29
  global $prli_options, $plp_options, $plp_update;
30
 
 
 
31
  $role = 'manage_options';
32
- if(isset($plp_options->min_role))
33
  $role = $plp_options->min_role;
 
34
 
35
- $prli_menu_hook = add_menu_page(
36
- __('Pretty Links | Manage Pretty Links', 'pretty-link'),
37
- __('Pretty Links', 'pretty-link'),
38
- $role, 'pretty-link',
39
- 'PrliLinksController::route',
40
- PRLI_IMAGES_URL.'/pretty-link-small.png'
41
- );
42
-
43
- $prli_menu_hook = add_submenu_page(
44
- 'pretty-link',
45
- __('Pretty Links | Manage Pretty Links', 'pretty-link'),
46
- __('Pretty Links', 'pretty-link'),
47
- $role, 'pretty-link',
48
- 'PrliLinksController::route'
49
- );
50
-
51
- $prli_add_links_menu_hook = add_submenu_page(
52
- 'pretty-link',
53
- __('Pretty Links | Add New Link', 'pretty-link'),
54
- __('Add New Link', 'pretty-link'),
55
- $role, 'add-new-pretty-link',
56
- 'PrliLinksController::new_link'
57
- );
58
 
59
- $groups_ctrl = new PrliGroupsController();
60
- add_submenu_page(
61
- 'pretty-link',
62
- __('Pretty Links | Groups', 'pretty-link'),
63
- __('Groups', 'pretty-link'),
64
- $role, 'pretty-link-groups',
65
- array( $groups_ctrl, 'route' )
66
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking != 'count' ) {
69
  $clicks_ctrl = new PrliClicksController();
70
- add_submenu_page(
71
- 'pretty-link',
72
- __('Pretty Links | Clicks', 'pretty-link'),
73
- __('Clicks', 'pretty-link'),
74
- $role, 'pretty-link-clicks',
75
- array( $clicks_ctrl, 'route' )
76
- );
77
  }
78
 
79
  $routes_ctrl = new PrliToolsController();
80
- add_submenu_page(
81
- 'pretty-link',
82
- __('Pretty Links | Tools', 'pretty-link'),
83
- __('Tools', 'pretty-link'),
84
- $role, 'pretty-link-tools',
85
- array($routes_ctrl,'route')
86
- );
87
 
88
  $options_ctrl = new PrliOptionsController();
89
- add_submenu_page(
90
- 'pretty-link',
91
- __('Pretty Links | Options', 'pretty-link'),
92
- __('Options', 'pretty-link'),
93
- $role, 'pretty-link-options',
94
- array( $options_ctrl, 'route' )
95
- );
96
 
97
  if(!defined('PRETTYLINK_LICENSE_KEY') && class_exists('PrliUpdateController')) {
98
  if($plp_update->is_installed_and_activated()) {
99
- add_submenu_page( 'pretty-link', __('Activate Pro', 'pretty-link'), __('Activate Pro', 'pretty-link'), $role, 'pretty-link-updates', array($plp_update, 'route'));
100
  }
101
  else if($plp_update->is_installed()) {
102
- add_submenu_page( 'pretty-link', __('Activate Pro', 'pretty-link'), '<span class="prli-menu-red"><b>'.__('Activate Pro', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
104
  else {
105
- add_submenu_page( 'pretty-link', __('Upgrade to Pro', 'pretty-link'), '<span class="prli-menu-red"><b>'.__('Upgrade to Pro', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
106
  }
107
  }
 
 
 
 
 
 
108
  }
109
 
110
  public function add_plugin_action_links($links) {
@@ -113,32 +264,43 @@ class PrliAppController extends PrliBaseController {
113
  $pllinks = array();
114
 
115
  if($plp_update->is_installed_and_activated()) {
116
- $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/activated/docs" target="_blank">'.__('Docs', 'pretty-link').'</a>';
117
- $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'">'.__('Activate', 'pretty-link').'</a>';
118
  }
119
  else if($plp_update->is_installed()) {
120
- $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.__('Activate Pro License', 'pretty-link').'</a>';
121
- $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/buy" target="_blank" class="prli-menu-red">'.__('Buy', 'pretty-link').'</a>';
122
- $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/docs" target="_blank">'.__('Docs', 'pretty-link').'</a>';
123
  }
124
  else {
125
- $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/upgrade" class="prli-menu-red" target="_blank">'.__('Upgrade to Pro', 'pretty-link').'</a>';
126
- $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.__('Activate Pro License', 'pretty-link').'</a>';
127
- $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/docs" target="_blank">'.__('Docs', 'pretty-link').'</a>';
128
  }
129
 
130
  return array_merge($pllinks, $links);
131
  }
132
 
133
  public function enqueue_admin_scripts($hook) {
134
- global $wp_version;
135
 
136
- wp_enqueue_style( 'prli-fontello-animation',
137
- PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css',
138
- array(), PRLI_VERSION );
139
  wp_enqueue_style( 'prli-fontello-pretty-link',
140
  PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css',
141
- array('prli-fontello-animation'), PRLI_VERSION );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
  // If we're in 3.8 now then use a font for the admin image
144
  if( version_compare( $wp_version, '3.8', '>=' ) ) {
@@ -146,23 +308,34 @@ class PrliAppController extends PrliBaseController {
146
  array('prli-fontello-pretty-link'), PRLI_VERSION );
147
  }
148
 
149
- $wp_scripts = new WP_Scripts();
150
- $ui = $wp_scripts->query('jquery-ui-core');
151
- $url = "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.css";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
- if(strstr($hook, 'pretty-link') !== false) {
154
- wp_register_style('pl-ui-smoothness', $url);
155
- wp_register_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
156
- wp_register_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
157
  wp_enqueue_style(
158
  'prli-admin-shared',
159
  PRLI_CSS_URL.'/admin_shared.css',
160
- array(
161
- 'pl-ui-smoothness',
162
- 'wp-pointer',
163
- 'prli-simplegrid',
164
- 'prli-social',
165
- ),
166
  PRLI_VERSION
167
  );
168
 
@@ -191,9 +364,25 @@ class PrliAppController extends PrliBaseController {
191
  ),
192
  PRLI_VERSION
193
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  }
195
 
196
- if( in_array( $hook, array( 'toplevel_page_pretty-link', 'pretty-links_page_add-new-pretty-link' ) ) ) {
197
  wp_enqueue_style( 'prli-admin-links', PRLI_CSS_URL . '/prli-admin-links.css', array(), PRLI_VERSION );
198
  //wp_enqueue_script( 'jquery-clippy', PRLI_JS_URL . '/jquery.clippy.js', array('jquery'), PRLI_VERSION );
199
  wp_enqueue_script( 'clipboard-js', PRLI_JS_URL . '/clipboard.min.js', null, PRLI_VERSION );
@@ -204,37 +393,35 @@ class PrliAppController extends PrliBaseController {
204
  wp_enqueue_script( 'prli-admin-links', PRLI_JS_URL . '/prli-admin-links.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
205
 
206
  wp_enqueue_script( 'prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
207
- //wp_localize_script( 'prli-admin-link-list', 'PrliLink', array('clippy_url' => PRLI_JS_URL.'/clippy.swf') );
208
- }
209
-
210
- if( $hook === 'pretty-links_page_pretty-link-groups' ) {
211
- wp_enqueue_style('pl-groups', PRLI_CSS_URL.'/admin_groups.css', null, PRLI_VERSION);
212
- wp_enqueue_script('pl-groups', PRLI_JS_URL.'/admin_groups.js', array('jquery'), PRLI_VERSION);
213
  }
214
 
215
- if( $hook === 'pretty-links_page_pretty-link-options' ) {
216
  wp_enqueue_style('pl-options', PRLI_CSS_URL.'/admin_options.css', null, PRLI_VERSION);
217
  wp_enqueue_script('pl-options', PRLI_JS_URL.'/admin_options.js', array('jquery'), PRLI_VERSION);
218
  }
219
 
220
- if(in_array($hook, array(
221
- 'toplevel_page_pretty-link',
222
- 'pretty-links_page_add-new-pretty-link',
223
- 'pretty-links_page_pretty-link-tools',
224
- 'pretty-links_page_pretty-link-options'
225
- ))) {
226
  wp_enqueue_style('pl-settings-table', PRLI_CSS_URL.'/settings_table.css', null, PRLI_VERSION);
227
  wp_enqueue_script('pl-settings-table', PRLI_JS_URL.'/settings_table.js', array('jquery'), PRLI_VERSION);
228
  }
229
 
230
- if( $hook === 'pretty-links_page_pretty-link-clicks' ) {
231
  wp_enqueue_script('google-visualization-api', 'https://www.gstatic.com/charts/loader.js', null, PRLI_VERSION);
232
  wp_enqueue_style('pl-reports', PRLI_CSS_URL.'/admin_reports.css', null, PRLI_VERSION);
233
  wp_enqueue_script('pl-reports', PRLI_JS_URL.'/admin_reports.js', array('jquery','google-visualization-api'), PRLI_VERSION);
234
  wp_localize_script('pl-reports', 'PrliReport', PrliReportsController::chart_data());
235
  }
236
 
237
- do_action('prli_load_admin_scripts', $hook);
 
 
238
  }
239
 
240
  public function parse_standalone_request() {
@@ -259,16 +446,22 @@ class PrliAppController extends PrliBaseController {
259
  $prli_db = new PrliDb();
260
 
261
  if($prli_db->should_install()) {
 
 
 
 
 
 
 
 
 
 
 
262
  @ignore_user_abort(true);
263
  @set_time_limit(0);
264
  $prli_db->prli_install();
265
- }
266
 
267
- // Install Pro DB maybe
268
- if($plp_update->is_installed() && $prli_utils->should_install_pro_db()) {
269
- @ignore_user_abort(true);
270
- @set_time_limit(0);
271
- $prli_utils->install_pro_db();
272
  }
273
  }
274
 
@@ -281,14 +474,28 @@ class PrliAppController extends PrliBaseController {
281
  $reinstall_url = wp_nonce_url('update.php?action=upgrade-plugin&plugin=pretty-link/pretty-link.php', 'upgrade-plugin_pretty-link/pretty-link.php');
282
  ?>
283
 
284
- <div class="updated notice notice-success"><p><strong><?php printf(__('You\'re almost done!<br/>%1$sFinish your Re-Install of Pretty Links Pro%2$s', 'pretty-link'), '<a href="'.$reinstall_url.'">', '</a>'); ?></strong></p></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  <?php
286
  }
287
 
288
  if(isset($_GET['action']) and $_GET['action'] == 'pro-uninstall') {
289
  $prli_utils->uninstall_pro();
290
  ?>
291
- <div class="updated notice notice-success is-dismissible"><p><strong><?php _e('Pretty Links Pro Successfully Uninstalled.' , 'pretty-link'); ?></strong></p></div>
292
  <?php
293
  }
294
 
@@ -330,10 +537,16 @@ class PrliAppController extends PrliBaseController {
330
 
331
  /********* DASHBOARD WIDGET ***********/
332
  public function dashboard_widget_function() {
333
- global $prli_group,$prli_link,$prli_blogurl;
 
 
334
 
335
- $groups = $prli_group->getAll('',' ORDER BY name');
336
- $values = PrliLinksController::setup_new_vars($groups);
 
 
 
 
337
 
338
  require_once(PRLI_VIEWS_PATH . '/widgets/widget.php');
339
  }
@@ -349,7 +562,7 @@ class PrliAppController extends PrliBaseController {
349
  }
350
 
351
  if(current_user_can($role)) {
352
- wp_add_dashboard_widget('prli_dashboard_widget', __('Pretty Link Quick Add', 'pretty-link'), array($this,'dashboard_widget_function'));
353
 
354
  // Globalize the metaboxes array, this holds all the widgets for wp-admin
355
  global $wp_meta_boxes;
@@ -437,4 +650,79 @@ class PrliAppController extends PrliBaseController {
437
  public static function close_about_notice() {
438
  update_option('prli_about_notice_version',PRLI_VERSION);
439
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440
  }
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  class PrliAppController extends PrliBaseController {
4
+ public $screens;
5
+
6
+ public function __construct() {
7
+ $this->screens = array(
8
+ 'add-edit' => 'pretty-link',
9
+ 'list' => 'edit-pretty-link',
10
+ 'category' => 'edit-pretty-link-category',
11
+ 'tag' => 'edit-pretty-link-tag',
12
+ 'clicks' => 'pretty-links_page_pretty-link-clicks',
13
+ 'reports' => 'pretty-links_page_plp-reports',
14
+ 'tools' => 'pretty-links_page_pretty-link-tools',
15
+ 'options' => 'pretty-links_page_pretty-link-options',
16
+ 'imp-exp' => 'pretty-links_page_plp-import-export',
17
+ 'activate' => 'pretty-links_page_pretty-link-updates'
18
+ );
19
+ }
20
+
21
  public function load_hooks() {
22
  global $prli_options;
23
 
24
+ add_action('init', array($this, 'parse_standalone_request'), 15); // Later so that the category taxonomy exists for the custom bookmarklet
25
  add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
26
  add_action('admin_menu', array($this, 'menu'), 3); //Hooking in earlier - there's a plugin out there somewhere breaking this action for later plugins
27
 
28
+ add_action('custom_menu_order', array($this,'admin_menu_order'));
29
+ add_action('menu_order', array($this,'admin_menu_order'));
30
+ add_action('menu_order', array($this,'admin_submenu_order'));
31
+
32
  //Where the magic happens when not in wp-admin nor !GET request
33
  if($_SERVER["REQUEST_METHOD"] == 'GET' && !is_admin()) {
34
+ add_action('init', array($this, 'redirect'), 1); // Redirect
35
  }
36
 
37
  // Hook into the 'wp_dashboard_setup' action to register our other functions
44
  add_action('init', array($this, 'install'));
45
 
46
  add_filter( 'plugin_action_links_' . PRLI_PLUGIN_SLUG, array($this,'add_plugin_action_links') );
47
+
48
+ add_action('in_admin_header', array($this,'pl_admin_header'), 0);
49
+
50
+ // Admin footer text.
51
+ add_filter( 'admin_footer_text', array( $this, 'admin_footer' ), 1, 2 );
52
+ }
53
+
54
+ public function pl_admin_header() {
55
+ global $current_screen;
56
+
57
+ if($this->on_pretty_link_page()) {
58
+ ?>
59
+ <div id="pl-admin-header"><img class="pl-logo" src="<?php echo PRLI_IMAGES_URL . '/pretty-links-logo-color-white.svg'; ?>" /></div>
60
+ <?php
61
+ }
62
+ }
63
+
64
+ private function on_pretty_link_page() {
65
+ global $current_screen;
66
+ return (isset($current_screen->id) && strpos($current_screen->id,'pretty-link') !== false);
67
  }
68
 
69
  public function menu() {
70
  global $prli_options, $plp_options, $plp_update;
71
 
72
+ $this->admin_separator();
73
+
74
  $role = 'manage_options';
75
+ if(isset($plp_options->min_role)) {
76
  $role = $plp_options->min_role;
77
+ }
78
 
79
+ $pl_link_cpt = PrliLink::$cpt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
+ if(!$plp_update->is_installed()) {
82
+ add_submenu_page(
83
+ "edit.php?post_type={$pl_link_cpt}",
84
+ esc_html__('Link Categories [Pro Only]', 'pretty-link'),
85
+ esc_html__('Categories [Pro]', 'pretty-link'),
86
+ $role,
87
+ "https://prettylinks.com/pl/main-menu/upgrade?categories",
88
+ false
89
+ );
90
+ add_submenu_page(
91
+ "edit.php?post_type={$pl_link_cpt}",
92
+ esc_html__('Link Tags [Pro Only]', 'pretty-link'),
93
+ esc_html__('Tags [Pro]', 'pretty-link'),
94
+ $role,
95
+ "https://prettylinks.com/pl/main-menu/upgrade?tags",
96
+ false
97
+ );
98
+ add_submenu_page(
99
+ "edit.php?post_type={$pl_link_cpt}",
100
+ esc_html__('Link Reports [Pro Only]', 'pretty-link'),
101
+ esc_html__('Reports [Pro]', 'pretty-link'),
102
+ $role,
103
+ "https://prettylinks.com/pl/main-menu/upgrade?reports",
104
+ false
105
+ );
106
+ add_submenu_page(
107
+ "edit.php?post_type={$pl_link_cpt}",
108
+ esc_html__('Import / Export [Pro Only]', 'pretty-link'),
109
+ esc_html__('Import / Export [Pro]', 'pretty-link'),
110
+ $role,
111
+ "https://prettylinks.com/pl/main-menu/upgrade?import-export",
112
+ false
113
+ );
114
+ }
115
 
116
  if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking != 'count' ) {
117
  $clicks_ctrl = new PrliClicksController();
118
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Clicks', 'pretty-link'), esc_html__('Clicks', 'pretty-link'), $role, 'pretty-link-clicks', array( $clicks_ctrl, 'route' ) );
 
 
 
 
 
 
119
  }
120
 
121
  $routes_ctrl = new PrliToolsController();
122
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Tools', 'pretty-link'), esc_html__('Tools', 'pretty-link'), $role, 'pretty-link-tools', array($routes_ctrl,'route') );
 
 
 
 
 
 
123
 
124
  $options_ctrl = new PrliOptionsController();
125
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Options', 'pretty-link'), esc_html__('Options', 'pretty-link'), $role, 'pretty-link-options', array( $options_ctrl, 'route' ));
 
 
 
 
 
 
126
 
127
  if(!defined('PRETTYLINK_LICENSE_KEY') && class_exists('PrliUpdateController')) {
128
  if($plp_update->is_installed_and_activated()) {
129
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Activate', 'pretty-link'), esc_html__('Activate', 'pretty-link'), $role, 'pretty-link-updates', array($plp_update, 'route'));
130
  }
131
  else if($plp_update->is_installed()) {
132
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Activate', 'pretty-link'), '<span class="prli-menu-red"><b>'.esc_html__('Activate', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
133
+ }
134
+ else {
135
+ add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Upgrade', 'pretty-link'), '<span class="prli-menu-red"><b>'.esc_html__('Upgrade', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
136
+ }
137
+ }
138
+
139
+ $onboarding_ctrl = new PrliOnboardingController();
140
+ add_submenu_page('options.php', __('Welcome', 'pretty-link'), null, $role, 'pretty-link-welcome', array($onboarding_ctrl, 'welcome_route'));
141
+ add_submenu_page('options.php', __("What's New", 'pretty-link'), null, $role, 'pretty-link-update', array($onboarding_ctrl, 'update_route'));
142
+ }
143
+
144
+ /**
145
+ * Add a separator to the WordPress admin menus
146
+ */
147
+ public function admin_separator()
148
+ {
149
+ global $menu;
150
+
151
+ // Prevent duplicate separators when no core menu items exist
152
+ if(!PrliUtils::is_admin()) { return; }
153
+
154
+ $menu[] = array('', 'read', 'separator-pretty-link', '', 'wp-menu-separator pretty-link');
155
+ }
156
+
157
+ /*
158
+ * Move our custom separator above our admin menu
159
+ *
160
+ * @param array $menu_order Menu Order
161
+ * @return array Modified menu order
162
+ */
163
+ public function admin_menu_order($menu_order) {
164
+ if(!$menu_order) {
165
+ return true;
166
+ }
167
+
168
+ if(!is_array($menu_order)) {
169
+ return $menu_order;
170
+ }
171
+
172
+ // Initialize our custom order array
173
+ $new_menu_order = array();
174
+
175
+ // Menu values
176
+ $second_sep = 'separator2';
177
+ $pl_link_cpt = PrliLink::$cpt;
178
+ $custom_menus = array('separator-pretty-link', "edit.php?post_type={$pl_link_cpt}");
179
+
180
+ // Loop through menu order and do some rearranging
181
+ foreach($menu_order as $item) {
182
+ // Position Pretty Links menu above appearance
183
+ if($second_sep == $item) {
184
+ // Add our custom menus
185
+ foreach($custom_menus as $custom_menu) {
186
+ if(array_search($custom_menu, $menu_order)) {
187
+ $new_menu_order[] = $custom_menu;
188
+ }
189
+ }
190
+ // Add the appearance separator
191
+ $new_menu_order[] = $second_sep;
192
+ // Skip our menu items down below
193
+ }
194
+ elseif(!in_array($item, $custom_menus)) {
195
+ $new_menu_order[] = $item;
196
+ }
197
+ }
198
+
199
+ // Return our custom order
200
+ return $new_menu_order;
201
+ }
202
+
203
+ //Organize the CPT's in our submenu
204
+ public function admin_submenu_order($menu_order) {
205
+ global $submenu;
206
+
207
+ static $run = false;
208
+
209
+ //no sense in running this everytime the hook gets called
210
+ if($run) { return $menu_order; }
211
+
212
+ $pl_link_cpt = PrliLink::$cpt;
213
+ $slug = "edit.php?post_type={$pl_link_cpt}";
214
+
215
+ //just return if there's no pretty-link menu available for the current screen
216
+ if(!isset($submenu[$slug])) { return $menu_order; }
217
+
218
+ $run = true;
219
+ $new_order = array();
220
+
221
+ $categories_ctax = class_exists('PlpLinkCategoriesController') ? PlpLinkCategoriesController::$ctax : 'pretty-link-category';
222
+ $tags_ctax = class_exists('PlpLinkTagsController') ? PlpLinkTagsController::$ctax : 'pretty-link-tag';
223
+
224
+ $include_array = array(
225
+ $slug,
226
+ "post-new.php?post_type={$pl_link_cpt}",
227
+ "edit-tags.php?taxonomy={$categories_ctax}&amp;post_type={$pl_link_cpt}",
228
+ 'https://prettylinks.com/pl/main-menu/upgrade?categories',
229
+ "edit-tags.php?taxonomy={$tags_ctax}&amp;post_type={$pl_link_cpt}",
230
+ 'https://prettylinks.com/pl/main-menu/upgrade?tags',
231
+ 'pretty-link-clicks',
232
+ 'plp-reports',
233
+ 'https://prettylinks.com/pl/main-menu/upgrade?reports',
234
+ 'pretty-link-tools',
235
+ 'pretty-link-options',
236
+ 'plp-import-export',
237
+ 'https://prettylinks.com/pl/main-menu/upgrade?import-export',
238
+ 'pretty-link-updates'
239
+ );
240
+
241
+ $i = (count($include_array) - 1);
242
+
243
+ foreach($submenu[$slug] as $sub) {
244
+ $include_order = array_search($sub[2], $include_array);
245
+
246
+ if(false !== $include_order) {
247
+ $new_order[$include_order] = $sub;
248
  }
249
  else {
250
+ $new_order[$i++] = $sub;
251
  }
252
  }
253
+
254
+ ksort($new_order);
255
+
256
+ $submenu[$slug] = $new_order;
257
+
258
+ return $menu_order;
259
  }
260
 
261
  public function add_plugin_action_links($links) {
264
  $pllinks = array();
265
 
266
  if($plp_update->is_installed_and_activated()) {
267
+ $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/activated/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
268
+ $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'">'.esc_html__('Activate', 'pretty-link').'</a>';
269
  }
270
  else if($plp_update->is_installed()) {
271
+ $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.esc_html__('Activate Pro License', 'pretty-link').'</a>';
272
+ $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/buy" target="_blank" class="prli-menu-red">'.esc_html__('Buy', 'pretty-link').'</a>';
273
+ $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
274
  }
275
  else {
276
+ $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/upgrade" class="prli-menu-red" target="_blank">'.esc_html__('Upgrade to Pro', 'pretty-link').'</a>';
277
+ $pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.esc_html__('Activate Pro License', 'pretty-link').'</a>';
278
+ $pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
279
  }
280
 
281
  return array_merge($pllinks, $links);
282
  }
283
 
284
  public function enqueue_admin_scripts($hook) {
285
+ global $wp_version, $current_screen;
286
 
 
 
 
287
  wp_enqueue_style( 'prli-fontello-pretty-link',
288
  PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css',
289
+ array(), PRLI_VERSION );
290
+
291
+ if (version_compare($wp_version, '5.2', '>=')) {
292
+ wp_enqueue_script(
293
+ 'pretty-link-richtext-format',
294
+ PRLI_JS_URL . '/editor.js',
295
+ ['wp-editor', 'wp-i18n', 'wp-element', 'wp-compose', 'wp-components'],
296
+ PRLI_VERSION,
297
+ true
298
+ );
299
+
300
+ wp_localize_script('pretty-link-richtext-format', 'plEditor', array(
301
+ 'homeUrl' => trailingslashit(get_home_url())
302
+ ));
303
+ }
304
 
305
  // If we're in 3.8 now then use a font for the admin image
306
  if( version_compare( $wp_version, '3.8', '>=' ) ) {
308
  array('prli-fontello-pretty-link'), PRLI_VERSION );
309
  }
310
 
311
+ $is_pl_page = $this->is_pretty_link_page();
312
+ $is_link_page = $this->is_pretty_link_link_page();
313
+ $is_link_listing_page = $this->is_pretty_link_listing_page();
314
+ $is_link_edit_page = $this->is_pretty_link_edit_page();
315
+ $is_link_new_page = $this->is_pretty_link_new_page();
316
+
317
+ if( $is_pl_page || $is_link_page ) {
318
+ $prli_admin_shared_prereqs = array( 'wp-pointer' );
319
+
320
+ if(!$is_link_listing_page) {
321
+ wp_register_style('pl-ui-smoothness', PRLI_VENDOR_LIB_URL.'/jquery-ui/jquery-ui.min.css', array(), '1.11.4');
322
+ wp_register_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
323
+ wp_register_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
324
+
325
+ $prli_admin_shared_prereqs = array_merge(
326
+ $prli_admin_shared_prereqs,
327
+ array(
328
+ 'pl-ui-smoothness',
329
+ 'prli-simplegrid',
330
+ 'prli-social',
331
+ )
332
+ );
333
+ }
334
 
 
 
 
 
335
  wp_enqueue_style(
336
  'prli-admin-shared',
337
  PRLI_CSS_URL.'/admin_shared.css',
338
+ $prli_admin_shared_prereqs,
 
 
 
 
 
339
  PRLI_VERSION
340
  );
341
 
364
  ),
365
  PRLI_VERSION
366
  );
367
+
368
+ if($is_link_edit_page || $is_link_new_page) {
369
+ global $prli_link, $post;
370
+
371
+ $link_id = $prli_link->get_link_from_cpt($post->ID);
372
+
373
+ $args = array( 'args' => array(
374
+ 'id' => $link_id,
375
+ 'action' => 'validate_pretty_link',
376
+ 'security' => wp_create_nonce( 'validate_pretty_link' ),
377
+ 'update' => __('Update', 'pretty-link') // Use default text domain
378
+ ) );
379
+
380
+ wp_enqueue_script( 'prli-link-form', PRLI_JS_URL . '/admin_link_form.js', array(), PRLI_VERSION);
381
+ wp_localize_script( 'prli-link-form', 'PrliLinkValidation', $args );
382
+ }
383
  }
384
 
385
+ if($current_screen->post_type == PrliLink::$cpt) {
386
  wp_enqueue_style( 'prli-admin-links', PRLI_CSS_URL . '/prli-admin-links.css', array(), PRLI_VERSION );
387
  //wp_enqueue_script( 'jquery-clippy', PRLI_JS_URL . '/jquery.clippy.js', array('jquery'), PRLI_VERSION );
388
  wp_enqueue_script( 'clipboard-js', PRLI_JS_URL . '/clipboard.min.js', null, PRLI_VERSION );
393
  wp_enqueue_script( 'prli-admin-links', PRLI_JS_URL . '/prli-admin-links.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
394
 
395
  wp_enqueue_script( 'prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
396
+ $links_js_obj = array(
397
+ 'reset_str' => __('Are you sure you want to reset your Pretty Link? This will delete all of the statistical data about this Pretty Link in your database.', 'pretty-link'),
398
+ 'reset_security' => wp_create_nonce('reset_pretty_link')
399
+ );
400
+ wp_localize_script( 'prli-admin-link-list', 'PrliLinkList', $links_js_obj );
 
401
  }
402
 
403
+ if( preg_match('/_page_pretty-link-options$/', $hook) ) {
404
  wp_enqueue_style('pl-options', PRLI_CSS_URL.'/admin_options.css', null, PRLI_VERSION);
405
  wp_enqueue_script('pl-options', PRLI_JS_URL.'/admin_options.js', array('jquery'), PRLI_VERSION);
406
  }
407
 
408
+ if( preg_match('/_page_pretty-link-tools$/', $hook) ||
409
+ preg_match('/_page_pretty-link-options$/', $hook) ||
410
+ $current_screen->post_type == PrliLink::$cpt ) {
 
 
 
411
  wp_enqueue_style('pl-settings-table', PRLI_CSS_URL.'/settings_table.css', null, PRLI_VERSION);
412
  wp_enqueue_script('pl-settings-table', PRLI_JS_URL.'/settings_table.js', array('jquery'), PRLI_VERSION);
413
  }
414
 
415
+ if( preg_match('/_page_pretty-link-clicks$/', $hook) ) {
416
  wp_enqueue_script('google-visualization-api', 'https://www.gstatic.com/charts/loader.js', null, PRLI_VERSION);
417
  wp_enqueue_style('pl-reports', PRLI_CSS_URL.'/admin_reports.css', null, PRLI_VERSION);
418
  wp_enqueue_script('pl-reports', PRLI_JS_URL.'/admin_reports.js', array('jquery','google-visualization-api'), PRLI_VERSION);
419
  wp_localize_script('pl-reports', 'PrliReport', PrliReportsController::chart_data());
420
  }
421
 
422
+
423
+ $page_vars = compact('is_pl_page', 'is_link_page', 'is_link_listing_page', 'is_link_edit_page', 'is_link_new_page');
424
+ do_action('prli_load_admin_scripts', $hook, $page_vars);
425
  }
426
 
427
  public function parse_standalone_request() {
446
  $prli_db = new PrliDb();
447
 
448
  if($prli_db->should_install()) {
449
+ // For some reason, install gets called multiple times so we're basically
450
+ // adding a mutex here (ala a transient) to ensure this only gets run once
451
+ $is_installing = get_transient('prli_installing');
452
+ if($is_installing) {
453
+ return;
454
+ }
455
+ else {
456
+ // 30 minutes
457
+ set_transient('prli_installing', 1, 60*30);
458
+ }
459
+
460
  @ignore_user_abort(true);
461
  @set_time_limit(0);
462
  $prli_db->prli_install();
 
463
 
464
+ delete_transient('prli_installing');
 
 
 
 
465
  }
466
  }
467
 
474
  $reinstall_url = wp_nonce_url('update.php?action=upgrade-plugin&plugin=pretty-link/pretty-link.php', 'upgrade-plugin_pretty-link/pretty-link.php');
475
  ?>
476
 
477
+ <div class="updated notice notice-success">
478
+ <p>
479
+ <strong>
480
+ <?php
481
+ printf(
482
+ // translators: %1$s: br tag, %2$s: open link tag, %3$s: close link tag
483
+ esc_html__('You\'re almost done!%1$s%2$sFinish your Re-Install of Pretty Links Pro%3$s', 'pretty-link'),
484
+ '<br>',
485
+ '<a href="'.esc_url($reinstall_url).'">',
486
+ '</a>'
487
+ );
488
+ ?>
489
+ </strong>
490
+ </p>
491
+ </div>
492
  <?php
493
  }
494
 
495
  if(isset($_GET['action']) and $_GET['action'] == 'pro-uninstall') {
496
  $prli_utils->uninstall_pro();
497
  ?>
498
+ <div class="updated notice notice-success is-dismissible"><p><strong><?php esc_html_e('Pretty Links Pro Successfully Uninstalled.' , 'pretty-link'); ?></strong></p></div>
499
  <?php
500
  }
501
 
537
 
538
  /********* DASHBOARD WIDGET ***********/
539
  public function dashboard_widget_function() {
540
+ global $prli_link, $prli_blogurl;
541
+
542
+ wp_enqueue_script('prli-quick-create', PRLI_JS_URL . '/quick_create.js', array('jquery'), PRLI_VERSION, true);
543
 
544
+ wp_localize_script('prli-quick-create', 'PrliQuickCreate', array(
545
+ 'nonce' => wp_create_nonce('prli_quick_create'),
546
+ 'ajaxUrl' => admin_url('admin-ajax.php'),
547
+ 'invalidServerResponse' => __('Invalid server response', 'pretty-link'),
548
+ 'ajaxError' => __('Ajax error', 'pretty-link')
549
+ ));
550
 
551
  require_once(PRLI_VIEWS_PATH . '/widgets/widget.php');
552
  }
562
  }
563
 
564
  if(current_user_can($role)) {
565
+ wp_add_dashboard_widget('prli_dashboard_widget', esc_html__('Pretty Link Quick Add', 'pretty-link'), array($this,'dashboard_widget_function'));
566
 
567
  // Globalize the metaboxes array, this holds all the widgets for wp-admin
568
  global $wp_meta_boxes;
650
  public static function close_about_notice() {
651
  update_option('prli_about_notice_version',PRLI_VERSION);
652
  }
653
+
654
+ /**
655
+ * When user is on a Pretty Links related admin page, display footer text
656
+ * that graciously asks them to rate us.
657
+ *
658
+ * @since 1.4.0
659
+ *
660
+ * @param string $text
661
+ *
662
+ * @return string
663
+ */
664
+ public function admin_footer($text) {
665
+ global $current_screen;
666
+
667
+ if(!empty($current_screen->id) && $this->is_pretty_link_page()) {
668
+ $url = 'https://prettylinks.com/pl/footer/review';
669
+ $text = sprintf(
670
+ wp_kses(
671
+ /* translators: $1$s - Pretty Links plugin name; $2$s - WP.org review link; $3$s - WP.org review link. */
672
+ __('Enjoying %1$s? Please rate <a href="%2$s" target="_blank" rel="noopener noreferrer">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href="%3$s" target="_blank" rel="noopener">WordPress.org</a> to help us spread the word. Thanks from the Pretty Links team!', 'pretty-link'),
673
+ array(
674
+ 'a' => array(
675
+ 'href' => array(),
676
+ 'target' => array(),
677
+ 'rel' => array(),
678
+ ),
679
+ )
680
+ ),
681
+ '<strong>Pretty Links</strong>',
682
+ $url,
683
+ $url
684
+ );
685
+ }
686
+
687
+ return $text;
688
+ }
689
+
690
+ private function get_screen_id($hook=null) {
691
+ if(is_null($hook)) {
692
+ $screen = get_current_screen();
693
+ $hook = $screen->id;
694
+ }
695
+
696
+ return $hook;
697
+ }
698
+
699
+ public function is_pretty_link_page() {
700
+ $hook = $this->get_screen_id();
701
+ return (strstr($hook, 'pretty-link') !== false);
702
+ }
703
+
704
+ public function is_pretty_link_link_page() {
705
+ $hook = $this->get_screen_id();
706
+ return in_array($hook, array($this->screens['add-edit'],$this->screens['list']));
707
+ }
708
+
709
+ public function is_pretty_link_listing_page() {
710
+ $hook = $this->get_screen_id();
711
+ return ($hook == $this->screens['list']);
712
+ }
713
+
714
+ public function is_pretty_link_edit_page() {
715
+ $hook = $this->get_screen_id();
716
+ return ($hook == $this->screens['add-edit']);
717
+ }
718
+
719
+ public function is_pretty_link_edit_tags() {
720
+ $hook = $this->get_screen_id();
721
+ return ($hook == $this->screens['tag']);
722
+ }
723
+
724
+ public function is_pretty_link_new_page() {
725
+ $hook = $this->get_screen_id();
726
+ return ($hook == $this->screens['add-edit']);
727
+ }
728
  }
app/controllers/PrliClicksController.php CHANGED
@@ -44,12 +44,12 @@ class PrliClicksController extends PrliBaseController {
44
  }
45
 
46
  public function admin_page() {
47
- global $wpdb, $prli_options, $prli_click, $prli_group, $prli_link, $prli_utils, $page_size;
48
 
49
  $page_params = '';
50
 
51
  $params = $prli_click->get_params_array();
52
- $page_size = (isset($_REQUEST['size']) && is_numeric($_REQUEST['size']) && !empty($_REQUEST['size']))?$_REQUEST['size']:10;
53
  $current_page = $params['paged'];
54
 
55
  $start_timestamp = $prli_utils->get_start_date($params);
@@ -95,12 +95,6 @@ class PrliClicksController extends PrliBaseController {
95
  $where_clause .= $wpdb->prepare(" AND cl.vuid=%s",$params['vuid']);
96
  $page_params .= "&vuid={$params['vuid']}";
97
  }
98
- else if(!empty($params['group'])) {
99
- $group = $prli_group->getOne($params['group']);
100
- $link_name = __('Group: ', 'pretty-link') . esc_html($group->name);
101
- $where_clause .= $wpdb->prepare(" AND cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)",$params['group']);
102
- $page_params .= "&group={$params['group']}";
103
- }
104
  else {
105
  $link_name = __('All Links', 'pretty-link');
106
  $where_clause .= "";
@@ -133,30 +127,27 @@ class PrliClicksController extends PrliBaseController {
133
  }
134
 
135
  public function click_report() {
136
- global $wpdb, $prli_click, $prli_group, $prli_link;
137
 
138
  if(isset($_GET['l'])) {
139
- $l = PrliClicksHelper::esc_spreadsheet_cell( $_GET['l'] );
140
  $where_clause = $wpdb->prepare(" link_id=%d",$l );
141
  $link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
142
  $link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
143
  }
144
  else if(isset($_GET['ip'])) {
145
- $ip = PrliClicksHelper::esc_spreadsheet_cell( $_GET['ip'] );
146
- $link_name = "ip_addr_{$ip}";
147
- $where_clause = $wpdb->prepare(" cl.ip=%s",$ip);
 
 
 
148
  }
149
  else if(isset($_GET['vuid'])) {
150
- $vuid = PrliClicksHelper::esc_spreadsheet_cell( $_GET['vuid'] );
151
  $link_name = "visitor_{$vuid}";
152
  $where_clause = $wpdb->prepare(" cl.vuid=%s",$vuid);
153
  }
154
- else if(isset($_GET['group'])) {
155
- $group_val = PrliClicksHelper::esc_spreadsheet_cell( $_GET['group'] );
156
- $group = $prli_group->getOne($group_val);
157
- $link_name = "group_{$group->name}";
158
- $where_clause .= $wpdb->prepare(" cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)", $group_val);
159
- }
160
  else {
161
  $link_name = "all_links";
162
  $where_clause = "";
@@ -167,7 +158,7 @@ class PrliClicksController extends PrliBaseController {
167
 
168
  $record_count = $prli_click->getRecordCount($where_clause);
169
  $page_count = (int)ceil($record_count / $this->max_rows_per_file);
170
- $prli_page = esc_html($_GET['prli_page']);
171
  $hmin = 0;
172
 
173
  if($prli_page) {
@@ -193,31 +184,27 @@ class PrliClicksController extends PrliBaseController {
193
  $param_string = $where_clause = '';
194
 
195
  if(isset($_GET['l'])) {
196
- $l = PrliClicksHelper::esc_spreadsheet_cell( $_GET['l'] );
197
  $where_clause = $wpdb->prepare(' link_id=%d', $l);
198
  $link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
199
  $link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
200
  $param_string .= "l={$l}";
201
  }
202
  else if(isset($_GET['ip'])) {
203
- $ip = PrliClicksHelper::esc_spreadsheet_cell( $_GET['ip'] );
204
- $link_name = "ip_addr_{$ip}";
205
- $where_clause = $wpdb->prepare(' cl.ip=%s', $ip);
206
- $param_string .= "ip={$ip}";
 
 
 
207
  }
208
  else if(isset($_GET['vuid'])) {
209
- $vuid = PrliClicksHelper::esc_spreadsheet_cell( $_GET['vuid'] );
210
  $link_name = "visitor_{$vuid}";
211
  $where_clause = $wpdb->prepare(' cl.vuid=%s', $vuid);
212
  $param_string .= "vuid={$vuid}";
213
  }
214
- else if(isset($_GET['group'])) {
215
- $group_val = PrliClicksHelper::esc_spreadsheet_cell( $_GET['group'] );
216
- $group = $prli_group->getOne($group_val);
217
- $link_name = "group_{$group->name}";
218
- $where_clause .= $wpdb->prepare(" cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)", $group_val);
219
- $param_string .= "group={$group_val}";
220
- }
221
  else {
222
  $link_name = 'all_links';
223
  }
44
  }
45
 
46
  public function admin_page() {
47
+ global $wpdb, $prli_options, $prli_click, $prli_link, $prli_utils, $page_size;
48
 
49
  $page_params = '';
50
 
51
  $params = $prli_click->get_params_array();
52
+ $page_size = (isset($_REQUEST['size']) && is_numeric($_REQUEST['size']) && !empty($_REQUEST['size']))?(int)$_REQUEST['size']:10;
53
  $current_page = $params['paged'];
54
 
55
  $start_timestamp = $prli_utils->get_start_date($params);
95
  $where_clause .= $wpdb->prepare(" AND cl.vuid=%s",$params['vuid']);
96
  $page_params .= "&vuid={$params['vuid']}";
97
  }
 
 
 
 
 
 
98
  else {
99
  $link_name = __('All Links', 'pretty-link');
100
  $where_clause .= "";
127
  }
128
 
129
  public function click_report() {
130
+ global $wpdb, $prli_click, $prli_link;
131
 
132
  if(isset($_GET['l'])) {
133
+ $l = (int) $_GET['l'];
134
  $where_clause = $wpdb->prepare(" link_id=%d",$l );
135
  $link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
136
  $link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
137
  }
138
  else if(isset($_GET['ip'])) {
139
+ $ip = stripslashes($_GET['ip']);
140
+ if (filter_var($ip, FILTER_VALIDATE_IP)) {
141
+ $ip = PrliClicksHelper::esc_spreadsheet_cell($ip);
142
+ $link_name = "ip_addr_{$ip}";
143
+ $where_clause = $wpdb->prepare(" cl.ip=%s", $ip);
144
+ }
145
  }
146
  else if(isset($_GET['vuid'])) {
147
+ $vuid = sanitize_key(stripslashes($_GET['vuid']));
148
  $link_name = "visitor_{$vuid}";
149
  $where_clause = $wpdb->prepare(" cl.vuid=%s",$vuid);
150
  }
 
 
 
 
 
 
151
  else {
152
  $link_name = "all_links";
153
  $where_clause = "";
158
 
159
  $record_count = $prli_click->getRecordCount($where_clause);
160
  $page_count = (int)ceil($record_count / $this->max_rows_per_file);
161
+ $prli_page = isset($_GET['prli_page']) ? (int) $_GET['prli_page'] : 1;
162
  $hmin = 0;
163
 
164
  if($prli_page) {
184
  $param_string = $where_clause = '';
185
 
186
  if(isset($_GET['l'])) {
187
+ $l = (int) $_GET['l'];
188
  $where_clause = $wpdb->prepare(' link_id=%d', $l);
189
  $link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
190
  $link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
191
  $param_string .= "l={$l}";
192
  }
193
  else if(isset($_GET['ip'])) {
194
+ $ip = stripslashes($_GET['ip']);
195
+ if (filter_var($ip, FILTER_VALIDATE_IP)) {
196
+ $ip = PrliClicksHelper::esc_spreadsheet_cell($_GET['ip']);
197
+ $link_name = "ip_addr_{$ip}";
198
+ $where_clause = $wpdb->prepare(' cl.ip=%s', $ip);
199
+ $param_string .= "ip={$ip}";
200
+ }
201
  }
202
  else if(isset($_GET['vuid'])) {
203
+ $vuid = sanitize_key(stripslashes($_GET['vuid']));
204
  $link_name = "visitor_{$vuid}";
205
  $where_clause = $wpdb->prepare(' cl.vuid=%s', $vuid);
206
  $param_string .= "vuid={$vuid}";
207
  }
 
 
 
 
 
 
 
208
  else {
209
  $link_name = 'all_links';
210
  }
app/controllers/PrliGroupsController.php DELETED
@@ -1,253 +0,0 @@
1
- <?php
2
- if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
3
-
4
- // We'll do a full refactor later -- for now we'll just implement the add group ajax method
5
- class PrliGroupsController extends PrliBaseController {
6
- public function load_hooks() {
7
- add_action('wp_ajax_add_new_prli_group', array($this,'ajax_new_group'));
8
- }
9
-
10
- public function route() {
11
- global $prli_group;
12
-
13
- $params = $prli_group->get_params_array();
14
-
15
- if($params['action'] == 'list') {
16
- $this->display_list($params);
17
- }
18
- else if($params['action'] == 'new') {
19
- $this->display_new($params);
20
- }
21
- else if($params['action'] == 'create') {
22
- $this->create($params);
23
- }
24
- else if($params['action'] == 'edit') {
25
- $this->display_edit($params);
26
- }
27
- else if($params['action'] == 'update') {
28
- $this->update($params);
29
- }
30
- else if($params['action'] == 'destroy') {
31
- $this->destroy($params);
32
- }
33
- }
34
-
35
- public function ajax_new_group() {
36
- global $prli_group;
37
-
38
- if(!PrliUtils::is_authorized()) {
39
- return json_encode( array( 'status' => 'failure',
40
- 'message' => __('Cannot add group because current user is not authorized.', 'pretty-link') ) );
41
- }
42
-
43
- // Default response
44
- $response = json_encode( array( 'status' => 'failure',
45
- 'message' => __('An unknown error occurred when creating your group.', 'pretty-link') ) );
46
-
47
- if(isset($_REQUEST['_prli_nonce']) and wp_verify_nonce($_REQUEST['_prli_nonce'], 'prli-add-new-group')) {
48
- if(isset($_REQUEST['new_group_name'])) {
49
- $new_group_name = stripslashes($_REQUEST['new_group_name']);
50
- $group_id = $prli_group->create( array( 'name' => $new_group_name, 'description' => '' ) );
51
-
52
- if( $group_id ) {
53
- $response = json_encode( array( 'status' => 'success',
54
- 'message' => __('Group Created', 'pretty-link'),
55
- 'group_id' => $group_id,
56
- 'group_option' => "<option value=\"{$group_id}\">{$new_group_name}</option>" ) );
57
- }
58
- }
59
- else {
60
- $response = json_encode( array( 'status' => 'failure',
61
- 'message' => __('A name must be specified for your new group name', 'pretty-link') ) );
62
- }
63
- }
64
- else {
65
- $response = json_encode( array( 'status' => 'failure',
66
- 'message' => __('Cannot add group because security nonce failed', 'pretty-link') ) );
67
- }
68
-
69
- header( "Content-Type: application/json" );
70
- echo $response;
71
-
72
- exit;
73
- }
74
-
75
- public function display_list($params) {
76
- $this->display_groups_list($params, __('Create a group and use it to organize your Pretty Links.', 'pretty-link'));
77
- }
78
-
79
- public function display_new($params) {
80
- global $prli_link;
81
- $links = $prli_link->getAll('',' ORDER BY li.name');
82
- require_once(PRLI_VIEWS_PATH.'/groups/new.php');
83
- }
84
-
85
- public function create($params) {
86
- global $prli_group, $prli_link;
87
-
88
- $errors = $prli_group->validate($_POST);
89
- if( count($errors) > 0 ) {
90
- $links = $prli_link->getAll('',' ORDER BY li.name');
91
- require_once(PRLI_VIEWS_PATH.'/groups/new.php');
92
- }
93
- else {
94
- $insert_id = $prli_group->create($_POST);
95
-
96
- if(isset($_POST['link'])) {
97
- $this->update_groups($insert_id, $_POST['link']);
98
- }
99
-
100
- $this->display_groups_list($params, __("Your Pretty Link Group was Successfully Created", 'pretty-link'), '', 1);
101
- }
102
- }
103
-
104
- public function display_edit($params) {
105
- global $prli_group, $prli_link;
106
-
107
- $record = $prli_group->getOne( $params['id'] );
108
- $id = $params['id'];
109
- $links = $prli_link->getAll('',' ORDER BY li.name');
110
-
111
- require_once(PRLI_VIEWS_PATH.'/groups/edit.php');
112
- }
113
-
114
- public function update($params) {
115
- global $prli_group, $prli_link;
116
-
117
- $errors = $prli_group->validate($_POST);
118
- $id = $_POST['id'];
119
- if( count($errors) > 0 ) {
120
- $links = $prli_link->getAll('',' ORDER BY li.name');
121
- require_once(PRLI_VIEWS_PATH.'/groups/edit.php');
122
- }
123
- else {
124
- $record = $prli_group->update( $_POST['id'], $_POST );
125
-
126
- if(isset($_POST['link'])) {
127
- $this->update_groups($_POST['id'],$_POST['link']);
128
- }
129
-
130
- $this->display_groups_list($params, __('Your Pretty Link Group was Successfully Updated', 'pretty-link'), '', 1);
131
- }
132
- }
133
-
134
- public function destroy($params) {
135
- global $prli_group;
136
-
137
- $prli_group->destroy( $params['id'] );
138
-
139
- $this->display_groups_list($params, __("Your Pretty Link Group was Successfully Deleted", 'pretty-link'), '', 1);
140
- }
141
-
142
- public function update_groups($group_id, $values) {
143
- global $prli_link;
144
-
145
- $links = $prli_link->getAll();
146
-
147
- foreach($links as $link) {
148
- // Only update a group if the user's pulling it from another group
149
- if($link->group_id != $group_id and empty($values[$link->id])) {
150
- continue;
151
- }
152
-
153
- $prli_link->update_group($link->id, $values[$link->id], $group_id);
154
- }
155
- }
156
-
157
- // Helpers
158
- public function display_groups_list($params, $prli_message, $page_params_ov = false, $current_page_ov = false) {
159
- global $wpdb, $prli_utils, $prli_group, $prli_click, $prli_link, $page_size;
160
-
161
- $controller_file = basename(__FILE__);
162
- $group_vars = $this->get_group_sort_vars($params);
163
-
164
- if($current_page_ov) {
165
- $current_page = $current_page_ov;
166
- }
167
- else {
168
- $current_page = $params['paged'];
169
- }
170
-
171
- if($page_params_ov) {
172
- $page_params = $page_params_ov;
173
- }
174
- else {
175
- $page_params = $group_vars['page_params'];
176
- }
177
-
178
- $sort_str = $group_vars['sort_str'];
179
- $sdir_str = $group_vars['sdir_str'];
180
- $search_str = $group_vars['search_str'];
181
-
182
- $record_count = $prli_group->getRecordCount($group_vars['where_clause']);
183
- $page_count = $prli_group->getPageCount($page_size,$group_vars['where_clause']);
184
- $groups = $prli_group->getPage($current_page,$page_size,$group_vars['where_clause'],$group_vars['order_by']);
185
- $page_last_record = $prli_utils->getLastRecordNum($record_count,$current_page,$page_size);
186
- $page_first_record = $prli_utils->getFirstRecordNum($record_count,$current_page,$page_size);
187
-
188
- require_once(PRLI_VIEWS_PATH.'/groups/list.php');
189
- }
190
-
191
- public function get_group_sort_vars($params,$where_clause = '') {
192
- $order_by = '';
193
- $page_params = '';
194
-
195
- // These will have to work with both get and post
196
- $sort_str = $params['sort'];
197
- $sdir_str = $params['sdir'];
198
- $search_str = $params['search'];
199
-
200
- // Insert search string
201
- if(!empty($search_str)) {
202
- $search_params = explode(" ", $search_str);
203
-
204
- foreach($search_params as $search_param) {
205
- if(!empty($where_clause))
206
- $where_clause .= " AND";
207
-
208
- $where_clause .= " (name like '%$search_param%' OR description like '%$search_param%' OR created_at like '%$search_param%')";
209
- }
210
-
211
- $page_params .="&search=$search_str";
212
- }
213
-
214
- // make sure page params stay correct
215
- if(!empty($sort_str)) {
216
- $page_params .="&sort=$sort_str";
217
- }
218
-
219
- if(!empty($sdir_str)) {
220
- $page_params .= "&sdir=$sdir_str";
221
- }
222
-
223
- // Add order by clause
224
- switch($sort_str) {
225
- case "name":
226
- case "link_count":
227
- case "click_count":
228
- case "description":
229
- $order_by .= " ORDER BY $sort_str";
230
- break;
231
- default:
232
- $order_by .= " ORDER BY created_at";
233
- }
234
-
235
- // Toggle ascending / descending
236
- if((empty($sort_str) and empty($sdir_str)) or $sdir_str == 'desc') {
237
- $order_by .= ' DESC';
238
- $sdir_str = 'desc';
239
- }
240
- else {
241
- $sdir_str = 'asc';
242
- }
243
-
244
- return array(
245
- 'order_by' => $order_by,
246
- 'sort_str' => $sort_str,
247
- 'sdir_str' => $sdir_str,
248
- 'search_str' => $search_str,
249
- 'where_clause' => $where_clause,
250
- 'page_params' => $page_params
251
- );
252
- }
253
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/controllers/PrliLinksController.php CHANGED
@@ -2,528 +2,714 @@
2
 
3
  class PrliLinksController extends PrliBaseController {
4
  public function load_hooks() {
5
- // nothing yet
6
  add_filter( 'cron_schedules', array($this,'intervals') );
7
  add_action( 'prli_cleanup_visitor_locks_worker', array($this,'cleanup_visitor_locks') );
8
  add_action( 'admin_init', array($this,'maybe_cleanup_visitor_locks') );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  if(!($snapshot_timestamp = wp_next_scheduled('prli_cleanup_visitor_locks_worker'))) {
11
  wp_schedule_event( time(), 'prli_cleanup_visitor_locks_interval', 'prli_cleanup_visitor_locks_worker' );
12
  }
13
  }
14
 
15
- public static function route() {
16
- $action = (isset($_REQUEST['action'])?$_REQUEST['action']:null);
17
- $params = self::get_params_array();
18
-
19
- // "new()" has its own submenu so we don't need a route for it here
20
- switch($action) {
21
- // POST ACTIONS
22
- case 'quick-create':
23
- return self::quick_create_link($params);
24
- case 'create':
25
- return self::create_link($params);
26
- case 'bulk-update':
27
- return self::bulk_update_links($params);
28
- case 'update':
29
- return self::update_link($params);
30
- case 'reset':
31
- return self::reset_link($params);
32
- case 'destroy':
33
- return self::destroy_link($params);
34
- case 'bulk-destroy':
35
- return self::bulk_destroy_links($params);
36
-
37
- // GET ACTIONS
38
- case 'edit':
39
- return self::edit_link($params);
40
- default:
41
- return self::list_links($params);
 
 
 
 
 
 
 
42
  }
43
- }
44
 
45
- public static function list_links($params) {
46
- global $wpdb, $prli_group;
47
 
48
- if(!empty($params['message']))
49
- $prli_message = $params['message'];
50
- else if(empty($params['group']))
51
- $prli_message = PrliUtils::get_main_message();
52
- else
53
- $prli_message = __("Links in Group: ", 'pretty-link') . $wpdb->get_var("SELECT name FROM " . $prli_group->table_name . " WHERE id=".$params['group']);
54
 
55
- self::display_links_list($params, $prli_message);
 
 
 
 
56
  }
57
 
58
- public static function new_link($params) {
59
- global $prli_group;
60
- $groups = $prli_group->getAll('',' ORDER BY name');
61
- $values = self::setup_new_vars($groups);
62
 
63
- require_once PRLI_VIEWS_PATH . '/links/new.php';
 
 
 
 
 
 
 
64
  }
65
 
66
- public static function quick_create_link($params) {
67
- global $prli_link, $prli_group, $prli_options;
68
 
69
- if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'update-options' ) ) {
70
- die( 'Security Check' );
 
 
 
 
 
71
  }
 
 
72
 
73
- $params = self::get_params_array();
74
- $errors = $prli_link->validate($_POST);
75
 
76
- if( count($errors) > 0 )
77
- {
78
- $groups = $prli_group->getAll('',' ORDER BY name');
79
- $values = self::setup_new_vars($groups);
80
- require_once PRLI_VIEWS_PATH . '/links/new.php';
81
- }
82
- else
83
- {
84
- unset($_POST['param_forwarding']);
85
 
86
- $_POST['param_struct'] = '';
87
- $_POST['name'] = '';
88
- $_POST['description'] = '';
89
- if( $prli_options->link_track_me )
90
- $_POST['track_me'] = 'on';
91
- if( $prli_options->link_nofollow )
92
- $_POST['nofollow'] = 'on';
93
 
94
- $_POST['redirect_type'] = $prli_options->link_redirect_type;
 
 
 
 
 
 
 
 
 
 
95
 
96
- $record = $prli_link->create( $_POST );
 
97
 
98
- $prli_message = __("Your Pretty Link was Successfully Created", 'pretty-link');
99
- self::display_links_list($params, $prli_message, '', 1);
 
 
 
 
 
 
 
 
 
 
100
  }
 
 
101
  }
102
 
103
- public static function create_link($params) {
104
- global $prli_link, $prli_group;
105
 
106
- if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'update-options' ) ) {
107
- die( 'Security Check' );
108
- }
 
 
 
 
 
109
 
110
- $errors = $prli_link->validate($_POST);
111
 
112
- $errors = apply_filters( "prli_validate_link", $errors );
 
 
 
 
 
 
 
 
 
 
113
 
114
- if(count($errors) > 0) {
115
- $groups = $prli_group->getAll('',' ORDER BY name');
116
- $values = self::setup_new_vars($groups);
117
- require_once PRLI_VIEWS_PATH . '/links/new.php';
118
  }
119
  else {
120
- $record = $prli_link->create( $_POST );
121
-
122
- do_action('prli_update_link', $record);
123
 
124
- $prli_message = __("Your Pretty Link was Successfully Created", 'pretty-link');
125
- self::display_links_list($params, $prli_message, '', 1);
 
 
 
126
  }
 
 
127
  }
128
 
129
- public static function edit_link($params) {
130
- global $prli_group, $prli_link;
131
 
132
- $groups = $prli_group->getAll('',' ORDER BY name');
 
 
 
133
 
134
- $record = $prli_link->getOne( $params['id'] );
135
- $values = self::setup_edit_vars($groups,$record);
136
- $id = $params['id'];
137
- require_once(PRLI_VIEWS_PATH . '/links/edit.php');
138
- }
139
 
140
- public static function update_link($params) {
141
- global $prli_link, $prli_group;
 
 
142
 
143
- if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'update-options' ) ) {
144
- die( 'Security Check' );
 
145
  }
146
 
147
- $errors = $prli_link->validate($_POST);
148
- $id = $_POST['id'];
149
 
150
- $errors = apply_filters( "prli_validate_link", $errors );
 
151
 
152
- if( count($errors) > 0 ) {
153
- $groups = $prli_group->getAll('',' ORDER BY name');
154
- $record = $prli_link->getOne( $params['id'] );
155
- $values = self::setup_edit_vars($groups,$record);
156
- require_once(PRLI_VIEWS_PATH . '/links/edit.php');
157
  }
158
  else {
159
- $record = $prli_link->update( $_POST['id'], $_POST );
160
-
161
- do_action('prli_update_link', $id);
162
-
163
- $prli_message = __('Your Pretty Link was Successfully Updated', 'pretty-link');
164
- self::display_links_list($params, $prli_message, '', 1);
165
  }
 
 
166
  }
167
 
168
- public static function bulk_update_links() {
169
  global $prli_link;
170
- if(wp_verify_nonce($_REQUEST['_wpnonce'],'prli_bulk_update') and isset($_REQUEST['ids'])) {
171
 
172
- $ids = $_REQUEST['ids'];
173
- $params = $_REQUEST['bu'];
174
 
175
- $prli_link->bulk_update( $ids, $params );
176
- do_action('prli-bulk-action-update',$ids,$params);
177
 
178
- $message = __('Your links were updated successfully', 'pretty-link');
179
 
180
- //self::display_links_list(self::get_params_array(),$message);
 
 
 
 
 
 
 
181
 
182
- // We're going to redirect here to avoid having a big nasty url that
183
- // can cause problems when doing several activities in a row.
184
 
185
- // Scrub message, action, _wpnonce, ids & bu vars from the arguments and redirect
186
- $request_uri = preg_replace( '#\&(message|action|_wpnonce|ids|bu\[[^\]]*?\])=[^\&]*#', '', $_SERVER['REQUEST_URI'] );
187
 
188
- // we assume here that some arguments are set ... if not this value is meaningless anyway
189
- $request_uri .= '&message=' . urlencode($message);
190
- $redirect_url = 'http' . (empty($_SERVER['HTTPS'])?'':'s') . '://' . $_SERVER['HTTP_HOST'] . $request_uri;
191
 
192
- require PRLI_VIEWS_PATH . '/shared/jsredirect.php';
193
- }
194
- else {
195
- wp_die(__('You are unauthorized to view this page.', 'pretty-link'));
 
 
 
 
 
 
196
  }
197
  }
198
 
199
- public static function reset_link($params) {
200
- global $prli_link;
 
201
 
202
- if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'link-actions' ) ) {
203
- die( 'Security Check' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  }
 
 
 
 
 
 
 
205
 
206
- $prli_link->reset( $params['id'] );
207
- $prli_message = __("Your Pretty Link was Successfully Reset", 'pretty-link');
208
- self::display_links_list($params, $prli_message, '', 1);
209
  }
210
 
211
- public static function destroy_link($params) {
212
  global $prli_link;
213
 
214
- if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'link-actions' ) ) {
215
- die( 'Security Check' );
 
 
216
  }
217
 
218
- $prli_link->destroy( $params['id'] );
219
- $prli_message = __("Your Pretty Link was Successfully Destroyed", 'pretty-link');
220
- self::display_links_list($params, $prli_message, '', 1);
221
- }
222
 
223
- public static function bulk_destroy_links($params) {
224
- global $prli_link;
225
- if(wp_verify_nonce($_REQUEST['_wpnonce'],'prli_bulk_update') and isset($_REQUEST['ids'])) {
226
- $ids = explode(',', $_REQUEST['ids']);
227
 
228
- foreach($ids as $id) {
229
- $prli_link->destroy( $id );
 
 
 
230
  }
 
 
231
 
232
- $message = __('Your links were deleted successfully', 'pretty-link');
 
 
 
233
 
234
- //self::display_links_list($params,$message);
235
- // Scrub message, action, _wpnonce, ids & bu vars from the arguments and redirect
236
- $request_uri = preg_replace( '#\&(message|action|_wpnonce|ids|bu\[[^\]]*?\])=[^\&]*#', '', $_SERVER['REQUEST_URI'] );
237
 
238
- // we assume here that some arguments are set ... if not this value is meaningless anyway
239
- $request_uri .= '&message=' . urlencode($message);
240
- $redirect_url = 'http' . (empty($_SERVER['HTTPS'])?'':'s') . '://' . $_SERVER['HTTP_HOST'] . $request_uri;
 
241
 
242
- require PRLI_VIEWS_PATH . '/shared/jsredirect.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
- else {
245
- wp_die(__('You are unauthorized to view this page.', 'pretty-link'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
 
 
 
 
 
 
247
  }
248
 
249
- public static function display_links_list($params, $prli_message, $page_params_ov = false, $current_page_ov = false) {
250
- global $wpdb, $prli_utils, $prli_click, $prli_group, $prli_link, $page_size, $prli_options;
251
 
252
- $controller_file = basename(__FILE__);
 
253
 
254
- $where_clause = '';
255
- $page_params = '';
256
- $group_param = '';
257
 
258
- $page_size = (isset($_REQUEST['size']) && is_numeric($_REQUEST['size']) && !empty($_REQUEST['size']))?$_REQUEST['size']:10;
 
259
 
260
- if(!empty($params['group'])) {
261
- $where_clause = " group_id=" . $params['group'];
262
- $group_param = "&group={$params['group']}";
263
- $page_params = "&group=" . $params['group'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  }
 
265
 
266
- $link_vars = self::get_link_sort_vars($params, $where_clause);
 
 
 
 
 
 
 
 
267
 
268
- if($current_page_ov)
269
- $current_page = $current_page_ov;
270
- else
271
- $current_page = $params['paged'];
272
 
273
- if($page_params_ov)
274
- $page_params .= $page_params_ov;
275
- else
276
- $page_params .= $link_vars['page_params'];
277
 
278
- $sort_str = $link_vars['sort_str'];
279
- $sdir_str = $link_vars['sdir_str'];
280
- $search_str = $link_vars['search_str'];
281
 
282
- $record_count = $prli_link->getRecordCount($link_vars['where_clause']);
283
- $page_count = $prli_link->getPageCount($page_size,$link_vars['where_clause']);
284
- $links = $prli_link->getPage($current_page,$page_size,$link_vars['where_clause'],$link_vars['order_by']);
285
- $page_last_record = $prli_utils->getLastRecordNum($record_count,$current_page,$page_size);
286
- $page_first_record = $prli_utils->getFirstRecordNum($record_count,$current_page,$page_size);
 
287
 
288
- require_once(PRLI_VIEWS_PATH . '/links/list.php');
289
- }
290
 
291
- public static function get_link_sort_vars($params,$where_clause = '')
292
- {
293
- $order_by = '';
294
- $page_params = '';
295
 
296
- // These will have to work with both get and post
297
- $sort_str = $params['sort'];
298
- $sdir_str = $params['sdir'];
299
- $search_str = $params['search'];
300
 
301
- // Insert search string
302
- if(!empty($search_str))
303
- {
304
- $search_params = explode(" ", $search_str);
305
 
306
- foreach($search_params as $search_param)
307
- {
308
- if(!empty($where_clause))
309
- $where_clause .= " AND";
310
 
311
- $where_clause .= " (li.name like '%$search_param%' OR li.slug like '%$search_param%' OR li.url like '%$search_param%' OR li.created_at like '%$search_param%')";
 
 
 
 
 
 
 
 
312
  }
313
 
314
- $page_params .="&search=$search_str";
 
315
  }
316
 
317
- // make sure page params stay correct
318
- if(!empty($sort_str))
319
- $page_params .="&sort=$sort_str";
320
 
321
- if(!empty($sdir_str))
322
- $page_params .= "&sdir=$sdir_str";
323
 
324
- // Add order by clause
325
- switch($sort_str)
326
- {
327
- case "name":
328
- case "clicks":
329
- case "group_name":
330
- case "slug":
331
- $order_by .= " ORDER BY $sort_str";
332
- break;
333
- default:
334
- $order_by .= " ORDER BY created_at";
335
- }
336
 
337
- // Toggle ascending / descending
338
- if((empty($sort_str) and empty($sdir_str)) or $sdir_str == 'desc')
339
- {
340
- $order_by .= ' DESC';
341
- $sdir_str = 'desc';
342
  }
343
- else
344
- $sdir_str = 'asc';
345
 
346
- return array('order_by' => $order_by,
347
- 'sort_str' => $sort_str,
348
- 'sdir_str' => $sdir_str,
349
- 'search_str' => $search_str,
350
- 'where_clause' => $where_clause,
351
- 'page_params' => $page_params);
352
- }
353
 
354
- // Set defaults and grab get or post of each possible param
355
- public static function get_params_array() {
356
- return array(
357
- 'action' => (isset($_REQUEST['action'])?$_REQUEST['action']:'list'),
358
- 'regenerate' => (isset($_REQUEST['regenerate'])?$_REQUEST['regenerate']:'false'),
359
- 'id' => (isset($_REQUEST['id'])?$_REQUEST['id']:''),
360
- 'group_name' => (isset($_REQUEST['group_name'])?$_REQUEST['group_name']:''),
361
- 'paged' => (isset($_REQUEST['paged'])?$_REQUEST['paged']:1),
362
- 'group' => (isset($_REQUEST['group'])?(int)$_REQUEST['group']:''),
363
- 'search' => (isset($_REQUEST['search'])?$_REQUEST['search']:''),
364
- 'sort' => (isset($_REQUEST['sort'])?$_REQUEST['sort']:''),
365
- 'sdir' => (isset($_REQUEST['sdir'])?$_REQUEST['sdir']:''),
366
- 'message' => (isset($_REQUEST['message'])?sanitize_text_field($_REQUEST['message']):'')
367
  );
 
 
368
  }
369
 
370
- public static function setup_new_vars($groups) {
371
- global $prli_link, $prli_options;
 
 
372
 
373
- $values = array();
374
- $values['url'] = (isset($_REQUEST['url'])?$_REQUEST['url']:'');
375
- $values['slug'] = (isset($_REQUEST['slug'])?$_REQUEST['slug']:$prli_link->generateValidSlug());
376
- $values['name'] = htmlspecialchars((isset($_REQUEST['name'])?stripslashes($_REQUEST['name']):''));
377
- $values['description'] = htmlspecialchars((isset($_REQUEST['description'])?stripslashes($_REQUEST['description']):''));
378
 
379
- $values['track_me'] = (((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or (!isset($_REQUEST['track_me']) and $prli_options->link_track_me == '1'))?'checked="true"':'');
380
- $values['nofollow'] = (((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (!isset($_REQUEST['nofollow']) and $prli_options->link_nofollow == '1'))?'checked="true"':'');
 
381
 
382
- $values['redirect_type'] = array();
383
- $values['redirect_type']['307'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '307'))?'selected="selected"':'');
384
- $values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '302'))?'selected="selected"':'');
385
- $values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '301'))?'selected="selected"':'');
386
- $values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'prettybar'))?'selected="selected"':'');
387
- $values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'cloak'))?'selected="selected"':'');
388
- $values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'pixel'))?'selected="selected"':'');
389
- $values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'metarefresh'))?'selected="selected"':'');
390
- $values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'javascript'))?'selected="selected"':'');
391
 
392
- $values['groups'] = array();
393
 
394
- if(is_array($groups)) {
395
- foreach($groups as $group) {
396
- $values['groups'][] = array(
397
- 'id' => $group->id,
398
- 'value' => ((isset($_REQUEST['group_id']) && $_REQUEST['group_id'] == $group->id)?' selected="true"':''),
399
- 'name' => $group->name
400
- );
401
- }
402
  }
403
 
404
- $values['param_forwarding'] = isset($_REQUEST['param_forwarding']);
405
- $values['delay'] = (isset($_REQUEST['delay']) ? $_REQUEST['delay'] : 0);
406
 
407
- if(isset($_REQUEST['google_tracking'])) {
408
- $values['google_tracking'] = ' checked=checked';
409
  }
410
- else {
411
- global $plp_update;
412
- if( $plp_update->is_installed() ) {
413
- global $plp_options;
414
- $values['google_tracking'] = $plp_options->google_tracking?' checked=checked':'';
415
- }
416
- else {
417
- $values['google_tracking'] = '';
418
- }
419
  }
420
 
421
- return $values;
422
- }
423
 
424
- public static function setup_edit_vars($groups,$record) {
425
- global $prli_link, $prli_link_meta;
 
426
 
427
- $values = array();
428
- $values['url'] = ((isset($_REQUEST['url']) and $record == null)?$_REQUEST['url']:$record->url);
429
- $values['slug'] = ((isset($_REQUEST['slug']) and $record == null)?$_REQUEST['slug']:$record->slug);
430
- $values['name'] = htmlspecialchars(stripslashes(((isset($_REQUEST['name']) and $record == null)?$_REQUEST['name']:$record->name)));
431
- $values['description'] = htmlspecialchars(stripslashes(((isset($_REQUEST['description']) and $record == null)?$_REQUEST['description']:$record->description)));
432
- $values['track_me'] = (((isset($_REQUEST['track_me']) or $record->track_me) and ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or $record->track_me == 1))?'checked="true"':'');
433
- $values['nofollow'] = (((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (isset($record->nofollow) && $record->nofollow == 1))?'checked="true"':'');
434
 
435
- $values['groups'] = array();
436
- foreach($groups as $group) {
437
- $values['groups'][] = array( 'id' => $group->id,
438
- 'value' => (((isset($_REQUEST['group_id']) and ($_REQUEST['group_id'] == $group->id)) or ($record->group_id == $group->id))?' selected="true"':''),
439
- 'name' => $group->name );
440
- }
 
 
441
 
442
- $values['param_forwarding'] = (isset($_REQUEST['param_forwarding']) || !(empty($record->param_forwarding) || $record->param_forwarding=='off'));
 
443
 
444
- $values['redirect_type'] = array();
445
- $values['redirect_type']['307'] = ((!isset($_REQUEST['redirect_type']) or (isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (isset($record->redirect_type) and $record->redirect_type == '307'))?' selected="selected"':'');
446
- $values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (isset($record->redirect_type) and $record->redirect_type == '302'))?' selected="selected"':'');
447
- $values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (isset($record->redirect_type) and $record->redirect_type == '301'))?' selected="selected"':'');
448
- $values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (isset($record->redirect_type) and $record->redirect_type == 'prettybar'))?' selected="selected"':'');
449
- $values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (isset($record->redirect_type) and $record->redirect_type == 'cloak'))?' selected="selected"':'');
450
- $values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (isset($record->redirect_type) and $record->redirect_type == 'pixel'))?' selected="selected"':'');
451
- $values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (isset($record->redirect_type) and $record->redirect_type == 'metarefresh'))?' selected="selected"':'');
452
- $values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (isset($record->redirect_type) and $record->redirect_type == 'javascript'))?' selected="selected"':'');
453
 
454
- if(isset($_REQUEST['delay'])) {
455
- $values['delay'] = $_REQUEST['delay'];
456
- }
457
- else {
458
- $values['delay'] = $prli_link_meta->get_link_meta($record->id, 'delay', true);
459
- }
460
 
461
- if(isset($_REQUEST['google_tracking'])) {
462
- $values['google_tracking'] = ' checked=checked';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  }
464
- else {
465
- $values['google_tracking'] = (($prli_link_meta->get_link_meta($record->id, 'google_tracking', true) == 1)?' checked=checked':'');
 
 
 
 
 
 
 
 
466
  }
467
 
468
- return $values;
469
  }
470
 
471
- public function maybe_cleanup_visitor_locks() {
472
- $cleanup = get_transient('prli_cleanup_visitor_locks');
 
473
 
474
- if(empty($cleanup)) {
475
- set_transient('prli_cleanup_visitor_locks', 1, DAY_IN_SECONDS);
476
- $this->cleanup_visitor_locks();
 
 
 
477
  }
 
 
478
  }
479
 
480
- /** Delete visitor locks so we don't explode the size of peoples' databases */
481
- public function cleanup_visitor_locks() {
482
- global $wpdb;
 
483
 
484
- //| 1127004 | _transient_timeout_prli_visitor_58b12712690d5 | 1488004892 | no |
485
- //| 1127005 | _transient_prli_visitor_58b12712690d5 | 58b12712690d5 | no |
 
 
 
486
 
487
- $q = $wpdb->prepare("
488
- SELECT option_name
489
- FROM {$wpdb->options}
490
- WHERE option_name LIKE %s
491
- AND option_value < %s
492
- ORDER BY option_value
493
- ",
494
- '_transient_timeout_prli_visitor_%',
495
- time()
496
- );
497
 
498
- $timeouts = $wpdb->get_col($q);
 
 
499
 
500
- foreach($timeouts as $i => $timeout_key) {
501
- // figure out the transient_key from the timeout_key
502
- $transient_key = preg_replace(
503
- '/^_transient_timeout_prli_visitor_/',
504
- '_transient_prli_visitor_',
505
- $timeout_key
506
- );
507
 
508
- $tq = $wpdb->prepare("
509
- DELETE FROM {$wpdb->options}
510
- WHERE option_name IN (%s,%s)
511
- ",
512
- $timeout_key,
513
- $transient_key
514
- );
515
 
516
- $res = $wpdb->query($tq);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
  }
518
- }
519
-
520
- public function intervals( $schedules ) {
521
- $schedules['prli_cleanup_visitor_locks_interval'] = array(
522
- 'interval' => HOUR_IN_SECONDS,
523
- 'display' => __('Pretty Link Cleanup Visitor Locks', 'pretty-link'),
524
- );
525
 
526
- return $schedules;
527
  }
 
528
  }
529
 
2
 
3
  class PrliLinksController extends PrliBaseController {
4
  public function load_hooks() {
5
+ add_action( 'init', array($this, 'register_post_type'), 0);
6
  add_filter( 'cron_schedules', array($this,'intervals') );
7
  add_action( 'prli_cleanup_visitor_locks_worker', array($this,'cleanup_visitor_locks') );
8
  add_action( 'admin_init', array($this,'maybe_cleanup_visitor_locks') );
9
+ add_action( 'pre_get_posts', array($this, 'set_custom_post_types_admin_order') );
10
+ add_action( 'save_post', array($this, 'save_cpt_link') );
11
+ add_action( 'deleted_post', array($this, 'delete_cpt_link') );
12
+ add_action( 'transition_post_status', array($this, 'transition_cpt_status'), 10, 3 );
13
+ add_action( 'transition_post_status', array($this, 'transition_cpt_status'), 10, 3 );
14
+ add_action( 'wp_ajax_validate_pretty_link', array($this,'ajax_validate_pretty_link') );
15
+ add_action( 'wp_ajax_reset_pretty_link', array($this,'ajax_reset_pretty_link') );
16
+ add_action( 'wp_ajax_prli_quick_create', array($this, 'ajax_quick_create'));
17
+
18
+ // Legacy Groups Filter
19
+ add_action( 'restrict_manage_posts', array($this,'filter_links_by_legacy_groups') );
20
+ add_filter( 'posts_join', array($this,'join_links_to_posts') );
21
+ add_filter( 'posts_where', array($this,'where_links_belong_to_legacy_group') );
22
+
23
+ // Alter Quick Links Menu (subsubsub)
24
+ add_filter( 'views_edit-'.PrliLink::$cpt, array($this,'modify_quick_links') );
25
+
26
+ // Sort links by custom columns
27
+ add_action( 'posts_orderby', array($this, 'custom_link_sort_orderby') );
28
+
29
+ add_action('manage_'.PrliLink::$cpt.'_posts_custom_column', array($this,'custom_columns'), 10, 2);
30
+ add_filter('manage_edit-'.PrliLink::$cpt.'_columns', array($this,'columns'));
31
+ add_filter('manage_edit-'.PrliLink::$cpt.'_sortable_columns', array($this,'sortable_columns'));
32
+
33
+ add_filter('post_row_actions', array($this, 'add_row_actions'), 10, 2);
34
 
35
  if(!($snapshot_timestamp = wp_next_scheduled('prli_cleanup_visitor_locks_worker'))) {
36
  wp_schedule_event( time(), 'prli_cleanup_visitor_locks_interval', 'prli_cleanup_visitor_locks_worker' );
37
  }
38
  }
39
 
40
+ public function register_post_type() {
41
+ $args = array(
42
+ 'labels' => array(
43
+ 'name' => esc_html__('Pretty Links', 'pretty-link'),
44
+ 'singular_name' => esc_html__('Pretty Link', 'pretty-link'),
45
+ 'add_new_item' => esc_html__('Add New Pretty Link', 'pretty-link'),
46
+ 'edit_item' => esc_html__('Edit Pretty Link', 'pretty-link'),
47
+ 'new_item' => esc_html__('New Pretty Link', 'pretty-link'),
48
+ 'view_item' => esc_html__('View Pretty Link', 'pretty-link'),
49
+ 'search_items' => esc_html__('Search Pretty Links', 'pretty-link'),
50
+ 'not_found' => esc_html__('No Pretty Links found', 'pretty-link'),
51
+ 'not_found_in_trash' => esc_html__('No Pretty Links found in Trash', 'pretty-link'),
52
+ 'parent_item_colon' => esc_html__('Parent Pretty Link:', 'pretty-link')
53
+ ),
54
+ 'public' => false,
55
+ 'menu_position' => 55,
56
+ 'show_ui' => true,
57
+ 'show_in_admin_bar' => true,
58
+ 'exclude_from_search' => true,
59
+ 'can_export' => false,
60
+ 'capability_type' => 'page',
61
+ 'hierarchical' => false,
62
+ 'register_meta_box_cb' => array($this, 'add_meta_boxes'),
63
+ 'rewrite' => false,
64
+ 'supports' => array('title')
65
+ );
66
+
67
+ $plp_update = new PrliUpdateController();
68
+
69
+ if($plp_update->is_installed()) {
70
+ $args['taxonomies'] = array(
71
+ PlpLinkCategoriesController::$ctax,
72
+ PlpLinkTagsController::$ctax,
73
+ );
74
  }
 
75
 
76
+ register_post_type( PrliLink::$cpt, $args );
77
+ }
78
 
79
+ /** Ensures that the CPT Links will list properly by post_date DESC */
80
+ public function set_custom_post_types_admin_order($wp_query) {
81
+ if( is_admin() && isset($wp_query->query['post_type']) ) {
82
+ // Get the post type from the query
83
+ $post_type = $wp_query->query['post_type'];
 
84
 
85
+ if( $post_type == PrliLink::$cpt ) {
86
+ $wp_query->set( 'orderby', 'post_date' );
87
+ $wp_query->set( 'order', 'DESC' );
88
+ }
89
+ }
90
  }
91
 
92
+ public function add_meta_boxes() {
93
+ global $post_id, $prli_link;
 
 
94
 
95
+ add_meta_box(
96
+ 'pretty-link-settings',
97
+ esc_html__('Pretty Link Settings', 'pretty-link'),
98
+ array($this, 'link_meta_box'), PrliLink::$cpt,
99
+ 'normal', 'high'
100
+ );
101
+
102
+ remove_meta_box('slugdiv', PrliLink::$cpt, 'normal');
103
  }
104
 
105
+ public function link_meta_box($post, $args) {
106
+ global $prli_link, $pagenow;
107
 
108
+ if($pagenow==='post-new.php') {
109
+ $values = $this->setup_new_vars();
110
+ }
111
+ else {
112
+ $id = $prli_link->get_link_from_cpt($post->ID);
113
+ $link = $prli_link->getOne($id);
114
+ $values = $this->setup_edit_vars($link);
115
  }
116
+ require PRLI_VIEWS_PATH . '/links/form.php';
117
+ }
118
 
119
+ public function setup_new_vars() {
120
+ global $prli_link, $prli_options;
121
 
122
+ $values = array();
123
+ $values['url'] = (isset($_REQUEST['url'])?esc_url_raw(trim(stripslashes($_REQUEST['url']))):'');
124
+ $values['slug'] = (isset($_REQUEST['slug'])?sanitize_text_field(stripslashes($_REQUEST['slug'])):$prli_link->generateValidSlug());
125
+ $values['name'] = (isset($_REQUEST['name'])?sanitize_text_field(stripslashes($_REQUEST['name'])):'');
126
+ $values['description'] = (isset($_REQUEST['description'])?sanitize_textarea_field(stripslashes($_REQUEST['description'])):'');
 
 
 
 
127
 
128
+ $values['track_me'] = ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or (!isset($_REQUEST['track_me']) and $prli_options->link_track_me == '1'));
129
+ $values['nofollow'] = ((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (!isset($_REQUEST['nofollow']) and $prli_options->link_nofollow == '1'));
 
 
 
 
 
130
 
131
+ $values['redirect_type'] = array();
132
+ $values['redirect_type']['307'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '307'))?' selected="selected"':'');
133
+ $values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '302'))?' selected="selected"':'');
134
+ $values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '301'))?' selected="selected"':'');
135
+ $values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'prettybar'))?' selected="selected"':'');
136
+ $values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'cloak'))?' selected="selected"':'');
137
+ $values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'pixel'))?' selected="selected"':'');
138
+ $values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'metarefresh'))?' selected="selected"':'');
139
+ $values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'javascript'))?' selected="selected"':'');
140
+
141
+ $values['groups'] = array();
142
 
143
+ $values['param_forwarding'] = isset($_REQUEST['param_forwarding']);
144
+ $values['delay'] = (isset($_REQUEST['delay']) ? (int) $_REQUEST['delay'] : 0);
145
 
146
+ if(isset($_REQUEST['google_tracking'])) {
147
+ $values['google_tracking'] = true;
148
+ }
149
+ else {
150
+ global $plp_update;
151
+ if( $plp_update->is_installed() ) {
152
+ global $plp_options;
153
+ $values['google_tracking'] = $plp_options->google_tracking?true:false;
154
+ }
155
+ else {
156
+ $values['google_tracking'] = false;
157
+ }
158
  }
159
+
160
+ return $values;
161
  }
162
 
163
+ public function setup_edit_vars($record) {
164
+ global $prli_link, $prli_link_meta;
165
 
166
+ $values = array();
167
+ $values['link_id'] = $record->id;
168
+ $values['url'] = ((isset($_REQUEST['url']) and $record == null)?esc_url_raw(trim(stripslashes($_REQUEST['url']))):stripslashes($record->url));
169
+ $values['slug'] = ((isset($_REQUEST['slug']) and $record == null)?sanitize_text_field(stripslashes($_REQUEST['slug'])):stripslashes($record->slug));
170
+ $values['name'] = ((isset($_REQUEST['name']) and $record == null)?sanitize_text_field(stripslashes($_REQUEST['name'])):stripslashes($record->name));
171
+ $values['description'] = ((isset($_REQUEST['description']) and $record == null)?sanitize_textarea_field(stripslashes($_REQUEST['description'])):stripslashes($record->description));
172
+ $values['track_me'] = ((isset($_REQUEST['track_me']) or $record->track_me) and ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or $record->track_me == 1));
173
+ $values['nofollow'] = ((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (isset($record->nofollow) && $record->nofollow == 1));
174
 
175
+ $values['groups'] = array();
176
 
177
+ $values['param_forwarding'] = (isset($_REQUEST['param_forwarding']) || !(empty($record->param_forwarding) || $record->param_forwarding=='off'));
178
+
179
+ $values['redirect_type'] = array();
180
+ $values['redirect_type']['307'] = ((!isset($_REQUEST['redirect_type']) or (isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (isset($record->redirect_type) and $record->redirect_type == '307'))?' selected="selected"':'');
181
+ $values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (isset($record->redirect_type) and $record->redirect_type == '302'))?' selected="selected"':'');
182
+ $values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (isset($record->redirect_type) and $record->redirect_type == '301'))?' selected="selected"':'');
183
+ $values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (isset($record->redirect_type) and $record->redirect_type == 'prettybar'))?' selected="selected"':'');
184
+ $values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (isset($record->redirect_type) and $record->redirect_type == 'cloak'))?' selected="selected"':'');
185
+ $values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (isset($record->redirect_type) and $record->redirect_type == 'pixel'))?' selected="selected"':'');
186
+ $values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (isset($record->redirect_type) and $record->redirect_type == 'metarefresh'))?' selected="selected"':'');
187
+ $values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (isset($record->redirect_type) and $record->redirect_type == 'javascript'))?' selected="selected"':'');
188
 
189
+ if(isset($_REQUEST['delay'])) {
190
+ $values['delay'] = (int) $_REQUEST['delay'];
 
 
191
  }
192
  else {
193
+ $values['delay'] = $prli_link_meta->get_link_meta($record->id, 'delay', true);
194
+ }
 
195
 
196
+ if(isset($_REQUEST['google_tracking'])) {
197
+ $values['google_tracking'] = true;
198
+ }
199
+ else {
200
+ $values['google_tracking'] = (($prli_link_meta->get_link_meta($record->id, 'google_tracking', true) == 1)?true:false);
201
  }
202
+
203
+ return $values;
204
  }
205
 
206
+ public static function save_cpt_link() {
207
+ global $post, $post_id, $typenow, $prli_link, $prli_group;
208
 
209
+ # Skip ajax
210
+ if(defined('DOING_AJAX')) {
211
+ return $post_id;
212
+ }
213
 
214
+ # Skip non-post requests & non-admin requests
215
+ if(!PrliUtils::is_post_request() || !PrliUtils::is_admin()) {
216
+ return $post_id;
217
+ }
 
218
 
219
+ # Please only run this code when we're dealing with a Link CPT
220
+ if($typenow !== PrliLink::$cpt) {
221
+ return $post_id;
222
+ }
223
 
224
+ # Verify nonce
225
+ if(!wp_verify_nonce(isset($_POST[PrliLink::$nonce_str]) ? $_POST[PrliLink::$nonce_str] : '', PrliLink::$nonce_str . wp_salt())) {
226
+ return $post_id;
227
  }
228
 
229
+ $link_id = isset($_POST['link_id']) ? (int) $_POST['link_id'] : 0;
 
230
 
231
+ $_POST['name'] = $_POST['post_title'];
232
+ $_POST['link_cpt_id'] = $post->ID;
233
 
234
+ if($link_id) {
235
+ $link_id = $prli_link->update( $link_id, $_POST );
 
 
 
236
  }
237
  else {
238
+ $link_id = $prli_link->create( $_POST );
 
 
 
 
 
239
  }
240
+
241
+ do_action('prli_update_link', $link_id);
242
  }
243
 
244
+ public function transition_cpt_status( $new_status, $old_status, $post ) {
245
  global $prli_link;
 
246
 
247
+ if( $new_status != $old_status ) {
248
+ $link_id = $prli_link->get_link_from_cpt($post->ID);
249
 
250
+ if(empty($link_id)) { return; }
 
251
 
252
+ $link = $prli_link->getOne($link_id);
253
 
254
+ if( $new_status == 'publish' ) {
255
+ $prli_link->enable_link($link_id);
256
+ }
257
+ else {
258
+ $prli_link->disable_link($link_id);
259
+ }
260
+ }
261
+ }
262
 
263
+ public static function delete_cpt_link($post_id) {
264
+ global $prli_link;
265
 
266
+ $link_id = $prli_link->get_link_from_cpt($post_id);
 
267
 
268
+ if(empty($link_id)) { return; }
 
 
269
 
270
+ // CPT is already deleted by now so don't try again
271
+ return $prli_link->destroy($link_id, 'dont_delete_cpt');
272
+ }
273
+
274
+ public function maybe_cleanup_visitor_locks() {
275
+ $cleanup = get_transient('prli_cleanup_visitor_locks');
276
+
277
+ if(empty($cleanup)) {
278
+ set_transient('prli_cleanup_visitor_locks', 1, DAY_IN_SECONDS);
279
+ $this->cleanup_visitor_locks();
280
  }
281
  }
282
 
283
+ /** Delete visitor locks so we don't explode the size of peoples' databases */
284
+ public function cleanup_visitor_locks() {
285
+ global $wpdb;
286
 
287
+ //| 1127004 | _transient_timeout_prli_visitor_58b12712690d5 | 1488004892 | no |
288
+ //| 1127005 | _transient_prli_visitor_58b12712690d5 | 58b12712690d5 | no |
289
+
290
+ $q = $wpdb->prepare("
291
+ SELECT option_name
292
+ FROM {$wpdb->options}
293
+ WHERE option_name LIKE %s
294
+ AND option_value < %s
295
+ ORDER BY option_value
296
+ ",
297
+ '_transient_timeout_prli_visitor_%',
298
+ time()
299
+ );
300
+
301
+ $timeouts = $wpdb->get_col($q);
302
+
303
+ foreach($timeouts as $i => $timeout_key) {
304
+ // figure out the transient_key from the timeout_key
305
+ $transient_key = preg_replace(
306
+ '/^_transient_timeout_prli_visitor_/',
307
+ '_transient_prli_visitor_',
308
+ $timeout_key
309
+ );
310
+
311
+ $tq = $wpdb->prepare("
312
+ DELETE FROM {$wpdb->options}
313
+ WHERE option_name IN (%s,%s)
314
+ ",
315
+ $timeout_key,
316
+ $transient_key
317
+ );
318
+
319
+ $res = $wpdb->query($tq);
320
  }
321
+ }
322
+
323
+ public function intervals( $schedules ) {
324
+ $schedules['prli_cleanup_visitor_locks_interval'] = array(
325
+ 'interval' => HOUR_IN_SECONDS,
326
+ 'display' => esc_html__('Pretty Link Cleanup Visitor Locks', 'pretty-link'),
327
+ );
328
 
329
+ return $schedules;
 
 
330
  }
331
 
332
+ public function ajax_validate_pretty_link() {
333
  global $prli_link;
334
 
335
+ check_ajax_referer('validate_pretty_link','security');
336
+
337
+ if(!PrliUtils::is_post_request()) {
338
+ PrliUtils::exit_with_status(403,esc_html__('Forbidden', 'pretty-link'));
339
  }
340
 
341
+ $id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
342
+ $errors = $prli_link->validate($_POST, $id);
 
 
343
 
344
+ $errors = apply_filters('prli_validate_link', $errors);
 
 
 
345
 
346
+ $message = esc_html__('Success!', 'pretty-link');
347
+ if(!empty($errors)) {
348
+ $message = '<div>' . esc_html__('Fix the following errors:', 'pretty-link') . '</div><ul>';
349
+ foreach($errors as $error) {
350
+ $message .= "<li>{$error}</li>";
351
  }
352
+ $message .= '</ul>';
353
+ }
354
 
355
+ $response = array(
356
+ 'valid' => empty($errors),
357
+ 'message' => $message
358
+ );
359
 
360
+ PrliUtils::exit_with_status(200,json_encode($response));
361
+ }
 
362
 
363
+ public function columns($columns) {
364
+ if(isset($_REQUEST['post_status']) && $_REQUEST['post_status'] == 'trash') {
365
+ return $columns;
366
+ }
367
 
368
+ global $plp_update;
369
+
370
+ $categories_label = esc_html__('Categories', 'pretty-link');
371
+ $tags_label = esc_html__('Tags', 'pretty-link');
372
+ $keywords_label = esc_html__('Keywords', 'pretty-link');
373
+
374
+ if ($plp_update->is_installed()) {
375
+ $category_key = 'taxonomy-pretty-link-category';
376
+ $tag_key = 'taxonomy-pretty-link-tag';
377
+ } else {
378
+ $category_key = 'pro-pretty-link-category';
379
+ $tag_key = 'pro-pretty-link-tag';
380
+ $categories_label = $categories_label . ' ' .
381
+ PrliAppHelper::pro_only_feature_indicator(
382
+ 'link-list-categories-column-header',
383
+ __('Pro', 'pretty-link'),
384
+ __('Upgrade to a Pretty Links premium plan to get Link Categories', 'pretty-link')
385
+ );
386
+ $tags_label = $tags_label . ' ' .
387
+ PrliAppHelper::pro_only_feature_indicator(
388
+ 'link-list-tags-column-header',
389
+ __('Pro', 'pretty-link'),
390
+ __('Upgrade to a Pretty Links premium plan to get Link Tags', 'pretty-link')
391
+ );
392
+ $keywords_label = $keywords_label . ' ' .
393
+ PrliAppHelper::pro_only_feature_indicator(
394
+ 'link-list-keywords-column-header',
395
+ __('Pro', 'pretty-link'),
396
+ __('Upgrade to a Pretty Links premium plan to get Keyword Replacements', 'pretty-link')
397
+ );
398
  }
399
+
400
+ $columns = array(
401
+ 'cb' => '<input type="checkbox" />',
402
+ 'settings' => esc_html__('Settings', 'pretty-link'),
403
+ 'title' => esc_html__('Link Title', 'pretty-link'),
404
+ //'slug' => esc_html__('Slug', 'pretty-link'),
405
+ //'target' => esc_html__('Target', 'pretty-link'),
406
+ $category_key => $categories_label,
407
+ $tag_key => $tags_label,
408
+ 'keywords' => $keywords_label,
409
+ 'clicks' => esc_html__('Clicks', 'pretty-link'),
410
+ 'date' => esc_html__('Date', 'pretty-link'),
411
+ 'links' => esc_html__('Pretty Links', 'pretty-link')
412
+ );
413
+
414
+ return $columns;
415
+ }
416
+
417
+ public function sortable_columns($columns) {
418
+ if(isset($_REQUEST['post_status']) && $_REQUEST['post_status'] == 'trash') {
419
+ return $columns;
420
  }
421
+
422
+ $columns['title'] = 'title';
423
+ $columns['slug'] = 'slug';
424
+ $columns['date'] = 'date';
425
+
426
+ return $columns;
427
  }
428
 
429
+ public function custom_columns($column, $post_id) {
430
+ global $prli_link, $prli_blogurl;
431
 
432
+ $link_id = $prli_link->get_link_from_cpt($post_id);
433
+ $link = $prli_link->getOne($link_id, OBJECT, true);
434
 
435
+ // This will happen if the link is trashed
436
+ if(empty($link)) { return $column; }
 
437
 
438
+ $struct = PrliUtils::get_permalink_pre_slug_uri();
439
+ $pretty_link_url = "{$prli_blogurl}{$struct}{$link->slug}";
440
 
441
+ if(!empty($link)) {
442
+ if('settings' == $column) {
443
+ PrliLinksHelper::link_list_icons($link);
444
+ }
445
+ elseif('keywords' == $column) {
446
+ $pro_only = apply_filters(
447
+ 'prli_link_column_keywords',
448
+ '—',
449
+ $link_id
450
+ );
451
+ echo $pro_only;
452
+ }
453
+ elseif('pro-pretty-link-category' == $column) {
454
+ $pro_only = apply_filters(
455
+ 'prli_link_column_categories',
456
+ '—',
457
+ $link_id
458
+ );
459
+ echo $pro_only;
460
+ }
461
+ elseif('pro-pretty-link-tag' == $column) {
462
+ $pro_only = apply_filters(
463
+ 'prli_link_column_tags',
464
+ '—',
465
+ $link_id
466
+ );
467
+ echo $pro_only;
468
+ }
469
+ elseif('clicks' == $column) {
470
+ PrliLinksHelper::link_list_clicks($link);
471
+ }
472
+ elseif('links' == $column) {
473
+ PrliLinksHelper::link_list_url_clipboard($link);
474
+ }
475
+ elseif('slug' == $column) {
476
+ echo esc_html(stripslashes($link->slug));
477
+ }
478
+ elseif('target' == $column) {
479
+ echo esc_url($link->url);
480
+ }
481
  }
482
+ }
483
 
484
+ /**
485
+ * Append row actions to list page
486
+ * @see add_filter('post_row_actions')
487
+ * @param array $actions Current row actions
488
+ * @param WP_Post current Post
489
+ * @return array filtered row actions
490
+ */
491
+ public function add_row_actions($actions, $post) {
492
+ global $prli_link;
493
 
494
+ if($post->post_type === PrliLink::$cpt) {
495
+ $id = $prli_link->get_link_from_cpt($post->ID);
496
+ $link = $prli_link->getOne($id);
 
497
 
498
+ if(empty($link)) { return $actions; }
 
 
 
499
 
500
+ $new_actions = array();
501
+ $new_actions['edit'] = $actions['edit'];
502
+ $new_actions['reset'] = PrliLinksHelper::link_action_reset($link, __('Reset', 'pretty-link'));
503
 
504
+ if( $link->redirect_type !== 'pixel' ) {
505
+ $new_actions['tweet'] = PrliLinksHelper::link_action_tweet($link, __('Tweet', 'pretty-link'));
506
+ $new_actions['email'] = PrliLinksHelper::link_action_email($link, __('Email', 'pretty-link'));
507
+ $new_actions['url'] = PrliLinksHelper::link_action_visit_target($link, __('Target &raquo;', 'pretty-link'));
508
+ $new_actions['pl'] = PrliLinksHelper::link_action_visit_pretty_link($link, __('Pretty Link &raquo;', 'pretty-link'));
509
+ }
510
 
511
+ $plp_update = new PrliUpdateController();
 
512
 
513
+ if($plp_update->is_installed()) {
514
+ global $plp_options, $prli_link_meta;
 
 
515
 
516
+ if ($plp_options->generate_qr_codes) {
517
+ $plp_links_ctrl = new PlpLinksController();
518
+ $new_actions['qr'] = $plp_links_ctrl->qr_code_link($link->id);
519
+ }
520
 
521
+ $dynamic_redirection = $prli_link_meta->get_link_meta($link->id, 'prli_dynamic_redirection', true);
 
 
 
522
 
523
+ if ($dynamic_redirection == 'rotate') {
524
+ $enable_split_test = $prli_link_meta->get_link_meta($link->id, 'prli-enable-split-test', true);
 
 
525
 
526
+ if ($enable_split_test) {
527
+ $new_actions['report'] = sprintf(
528
+ '<a href="%s" title="%s">%s</a>',
529
+ esc_url(admin_url('admin.php?page=plp-reports&action=display-split-test-report&id=') . $link->id),
530
+ esc_attr__('View Split Test Report', 'pretty-link'),
531
+ esc_html__('View Split Test Report', 'pretty-link')
532
+ );
533
+ }
534
+ }
535
  }
536
 
537
+ $new_actions['trash'] = $actions['trash'];
538
+ $actions = $new_actions;
539
  }
540
 
541
+ return $actions;
542
+ }
 
543
 
544
+ public function ajax_reset_pretty_link() {
545
+ global $prli_link;
546
 
547
+ check_ajax_referer('reset_pretty_link','security');
 
 
 
 
 
 
 
 
 
 
 
548
 
549
+ if(!PrliUtils::is_post_request()) {
550
+ PrliUtils::exit_with_status(403,esc_html__('Forbidden', 'pretty-link'));
 
 
 
551
  }
 
 
552
 
553
+ $prli_link->reset( $_POST['id'] );
 
 
 
 
 
 
554
 
555
+ $response = array(
556
+ 'message' => esc_html__("Your Pretty Link was Successfully Reset", 'pretty-link')
 
 
 
 
 
 
 
 
 
 
 
557
  );
558
+
559
+ PrliUtils::exit_with_status(200,json_encode($response));
560
  }
561
 
562
+ public function ajax_quick_create() {
563
+ if (!PrliUtils::is_post_request() || !isset($_POST['url'], $_POST['slug']) || !is_string($_POST['url']) || !is_string($_POST['slug'])) {
564
+ wp_send_json_error(array('message' => __('Bad request', 'pretty-link')));
565
+ }
566
 
567
+ if (!PrliUtils::is_authorized()) {
568
+ wp_send_json_error(array('message' => __('Insufficient permissions', 'pretty-link')));
569
+ }
 
 
570
 
571
+ if (!check_ajax_referer('prli_quick_create', false, false)) {
572
+ wp_send_json_error(array('message' => __('Security check failed', 'pretty-link')));
573
+ }
574
 
575
+ global $prli_link, $prli_options;
 
 
 
 
 
 
 
 
576
 
577
+ $errors = $prli_link->validate($_POST);
578
 
579
+ if (count($errors)) {
580
+ wp_send_json_error(array('message' => $errors[0]));
 
 
 
 
 
 
581
  }
582
 
583
+ $_POST['redirect_type'] = $prli_options->link_redirect_type;
 
584
 
585
+ if ($prli_options->link_track_me) {
586
+ $_POST['track_me'] = 'on';
587
  }
588
+
589
+ if ($prli_options->link_nofollow) {
590
+ $_POST['nofollow'] = 'on';
 
 
 
 
 
 
591
  }
592
 
593
+ $link_id = $prli_link->create($_POST);
594
+ $link = $prli_link->getOne($link_id);
595
 
596
+ if (!$link) {
597
+ wp_send_json_error(array('message' => __('An error occurred creating the link', 'pretty-link')));
598
+ }
599
 
600
+ wp_send_json_success([
601
+ 'redirect' => esc_url_raw(sprintf(admin_url('post.php?post=%d&action=edit'), $link->link_cpt_id))
602
+ ]);
603
+ }
 
 
 
604
 
605
+ /**
606
+ * Filter groups if the user is running the free version of Pretty Links
607
+ *
608
+ * @since 1.1.0
609
+ * @return void
610
+ */
611
+ public function filter_links_by_legacy_groups() {
612
+ global $typenow, $wp_query, $prli_link, $plp_update;
613
 
614
+ if( $typenow == PrliLink::$cpt && !$plp_update->is_installed() ) {
615
+ $groups = $prli_link->get_all_legacy_groups();
616
 
617
+ if(empty($groups)) { return; }
 
 
 
 
 
 
 
 
618
 
619
+ $current_group = 'all';
620
+ if( isset( $_GET['group'] ) && is_numeric( $_GET['group'] ) ) {
621
+ $current_group = (int) $_GET['group']; // Check if option has been selected
622
+ }
 
 
623
 
624
+ ?>
625
+ <select name="group" id="group">
626
+ <option
627
+ value="all"
628
+ <?php selected( 'all', $current_group ); ?>>
629
+ <?php esc_html_e( 'All Groups (Legacy)', 'pretty-link' ); ?>
630
+ </option>
631
+ <?php foreach( $groups as $group ): ?>
632
+ <option
633
+ value="<?php echo esc_attr( $group->id ); ?>"
634
+ <?php selected( $group->id, $current_group ); ?>>
635
+ <?php echo esc_html( stripslashes($group->name) ); ?>
636
+ </option>
637
+ <?php endforeach; ?>
638
+ </select>
639
+ <?php
640
  }
641
+ }
642
+
643
+ // Join for searching link groups
644
+ public function join_links_to_posts($join) {
645
+ global $wp_query, $wpdb, $typenow;
646
+
647
+ if( $typenow == PrliLink::$cpt &&
648
+ ( ( isset($_GET['orderby']) && isset($_GET['order']) ) ||
649
+ empty($wp_query->query_vars['s']) ) ) {
650
+ $join .= "JOIN {$wpdb->prefix}prli_links AS li ON {$wpdb->posts}.ID = li.link_cpt_id ";
651
  }
652
 
653
+ return $join;
654
  }
655
 
656
+ // Where clause for searching link groups
657
+ public function where_links_belong_to_legacy_group( $where ) {
658
+ global $wp_query, $wpdb, $typenow;
659
 
660
+ if( $typenow == PrliLink::$cpt &&
661
+ isset($_GET['group']) &&
662
+ is_numeric($_GET['group']) &&
663
+ empty($wp_query->query_vars['s']) ) {
664
+ // possible because we've already joined the links to posts
665
+ $where .= $wpdb->prepare(" AND li.group_id=%d", (int) $_GET['group']);
666
  }
667
+
668
+ return $where;
669
  }
670
 
671
+ // Only keep the All & Trash quick links
672
+ public function modify_quick_links($views) {
673
+ $view_keys = array_keys($views);
674
+ $keep_keys = array('all','trash');
675
 
676
+ foreach($view_keys as $view_key) {
677
+ if(!in_array($view_key,$keep_keys)) {
678
+ unset($views[$view_key]);
679
+ }
680
+ }
681
 
682
+ return $views;
683
+ }
 
 
 
 
 
 
 
 
684
 
685
+ // Add custom sort orderbys
686
+ public function custom_link_sort_orderby($orderby) {
687
+ global $wp_query, $wpdb, $typenow;
688
 
689
+ if( $typenow == PrliLink::$cpt &&
690
+ isset($_GET['orderby']) && isset($_GET['order']) ) {
 
 
 
 
 
691
 
692
+ $order = strtoupper($_GET['order'])=='ASC' ? 'ASC' : 'DESC';
 
 
 
 
 
 
693
 
694
+ if($_GET['orderby']=='slug') {
695
+ $orderby = "
696
+ li.slug {$order}
697
+ ";
698
+ }
699
+ elseif($_GET['orderby']=='date') {
700
+ $orderby = "
701
+ li.created_at {$order}
702
+ ";
703
+ }
704
+ elseif($_GET['orderby']=='title') {
705
+ $orderby = "
706
+ li.name {$order}
707
+ ";
708
+ }
709
  }
 
 
 
 
 
 
 
710
 
711
+ return $orderby;
712
  }
713
+
714
  }
715
 
app/controllers/PrliLocalApiController.php CHANGED
@@ -30,7 +30,7 @@ class PrliLocalApiController extends PrliBaseController {
30
  *
31
  * @param string $description Optional, description for the Pretty Link.
32
  *
33
- * @param integer $group_id Optional, the group that this link will be placed in.
34
  * If this value isn't set then the link will not be
35
  * placed in a group.
36
  *
@@ -59,7 +59,7 @@ class PrliLocalApiController extends PrliBaseController {
59
  $slug = '',
60
  $name = '',
61
  $description = '',
62
- $group_id = 0,
63
  $track_me = '',
64
  $nofollow = '',
65
  $redirect_type = '',
@@ -75,7 +75,6 @@ class PrliLocalApiController extends PrliBaseController {
75
  $values['slug'] = (($slug == '')?$prli_link->generateValidSlug():$slug);
76
  $values['name'] = $name;
77
  $values['description'] = $description;
78
- $values['group_id'] = $group_id;
79
  $values['redirect_type'] = (($redirect_type == '')?$prli_options->link_redirect_type:$redirect_type);
80
  $values['nofollow'] = (($nofollow === '')?$prli_options->link_nofollow:$nofollow);
81
  $values['track_me'] = (($track_me === '')?$prli_options->link_track_me:$track_me);
@@ -111,7 +110,7 @@ class PrliLocalApiController extends PrliBaseController {
111
  $slug = '',
112
  $name = -1,
113
  $description = -1,
114
- $group_id = '',
115
  $track_me = '',
116
  $nofollow = '',
117
  $redirect_type = '',
@@ -136,12 +135,12 @@ class PrliLocalApiController extends PrliBaseController {
136
  $values['slug'] = (($slug == '')?$record->slug:$slug);
137
  $values['name'] = (($name == -1)?$record->name:$name);
138
  $values['description'] = (($description == -1)?$record->description:$description);
139
- $values['group_id'] = (($group_id === '')?$record->group_id:$group_id);
140
  $values['redirect_type'] = (($redirect_type == '')?$record->redirect_type:$redirect_type);
141
  $values['nofollow'] = (($nofollow === '')?$record->nofollow:$nofollow);
142
  $values['track_me'] = (($track_me === '')?(int)$record->track_me:$track_me);
143
  $values['param_forwarding'] = !empty($param_forwarding);
144
  $values['param_struct'] = (($param_struct == -1)?$record->param_struct:$param_struct);
 
145
 
146
  // make array look like $_POST
147
  if(empty($values['nofollow']) or !$values['nofollow'])
@@ -149,7 +148,7 @@ class PrliLocalApiController extends PrliBaseController {
149
  if(empty($values['track_me']) or !$values['track_me'])
150
  unset($values['track_me']);
151
 
152
- $prli_error_messages = $prli_link->validate( $values );
153
 
154
  if( count($prli_error_messages) == 0 )
155
  {
@@ -166,16 +165,14 @@ class PrliLocalApiController extends PrliBaseController {
166
  }
167
 
168
  /**
169
- * Get all the pretty link groups in an array suitable for creating a select box.
170
  *
171
  * @return bool (false if failure) | array A numerical array of associative arrays
172
  * containing all the data about the pretty
173
  * link groups.
174
  */
175
  public function get_all_groups() {
176
- global $prli_group;
177
- $groups = $prli_group->getAll('',' ORDER BY gr.name', ARRAY_A);
178
- return $groups;
179
  }
180
 
181
  /**
@@ -223,8 +220,11 @@ class PrliLocalApiController extends PrliBaseController {
223
  public function get_pretty_link_url($id) {
224
  global $prli_link,$prli_blogurl;
225
 
226
- if($pretty_link = $prli_link->getOne($id))
227
- return "{$prli_blogurl}".PrliUtils::get_permalink_pre_slug_uri()."{$pretty_link->slug}";
 
 
 
228
 
229
  return false;
230
  }
@@ -245,7 +245,7 @@ function prli_create_pretty_link( $target_url,
245
  $slug = '',
246
  $name = '',
247
  $description = '',
248
- $group_id = 0,
249
  $track_me = '',
250
  $nofollow = '',
251
  $redirect_type = '',
@@ -256,7 +256,7 @@ function prli_create_pretty_link( $target_url,
256
  $slug,
257
  $name,
258
  $description,
259
- $group_id,
260
  $track_me,
261
  $nofollow,
262
  $redirect_type,
@@ -269,7 +269,7 @@ function prli_update_pretty_link( $id,
269
  $slug = '',
270
  $name = -1,
271
  $description = -1,
272
- $group_id = '',
273
  $track_me = '',
274
  $nofollow = '',
275
  $redirect_type = '',
@@ -281,7 +281,7 @@ function prli_update_pretty_link( $id,
281
  $slug,
282
  $name,
283
  $description,
284
- $group_id,
285
  $track_me,
286
  $nofollow,
287
  $redirect_type,
@@ -289,9 +289,9 @@ function prli_update_pretty_link( $id,
289
  $param_struct );
290
  }
291
 
 
292
  function prli_get_all_groups() {
293
- $ctrl = new PrliLocalApiController();
294
- return $ctrl->get_all_groups();
295
  }
296
 
297
  function prli_get_all_links() {
30
  *
31
  * @param string $description Optional, description for the Pretty Link.
32
  *
33
+ * @param integer $group_id DEPRECATED Optional, the group that this link will be placed in.
34
  * If this value isn't set then the link will not be
35
  * placed in a group.
36
  *
59
  $slug = '',
60
  $name = '',
61
  $description = '',
62
+ $group_id = 0, // deprecated
63
  $track_me = '',
64
  $nofollow = '',
65
  $redirect_type = '',
75
  $values['slug'] = (($slug == '')?$prli_link->generateValidSlug():$slug);
76
  $values['name'] = $name;
77
  $values['description'] = $description;
 
78
  $values['redirect_type'] = (($redirect_type == '')?$prli_options->link_redirect_type:$redirect_type);
79
  $values['nofollow'] = (($nofollow === '')?$prli_options->link_nofollow:$nofollow);
80
  $values['track_me'] = (($track_me === '')?$prli_options->link_track_me:$track_me);
110
  $slug = '',
111
  $name = -1,
112
  $description = -1,
113
+ $group_id = '', // deprecated
114
  $track_me = '',
115
  $nofollow = '',
116
  $redirect_type = '',
135
  $values['slug'] = (($slug == '')?$record->slug:$slug);
136
  $values['name'] = (($name == -1)?$record->name:$name);
137
  $values['description'] = (($description == -1)?$record->description:$description);
 
138
  $values['redirect_type'] = (($redirect_type == '')?$record->redirect_type:$redirect_type);
139
  $values['nofollow'] = (($nofollow === '')?$record->nofollow:$nofollow);
140
  $values['track_me'] = (($track_me === '')?(int)$record->track_me:$track_me);
141
  $values['param_forwarding'] = !empty($param_forwarding);
142
  $values['param_struct'] = (($param_struct == -1)?$record->param_struct:$param_struct);
143
+ $values['link_cpt_id'] = $record->link_cpt_id;
144
 
145
  // make array look like $_POST
146
  if(empty($values['nofollow']) or !$values['nofollow'])
148
  if(empty($values['track_me']) or !$values['track_me'])
149
  unset($values['track_me']);
150
 
151
+ $prli_error_messages = $prli_link->validate( $values, $id );
152
 
153
  if( count($prli_error_messages) == 0 )
154
  {
165
  }
166
 
167
  /**
168
+ * DEPRECATED: Get all the pretty link groups in an array suitable for creating a select box.
169
  *
170
  * @return bool (false if failure) | array A numerical array of associative arrays
171
  * containing all the data about the pretty
172
  * link groups.
173
  */
174
  public function get_all_groups() {
175
+ return array();
 
 
176
  }
177
 
178
  /**
220
  public function get_pretty_link_url($id) {
221
  global $prli_link,$prli_blogurl;
222
 
223
+ $pretty_link = $prli_link->getOne($id);
224
+
225
+ if($pretty_link) {
226
+ return $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$pretty_link->slug;
227
+ }
228
 
229
  return false;
230
  }
245
  $slug = '',
246
  $name = '',
247
  $description = '',
248
+ $group_id = 0, // deprecated
249
  $track_me = '',
250
  $nofollow = '',
251
  $redirect_type = '',
256
  $slug,
257
  $name,
258
  $description,
259
+ $group_id, // deprecated
260
  $track_me,
261
  $nofollow,
262
  $redirect_type,
269
  $slug = '',
270
  $name = -1,
271
  $description = -1,
272
+ $group_id = '', // deprecated
273
  $track_me = '',
274
  $nofollow = '',
275
  $redirect_type = '',
281
  $slug,
282
  $name,
283
  $description,
284
+ $group_id, // deprecated
285
  $track_me,
286
  $nofollow,
287
  $redirect_type,
289
  $param_struct );
290
  }
291
 
292
+ /** DEPRECATED **/
293
  function prli_get_all_groups() {
294
+ return array();
 
295
  }
296
 
297
  function prli_get_all_links() {
app/controllers/PrliOnboardingController.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
+
3
+ class PrliOnboardingController extends PrliBaseController {
4
+ public function load_hooks() {
5
+ // must be before PrliAppController::install() to detect a fresh install
6
+ add_action('init', array($this, 'maybe_onboard'), 5);
7
+
8
+ if (is_admin() && (!defined('DOING_AJAX') || !DOING_AJAX)) {
9
+ add_action('wp_loaded', array($this, 'onboarding_intercept'));
10
+ }
11
+ }
12
+
13
+ public function maybe_onboard() {
14
+ if (get_option('prli_version') == PRLI_VERSION) {
15
+ return;
16
+ }
17
+
18
+ if (get_option('prli_db_version')) {
19
+ // existing install
20
+ if ($this->is_major_update()) {
21
+ update_option('prli_onboard', 'update');
22
+ }
23
+ } else {
24
+ // fresh install
25
+ update_option('prli_onboard', 'welcome');
26
+ }
27
+
28
+ update_option('prli_version', PRLI_VERSION);
29
+ }
30
+
31
+ protected function is_major_update() {
32
+ $oldVersion = get_option('prli_version');
33
+
34
+ if (empty($oldVersion)) {
35
+ return true;
36
+ }
37
+
38
+ list($oldMajor, $oldMinor) = explode('.', $oldVersion);
39
+ list($newMajor, $newMinor) = explode('.', PRLI_VERSION);
40
+
41
+ return $newMajor > $oldMajor || ($newMajor == $oldMajor && $newMinor > $oldMinor);
42
+ }
43
+
44
+ public function onboarding_intercept() {
45
+ $onboard = get_option('prli_onboard');
46
+
47
+ if ($onboard == 'welcome' || $onboard == 'update') {
48
+ delete_option('prli_onboard');
49
+ wp_redirect(admin_url("admin.php?page=pretty-link-{$onboard}"));
50
+ exit;
51
+ }
52
+ }
53
+
54
+ public function welcome_route() {
55
+ require_once PRLI_VIEWS_PATH . '/admin/onboarding/welcome.php';
56
+ }
57
+
58
+ public function update_route() {
59
+ require_once PRLI_VIEWS_PATH . '/admin/onboarding/update.php';
60
+ }
61
+ }
app/controllers/PrliOptionsController.php CHANGED
@@ -76,7 +76,7 @@ class PrliOptionsController extends PrliBaseController {
76
  }
77
 
78
  if( !empty($params[ $whitelist_ips ]) && !preg_match( "#^[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*))([ \t]*,[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*)))*$#", $params[ $whitelist_ips ] ) ) {
79
- $errors[] = __('Whitlist IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges.', 'pretty-link');
80
  }
81
 
82
  return apply_filters( 'prli-validate-options', $errors, $params );
@@ -88,15 +88,15 @@ class PrliOptionsController extends PrliBaseController {
88
  extract( $this->opt_fields );
89
 
90
  // Read their posted value
91
- $prli_options->prli_exclude_ips = stripslashes($params[ $prli_exclude_ips ]);
92
- $prli_options->whitelist_ips = stripslashes($params[ $whitelist_ips ]);
93
  $prli_options->filter_robots = (int)isset($params[ $filter_robots ]);
94
- $prli_options->extended_tracking = stripslashes($params[ $extended_tracking ]);
95
  $prli_options->link_track_me = (int)isset($params[ $link_track_me ]);
96
  $prli_options->link_prefix = (int)isset($params[ $link_prefix ]);
97
  $prli_options->auto_trim_clicks = (int)isset($params[ $auto_trim_clicks ]);
98
  $prli_options->link_nofollow = (int)isset($params[ $link_nofollow ]);
99
- $prli_options->link_redirect_type = $params[ $link_redirect_type ];
100
 
101
  do_action('prli-update-options', $params);
102
  }
76
  }
77
 
78
  if( !empty($params[ $whitelist_ips ]) && !preg_match( "#^[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*))([ \t]*,[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*)))*$#", $params[ $whitelist_ips ] ) ) {
79
+ $errors[] = __('Whitelist IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges.', 'pretty-link');
80
  }
81
 
82
  return apply_filters( 'prli-validate-options', $errors, $params );
88
  extract( $this->opt_fields );
89
 
90
  // Read their posted value
91
+ $prli_options->prli_exclude_ips = isset($params[ $prli_exclude_ips ]) && is_string($params[ $prli_exclude_ips ]) ? sanitize_text_field(stripslashes($params[ $prli_exclude_ips ])) : '';
92
+ $prli_options->whitelist_ips = isset($params[ $whitelist_ips ]) && is_string($params[ $whitelist_ips ]) ? sanitize_text_field(stripslashes($params[ $whitelist_ips ])) : '';
93
  $prli_options->filter_robots = (int)isset($params[ $filter_robots ]);
94
+ $prli_options->extended_tracking = isset($params[ $extended_tracking ]) && is_string($params[ $extended_tracking ]) ? sanitize_key(stripslashes($params[ $extended_tracking ])) : 'normal';
95
  $prli_options->link_track_me = (int)isset($params[ $link_track_me ]);
96
  $prli_options->link_prefix = (int)isset($params[ $link_prefix ]);
97
  $prli_options->auto_trim_clicks = (int)isset($params[ $auto_trim_clicks ]);
98
  $prli_options->link_nofollow = (int)isset($params[ $link_nofollow ]);
99
+ $prli_options->link_redirect_type = isset($params[ $link_redirect_type ]) && is_string($params[ $link_redirect_type ]) ? sanitize_key(stripslashes($params[ $link_redirect_type ])) : '307';
100
 
101
  do_action('prli-update-options', $params);
102
  }
app/controllers/PrliPopupController.php CHANGED
@@ -1,29 +1,30 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  class PrliPopupController extends PrliBaseController {
4
- public $popup_css, $popup_js, $popups;
5
-
6
  public function __construct() {
7
- $cdn_base = 'https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/';
8
- $this->popup_css = "{$cdn_base}/magnific-popup.min.css";
9
- $this->popup_js = "{$cdn_base}/jquery.magnific-popup.min.js";
10
-
11
  // This is an array of the currently defined popups ...
12
  // used to validate that the popup specified actually exists
13
  $this->popups = array(
14
  'rating' => array(
15
- 'after_usage' => true,
 
 
 
16
  'user_popup' => true,
17
- 'lite_only_popup' => true,
18
- 'delay' => MONTH_IN_SECONDS,
19
- 'delay_after_last_popup' => WEEK_IN_SECONDS,
20
  ),
21
  'upgrade' => array(
22
- 'after_usage' => true,
 
 
 
23
  'user_popup' => true,
24
  'lite_only_popup' => true,
25
- 'delay' => MONTH_IN_SECONDS,
26
- 'delay_after_last_popup' => WEEK_IN_SECONDS,
27
  ),
28
  );
29
  }
@@ -41,8 +42,8 @@ class PrliPopupController extends PrliBaseController {
41
  }
42
 
43
  public function enqueue_admin_scripts($hook) {
44
- if(strstr($hook, 'pretty-link') !== false) {
45
- wp_register_style('prli-magnific-popup', $this->popup_css);
46
  wp_enqueue_style(
47
  'prli-admin-popup',
48
  PRLI_CSS_URL.'/admin_popup.css',
@@ -50,7 +51,7 @@ class PrliPopupController extends PrliBaseController {
50
  PRLI_VERSION
51
  );
52
 
53
- wp_register_script('prli-magnific-popup', $this->popup_js, array('jquery'));
54
  wp_enqueue_script(
55
  'prli-admin-popup',
56
  PRLI_JS_URL.'/admin_popup.js',
@@ -66,13 +67,16 @@ class PrliPopupController extends PrliBaseController {
66
  }
67
 
68
  private function on_pretty_link_page() {
69
- $screen = get_current_screen();
70
- return (isset($screen->parent_base) && $screen->parent_base=='pretty-link');
71
  }
72
 
73
  public function display_popups() {
74
  if(!$this->on_pretty_link_page()) { return; }
75
 
 
 
 
76
  // If this isn't a Pretty Link authorized user then bail
77
  if(!PrliUtils::is_authorized()) { return; }
78
 
@@ -139,7 +143,7 @@ class PrliPopupController extends PrliBaseController {
139
  }
140
 
141
  private function is_popup_delayed($popup) {
142
- if(!$this->is_valid_popup($popup)) { $return; }
143
 
144
  if($this->popups[$popup]['user_popup']) {
145
  // check if it's been delayed or stopped
@@ -151,7 +155,7 @@ class PrliPopupController extends PrliBaseController {
151
  }
152
 
153
  private function is_popup_stopped($popup) {
154
- if(!$this->is_valid_popup($popup)) { $return; }
155
 
156
  if($this->popups[$popup]['user_popup']) {
157
  $user_id = PrliUtils::get_current_user_id();
@@ -188,19 +192,12 @@ class PrliPopupController extends PrliBaseController {
188
  return false;
189
  }
190
 
191
- if($this->popups[$popup]['after_usage']) {
 
192
  $click_count = PrliClick::get_count();
193
- $first_click_date = PrliClick::get_first_date();
194
  $link_count = PrliLink::get_count();
195
- $first_link_date = PrliClick::get_first_date();
196
-
197
- // Make sure user has been using Pretty Link for at least a month
198
- $month_ago = time() - MONTH_IN_SECONDS;
199
 
200
- if( $click_count < 10 ||
201
- ($first_click_date!==false && strtotime($first_click_date) > $month_ago) ||
202
- $link_count < 3 ||
203
- strtotime($first_link_date) > $month_ago ) {
204
  return false;
205
  }
206
  }
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  class PrliPopupController extends PrliBaseController {
4
+ public $popups;
 
5
  public function __construct() {
 
 
 
 
6
  // This is an array of the currently defined popups ...
7
  // used to validate that the popup specified actually exists
8
  $this->popups = array(
9
  'rating' => array(
10
+ 'after_usage' => array(
11
+ 'links' => 1,
12
+ 'clicks' => 5
13
+ ),
14
  'user_popup' => true,
15
+ 'lite_only_popup' => false,
16
+ 'delay' => WEEK_IN_SECONDS,
17
+ 'delay_after_last_popup' => DAY_IN_SECONDS,
18
  ),
19
  'upgrade' => array(
20
+ 'after_usage' => array(
21
+ 'links' => 3,
22
+ 'clicks' => 5
23
+ ),
24
  'user_popup' => true,
25
  'lite_only_popup' => true,
26
+ 'delay' => 2*WEEK_IN_SECONDS,
27
+ 'delay_after_last_popup' => DAY_IN_SECONDS,
28
  ),
29
  );
30
  }
42
  }
43
 
44
  public function enqueue_admin_scripts($hook) {
45
+ if($this->on_pretty_link_page()) {
46
+ wp_register_style('prli-magnific-popup', PRLI_VENDOR_LIB_URL . '/magnific-popup/magnific-popup.min.css', array(), '1.1.0');
47
  wp_enqueue_style(
48
  'prli-admin-popup',
49
  PRLI_CSS_URL.'/admin_popup.css',
51
  PRLI_VERSION
52
  );
53
 
54
+ wp_register_script('prli-magnific-popup', PRLI_VENDOR_LIB_URL . '/magnific-popup/jquery.magnific-popup.min.js', array('jquery'), '1.1.0', true);
55
  wp_enqueue_script(
56
  'prli-admin-popup',
57
  PRLI_JS_URL.'/admin_popup.js',
67
  }
68
 
69
  private function on_pretty_link_page() {
70
+ global $current_screen;
71
+ return (isset($current_screen->id) && strpos($current_screen->id,'pretty-link') !== false);
72
  }
73
 
74
  public function display_popups() {
75
  if(!$this->on_pretty_link_page()) { return; }
76
 
77
+ // Bail on update/welcome page
78
+ if (isset($_GET['page']) && ($_GET['page'] == 'pretty-link-welcome' || $_GET['page'] == 'pretty-link-update')) { return;}
79
+
80
  // If this isn't a Pretty Link authorized user then bail
81
  if(!PrliUtils::is_authorized()) { return; }
82
 
143
  }
144
 
145
  private function is_popup_delayed($popup) {
146
+ if(!$this->is_valid_popup($popup)) { return; }
147
 
148
  if($this->popups[$popup]['user_popup']) {
149
  // check if it's been delayed or stopped
155
  }
156
 
157
  private function is_popup_stopped($popup) {
158
+ if(!$this->is_valid_popup($popup)) { return; }
159
 
160
  if($this->popups[$popup]['user_popup']) {
161
  $user_id = PrliUtils::get_current_user_id();
192
  return false;
193
  }
194
 
195
+ if(false !== $this->popups[$popup]['after_usage']) {
196
+ $usage = $this->popups[$popup]['after_usage'];
197
  $click_count = PrliClick::get_count();
 
198
  $link_count = PrliLink::get_count();
 
 
 
 
199
 
200
+ if( $click_count < $usage['clicks'] || $link_count < $usage['links'] ) {
 
 
 
201
  return false;
202
  }
203
  }
app/controllers/PrliPostsController.php CHANGED
@@ -58,6 +58,46 @@ class PrliPostsController extends PrliBaseController {
58
  }
59
  }
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  require(PRLI_VIEWS_PATH.'/shared/tinymce_form_popup.php');
62
  die();
63
  }
@@ -69,10 +109,10 @@ class PrliPostsController extends PrliBaseController {
69
  die();
70
  }
71
 
72
- $slug = trim(stripslashes($_POST['slug']));
73
 
74
  //Can't end in a slash
75
- if(substr($slug, -1) == '/' || $slug[0] == '/' || preg_match('/\s/', $slug) || !PrliUtils::slugIsAvailable($slug)) {
76
  echo "false";
77
  die();
78
  }
@@ -97,14 +137,14 @@ class PrliPostsController extends PrliBaseController {
97
 
98
  //Using the local API Yo
99
  $id = prli_create_pretty_link(
100
- stripslashes($_POST['target']),
101
- stripslashes($_POST['slug']),
102
  '', //Name
103
  '', //Desc
104
  0, //Group ID
105
  (int)($_POST['tracking'] == 'enabled'),
106
  (int)($_POST['nofollow'] == 'enabled'),
107
- $_POST['redirect']
108
  );
109
 
110
  if((int)$id > 0) {
@@ -123,8 +163,8 @@ class PrliPostsController extends PrliBaseController {
123
  if(!isset($_GET['term']) || empty($_GET['term'])) { die(''); }
124
 
125
  $return = array();
126
- $term = '%' . rawurldecode(stripslashes($_GET['term'])) . '%';
127
- $q = "SELECT * FROM {$prli_link->table_name} WHERE slug LIKE %s OR name LIKE %s OR url LIKE %s LIMIT 20";
128
  $q = $wpdb->prepare($q, $term, $term, $term);
129
  $results = $wpdb->get_results($q, ARRAY_A);
130
 
@@ -140,13 +180,16 @@ class PrliPostsController extends PrliBaseController {
140
  $alt_name = (strlen($result['name']) > 55)?substr($result['name'], 0, 55).'...':$result['name'];
141
  }
142
 
 
 
143
  $return[] = array(
144
- 'value' => (empty($result['name']))?$result['slug']:$alt_name,
145
- 'slug' => $result['slug'],
146
- 'target' => $result['url'],
147
- 'title' => $result['name'], //Not used currently, but we may want this at some point
148
- 'nofollow' => (int)$result['nofollow']
149
- );
 
150
  }
151
 
152
  die(json_encode($return));
58
  }
59
  }
60
 
61
+ wp_register_style('prli-ui-smoothness', PRLI_VENDOR_LIB_URL.'/jquery-ui/jquery-ui.min.css', array(), '1.11.4');
62
+ wp_register_style('prli-tinymce-popup-form', PRLI_CSS_URL . '/tinymce_form_popup.css', array('prli-ui-smoothness'), PRLI_VERSION);
63
+
64
+ $css = sprintf('.ui-autocomplete-loading {
65
+ background: white url(%s) right center no-repeat;
66
+ }
67
+ .ui-autocomplete {
68
+ max-height: 200px;
69
+ overflow-y: auto;
70
+ overflow-x: hidden;
71
+ width: 510px !important;
72
+ }', esc_url(admin_url('images/wpspin_light.gif')));
73
+
74
+ wp_add_inline_style('prli-tinymce-popup-form', $css);
75
+
76
+ wp_register_script(
77
+ 'prli-tinymce-popup-form',
78
+ PRLI_JS_URL . '/tinymce_form_popup.js',
79
+ array(
80
+ 'jquery',
81
+ 'jquery-ui-core',
82
+ 'jquery-ui-widget',
83
+ 'jquery-ui-position',
84
+ 'jquery-ui-menu',
85
+ 'jquery-ui-autocomplete',
86
+ 'jquery-ui-accordion'
87
+ ),
88
+ PRLI_VERSION,
89
+ true
90
+ );
91
+
92
+ wp_localize_script('prli-tinymce-popup-form', 'prliTinymceL10n', array(
93
+ 'prli_selected_text' => '',
94
+ 'home_url' => $home_url,
95
+ 'default_redirect' => $default_redirect,
96
+ 'default_nofollow' => $default_nofollow,
97
+ 'default_tracking' => $default_tracking,
98
+ 'ajaxurl' => admin_url('admin-ajax.php')
99
+ ));
100
+
101
  require(PRLI_VIEWS_PATH.'/shared/tinymce_form_popup.php');
102
  die();
103
  }
109
  die();
110
  }
111
 
112
+ $slug = sanitize_text_field(stripslashes($_POST['slug']));
113
 
114
  //Can't end in a slash
115
+ if(substr($slug, -1) == '/' || $slug[0] == '/' || preg_match('/\s/', $slug) || is_wp_error(PrliUtils::is_slug_available($slug))) {
116
  echo "false";
117
  die();
118
  }
137
 
138
  //Using the local API Yo
139
  $id = prli_create_pretty_link(
140
+ esc_url_raw(trim(stripslashes($_POST['target']))),
141
+ sanitize_text_field(stripslashes($_POST['slug'])),
142
  '', //Name
143
  '', //Desc
144
  0, //Group ID
145
  (int)($_POST['tracking'] == 'enabled'),
146
  (int)($_POST['nofollow'] == 'enabled'),
147
+ sanitize_key(stripslashes($_POST['redirect']))
148
  );
149
 
150
  if((int)$id > 0) {
163
  if(!isset($_GET['term']) || empty($_GET['term'])) { die(''); }
164
 
165
  $return = array();
166
+ $term = '%' . $wpdb->esc_like(sanitize_text_field(stripslashes($_GET['term']))) . '%';
167
+ $q = "SELECT * FROM {$prli_link->table_name} WHERE link_status='enabled' AND (slug LIKE %s OR name LIKE %s OR url LIKE %s) LIMIT 20";
168
  $q = $wpdb->prepare($q, $term, $term, $term);
169
  $results = $wpdb->get_results($q, ARRAY_A);
170
 
180
  $alt_name = (strlen($result['name']) > 55)?substr($result['name'], 0, 55).'...':$result['name'];
181
  }
182
 
183
+ $pretty_link = prli_get_pretty_link_url($result['id']);
184
+
185
  $return[] = array(
186
+ 'pretty_url' => (empty($pretty_link) ? home_url() : $pretty_link),
187
+ 'value' => (empty($result['name']))?$result['slug']:$alt_name,
188
+ 'slug' => $result['slug'],
189
+ 'target' => $result['url'],
190
+ 'title' => $result['name'], //Not used currently, but we may want this at some point
191
+ 'nofollow' => (int)$result['nofollow']
192
+ );
193
  }
194
 
195
  die(json_encode($return));
app/controllers/PrliReportsController.php CHANGED
@@ -31,7 +31,7 @@ class PrliReportsController extends PrliBaseController {
31
 
32
  $link_id = $params['l'];
33
  $type = $params['type'];
34
- $group = $params['group'];
35
  $show_chart = (!isset($_GET['ip']) and !isset($_GET['vuid']));
36
 
37
  return array(
31
 
32
  $link_id = $params['l'];
33
  $type = $params['type'];
34
+ $group = '';
35
  $show_chart = (!isset($_GET['ip']) and !isset($_GET['vuid']));
36
 
37
  return array(
app/controllers/PrliToolsController.php CHANGED
@@ -45,13 +45,18 @@ class PrliToolsController extends PrliBaseController {
45
  public static function bookmark($target_url) {
46
  global $prli_options, $prli_blogurl, $prli_link, $plp_update;
47
 
48
- $redirect_type = esc_html((isset($_GET['rt']) and $_GET['rt'] != '-1')?$_GET['rt']:'');
49
- $track = esc_html((isset($_GET['trk']) and $_GET['trk'] != '-1')?$_GET['trk']:'');
50
- $group = esc_html((isset($_GET['grp']) and $_GET['grp'] != '-1')?$_GET['grp']:'');
51
 
52
- $result = prli_create_pretty_link( esc_url_raw($target_url, array('http','https')), '', '', '', $group, $track, '', $redirect_type );
53
 
54
  $plink = $prli_link->getOne($result);
 
 
 
 
 
55
  $target_url = $plink->url;
56
  $target_url_title = $plink->name;
57
  $pretty_link = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $plink->slug;
45
  public static function bookmark($target_url) {
46
  global $prli_options, $prli_blogurl, $prli_link, $plp_update;
47
 
48
+ $redirect_type = isset($_GET['rt']) && is_string($_GET['rt']) && $_GET['rt'] != '-1' ? sanitize_key(stripslashes($_GET['rt'])) : '';
49
+ $track = isset($_GET['trk']) && is_numeric($_GET['trk']) && $_GET['trk'] != '-1' ? (int) $_GET['trk'] : '';
50
+ $category = isset($_GET['ct']) && is_numeric($_GET['ct']) && $_GET['ct'] != '-1' ? (int) $_GET['ct'] : '';
51
 
52
+ $result = prli_create_pretty_link( esc_url_raw($target_url, array('http','https')), '', '', '', 0, $track, '', $redirect_type );
53
 
54
  $plink = $prli_link->getOne($result);
55
+
56
+ if ($plp_update->is_installed() && $category) {
57
+ wp_set_object_terms($plink->link_cpt_id, $category, PlpLinkCategoriesController::$ctax);
58
+ }
59
+
60
  $target_url = $plink->url;
61
  $target_url_title = $plink->name;
62
  $pretty_link = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $plink->slug;
app/controllers/PrliUpdateController.php CHANGED
@@ -69,7 +69,7 @@ class PrliUpdateController {
69
 
70
  public function process_form() {
71
  if(!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'],'activation_form')) {
72
- wp_die(_e('Why you creepin\'?', 'pretty-link'));
73
  }
74
 
75
  if(!isset($_POST[$this->mothership_license_str])) {
@@ -172,12 +172,11 @@ class PrliUpdateController {
172
  $this->set_edge_updates(false);
173
 
174
  $message = $act['message'];
175
- $callback = create_function( '', '$message = "'.$message.'"; ' .
176
- 'require(PRLI_VIEWS_PATH."/admin/errors.php");' );
177
  }
178
  catch(Exception $e) {
179
- $callback = create_function( '', '$error = "'.$e->getMessage().'"; ' .
180
- 'require(PRLI_VIEWS_PATH."/admin/update/activation_warning.php");' );
181
  }
182
 
183
  add_action( 'admin_notices', $callback );
@@ -303,7 +302,7 @@ class PrliUpdateController {
303
 
304
  public function queue_button() {
305
  ?>
306
- <a href="<?php echo admin_url('admin.php?page=pretty-link-options&action=queue&_wpnonce=' . wp_create_nonce('PrliUpdateController::manually_queue_update')); ?>" class="button"><?php _e('Check for Update', 'pretty-link')?></a>
307
  <?php
308
  }
309
 
@@ -392,7 +391,7 @@ class PrliUpdateController {
392
  }
393
 
394
  public function enqueue_scripts($hook) {
395
- if($hook == 'pretty-links_page_pretty-link-updates') {
396
  wp_register_style('prli-settings-table', PRLI_CSS_URL.'/settings_table.css', array(), PRLI_VERSION);
397
  wp_enqueue_style('prli-activate-css', PRLI_CSS_URL.'/admin-activate.css', array('prli-settings-table'), PRLI_VERSION);
398
 
69
 
70
  public function process_form() {
71
  if(!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'],'activation_form')) {
72
+ wp_die(__('Why you creepin\'?', 'pretty-link'));
73
  }
74
 
75
  if(!isset($_POST[$this->mothership_license_str])) {
172
  $this->set_edge_updates(false);
173
 
174
  $message = $act['message'];
175
+ $callback = function() use ($message) { require(PRLI_VIEWS_PATH."/admin/errors.php"); };
 
176
  }
177
  catch(Exception $e) {
178
+ $error = $e->getMessage();
179
+ $callback = function() use ($error) { require(PRLI_VIEWS_PATH."/admin/update/activation_warning.php"); };
180
  }
181
 
182
  add_action( 'admin_notices', $callback );
302
 
303
  public function queue_button() {
304
  ?>
305
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-options&action=queue&_wpnonce=' . wp_create_nonce('PrliUpdateController::manually_queue_update'))); ?>" class="button"><?php esc_html_e('Check for Update', 'pretty-link')?></a>
306
  <?php
307
  }
308
 
391
  }
392
 
393
  public function enqueue_scripts($hook) {
394
+ if(preg_match('/_page_pretty-link-updates$/', $hook)) {
395
  wp_register_style('prli-settings-table', PRLI_CSS_URL.'/settings_table.css', array(), PRLI_VERSION);
396
  wp_enqueue_style('prli-activate-css', PRLI_CSS_URL.'/admin-activate.css', array('prli-settings-table'), PRLI_VERSION);
397
 
app/helpers/PrliAppHelper.php CHANGED
@@ -7,7 +7,7 @@ class PrliAppHelper {
7
 
8
  public static function info_tooltip($id, $title, $info) {
9
  ?>
10
- <span id="prli-tooltip-<?php echo $id; ?>" class="prli-tooltip">
11
  <span><i class="pl-icon pl-icon-info-circled pl-16"></i></span>
12
  <span class="prli-data-title prli-hidden"><?php echo $title; ?></span>
13
  <span class="prli-data-info prli-hidden"><?php echo $info; ?></span>
@@ -15,27 +15,17 @@ class PrliAppHelper {
15
  <?php
16
  }
17
 
18
- public static function groups_dropdown( $field_name, $value='', $include_blank=true ) {
19
- ?>
20
- <select name="<?php echo $field_name; ?>">
21
-
22
- <?php if( $include_blank ): ?>
23
- <option value=""><?php _e('None', 'pretty-link'); ?></option>
24
- <?php endif; ?>
25
-
26
- <?php
27
- $groups = prli_get_all_groups();
28
- if(is_array($groups)) {
29
- foreach($groups as $group) {
30
- ?>
31
- <option value="<?php echo $group['id']; ?>" <?php selected($value, $group['id']); ?>><?php echo $group['name']; ?></option>
32
- <?php
33
- }
34
- }
35
- ?>
36
 
37
- </select>
38
- <?php
 
 
 
 
39
  }
40
  }
41
 
7
 
8
  public static function info_tooltip($id, $title, $info) {
9
  ?>
10
+ <span id="prli-tooltip-<?php echo esc_attr($id); ?>" class="prli-tooltip">
11
  <span><i class="pl-icon pl-icon-info-circled pl-16"></i></span>
12
  <span class="prli-data-title prli-hidden"><?php echo $title; ?></span>
13
  <span class="prli-data-info prli-hidden"><?php echo $info; ?></span>
15
  <?php
16
  }
17
 
18
+ public static function pro_only_feature_indicator($feature='', $label=null, $title=null) {
19
+ $feature = esc_url_raw( empty($feature) ? '' : "?{$feature}" );
20
+ $label = esc_html( is_null($label) ? __('Pro', 'pretty-link') : $label );
21
+ $title = esc_attr( is_null($title) ? __('Upgrade to Pro to unlock this feature', 'pretty-link') : $title );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
+ return sprintf(
24
+ '<span class="prli-pro-only-indicator" title="%1$s"><a href="https://prettylinks.com/pl/pro-feature-indicator/upgrade%2$s">%3$s</a></span>',
25
+ $title,
26
+ $feature,
27
+ $label
28
+ );
29
  }
30
  }
31
 
app/helpers/PrliClicksHelper.php CHANGED
@@ -16,7 +16,7 @@ class PrliClicksHelper {
16
 
17
  // Insert search string
18
  if(!empty($search_str)) {
19
- $search_params = explode(' ', esc_html($search_str));
20
 
21
  $first_pass = true;
22
  foreach($search_params as $search_param) {
16
 
17
  // Insert search string
18
  if(!empty($search_str)) {
19
+ $search_params = explode(' ', $search_str);
20
 
21
  $first_pass = true;
22
  foreach($search_params as $search_param) {
app/helpers/PrliLinksHelper.php CHANGED
@@ -2,106 +2,58 @@
2
 
3
  class PrliLinksHelper {
4
 
5
- public static function groups_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
6
- global $prli_group;
7
- $groups = $prli_group->getAll();
8
-
9
- $idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
10
-
11
- ?>
12
- <select id="<?php echo esc_html($idname); ?>" name="<?php echo esc_html($fieldname); ?>" class="<?php echo $classes; ?>">
13
- <?php if( empty($extra_options) ): ?>
14
- <option><?php _e('None', 'pretty-link'); ?>&nbsp;</option>
15
- <?php else:
16
- foreach($extra_options as $exoptkey => $exoptval): ?>
17
- <option value="<?php echo $exoptval; ?>"><?php echo $exoptkey; ?>&nbsp;</option>
18
- <?php endforeach;
19
- endif; ?>
20
- <?php foreach($groups as $group): ?>
21
- <?php $selected = ($value==$group->id)?' selected="selected"':''; ?>
22
- <option value="<?php echo $group->id; ?>"<?php echo $selected; ?>><?php echo $group->name; ?>&nbsp;</option>
23
- <?php endforeach; ?>
24
- </select>
25
- <?php
26
- }
27
-
28
  public static function redirect_type_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
29
  $idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
30
  ?>
31
- <select id="<?php echo $idname; ?>" name="<?php echo $fieldname; ?>" class="<?php echo $classes; ?>">
32
  <?php if( !empty($extra_options) ): ?>
33
  <?php foreach( $extra_options as $exoptkey => $exoptval ): ?>
34
- <option value="<?php echo $exoptval; ?>"><?php echo $exoptkey; ?>&nbsp;</option>
35
  <?php endforeach; ?>
36
  <?php endif; ?>
37
- <option value="307" <?php selected((int)$value,(int)307); ?>><?php _e('307 (Temporary)', 'pretty-link') ?>&nbsp;</option>
38
- <option value="302" <?php selected((int)$value,(int)302); ?>><?php _e('302 (Temporary)', 'pretty-link') ?>&nbsp;</option>
39
- <option value="301" <?php selected((int)$value,(int)301); ?>><?php _e('301 (Permanent)', 'pretty-link') ?>&nbsp;</option>
40
  <?php do_action('prli_redirection_types', array(), $value); ?>
41
  </select>
42
  <?php
43
  }
44
 
45
- public static function bulk_action_dropdown() {
46
- ?>
47
- <div class="prli_bulk_action_dropdown">
48
- <select class="prli_bulk_action">
49
- <option value="-1"><?php _e('Bulk Actions', 'pretty-link'); ?>&nbsp;</option>
50
- <option value="edit"><?php _e('Edit', 'pretty-link'); ?>&nbsp;</option>
51
- <option value="delete"><?php _e('Delete', 'pretty-link'); ?>&nbsp;</option>
52
- </select>
53
- <a href="javascript:" class="prli_bulk_action_apply button button-primary" data-confmsg="<?php _e('Are you sure you want to delete the selected links?', 'pretty-link'); ?>" data-url="<?php echo admin_url('admin.php'); ?>" data-wpnonce="<?php echo wp_create_nonce('prli_bulk_update'); ?>" style="display:inline-block;margin:0;"><?php _e('Apply', 'pretty-link'); ?></a>
54
- </div>
55
- <?php
56
- }
57
-
58
- public static function bulk_action_checkbox_dropdown($input_name, $input_title, $classes='') {
59
- $idname = preg_match('#^.*\[(.*?)\]$#',$input_name,$matches)?$matches[1]:$input_name;
60
- ?>
61
- <div class="bacheck-title"><?php echo $input_title; ?></div>
62
- <select name="<?php echo $input_name; ?>" class="<?php echo $classes; ?>" id="<?php echo $idname; ?>">
63
- <option value="##nochange##"><?php _e('- No Change -', 'pretty-link'); ?>&nbsp;</option>
64
- <option value="off"><?php _e('Off', 'pretty-link'); ?>&nbsp;</option>
65
- <option value="on"><?php _e('On', 'pretty-link'); ?>&nbsp;</option>
66
- </select>
67
- <?php
68
- }
69
-
70
  public static function link_list_icons($link) {
71
  do_action('prli_list_icon',$link->id);
72
 
73
  switch( $link->redirect_type ):
74
  case 'prettybar': ?>
75
- <i title="<?php _e('PrettyBar Redirection', 'pretty-link'); ?>" class="pl-icon-star pl-list-icon"></i><?php
76
  break;
77
  case 'cloak': ?>
78
- <i title="<?php _e('Cloaked Redirection', 'pretty-link'); ?>" class="pl-icon-cloak pl-list-icon"></i><?php
79
  break;
80
  case 'pixel': ?>
81
- <i title="<?php _e('Pixel Tracking Redirection', 'pretty-link'); ?>" class="pl-icon-eye-off pl-list-icon"></i><?php
82
  break;
83
  case 'metarefresh': ?>
84
- <i title="<?php _e('Meta Refresh Redirection', 'pretty-link'); ?>" class="pl-icon-cw pl-list-icon"></i><?php
85
  break;
86
  case 'javascript': ?>
87
- <i title="<?php _e('Javascript Redirection', 'pretty-link'); ?>" class="pl-icon-code pl-list-icon"></i><?php
88
  break;
89
  case '307': ?>
90
- <i title="<?php _e('Temporary (307) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
91
  break;
92
  case '302': /* Using 307 Icon for now */ ?>
93
- <i title="<?php _e('Temporary (302) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
94
  break;
95
  case '301': ?>
96
- <i title="<?php _e('Permanent (301) Redirection', 'pretty-link'); ?>" class="pl-icon-301 pl-list-icon"></i><?php
97
  endswitch;
98
 
99
  if( $link->nofollow ): ?>
100
- <i title="<?php _e('Nofollow Enabled', 'pretty-link'); ?>" class="pl-icon-cancel-circled pl-list-icon"></i><?php
101
  endif;
102
 
103
  if(!empty($link->param_forwarding) && $link->param_forwarding != 'off'): ?>
104
- <i title="<?php _e('Parameter Forwarding Enabled', 'pretty-link'); ?>" class="pl-icon-forward pl-list-icon"></i><?php
105
  endif;
106
 
107
  do_action('prli_list_end_icon',$link);
@@ -112,27 +64,134 @@ class PrliLinksHelper {
112
 
113
  $link_nonce = wp_create_nonce( 'link-actions' );
114
  ?>
115
- <a href="<?php echo admin_url('admin.php?page=pretty-link&action=edit&id=' . $link->id); ?>" title="<?php printf( __('Edit %s', 'pretty-link'), $link->slug ); ?>"><i class="pl-list-icon pl-icon-edit"></i></a>
116
- <a href="<?php echo admin_url("admin.php?page=pretty-link&action=destroy&id={$link->id}&_wpnonce={$link_nonce}"); ?>" onclick="return confirm('<?php printf( __('Are you sure you want to delete your %s Pretty Link? This will delete the Pretty Link and all of the statistical data about it in your database.', 'pretty-link'), $link->name ); ?>');" title="<?php printf( __('Delete %s', 'pretty-link'), $link->slug ); ?>"><i class="pl-list-icon pl-icon-cancel"></i></a>
117
- <a href="<?php echo admin_url("admin.php?page=pretty-link&action=reset&id={$link->id}&_wpnonce={$link_nonce}"); ?>" onclick="return confirm('<?php printf( __('Are you sure you want to reset your %s Pretty Link? This will delete all of the statistical data about this Pretty Link in your database.', 'pretty-link'), $link->name ); ?>');" title="<?php printf( __('Reset %s', 'pretty-link'), $link->name ); ?>"><i class="pl-list-icon pl-icon-reply"></i></a>
118
  <?php
119
  if( $link->track_me and $prli_options->extended_tracking!='count' ):
120
- ?><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&l={$link->id}"); ?>" title="<?php printf( __('View clicks for %s', 'pretty-link'), $link->slug ); ?>"><i class="pl-list-icon pl-icon-chart-line"></i></a><?php
121
  do_action('prli-link-action',$link->id);
122
  endif;
123
 
124
  if( $link->redirect_type != 'pixel' ):
125
- ?><a href="http://twitter.com/home?status=<?php echo $pretty_link_url; ?>" target="_blank" title="<?php printf( __('Post %s to Twitter', 'pretty-link'), $pretty_link_url ); ?>"><i class="pl-list-icon pl-icon-twitter"></i></a>
126
- <a href="mailto:?subject=Pretty Link&body=<?php echo $pretty_link_url; ?>" target="_blank" title="<?php printf( __('Send %s in an Email', 'pretty-link'), $pretty_link_url ); ?>"><i class="pl-list-icon pl-icon-mail"></i></a><?php
127
  endif;
128
  ?>
129
 
130
  <?php if( $link->redirect_type != 'pixel' ): ?>
131
- <a href="<?php echo $link->url; ?>" target="_blank" title="<?php printf( 'Visit Target URL: %s in a New Window', $link->url ); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a>
132
- <a href="<?php echo $pretty_link_url; ?>" target="_blank" title="<?php printf( 'Visit Short URL: %s in a New Window', $pretty_link_url ); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a><?php
133
  endif;
134
 
135
  do_action('prli-special-link-action',$link->id);
136
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  }
138
 
2
 
3
  class PrliLinksHelper {
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  public static function redirect_type_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
6
  $idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
7
  ?>
8
+ <select id="<?php echo esc_attr($idname); ?>" name="<?php echo esc_attr($fieldname); ?>" class="<?php echo esc_attr($classes); ?>">
9
  <?php if( !empty($extra_options) ): ?>
10
  <?php foreach( $extra_options as $exoptkey => $exoptval ): ?>
11
+ <option value="<?php echo esc_attr($exoptval); ?>"><?php echo esc_html($exoptkey); ?>&nbsp;</option>
12
  <?php endforeach; ?>
13
  <?php endif; ?>
14
+ <option value="307" <?php selected((int)$value,(int)307); ?>><?php esc_html_e('307 (Temporary)', 'pretty-link') ?>&nbsp;</option>
15
+ <option value="302" <?php selected((int)$value,(int)302); ?>><?php esc_html_e('302 (Temporary)', 'pretty-link') ?>&nbsp;</option>
16
+ <option value="301" <?php selected((int)$value,(int)301); ?>><?php esc_html_e('301 (Permanent)', 'pretty-link') ?>&nbsp;</option>
17
  <?php do_action('prli_redirection_types', array(), $value); ?>
18
  </select>
19
  <?php
20
  }
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  public static function link_list_icons($link) {
23
  do_action('prli_list_icon',$link->id);
24
 
25
  switch( $link->redirect_type ):
26
  case 'prettybar': ?>
27
+ <i title="<?php esc_attr_e('PrettyBar Redirection', 'pretty-link'); ?>" class="pl-icon-star pl-list-icon"></i><?php
28
  break;
29
  case 'cloak': ?>
30
+ <i title="<?php esc_attr_e('Cloaked Redirection', 'pretty-link'); ?>" class="pl-icon-cloak pl-list-icon"></i><?php
31
  break;
32
  case 'pixel': ?>
33
+ <i title="<?php esc_attr_e('Pixel Tracking Redirection', 'pretty-link'); ?>" class="pl-icon-eye-off pl-list-icon"></i><?php
34
  break;
35
  case 'metarefresh': ?>
36
+ <i title="<?php esc_attr_e('Meta Refresh Redirection', 'pretty-link'); ?>" class="pl-icon-cw pl-list-icon"></i><?php
37
  break;
38
  case 'javascript': ?>
39
+ <i title="<?php esc_attr_e('Javascript Redirection', 'pretty-link'); ?>" class="pl-icon-code pl-list-icon"></i><?php
40
  break;
41
  case '307': ?>
42
+ <i title="<?php esc_attr_e('Temporary (307) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
43
  break;
44
  case '302': /* Using 307 Icon for now */ ?>
45
+ <i title="<?php esc_attr_e('Temporary (302) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
46
  break;
47
  case '301': ?>
48
+ <i title="<?php esc_attr_e('Permanent (301) Redirection', 'pretty-link'); ?>" class="pl-icon-301 pl-list-icon"></i><?php
49
  endswitch;
50
 
51
  if( $link->nofollow ): ?>
52
+ <i title="<?php esc_attr_e('Nofollow Enabled', 'pretty-link'); ?>" class="pl-icon-cancel-circled pl-list-icon"></i><?php
53
  endif;
54
 
55
  if(!empty($link->param_forwarding) && $link->param_forwarding != 'off'): ?>
56
+ <i title="<?php esc_attr_e('Parameter Forwarding Enabled', 'pretty-link'); ?>" class="pl-icon-forward pl-list-icon"></i><?php
57
  endif;
58
 
59
  do_action('prli_list_end_icon',$link);
64
 
65
  $link_nonce = wp_create_nonce( 'link-actions' );
66
  ?>
67
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link&action=edit&id=' . $link->id)); ?>" title="<?php echo esc_html(sprintf(__('Edit %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-edit"></i></a>
68
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&action=destroy&id={$link->id}&_wpnonce={$link_nonce}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to delete your %s Pretty Link? This will delete the Pretty Link and all of the statistical data about it in your database.', 'pretty-link'), $link->name)); ?>');" title="<?php echo esc_attr(sprintf(__('Delete %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-cancel"></i></a>
69
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&action=reset&id={$link->id}&_wpnonce={$link_nonce}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to reset your %s Pretty Link? This will delete all of the statistical data about this Pretty Link in your database.', 'pretty-link'), $link->name)); ?>');" title="<?php echo esc_attr(sprintf(__('Reset %s', 'pretty-link'), $link->name)); ?>"><i class="pl-list-icon pl-icon-reply"></i></a>
70
  <?php
71
  if( $link->track_me and $prli_options->extended_tracking!='count' ):
72
+ ?><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&l={$link->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View clicks for %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-chart-line"></i></a><?php
73
  do_action('prli-link-action',$link->id);
74
  endif;
75
 
76
  if( $link->redirect_type != 'pixel' ):
77
+ ?><a href="<?php echo esc_url('https://twitter.com/intent/tweet?url=' . urlencode($pretty_link_url)); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Post %s to Twitter', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-list-icon pl-icon-twitter"></i></a>
78
+ <a href="<?php echo esc_url('mailto:?subject=Pretty Link&body=' . urlencode($pretty_link_url)); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Send %s in an Email', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-list-icon pl-icon-mail"></i></a><?php
79
  endif;
80
  ?>
81
 
82
  <?php if( $link->redirect_type != 'pixel' ): ?>
83
+ <a href="<?php echo esc_url($link->url); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Visit Target URL: %s in a New Window', 'pretty-link'), $link->url)); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a>
84
+ <a href="<?php echo esc_url($pretty_link_url); ?>" target="_blank" title="<?php echo esc_attr(sprintf( __('Visit Short URL: %s in a New Window', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a><?php
85
  endif;
86
 
87
  do_action('prli-special-link-action',$link->id);
88
  }
89
+
90
+ public static function link_list_clicks($link) {
91
+ global $prli_options;
92
+
93
+ if($link->track_me) {
94
+ $clicks = ( empty($link->clicks) ? 0 : $link->clicks );
95
+ $uniques = ( empty($link->uniques) ? 0 : $link->uniques );
96
+ $click_str = "{$clicks}/{$uniques}";
97
+
98
+ if($prli_options->extended_tracking !== 'count') {
99
+ ?>
100
+ <a href="<?php echo esc_url(admin_url( "admin.php?page=pretty-link-clicks&l={$link->id}" )); ?>"
101
+ id="link_clicks_<?php echo esc_attr($link->id); ?>"
102
+ title="<?php echo esc_attr(sprintf(__('%d Clicks / %d Uniques', 'pretty-link'), $clicks, $uniques)); ?>"><?php echo esc_html($click_str); ?></a>
103
+ <?php
104
+ }
105
+ else {
106
+ echo esc_html($click_str);
107
+ }
108
+ }
109
+ else {
110
+ ?>
111
+ <img src="<?php echo PRLI_IMAGES_URL.'/not_tracking.png'; ?>" title="<?php esc_attr_e('This link isn\'t being tracked', 'pretty-link'); ?>" />
112
+ <?php
113
+ }
114
+ }
115
+
116
+ public static function link_list_url_clipboard($link) {
117
+ global $prli_link;
118
+
119
+ $pretty_link_url = $prli_link->get_pretty_link_url($link->slug, true);
120
+
121
+ ?>
122
+ <input type='text'
123
+ readonly="true"
124
+ style="width: 65%;"
125
+ onclick='this.select();'
126
+ onfocus='this.select();'
127
+ value="<?php echo esc_attr($pretty_link_url); ?>" />
128
+ <span class="list-clipboard prli-clipboard">
129
+ <i class="pl-icon-clipboard pl-list-icon icon-clipboardjs"
130
+ data-clipboard-text="<?php echo esc_url($pretty_link_url); ?>"></i>
131
+ </span>
132
+ <?php if( 0 ): // $link->redirect_type !== 'pixel' ): ?>
133
+ <div style="font-size: 8px;"
134
+ title="<?php echo esc_url($link->url); ?>">
135
+ <strong><?php esc_html_e('Target URL:', 'pretty-link'); ?></strong>
136
+ <?php echo esc_html(substr($link->url,0,47) . ((strlen($link->url) >= 47)?'...':'')); ?>
137
+ </div>
138
+ <?php endif;
139
+ }
140
+
141
+ public static function link_action_reset($link, $title) {
142
+ ob_start();
143
+ ?>
144
+ <a href=""
145
+ data-id="<?php echo esc_attr($link->id); ?>"
146
+ class="prli_reset_pretty_link"
147
+ title="<?php echo esc_attr(sprintf( __('Reset %s', 'pretty-link'), $link->name )); ?>"><?php echo esc_html($title); ?></a>
148
+ <?php
149
+
150
+ return ob_get_clean();
151
+ }
152
+
153
+ public static function link_action_tweet($link, $title) {
154
+ ob_start();
155
+ ?>
156
+ <a href="<?php echo esc_url('https://twitter.com/intent/tweet?url=' . urlencode($link->pretty_url)); ?>"
157
+ target="_blank"
158
+ title="<?php echo esc_attr(sprintf( __('Post %s to Twitter', 'pretty-link'), $link->pretty_url )); ?>"><?php echo esc_html($title); ?></a>
159
+ <?php
160
+
161
+ return ob_get_clean();
162
+ }
163
+
164
+ public static function link_action_email($link, $title) {
165
+ ob_start();
166
+ ?>
167
+ <a href="<?php echo esc_url('mailto:?subject=' . rawurlencode(__('Pretty Link', 'pretty-link')) . '&body=' . rawurlencode($link->pretty_url)); ?>"
168
+ target="_blank"
169
+ title="<?php echo esc_attr(sprintf( __('Send %s in an Email', 'pretty-link'), $link->pretty_url )); ?>"><?php echo esc_html($title); ?></a>
170
+ <?php
171
+
172
+ return ob_get_clean();
173
+ }
174
+
175
+ public static function link_action_visit_target($link, $title) {
176
+ ob_start();
177
+ ?>
178
+ <a href="<?php echo esc_url($link->url); ?>"
179
+ target="_blank"
180
+ title="<?php echo esc_attr(sprintf(__('Visit Target URL: %s in a New Window', 'pretty-link'), $link->url)); ?>"><?php echo esc_html($title); ?></a>
181
+ <?php
182
+
183
+ return ob_get_clean();
184
+ }
185
+
186
+ public static function link_action_visit_pretty_link($link, $title) {
187
+ ob_start();
188
+ ?>
189
+ <a href="<?php echo esc_url($link->pretty_url); ?>"
190
+ target="_blank"
191
+ title="<?php echo esc_attr(sprintf(__('Visit Short URL: %s in a New Window', 'pretty-link'), $link->pretty_url)); ?>"><?php echo esc_html($title); ?></a>
192
+ <?php
193
+
194
+ return ob_get_clean();
195
+ }
196
  }
197
 
app/models/PrliClick.php CHANGED
@@ -231,12 +231,9 @@ class PrliClick {
231
  }
232
 
233
  public function setupClickLineGraph($start_timestamp, $end_timestamp, $link_id = "all", $type = "all", $group = '', $title_only = false) {
234
- global $wpdb, $prli_utils, $prli_link, $prli_group;
235
 
236
- if(!empty($group)) {
237
- $link_slug = sprintf(__("group: '%s'", 'pretty-link'),$wpdb->get_var($wpdb->prepare("SELECT name FROM {$prli_group->table_name} WHERE id = %d", $group)));
238
- }
239
- else if($link_id == 'all') {
240
  $link_slug = __('all links', 'pretty-link');
241
  }
242
  else {
@@ -268,17 +265,17 @@ class PrliClick {
268
  // Set defaults and grab get or post of each possible param
269
  public function get_params_array() {
270
  $values = array(
271
- 'paged' => (isset($_GET['paged'])?$_GET['paged']:(isset($_POST['paged'])?$_POST['paged']:1)),
272
  'l' => (isset($_GET['l'])?(int)$_GET['l']:(isset($_POST['l'])?(int)$_POST['l']:'all')),
273
- 'group' => (isset($_GET['group'])?$_GET['group']:(isset($_POST['group'])?$_POST['group']:'')),
274
- 'ip' => (isset($_GET['ip'])?$_GET['ip']:(isset($_POST['ip'])?$_POST['ip']:'')),
275
- 'vuid' => (isset($_GET['vuid'])?$_GET['vuid']:(isset($_POST['vuid'])?$_POST['vuid']:'')),
276
- 'sdate' => (isset($_GET['sdate'])?$_GET['sdate']:(isset($_POST['sdate'])?$_POST['sdate']:'')),
277
- 'edate' => (isset($_GET['edate'])?$_GET['edate']:(isset($_POST['edate'])?$_POST['edate']:'')),
278
- 'type' => (isset($_GET['type'])?$_GET['type']:(isset($_POST['type'])?$_POST['type']:'all')),
279
- 'search' => (isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:'')),
280
- 'sort' => (isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:'')),
281
- 'sdir' => (isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:''))
282
  );
283
 
284
  return $values;
231
  }
232
 
233
  public function setupClickLineGraph($start_timestamp, $end_timestamp, $link_id = "all", $type = "all", $group = '', $title_only = false) {
234
+ global $wpdb, $prli_utils, $prli_link;
235
 
236
+ if($link_id == 'all') {
 
 
 
237
  $link_slug = __('all links', 'pretty-link');
238
  }
239
  else {
265
  // Set defaults and grab get or post of each possible param
266
  public function get_params_array() {
267
  $values = array(
268
+ 'paged' => (isset($_GET['paged'])?(int)$_GET['paged']:(isset($_POST['paged'])?(int)$_POST['paged']:1)),
269
  'l' => (isset($_GET['l'])?(int)$_GET['l']:(isset($_POST['l'])?(int)$_POST['l']:'all')),
270
+ 'group' => (isset($_GET['group'])?(int)$_GET['group']:(isset($_POST['group'])?(int)$_POST['group']:'')),
271
+ 'ip' => sanitize_text_field(stripslashes(isset($_GET['ip'])?$_GET['ip']:(isset($_POST['ip'])?$_POST['ip']:''))),
272
+ 'vuid' => sanitize_key(stripslashes(isset($_GET['vuid'])?$_GET['vuid']:(isset($_POST['vuid'])?$_POST['vuid']:''))),
273
+ 'sdate' => sanitize_text_field(stripslashes(isset($_GET['sdate'])?$_GET['sdate']:(isset($_POST['sdate'])?$_POST['sdate']:''))),
274
+ 'edate' => sanitize_text_field(stripslashes(isset($_GET['edate'])?$_GET['edate']:(isset($_POST['edate'])?$_POST['edate']:''))),
275
+ 'type' => sanitize_text_field(stripslashes(isset($_GET['type'])?$_GET['type']:(isset($_POST['type'])?$_POST['type']:'all'))),
276
+ 'search' => sanitize_text_field(stripslashes(isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:''))),
277
+ 'sort' => sanitize_key(stripslashes(isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:''))),
278
+ 'sdir' => sanitize_key(stripslashes(isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:'')))
279
  );
280
 
281
  return $values;
app/models/PrliDb.php CHANGED
@@ -26,6 +26,10 @@ class PrliDb {
26
  public function prli_install() {
27
  global $wpdb, $prli_utils, $plp_update, $prli_db_version;
28
 
 
 
 
 
29
  // This was introduced in WordPress 3.5
30
  // $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
31
  $char_col = "";
@@ -47,9 +51,6 @@ class PrliDb {
47
 
48
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
49
 
50
- //Fix for large indexes
51
- $wpdb->query("SET GLOBAL innodb_large_prefix=1");
52
-
53
  /* Create/Upgrade Clicks (Clicks) Table */
54
  $sql = "CREATE TABLE {$this->clicks} (
55
  id int(11) NOT NULL auto_increment,
@@ -68,14 +69,14 @@ class PrliDb {
68
  vuid varchar(25) default NULL,
69
  PRIMARY KEY (id),
70
  KEY link_id (link_id),
71
- KEY ip (ip),
72
- KEY browser (browser),
73
- KEY btype (btype),
74
- KEY bversion (bversion),
75
- KEY os (os),
76
- KEY referer (referer),
77
- KEY host (host),
78
- KEY uri (uri),
79
  KEY robot (robot),
80
  KEY first_click (first_click),
81
  KEY vuid (vuid)".
@@ -97,37 +98,26 @@ class PrliDb {
97
  param_forwarding varchar(255) default NULL,
98
  param_struct varchar(255) default NULL,
99
  redirect_type varchar(255) default '307',
 
100
  created_at datetime NOT NULL,
101
  updated_at datetime default NULL,
102
  group_id int(11) default NULL,
 
103
  PRIMARY KEY (id),
 
104
  KEY group_id (group_id),
105
- KEY name (name),
106
  KEY nofollow (nofollow),
107
  KEY track_me (track_me),
108
- KEY param_forwarding (param_forwarding),
109
- KEY param_struct (param_struct),
110
- KEY redirect_type (redirect_type),
111
- KEY slug (slug),
112
  KEY created_at (created_at),
113
  KEY updated_at (updated_at)
114
  ) {$char_col};";
115
 
116
  dbDelta($sql);
117
 
118
- /* Create/Upgrade Groups Table */
119
- $sql = "CREATE TABLE {$this->groups} (
120
- id int(11) NOT NULL auto_increment,
121
- name varchar(255) default NULL,
122
- description text default NULL,
123
- created_at datetime NOT NULL,
124
- PRIMARY KEY (id),
125
- KEY name (name)
126
- ) {$char_col};";
127
-
128
- dbDelta($sql);
129
-
130
- /* Create/Upgrade Groups Table */
131
  $sql = "CREATE TABLE {$this->linkmeta} (
132
  id int(11) NOT NULL auto_increment,
133
  meta_key varchar(255) default NULL,
@@ -136,7 +126,7 @@ class PrliDb {
136
  link_id int(11) NOT NULL,
137
  created_at datetime NOT NULL,
138
  PRIMARY KEY (id),
139
- KEY meta_key (meta_key),
140
  KEY link_id (link_id)
141
  ) {$char_col};";
142
 
@@ -154,4 +144,11 @@ class PrliDb {
154
  /***** SAVE DB VERSION *****/
155
  update_option('prli_db_version', $prli_db_version);
156
  }
 
 
 
 
 
 
 
157
  }
26
  public function prli_install() {
27
  global $wpdb, $prli_utils, $plp_update, $prli_db_version;
28
 
29
+ $wpdb->query('SET SQL_BIG_SELECTS=1'); //This may be getting set back to 0 when SET MAX_JOIN_SIZE is executed
30
+ $wpdb->query('SET MAX_JOIN_SIZE=18446744073709551615');
31
+ //$wpdb->query('SET GLOBAL innodb_large_prefix=1'); //Will fail on some installs without proper privileges still
32
+
33
  // This was introduced in WordPress 3.5
34
  // $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
35
  $char_col = "";
51
 
52
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
53
 
 
 
 
54
  /* Create/Upgrade Clicks (Clicks) Table */
55
  $sql = "CREATE TABLE {$this->clicks} (
56
  id int(11) NOT NULL auto_increment,
69
  vuid varchar(25) default NULL,
70
  PRIMARY KEY (id),
71
  KEY link_id (link_id),
72
+ KEY ip (ip(191)),
73
+ KEY browser (browser(191)),
74
+ KEY btype (btype(191)),
75
+ KEY bversion (bversion(191)),
76
+ KEY os (os(191)),
77
+ KEY referer (referer(191)),
78
+ KEY host (host(191)),
79
+ KEY uri (uri(191)),
80
  KEY robot (robot),
81
  KEY first_click (first_click),
82
  KEY vuid (vuid)".
98
  param_forwarding varchar(255) default NULL,
99
  param_struct varchar(255) default NULL,
100
  redirect_type varchar(255) default '307',
101
+ link_status varchar(64) default 'enabled',
102
  created_at datetime NOT NULL,
103
  updated_at datetime default NULL,
104
  group_id int(11) default NULL,
105
+ link_cpt_id int(11) default 0,
106
  PRIMARY KEY (id),
107
+ KEY link_cpt_id (link_cpt_id),
108
  KEY group_id (group_id),
109
+ KEY link_status (link_status),
110
  KEY nofollow (nofollow),
111
  KEY track_me (track_me),
112
+ KEY param_forwarding (param_forwarding(191)),
113
+ KEY redirect_type (redirect_type(191)),
114
+ KEY slug (slug(191)),
 
115
  KEY created_at (created_at),
116
  KEY updated_at (updated_at)
117
  ) {$char_col};";
118
 
119
  dbDelta($sql);
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  $sql = "CREATE TABLE {$this->linkmeta} (
122
  id int(11) NOT NULL auto_increment,
123
  meta_key varchar(255) default NULL,
126
  link_id int(11) NOT NULL,
127
  created_at datetime NOT NULL,
128
  PRIMARY KEY (id),
129
+ KEY meta_key (meta_key(191)),
130
  KEY link_id (link_id)
131
  ) {$char_col};";
132
 
144
  /***** SAVE DB VERSION *****/
145
  update_option('prli_db_version', $prli_db_version);
146
  }
147
+
148
+ public function table_exists($table) {
149
+ global $wpdb;
150
+ $q = $wpdb->prepare('SHOW TABLES LIKE %s', $table);
151
+ $table_res = $wpdb->get_var($q);
152
+ return (strtolower($table_res) == strtolower($table));
153
+ }
154
  }
app/models/PrliGroup.php CHANGED
@@ -26,26 +26,21 @@ class PrliGroup
26
  {
27
  global $wpdb;
28
 
29
- $query = 'UPDATE ' . $this->table_name .
30
- ' SET name=\'' . $values['name'] . '\', ' .
31
- ' description=\'' . $values['description'] . '\' ' .
32
- ' WHERE id='.$id;
33
  $query_results = $wpdb->query($query);
34
  return $query_results;
35
  }
36
 
37
  public function destroy( $id )
38
  {
39
- //require_once(PRLI_MODELS_PATH.'/models.inc.php');
40
  global $wpdb, $prli_link;
41
 
42
  // Disconnect the links from this group
43
- $query = 'UPDATE ' . $prli_link->table_name .
44
- ' SET group_id = NULL ' .
45
- ' WHERE group_id='.$id;
46
- $query_results = $wpdb->query($query);
47
 
48
- $destroy = 'DELETE FROM ' . $this->table_name . ' WHERE id=' . $id;
49
  return $wpdb->query($destroy);
50
  }
51
 
@@ -98,13 +93,13 @@ class PrliGroup
98
  public function get_params_array()
99
  {
100
  $values = array(
101
- 'action' => (isset($_GET['action'])?$_GET['action']:(isset($_POST['action'])?$_POST['action']:'list')),
102
- 'id' => (isset($_GET['id'])?$_GET['id']:(isset($_POST['id'])?$_POST['id']:'')),
103
- 'paged' => (isset($_GET['paged'])?$_GET['paged']:(isset($_POST['paged'])?$_POST['paged']:1)),
104
- 'group' => (isset($_GET['group'])?$_GET['group']:(isset($_POST['group'])?$_POST['group']:'')),
105
- 'search' => (isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:'')),
106
- 'sort' => (isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:'')),
107
- 'sdir' => (isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:''))
108
  );
109
 
110
  return $values;
@@ -116,7 +111,7 @@ class PrliGroup
116
 
117
  $errors = array();
118
  if( empty($values['name']) )
119
- $errors[] = "Group must have a name.";
120
 
121
  return $errors;
122
  }
26
  {
27
  global $wpdb;
28
 
29
+ $query = "UPDATE {$this->table_name} SET name = %s, description = %s WHERE id = %d";
30
+ $query = $wpdb->prepare($query, $values['name'], $values['description'], $id);
 
 
31
  $query_results = $wpdb->query($query);
32
  return $query_results;
33
  }
34
 
35
  public function destroy( $id )
36
  {
 
37
  global $wpdb, $prli_link;
38
 
39
  // Disconnect the links from this group
40
+ $query = $wpdb->prepare("UPDATE {$prli_link->table_name} SET group_id = NULL WHERE group_id = %d", $id);
41
+ $wpdb->query($query);
 
 
42
 
43
+ $destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id = %d", $id);
44
  return $wpdb->query($destroy);
45
  }
46
 
93
  public function get_params_array()
94
  {
95
  $values = array(
96
+ 'action' => sanitize_key(stripslashes(isset($_GET['action'])?$_GET['action']:(isset($_POST['action'])?$_POST['action']:'list'))),
97
+ 'id' => (isset($_GET['id'])?(int)$_GET['id']:(isset($_POST['id'])?(int)$_POST['id']:'')),
98
+ 'paged' => (isset($_GET['paged'])?(int)$_GET['paged']:(isset($_POST['paged'])?(int)$_POST['paged']:1)),
99
+ 'group' => (isset($_GET['group'])?(int)$_GET['group']:(isset($_POST['group'])?(int)$_POST['group']:'')),
100
+ 'search' => sanitize_text_field(stripslashes(isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:''))),
101
+ 'sort' => sanitize_key(stripslashes(isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:''))),
102
+ 'sdir' => sanitize_key(stripslashes(isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:'')))
103
  );
104
 
105
  return $values;
111
 
112
  $errors = array();
113
  if( empty($values['name']) )
114
+ $errors[] = __('Group must have a name.', 'pretty-link');
115
 
116
  return $errors;
117
  }
app/models/PrliLink.php CHANGED
@@ -3,6 +3,8 @@ if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.')
3
 
4
  class PrliLink {
5
  public $table_name;
 
 
6
 
7
  public function __construct() {
8
  global $wpdb;
@@ -11,62 +13,50 @@ class PrliLink {
11
 
12
  public static function get_count() {
13
  global $wpdb, $prli_link;
14
- $q = "SELECT COUNT(*) FROM {$prli_link->table_name}";
15
  return $wpdb->get_var($q);
16
  }
17
 
18
  public static function get_first_date() {
19
  global $wpdb, $prli_link;
20
- $q = "SELECT min(created_at) FROM {$prli_link->table_name}";
21
  return $wpdb->get_var($q);
22
  }
23
 
24
  public function create( $values ) {
25
  global $wpdb, $prli_link_meta;
26
 
27
- $now = date('Y-m-d H:i:s');
28
 
29
- if($values['redirect_type'] == 'pixel') {
30
- $values['name'] = (!empty($values['name'])?$values['name']:$values['slug']);
31
- }
32
- else {
33
- $values['name'] = (!empty($values['name'])?$values['name']:PrliUtils::get_page_title($values['url'],$values['slug']));
 
 
 
 
 
 
 
34
  }
35
 
36
- // We no longer handle this: 'param_struct,'.
37
- $query_str = "
38
- INSERT INTO {$this->table_name} (
39
- url,
40
- slug,
41
- name,
42
- param_forwarding,
43
- redirect_type,
44
- description,
45
- track_me,
46
- nofollow,
47
- group_id,
48
- created_at,
49
- updated_at
50
- )
51
- VALUES (%s,%s,%s,%s,%s,%s,%d,%d,%d,%s,%s)
52
- ";
53
 
54
- $query = $wpdb->prepare(
55
- $query_str,
56
- $values['url'],
57
- $values['slug'],
58
- $values['name'],
59
- (isset($values['param_forwarding']) && !empty($values['param_forwarding']))?1:0,
60
- // We no longer handle this: $values['param_struct'],
61
- $values['redirect_type'],
62
- $values['description'],
63
- (isset($values['track_me']) && !empty($values['track_me']))?1:0,
64
- (isset($values['nofollow']) && !empty($values['nofollow']))?1:0,
65
- (isset($values['group_id'])?(int)$values['group_id']:'NULL'),
66
- $now, $now
67
- );
68
 
69
- $query_results = $wpdb->query($query);
70
 
71
  $link_id = ($query_results ? $wpdb->insert_id : false);
72
 
@@ -75,129 +65,99 @@ class PrliLink {
75
  $prli_link_meta->update_link_meta($link_id, 'delay', 0);
76
  }
77
 
 
 
 
 
78
  do_action('prli-create-link', $link_id, $values);
79
 
80
  return $link_id;
81
  }
82
 
83
  public function update( $id, $values ) {
84
- global $wpdb;
85
 
86
- $now = date('Y-m-d H:i:s');
87
 
88
- if($values['redirect_type'] == 'pixel') {
89
- $values['name'] = (!empty($values['name'])?$values['name']:$values['slug']);
90
- }
91
- else {
92
- $values['name'] = (!empty($values['name'])?$values['name']:PrliUtils::get_page_title($values['url'],$values['slug']));
93
- }
94
 
95
- // 'param_struct=%s, ' .
96
- $query_str = "
97
- UPDATE {$this->table_name}
98
- SET url=%s,
99
- slug=%s,
100
- name=%s,
101
- param_forwarding=%s,
102
- redirect_type=%s,
103
- description=%s,
104
- track_me=%d,
105
- nofollow=%d,
106
- group_id=%d,
107
- updated_at=%s
108
- WHERE id=%d
109
- ";
110
 
111
- // isset($values['param_struct'])?$values['param_struct']:'',
112
- $query = $wpdb->prepare(
113
- $query_str,
114
- isset($values['url'])?$values['url']:'',
115
- isset($values['slug'])?$values['slug']:'',
116
- isset($values['name'])?$values['name']:'',
117
- (isset($values['param_forwarding']) && !empty($values['param_forwarding']))?1:0,
118
- isset($values['redirect_type'])?$values['redirect_type']:'',
119
- isset($values['description'])?$values['description']:'',
120
- (isset($values['track_me']) && !empty($values['track_me']))?1:0,
121
- (isset($values['nofollow']) && !empty($values['nofollow']))?1:0,
122
- (isset($values['group_id'])?(int)$values['group_id']:'NULL'),
123
- $now, $id
124
- );
125
 
126
- $query_results = $wpdb->query($query);
127
 
128
- return $query_results;
129
- }
 
 
130
 
131
- public function bulk_update($ids, $values) {
132
- if(!empty($ids) && is_array($values) && !empty($values)) {
133
- global $wpdb;
134
-
135
- $now = date('Y-m-d H:i:s');
136
- $sets = array();
137
- $query = $wpdb->prepare("UPDATE {$this->table_name} SET updated_at=%s ", $now);
138
-
139
- $link_columns = array(
140
- 'name',
141
- 'description',
142
- 'url',
143
- 'slug',
144
- 'nofollow',
145
- 'track_me',
146
- 'param_forwarding',
147
- 'param_struct',
148
- 'redirect_type',
149
- 'group_id'
150
- );
151
-
152
- foreach($values as $lnkkey => $lnkval) {
153
- // make sure this is an option contained in the links table
154
- if(in_array($lnkkey, $link_columns)) {
155
- // check to see if this is a checkbox
156
- if(in_array(strtolower($lnkval), array('on','off'))) {
157
- $sets[] = $wpdb->prepare("{$lnkkey}=%d", (strtolower($lnkval)=='on'));
158
- }
159
- else {
160
- $sets[] = $wpdb->prepare("{$lnkkey}=%s", $lnkval);
161
- }
162
- }
163
- }
164
 
165
- if(!empty($sets)) {
166
- $query .= ', ';
167
- $query .= implode(',', $sets);
168
- }
169
 
170
- if(preg_match('/,/',$ids)) {
171
- $query .= " WHERE id IN ({$ids})";
172
- }
173
- else {
174
- $query .= $wpdb->prepare(" WHERE id=%d", $ids);
175
- }
176
 
177
- $query_results = $wpdb->query($query);
 
178
 
179
- return $query_results;
180
- }
 
 
 
 
 
 
181
 
182
- return false;
183
  }
184
 
185
  public function update_group($id, $value, $group_id) {
186
  global $wpdb;
187
 
188
- $query = 'UPDATE ' . $this->table_name .
189
- ' SET group_id=' . (isset($value)?$group_id:'NULL') .
190
- ' WHERE id='.$id;
 
 
 
 
 
 
 
 
 
 
191
  $query_results = $wpdb->query($query);
192
 
193
  return $query_results;
194
  }
195
 
196
- public function destroy($id) {
197
- //require_once(PRLI_MODELS_PATH.'/models.inc.php');
198
  global $wpdb, $prli_click, $prli_link_meta;
199
 
200
  do_action('prli_delete_link', $id);
 
 
 
 
 
 
201
  $metas = $wpdb->prepare("DELETE FROM {$prli_link_meta->table_name} WHERE link_id=%d",$id);
202
  $reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d",$id);
203
  $destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id=%d",$id);
@@ -209,7 +169,6 @@ class PrliLink {
209
  }
210
 
211
  public function reset($id) {
212
- //require_once(PRLI_MODELS_PATH.'/models.inc.php');
213
  global $wpdb, $prli_click, $prli_link_meta;
214
 
215
  $prli_link_meta->delete_link_meta($id, 'static-clicks');
@@ -220,123 +179,89 @@ class PrliLink {
220
  return $wpdb->query($reset);
221
  }
222
 
223
- public function getOneFromSlug( $slug, $return_type = OBJECT, $include_stats = false ) {
224
- global $wpdb, $prli_click, $prli_options, $prli_link_meta;
 
225
 
226
- static $cached;
 
 
227
 
228
- if(!isset($cached)) { $cached = array(); }
 
229
 
230
- if(!$include_stats && isset($cached[$slug])) {
231
- return $cached[$slug];
232
- }
233
- elseif($include_stats && isset($cached[$slug]['stats'])) {
234
- return $cached[$slug]['stats'];
235
- }
236
 
237
  if($include_stats) {
238
- $query = 'SELECT li.*, ';
 
 
239
 
240
  if($prli_options->extended_tracking != 'count') {
241
- $query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
242
- 'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
243
- '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
244
- 'WHERE cl.link_id = li.id ' .
245
- 'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques ';
 
 
 
 
 
 
 
 
 
246
  }
247
  else {
248
- $query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
249
- 'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
250
- '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
251
- 'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques ';
 
 
 
 
 
 
 
 
 
 
252
  }
253
-
254
- $query .= "FROM {$this->table_name} li " .
255
- 'WHERE slug=%s';
256
  }
257
  else {
258
- $query = "SELECT * FROM {$this->table_name} WHERE slug=%s";
259
  }
260
 
261
- $query = $wpdb->prepare($query, $slug);
262
- $link = $wpdb->get_row($query, $return_type);
263
-
264
- //get_row returns a null if not found - we don't want nulls
265
- if(!$link) { $link = false; }
266
-
267
- if($include_stats and $link and $prli_options->extended_tracking == 'count') {
268
- $link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
269
- $link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
270
- }
271
-
272
- //Cache this to prevent multiple queries
273
- if(!$include_stats) {
274
- $cached[$slug] = $link;
275
- }
276
- else {
277
- $cached[$slug]['stats'] = $link;
278
- }
279
-
280
- return $link;
281
- }
282
-
283
- public function getOne( $id, $return_type = OBJECT, $include_stats = false ) {
284
- global $wpdb, $prli_click, $prli_link_meta, $prli_options;
285
-
286
- if(!isset($id) or empty($id)) { return false; }
287
-
288
- static $cached;
289
-
290
- if(!isset($cached)) { $cached = array(); }
291
 
292
- if(!$include_stats && isset($cached[$id])) {
293
- return $cached[$id];
 
 
294
  }
295
 
296
- if($include_stats) {
297
- $query = 'SELECT li.*, ';
298
-
299
- if($prli_options->extended_tracking != 'count') {
300
- $query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
301
- 'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
302
- '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
303
- 'WHERE cl.link_id = li.id ' .
304
- 'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques ';
305
- }
306
- else {
307
- $query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
308
- 'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
309
- '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
310
- 'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques ';
311
- }
312
-
313
- $query .= 'FROM ' . $this->table_name . ' li ' .
314
- 'WHERE id=%d';
315
- }
316
- else {
317
- $query = "SELECT * FROM {$this->table_name} WHERE id=%d";
318
- }
319
 
320
- $query = $wpdb->prepare($query, $id);
321
- $link = $wpdb->get_row($query, $return_type);
322
 
323
  if($include_stats and $link and $prli_options->extended_tracking == 'count') {
324
  $link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
325
  $link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
326
  }
327
 
328
- //Cache this to prevent multiple queries
329
- if(!$include_stats) {
330
- $cached[$id] = $link;
331
- }
332
-
333
  return $link;
334
  }
335
 
336
- public function find_first_target_url($target_url)
337
- {
338
  global $wpdb;
339
- $query_str = "SELECT id FROM {$this->table_name} WHERE url=%s LIMIT 1";
340
  $query = $wpdb->prepare($query_str,$target_url);
341
  return $wpdb->get_var($query);
342
  }
@@ -344,7 +269,7 @@ class PrliLink {
344
  public function get_or_create_pretty_link_for_target_url( $target_url, $group=0 )
345
  {
346
  global $wpdb;
347
- $query_str = "SELECT * FROM {$this->table_name} WHERE url=%s LIMIT 1";
348
  $query = $wpdb->prepare($query_str,$target_url);
349
  $pretty_link = $wpdb->get_row($query);
350
 
@@ -380,9 +305,9 @@ class PrliLink {
380
  if(preg_match($match_str, $uri, $match_val))
381
  {
382
  // Match longest slug -- this is the most common
383
- $params = (isset($match_val[3])?$match_val[3]:'');
384
  if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
385
- return compact('pretty_link_found','pretty_link_params');
386
 
387
  // Trim down the matched link
388
  $matched_link = preg_replace('#/[^/]*?$#','',$match_val[2],1);
@@ -396,9 +321,9 @@ class PrliLink {
396
  {
397
  $new_match_str ="#^{$subdir_str}({$struct})({$matched_link})(.*?)?$#";
398
 
399
- $params = (isset($match_val[3])?$match_val:'');
400
  if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
401
- return compact('pretty_link_found','pretty_link_params');
402
 
403
  // Trim down the matched link and try again
404
  $matched_link = preg_replace('#/[^/]*$#','',$match_val[2],1);
@@ -409,14 +334,13 @@ class PrliLink {
409
  return false;
410
  }
411
 
412
- public function is_pretty_link_slug($slug)
413
- {
414
  return apply_filters('prli-check-if-slug', $this->getOneFromSlug( rawurldecode($slug) ), rawurldecode($slug));
415
  }
416
 
417
  public function get_link_min( $id, $return_type = OBJECT ) {
418
  global $wpdb, $prli_link_meta;
419
- $query_str = "SELECT * FROM {$this->table_name} WHERE id=%d";
420
  $query = $wpdb->prepare($query_str, $id);
421
  $res = $wpdb->get_row($query, $return_type);
422
 
@@ -429,84 +353,62 @@ class PrliLink {
429
  return $res;
430
  }
431
 
432
- public function getAll($where = '', $order_by = '', $return_type = OBJECT, $include_stats = false)
433
- {
434
- global $wpdb, $prli_click, $prli_group, $prli_link_meta, $prli_options, $prli_utils;
435
 
436
- if($include_stats)
437
- {
438
- $query = 'SELECT li.*, ';
439
- if($prli_options->extended_tracking != 'count')
440
- {
441
- $query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
442
- 'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
443
- '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
444
- 'WHERE cl.link_id = li.id ' .
445
- 'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques, ';
 
 
 
 
 
 
 
 
 
 
 
 
446
  }
447
  else
448
  {
449
- $query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
450
- 'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
451
- '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
452
- 'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques, ';
 
 
 
 
 
 
 
 
 
 
 
 
453
  }
454
- $query .= 'gr.name as group_name ' .
455
- 'FROM '. $this->table_name . ' li ' .
456
- 'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
457
- $prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by;
458
  }
459
- else
460
- {
461
- $query = "SELECT li.*, gr.name as group_name FROM {$this->table_name} li " .
462
- 'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
463
- $prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by;
464
  }
465
 
466
- return $wpdb->get_results($query, $return_type);
467
- }
468
-
469
- // Pagination Methods
470
- public function getRecordCount($where="")
471
- {
472
- global $wpdb, $prli_utils;
473
- $query = 'SELECT COUNT(*) FROM ' . $this->table_name . ' li' . $prli_utils->prepend_and_or_where(' WHERE', $where);
474
- return $wpdb->get_var($query);
475
- }
476
 
477
- public function getPageCount($p_size, $where="")
478
- {
479
- return ceil((int)$this->getRecordCount($where) / (int)$p_size);
480
- }
481
-
482
- public function getPage($current_p,$p_size, $where = "", $order_by = '', $return_type = OBJECT)
483
- {
484
- global $wpdb, $prli_click, $prli_utils, $prli_group, $prli_link_meta, $prli_options;
485
- $end_index = $current_p * $p_size;
486
- $start_index = $end_index - $p_size;
487
- $query = 'SELECT li.*, ';
488
- if($prli_options->extended_tracking != 'count')
489
- {
490
- $query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
491
- 'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
492
- '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
493
- 'WHERE cl.link_id = li.id ' .
494
- 'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques, ';
495
- }
496
- else
497
- {
498
- $query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
499
- 'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
500
- '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
501
- 'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques, ';
502
- }
503
- $query .= 'gr.name as group_name ' .
504
- 'FROM ' . $this->table_name . ' li ' .
505
- 'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
506
- $prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by . ' ' .
507
- 'LIMIT ' . $start_index . ',' . $p_size . ';';
508
- $results = $wpdb->get_results($query, $return_type);
509
- return $results;
510
  }
511
 
512
  public function generateValidSlug($num_chars = 4) {
@@ -524,45 +426,75 @@ class PrliLink {
524
 
525
  $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
526
 
 
527
  $query = "SELECT slug FROM {$this->table_name}";
528
  $slugs = $wpdb->get_col($query,0);
529
 
530
  // It is highly unlikely that we'll ever see 2 identical random slugs
531
  // but just in case, here's some code to prevent collisions
532
- while(in_array($slug, $slugs) or !PrliUtils::slugIsAvailable($slug))
533
  $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
 
534
 
535
  return apply_filters('prli-auto-generated-slug', $slug, $slugs, $num_chars);
536
  }
537
 
538
- public function get_pretty_link_url($slug)
539
- {
540
  global $prli_blogurl;
541
 
542
  $link = $this->getOneFromSlug($slug);
 
 
 
 
 
 
 
543
 
544
  if( ( !isset($link->param_forwarding) || empty($link->param_forwarding) || $link->param_forwarding=='off' ) &&
545
  ( isset($link->redirect_type) && $link->redirect_type == 'pixel' ) ) {
546
- return '&lt;img src="'.$prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$link->slug.'" width="1" height="1" style="display: none" &gt;';
547
  }
548
  else {
549
- return $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $link->slug;
550
  }
551
  }
552
 
553
- public function validate( $values )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
554
  {
555
  global $wpdb, $prli_utils, $prli_blogurl;
556
 
 
 
557
  $errors = array();
558
  if( empty($values['url']) && $values['redirect_type'] != 'pixel' ) {
559
  $errors[] = __("Target URL can't be blank", 'pretty-link');
560
  }
561
 
562
- if( $values['slug'] == null || $values['slug'] == '' ) {
563
- $errors[] = __("Pretty Link can't be blank", 'pretty-link');
564
- }
565
-
566
  if( $values['url'] == $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$values['slug'] ) {
567
  $errors[] = __("Target URL must be different than the Pretty Link", 'pretty-link');
568
  }
@@ -579,9 +511,9 @@ class PrliLink {
579
  $errors[] = __("Pretty Link slugs must not end with a slash (\"/\")", 'pretty-link');
580
  }
581
 
582
- $id = isset($values['id'])?$values['id']:null;
583
- if( !$prli_utils->slugIsAvailable($values['slug'],$id) ) {
584
- $errors[] = __("This Pretty Link Slug is already taken. Check to make sure it isn't being used by another pretty link, post, page, category or tag slug. If none of these are true then check to see that this slug isn't the name of a file in the root folder of your wordpress install.", 'pretty-link');
585
  }
586
 
587
  return $errors;
@@ -599,7 +531,12 @@ class PrliLink {
599
 
600
  if(empty($urls)) { return false; }
601
 
602
- $decoded_urls = array_map( create_function( '$url', 'return html_entity_decode(rawurldecode($url));' ), $urls );
 
 
 
 
 
603
 
604
  // Filter out urls that are already Pretty Links
605
  $where = "IN (" . implode( ',', array_map( array($this, 'get_link_slug'), $decoded_urls ) ) . ")";
@@ -607,7 +544,8 @@ class PrliLink {
607
  $query = "
608
  SELECT CONCAT(%s, li.slug) AS pretty_url
609
  FROM {$this->table_name} AS li
610
- WHERE li.slug {$where}
 
611
  ";
612
  $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
613
  $plinks = $wpdb->get_col($query);
@@ -616,13 +554,18 @@ class PrliLink {
616
 
617
  if(empty($decoded_urls)) { return false; }
618
 
619
- $where = "IN (" . implode( ',', array_map( create_function( '$url', 'return "\"{$url}\"";' ), $decoded_urls ) ) . ")";
 
 
 
 
620
 
621
  $query = "
622
  SELECT li.url AS target_url,
623
  CONCAT(%s, li.slug) AS pretty_url
624
  FROM {$this->table_name} AS li
625
- WHERE li.url {$where}
 
626
  ";
627
  $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
628
 
@@ -656,5 +599,157 @@ class PrliLink {
656
  $site_url = site_url();
657
  return "javascript:location.href='{$site_url}/index.php?action=prli_bookmarklet&k={$prli_options->bookmarklet_auth}&target_url='+escape(location.href);";
658
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  }
660
 
3
 
4
  class PrliLink {
5
  public $table_name;
6
+ public static $cpt = 'pretty-link';
7
+ public static $nonce_str = 'pretty-link-nonce';
8
 
9
  public function __construct() {
10
  global $wpdb;
13
 
14
  public static function get_count() {
15
  global $wpdb, $prli_link;
16
+ $q = "SELECT COUNT(*) FROM {$prli_link->table_name} WHERE link_status='enabled'";
17
  return $wpdb->get_var($q);
18
  }
19
 
20
  public static function get_first_date() {
21
  global $wpdb, $prli_link;
22
+ $q = "SELECT min(created_at) FROM {$prli_link->table_name} WHERE link_status='enabled'";
23
  return $wpdb->get_var($q);
24
  }
25
 
26
  public function create( $values ) {
27
  global $wpdb, $prli_link_meta;
28
 
29
+ $now = current_time('mysql');
30
 
31
+ $values = $this->sanitize($values);
32
+ $values['created_at'] = $values['updated_at'] = $now;
33
+
34
+ if($values['link_cpt_id'] == 0) { ## Autocreate CPT
35
+
36
+ $post_id = $this->create_cpt_for_link($values['name'], $now, $now);
37
+
38
+ if($post_id == 0 || is_wp_error($post_id)) {
39
+ error_log("Unable to create CPT Post for Link");
40
+ }
41
+
42
+ $values['link_cpt_id'] = $post_id;
43
  }
44
 
45
+ if(empty($values['name'])) {
46
+ if($values['redirect_type'] == 'pixel') {
47
+ $values['name'] = $values['slug'];
48
+ }
49
+ else {
50
+ $values['name'] = PrliUtils::get_page_title($values['url'],$values['slug']);
51
+ }
 
 
 
 
 
 
 
 
 
 
52
 
53
+ // Update the post_title field directly so we don't activate the action
54
+ // that ultimately calls this function lest we get into an infinite loop
55
+ $q = $wpdb->prepare("UPDATE {$wpdb->posts} SET post_title=%s WHERE ID=%d", $values['name'], $values['link_cpt_id']);
56
+ $wpdb->query($q);
57
+ }
 
 
 
 
 
 
 
 
 
58
 
59
+ $query_results = $wpdb->insert($this->table_name, $values);
60
 
61
  $link_id = ($query_results ? $wpdb->insert_id : false);
62
 
65
  $prli_link_meta->update_link_meta($link_id, 'delay', 0);
66
  }
67
 
68
+ $this->update_cpt_title($values['link_cpt_id'], $values['name']);
69
+ $this->update_cpt_status($values['link_cpt_id']);
70
+ $this->update_cpt_post_date($values['link_cpt_id'], $now);
71
+
72
  do_action('prli-create-link', $link_id, $values);
73
 
74
  return $link_id;
75
  }
76
 
77
  public function update( $id, $values ) {
78
+ global $wpdb, $prli_link;
79
 
80
+ $now = current_time('mysql');
81
 
82
+ $values = $this->sanitize($values);
83
+ $values['updated_at'] = $now;
 
 
 
 
84
 
85
+ $title = isset($values['name'])?trim($values['name']):'';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
+ if(empty($title)) {
88
+ error_log("REDIRECT TYPE: " . $values['redirect_type']);
89
+ if($values['redirect_type'] == 'pixel') {
90
+ $title = $values['slug'];
91
+ }
92
+ else {
93
+ $title = PrliUtils::get_page_title($values['url'],$values['slug']);
94
+ }
95
+ }
 
 
 
 
 
96
 
97
+ $query_results = $wpdb->update($this->table_name, $values, array('id' => $id));
98
 
99
+ $link = $this->getOne($id);
100
+ $this->update_cpt_title($link->link_cpt_id, $title);
101
+ $this->update_cpt_status($link->link_cpt_id);
102
+ $this->update_cpt_post_modified($link->link_cpt_id, $now);
103
 
104
+ return $id;
105
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
+ public function disable_link($id) {
108
+ return $this->update_link_status( $id, 'disabled' );
109
+ }
 
110
 
111
+ public function enable_link($id) {
112
+ return $this->update_link_status( $id, 'enabled' );
113
+ }
 
 
 
114
 
115
+ public function update_link_status( $id, $link_status='enabled' ) {
116
+ global $wpdb;
117
 
118
+ $q = $wpdb->prepare("
119
+ UPDATE {$this->table_name}
120
+ SET link_status=%s
121
+ WHERE id=%d
122
+ ",
123
+ $link_status,
124
+ $id
125
+ );
126
 
127
+ return $wpdb->query($q);
128
  }
129
 
130
  public function update_group($id, $value, $group_id) {
131
  global $wpdb;
132
 
133
+ if (isset($value)) {
134
+ $query = $wpdb->prepare(
135
+ "UPDATE {$this->table_name} SET group_id = %d WHERE id = %d",
136
+ $group_id,
137
+ $id
138
+ );
139
+ } else {
140
+ $query = $wpdb->prepare(
141
+ "UPDATE {$this->table_name} SET group_id = NULL WHERE id = %d",
142
+ $id
143
+ );
144
+ }
145
+
146
  $query_results = $wpdb->query($query);
147
 
148
  return $query_results;
149
  }
150
 
151
+ public function destroy($id, $delete_mode='delete_cpt') {
 
152
  global $wpdb, $prli_click, $prli_link_meta;
153
 
154
  do_action('prli_delete_link', $id);
155
+
156
+ $link = $this->getOne($id);
157
+ if($delete_mode=='delete_cpt' && $link->link_cpt_id > 0) {
158
+ wp_delete_post($link->link_cpt_id, true);
159
+ }
160
+
161
  $metas = $wpdb->prepare("DELETE FROM {$prli_link_meta->table_name} WHERE link_id=%d",$id);
162
  $reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d",$id);
163
  $destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id=%d",$id);
169
  }
170
 
171
  public function reset($id) {
 
172
  global $wpdb, $prli_click, $prli_link_meta;
173
 
174
  $prli_link_meta->delete_link_meta($id, 'static-clicks');
179
  return $wpdb->query($reset);
180
  }
181
 
182
+ public function getOneFromSlug( $slug, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
183
+ return $this->get_one_by( 'slug', $slug, $return_type, $include_stats, $exclude_disabled );
184
+ }
185
 
186
+ public function getOne( $id, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
187
+ return $this->get_one_by( 'id', $id, $return_type, $include_stats, $exclude_disabled );
188
+ }
189
 
190
+ public function get_one_by( $field='id', $val, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
191
+ global $wpdb, $prli_click, $prli_options, $prli_link_meta, $prli_blogurl;
192
 
193
+ $struct = PrliUtils::get_permalink_pre_slug_uri();
 
 
 
 
 
194
 
195
  if($include_stats) {
196
+ $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, ";
197
+
198
+ $op = $prli_click->get_exclude_where_clause( ' AND' );
199
 
200
  if($prli_options->extended_tracking != 'count') {
201
+ $query .= "
202
+ (
203
+ SELECT COUNT(*)
204
+ FROM {$prli_click->table_name} AS cl
205
+ WHERE cl.link_id = li.id
206
+ {$op}
207
+ ) as clicks,
208
+ (
209
+ SELECT COUNT(*) FROM {$prli_click->table_name} AS cl
210
+ WHERE cl.link_id = li.id
211
+ AND cl.first_click <> 0
212
+ {$op}
213
+ ) as uniques
214
+ ";
215
  }
216
  else {
217
+ $query .= "
218
+ (
219
+ SELECT lm.meta_value
220
+ FROM {$prli_link_meta->table_name} AS lm
221
+ WHERE lm.meta_key=\"static-clicks\"
222
+ AND lm.link_id=li.id LIMIT 1
223
+ ) as clicks,
224
+ (
225
+ SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm
226
+ WHERE lm.meta_key=\"static-uniques\"
227
+ AND lm.link_id=li.id
228
+ LIMIT 1
229
+ ) as uniques
230
+ ";
231
  }
 
 
 
232
  }
233
  else {
234
+ $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url";
235
  }
236
 
237
+ $query .= "
238
+ FROM {$this->table_name} AS li
239
+ WHERE {$field}=%s
240
+ ";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
 
242
+ if($exclude_disabled) {
243
+ $query .= "
244
+ AND link_status='enabled'
245
+ ";
246
  }
247
 
248
+ $query = $wpdb->prepare($query, $val);
249
+ $link = $wpdb->get_row($query, $return_type);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
 
251
+ //get_row returns a null if not found - we don't want nulls
252
+ if(!$link) { $link = false; }
253
 
254
  if($include_stats and $link and $prli_options->extended_tracking == 'count') {
255
  $link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
256
  $link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
257
  }
258
 
 
 
 
 
 
259
  return $link;
260
  }
261
 
262
+ public function find_first_target_url($target_url) {
 
263
  global $wpdb;
264
+ $query_str = "SELECT id FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1";
265
  $query = $wpdb->prepare($query_str,$target_url);
266
  return $wpdb->get_var($query);
267
  }
269
  public function get_or_create_pretty_link_for_target_url( $target_url, $group=0 )
270
  {
271
  global $wpdb;
272
+ $query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1";
273
  $query = $wpdb->prepare($query_str,$target_url);
274
  $pretty_link = $wpdb->get_row($query);
275
 
305
  if(preg_match($match_str, $uri, $match_val))
306
  {
307
  // Match longest slug -- this is the most common
308
+ $pretty_link_params = (isset($match_val[3])?$match_val[3]:'');
309
  if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
310
+ return compact('pretty_link_found');
311
 
312
  // Trim down the matched link
313
  $matched_link = preg_replace('#/[^/]*?$#','',$match_val[2],1);
321
  {
322
  $new_match_str ="#^{$subdir_str}({$struct})({$matched_link})(.*?)?$#";
323
 
324
+ $pretty_link_params = (isset($match_val[3])?$match_val:'');
325
  if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
326
+ return compact('pretty_link_found');
327
 
328
  // Trim down the matched link and try again
329
  $matched_link = preg_replace('#/[^/]*$#','',$match_val[2],1);
334
  return false;
335
  }
336
 
337
+ public function is_pretty_link_slug($slug) {
 
338
  return apply_filters('prli-check-if-slug', $this->getOneFromSlug( rawurldecode($slug) ), rawurldecode($slug));
339
  }
340
 
341
  public function get_link_min( $id, $return_type = OBJECT ) {
342
  global $wpdb, $prli_link_meta;
343
+ $query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND id=%d";
344
  $query = $wpdb->prepare($query_str, $id);
345
  $res = $wpdb->get_row($query, $return_type);
346
 
353
  return $res;
354
  }
355
 
356
+ public function getAll($where = '', $order_by = '', $return_type = OBJECT, $include_stats = false) {
357
+ global $wpdb, $prli_click, $prli_group, $prli_link_meta, $prli_options, $prli_utils, $prli_blogurl;
 
358
 
359
+ $struct = PrliUtils::get_permalink_pre_slug_regex();
360
+
361
+ $op = $prli_click->get_exclude_where_clause( ' AND' );
362
+
363
+ if($include_stats) {
364
+ $query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, ";
365
+ if($prli_options->extended_tracking != 'count') {
366
+ $query .= "
367
+ (
368
+ SELECT COUNT(*)
369
+ FROM {$prli_click->table_name} AS cl
370
+ WHERE cl.link_id = li.id
371
+ {$op}
372
+ ) as clicks,
373
+ (
374
+ SELECT COUNT(*)
375
+ FROM {$prli_click->table_name} AS cl
376
+ WHERE cl.link_id = li.id
377
+ AND cl.first_click <> 0
378
+ {$op}
379
+ ) as uniques
380
+ ";
381
  }
382
  else
383
  {
384
+ $query .= "
385
+ (
386
+ SELECT lm.meta_value
387
+ FROM {$prli_link_meta->table_name} AS lm
388
+ WHERE lm.meta_key=\"static-clicks\"
389
+ AND lm.link_id=li.id
390
+ LIMIT 1
391
+ ) as clicks,
392
+ (
393
+ SELECT lm.meta_value
394
+ FROM {$prli_link_meta->table_name} AS lm
395
+ WHERE lm.meta_key=\"static-uniques\"
396
+ AND lm.link_id=li.id
397
+ LIMIT 1
398
+ ) as uniques
399
+ ";
400
  }
 
 
 
 
401
  }
402
+ else {
403
+ $query = "SELECT li.*,CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url ";
 
 
 
404
  }
405
 
406
+ $query .= "FROM {$this->table_name} AS li
407
+ WHERE li.link_status='enabled'
408
+ " . $prli_utils->prepend_and_or_where(' AND', $where) .
409
+ $order_by;
 
 
 
 
 
 
410
 
411
+ return $wpdb->get_results($query, $return_type);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
412
  }
413
 
414
  public function generateValidSlug($num_chars = 4) {
426
 
427
  $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
428
 
429
+ // Intentionally not checking to see if link is enabled or disabled
430
  $query = "SELECT slug FROM {$this->table_name}";
431
  $slugs = $wpdb->get_col($query,0);
432
 
433
  // It is highly unlikely that we'll ever see 2 identical random slugs
434
  // but just in case, here's some code to prevent collisions
435
+ while(in_array($slug, $slugs) || is_wp_error(PrliUtils::is_slug_available($slug))) {
436
  $slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
437
+ }
438
 
439
  return apply_filters('prli-auto-generated-slug', $slug, $slugs, $num_chars);
440
  }
441
 
442
+ public function get_pretty_link_url($slug, $esc_url=false) {
 
443
  global $prli_blogurl;
444
 
445
  $link = $this->getOneFromSlug($slug);
446
+ $pretty_link_url = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $link->slug;
447
+ if($esc_url) {
448
+ $pretty_link_url = esc_url($pretty_link_url);
449
+ }
450
+ else {
451
+ $pretty_link_url = $pretty_link_url;
452
+ }
453
 
454
  if( ( !isset($link->param_forwarding) || empty($link->param_forwarding) || $link->param_forwarding=='off' ) &&
455
  ( isset($link->redirect_type) && $link->redirect_type == 'pixel' ) ) {
456
+ return '&lt;img src="'.$pretty_link_url.'" width="1" height="1" style="display: none" /&gt;';
457
  }
458
  else {
459
+ return $pretty_link_url;
460
  }
461
  }
462
 
463
+ /**
464
+ * Sanitize the given link options and return them
465
+ *
466
+ * @param array $values
467
+ * @return array
468
+ */
469
+ public function sanitize($values)
470
+ {
471
+ $sanitized = array(
472
+ 'redirect_type' => isset($values['redirect_type']) && is_string($values['redirect_type']) ? sanitize_key($values['redirect_type']) : '307',
473
+ 'url' => isset($values['url']) && is_string($values['url']) ? esc_url_raw(trim($values['url'])) : '',
474
+ 'slug' => isset($values['slug']) && is_string($values['slug']) ? sanitize_text_field($values['slug']) : '',
475
+ 'name' => isset($values['name']) && is_string($values['name']) ? sanitize_text_field($values['name']) : '',
476
+ 'description' => isset($values['description']) && is_string($values['description']) ? sanitize_textarea_field($values['description']) : '',
477
+ 'group_id' => isset($values['group_id']) && is_numeric($values['group_id']) ? (int) $values['group_id'] : null,
478
+ 'nofollow' => isset($values['nofollow']) ? 1 : 0,
479
+ 'param_forwarding' => isset($values['param_forwarding']) ? 1 : 0,
480
+ 'track_me' => isset($values['track_me']) ? 1 : 0,
481
+ 'link_cpt_id' => isset($values['link_cpt_id']) && is_numeric($values['link_cpt_id']) ? (int) $values['link_cpt_id'] : 0
482
+ );
483
+
484
+ return $sanitized;
485
+ }
486
+
487
+ public function validate( $values , $id = null )
488
  {
489
  global $wpdb, $prli_utils, $prli_blogurl;
490
 
491
+ $values = $this->sanitize($values);
492
+
493
  $errors = array();
494
  if( empty($values['url']) && $values['redirect_type'] != 'pixel' ) {
495
  $errors[] = __("Target URL can't be blank", 'pretty-link');
496
  }
497
 
 
 
 
 
498
  if( $values['url'] == $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$values['slug'] ) {
499
  $errors[] = __("Target URL must be different than the Pretty Link", 'pretty-link');
500
  }
511
  $errors[] = __("Pretty Link slugs must not end with a slash (\"/\")", 'pretty-link');
512
  }
513
 
514
+ $slug_is_available = PrliUtils::is_slug_available($values['slug'],$id);
515
+ if(is_wp_error($slug_is_available)) {
516
+ $errors[] = $slug_is_available->get_error_message();
517
  }
518
 
519
  return $errors;
531
 
532
  if(empty($urls)) { return false; }
533
 
534
+ $decoded_urls = array_map(
535
+ function($url) {
536
+ return html_entity_decode(rawurldecode($url));
537
+ },
538
+ $urls
539
+ );
540
 
541
  // Filter out urls that are already Pretty Links
542
  $where = "IN (" . implode( ',', array_map( array($this, 'get_link_slug'), $decoded_urls ) ) . ")";
544
  $query = "
545
  SELECT CONCAT(%s, li.slug) AS pretty_url
546
  FROM {$this->table_name} AS li
547
+ WHERE li.link_status='enabled'
548
+ AND li.slug {$where}
549
  ";
550
  $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
551
  $plinks = $wpdb->get_col($query);
554
 
555
  if(empty($decoded_urls)) { return false; }
556
 
557
+ $where = "IN (" . implode( ',', array_map(
558
+ function($url) {
559
+ return "\"{$url}\"";
560
+ },
561
+ $decoded_urls ) ) . ")";
562
 
563
  $query = "
564
  SELECT li.url AS target_url,
565
  CONCAT(%s, li.slug) AS pretty_url
566
  FROM {$this->table_name} AS li
567
+ WHERE li.link_status='enabled'
568
+ AND li.url {$where}
569
  ";
570
  $query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
571
 
599
  $site_url = site_url();
600
  return "javascript:location.href='{$site_url}/index.php?action=prli_bookmarklet&k={$prli_options->bookmarklet_auth}&target_url='+escape(location.href);";
601
  }
602
+
603
+ public function get_link_from_cpt($cpt_id) {
604
+ global $wpdb;
605
+
606
+ $q = $wpdb->prepare("
607
+ SELECT id
608
+ FROM {$this->table_name}
609
+ WHERE link_cpt_id=%d
610
+ ",
611
+ $cpt_id
612
+ );
613
+
614
+ $link_id = $wpdb->get_var($q);
615
+
616
+ if(empty($link_id)) {
617
+ $link_id = 0;
618
+ }
619
+
620
+ return $link_id;
621
+ }
622
+
623
+ public function update_link_cpt($link_id, $cpt_id) {
624
+ global $wpdb;
625
+
626
+ $q = $wpdb->prepare("
627
+ UPDATE {$this->table_name}
628
+ SET link_cpt_id=%d
629
+ WHERE id=%d
630
+ ",
631
+ $cpt_id, $link_id
632
+ );
633
+
634
+ return $wpdb->get_var($q);
635
+ }
636
+
637
+ /** We do this directly in the database because wp_insert_post is very slow */
638
+ public function create_cpt_for_link($title, $created_at, $updated_at) {
639
+ global $wpdb;
640
+
641
+ $inserted = $wpdb->insert(
642
+ $wpdb->posts,
643
+ array(
644
+ 'post_title' => stripslashes($title),
645
+ 'post_type' => PrliLink::$cpt,
646
+ 'post_status' => 'publish',
647
+ 'post_date' => $created_at,
648
+ 'post_date_gmt' => get_gmt_from_date($created_at),
649
+ 'post_modified' => $updated_at,
650
+ 'post_modified_gmt' => get_gmt_from_date($updated_at),
651
+ 'comment_status' => 'closed',
652
+ 'ping_status' => 'closed'
653
+ ),
654
+ array('%s','%s','%s','%s','%s','%s','%s')
655
+ );
656
+
657
+ return $inserted ? $wpdb->insert_id : false;
658
+ }
659
+
660
+ public function update_cpt_title($cpt_id, $title) {
661
+ global $wpdb;
662
+
663
+ $q = $wpdb->prepare("
664
+ UPDATE {$wpdb->posts}
665
+ SET `post_title` = %s
666
+ WHERE `ID` = %d
667
+ AND `post_type` = %s
668
+ ",
669
+ stripslashes($title),
670
+ $cpt_id,
671
+ PrliLink::$cpt
672
+ );
673
+
674
+ return $wpdb->query($q);
675
+ }
676
+
677
+ public function update_cpt_status($cpt_id, $status='publish') {
678
+ global $wpdb;
679
+
680
+ $q = $wpdb->prepare("
681
+ UPDATE {$wpdb->posts}
682
+ SET `post_status` = %s
683
+ WHERE `ID` = %d
684
+ AND `post_type` = %s
685
+ ",
686
+ $status,
687
+ $cpt_id,
688
+ PrliLink::$cpt
689
+ );
690
+
691
+ return $wpdb->query($q);
692
+ }
693
+
694
+ public function update_cpt_post_date($cpt_id, $now=false) {
695
+ global $wpdb;
696
+
697
+ if(empty($now)) {
698
+ $now = current_time('mysql');
699
+ }
700
+
701
+ $wpdb->update(
702
+ $wpdb->posts,
703
+ array(
704
+ 'post_date' => $now,
705
+ 'post_date_gmt' => get_gmt_from_date($now)
706
+ ),
707
+ array(
708
+ 'ID' => $cpt_id,
709
+ 'post_type' => PrliLink::$cpt
710
+ ),
711
+ array('%s', '%s'),
712
+ array('%d', '%s')
713
+ );
714
+ }
715
+
716
+ public function update_cpt_post_modified($cpt_id, $now=false) {
717
+ global $wpdb;
718
+
719
+ if(empty($now)) {
720
+ $now = current_time('mysql');
721
+ }
722
+
723
+ $wpdb->update(
724
+ $wpdb->posts,
725
+ array(
726
+ 'post_modified' => $now,
727
+ 'post_modified_gmt' => get_gmt_from_date($now)
728
+ ),
729
+ array(
730
+ 'ID' => $cpt_id,
731
+ 'post_type' => PrliLink::$cpt
732
+ ),
733
+ array('%s', '%s'),
734
+ array('%d', '%s')
735
+ );
736
+ }
737
+
738
+ /** For legacy handling of groups filter */
739
+ public function get_all_legacy_groups() {
740
+ global $wpdb;
741
+
742
+ $prli_db = new PrliDb();
743
+
744
+ $groups_table = "{$wpdb->prefix}prli_groups";
745
+ $groups = array();
746
+
747
+ if($prli_db->table_exists($groups_table)) {
748
+ $q = "SELECT * FROM {$groups_table} ORDER BY `name`";
749
+ $groups = $wpdb->get_results($q);
750
+ }
751
+
752
+ return $groups;
753
+ }
754
  }
755
 
app/models/PrliOptions.php CHANGED
@@ -196,7 +196,7 @@ class PrliOptions
196
  else
197
  $this->prettybar_color = '';
198
  }
199
- else if(!preg_match('/^#/',$this->prettybar_color)) {
200
  $this->prettybar_color = '#' . $this->prettybar_color;
201
  }
202
 
@@ -208,7 +208,7 @@ class PrliOptions
208
  else
209
  $this->prettybar_text_color = '000000';
210
  }
211
- else if(!preg_match('/^#/',$this->prettybar_text_color)) {
212
  $this->prettybar_text_color = '#' . $this->prettybar_text_color;
213
  }
214
 
@@ -220,7 +220,7 @@ class PrliOptions
220
  else
221
  $this->prettybar_link_color = '0000ee';
222
  }
223
- else if(!preg_match('/^#/',$this->prettybar_link_color)) {
224
  $this->prettybar_link_color = '#' . $this->prettybar_link_color;
225
  }
226
 
@@ -232,7 +232,7 @@ class PrliOptions
232
  else
233
  $this->prettybar_hover_color = 'ababab';
234
  }
235
- else if(!preg_match('/^#/',$this->prettybar_hover_color)) {
236
  $this->prettybar_hover_color = '#' . $this->prettybar_hover_color;
237
  }
238
 
@@ -244,7 +244,7 @@ class PrliOptions
244
  else
245
  $this->prettybar_visited_color = '551a8b';
246
  }
247
- else if(!preg_match('/^#/',$this->prettybar_visited_color)) {
248
  $this->prettybar_visited_color = '#' . $this->prettybar_visited_color;
249
  }
250
 
196
  else
197
  $this->prettybar_color = '';
198
  }
199
+ else if($this->prettybar_color && !preg_match('/^#/',$this->prettybar_color)) {
200
  $this->prettybar_color = '#' . $this->prettybar_color;
201
  }
202
 
208
  else
209
  $this->prettybar_text_color = '000000';
210
  }
211
+ else if($this->prettybar_text_color && !preg_match('/^#/',$this->prettybar_text_color)) {
212
  $this->prettybar_text_color = '#' . $this->prettybar_text_color;
213
  }
214
 
220
  else
221
  $this->prettybar_link_color = '0000ee';
222
  }
223
+ else if($this->prettybar_link_color && !preg_match('/^#/',$this->prettybar_link_color)) {
224
  $this->prettybar_link_color = '#' . $this->prettybar_link_color;
225
  }
226
 
232
  else
233
  $this->prettybar_hover_color = 'ababab';
234
  }
235
+ else if($this->prettybar_hover_color && !preg_match('/^#/',$this->prettybar_hover_color)) {
236
  $this->prettybar_hover_color = '#' . $this->prettybar_hover_color;
237
  }
238
 
244
  else
245
  $this->prettybar_visited_color = '551a8b';
246
  }
247
+ else if($this->prettybar_visited_color && !preg_match('/^#/',$this->prettybar_visited_color)) {
248
  $this->prettybar_visited_color = '#' . $this->prettybar_visited_color;
249
  }
250
 
app/models/PrliUtils.php CHANGED
@@ -83,92 +83,64 @@ class PrliUtils {
83
  }
84
  }
85
 
86
- public static function get_url_from_slug( $slug ) {
87
- global $prli_blogurl;
88
- return $prli_blogurl . self::get_permalink_pre_slug_uri() . $slug;
89
- }
90
-
91
  public static function debug_log($message) {
92
  if(defined('WP_DEBUG') && WP_DEBUG) {
93
  error_log(sprintf(__('*** Pretty Links Debug: %s', 'pretty-link'), $message));
94
  }
95
  }
96
 
97
- public static function slugIsAvailable( $slug, $id = '' ) {
 
98
  global $wp_rewrite, $prli_link;
99
- $url = self::get_url_from_slug($slug);
100
 
101
  if(empty($slug)) {
102
- self::debug_log('SlugIsAvailable: $slug was empty');
103
- return false;
 
104
  }
105
 
106
  // Check Filepaths
107
  $filepath = ABSPATH . $slug;
108
  if( file_exists($filepath) ) {
109
- self::debug_log('SlugIsAvailable: There\'s already a file at: ' . $filepath);
110
- return false;
 
111
  }
112
 
113
  // Check other Pretty Links
114
- if( empty($id) ) {
115
- $this_link = $prli_link->getOneFromSlug( $slug );
116
- if( $this_link != false ) {
117
- self::debug_log('SlugIsAvailable: There\'s already pretty link for slug: ' . $slug);
118
- return false;
119
- }
120
  }
121
- else {
122
- $this_link = $prli_link->getOne( $id );
123
- $slug_link = $prli_link->getOneFromSlug( $slug );
124
 
125
- // check to see if the link is just being updated with the same slug
126
- if( !empty($this_link) && !empty($slug_link) && $this_link->id === $slug_link->id ) {
127
- return true;
128
- }
129
- }
130
 
131
- // Check Rewrite Rules
132
- $rules = $wp_rewrite->wp_rewrite_rules();
133
- //self::debug_log('SlugIsAvailable: Rewrite Rules: ' . self::object_to_string($rules));
134
- //unset($rules['([^/]+)(/[0-9]+)?/?$']); //Pretty sure this may nullify all the work below, but it's causing too many false positives somehow
135
-
136
- foreach( $rules as $pattern => $query ) {
137
- // just looking for the beginning of the pattern
138
- if(isset($pattern[0]) && $pattern[0] != '^') { $pattern = '^' . $pattern; }
139
-
140
- if( preg_match( "!{$pattern}!", $slug, $matches ) ) {
141
- // Got a match.
142
- // Trim the query of everything up to the '?'. (copied from url_to_postid)
143
- $query = preg_replace("!^.+\?!", '', $query);
144
-
145
- // Substitute the substring matches into the query. (copied from url_to_postid)
146
- $query = addslashes(WP_MatchesMapRegex::apply($query, $matches));
147
-
148
- // Filter out non-public query vars (copied from url_to_postid)
149
- global $wp;
150
- parse_str( $query, $query_vars );
151
- $query = array();
152
-
153
- foreach ( (array) $query_vars as $key => $value ) {
154
- if ( in_array( $key, $wp->public_query_vars ) ) {
155
- $query[$key] = $value;
156
- if ( isset( $post_type_query_vars[$key] ) ) {
157
- $query['post_type'] = $post_type_query_vars[$key];
158
- $query['name'] = $value;
159
- }
160
- }
161
- }
162
 
163
- // Do this query bro
164
- $wpq = new WP_Query( $query );
 
 
 
 
 
 
 
 
 
 
 
 
 
165
 
166
- // If we have a resolved post (applicable for tag, category & author pages too) then it's taken
167
- if( isset($wpq->post) && isset($wpq->posts) && !empty($wpq->posts) ) {
168
- self::debug_log('SlugIsAvailable: The path resolved to a post in wp rewrite rules for pattern: /'.$pattern.'/ query: '.self::object_to_string($query));
169
- self::debug_log(self::object_to_string($wpq->post));
170
- return false;
171
- }
172
  }
173
  }
174
 
@@ -251,7 +223,16 @@ class PrliUtils {
251
  public function track_link($slug,$values) {
252
  global $wpdb, $prli_click, $prli_options, $prli_link, $plp_update;
253
 
254
- $query = "SELECT * FROM ".$prli_link->table_name." WHERE slug='$slug' LIMIT 1";
 
 
 
 
 
 
 
 
 
255
  $pretty_link = $wpdb->get_row($query);
256
  $pretty_link_target = apply_filters( 'prli_target_url', array( 'url' => $pretty_link->url, 'link_id' => $pretty_link->id, 'redirect_type' => $pretty_link->redirect_type ) );
257
  $prli_edition = ucwords(preg_replace('/-/', ' ', PRLI_EDITION));
@@ -543,163 +524,6 @@ class PrliUtils {
543
  // around in case you want to re-install it at some point
544
  }
545
 
546
- public function should_install_pro_db() {
547
- global $plp_db_version;
548
- $old_pro_db_version = get_option('prlipro_db_version');
549
-
550
- if($plp_db_version != $old_pro_db_version) { return true; }
551
-
552
- return false;
553
- }
554
-
555
- public function install_pro_db() {
556
- global $wpdb, $plp_db_version;
557
-
558
- $upgrade_path = ABSPATH . 'wp-admin/includes/upgrade.php';
559
- require_once($upgrade_path);
560
-
561
- // Pretty Links Pro Tables
562
- $keywords_table = "{$wpdb->prefix}prli_keywords";
563
- $post_keywords_table = "{$wpdb->prefix}prli_post_keywords";
564
- $post_urls_table = "{$wpdb->prefix}prli_post_urls";
565
- $reports_table = "{$wpdb->prefix}prli_reports";
566
- $report_links_table = "{$wpdb->prefix}prli_report_links";
567
- $link_rotations_table = "{$wpdb->prefix}prli_link_rotations";
568
- $clicks_rotations_table = "{$wpdb->prefix}prli_clicks_rotations";
569
-
570
- // This was introduced in WordPress 3.5
571
- // $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
572
- $char_col = "";
573
- $collation = $wpdb->get_row("SHOW FULL COLUMNS FROM {$wpdb->posts} WHERE field = 'post_content'");
574
-
575
- if(isset($collation->Collation)) {
576
- $charset = explode('_', $collation->Collation);
577
-
578
- if(is_array($charset) && count($charset) > 1) {
579
- $charset = $charset[0]; //Get the charset from the collation
580
- $char_col = "DEFAULT CHARACTER SET {$charset} COLLATE {$collation->Collation}";
581
- }
582
- }
583
-
584
- //Fine we'll try it your way this time
585
- if(empty($char_col)) { $char_col = $wpdb->get_charset_collate(); }
586
-
587
- //Fix for large indexes
588
- $wpdb->query("SET GLOBAL innodb_large_prefix=1");
589
-
590
- /* Create/Upgrade Keywords Table */
591
- $sql = "
592
- CREATE TABLE {$keywords_table} (
593
- id int(11) NOT NULL auto_increment,
594
- text varchar(255) NOT NULL,
595
- link_id int(11) NOT NULL,
596
- created_at datetime NOT NULL,
597
- PRIMARY KEY (id),
598
- KEY link_id (link_id),
599
- KEY text (text)
600
- ) {$char_col};
601
- ";
602
-
603
- dbDelta($sql);
604
-
605
- /* Create/Upgrade Keywords Table */
606
- $sql = "
607
- CREATE TABLE {$post_keywords_table} (
608
- id int(11) NOT NULL auto_increment,
609
- keyword_id int(11) NOT NULL,
610
- post_id int(11) NOT NULL,
611
- PRIMARY KEY (id),
612
- KEY keyword_id (keyword_id),
613
- KEY post_id (post_id),
614
- UNIQUE KEY post_keyword_index (keyword_id,post_id)
615
- ) {$char_col};
616
- ";
617
-
618
- dbDelta($sql);
619
-
620
- /* Create/Upgrade URLs Table */
621
- $sql = "
622
- CREATE TABLE {$post_urls_table} (
623
- id int(11) NOT NULL auto_increment,
624
- url_id int(11) NOT NULL,
625
- post_id int(11) NOT NULL,
626
- PRIMARY KEY (id),
627
- KEY url_id (url_id),
628
- KEY post_id (post_id),
629
- UNIQUE KEY post_url_index (url_id,post_id)
630
- ) {$char_col};
631
- ";
632
-
633
- dbDelta($sql);
634
-
635
- /* Create/Upgrade Reports Table */
636
- $sql = "
637
- CREATE TABLE {$reports_table} (
638
- id int(11) NOT NULL auto_increment,
639
- name varchar(255) NOT NULL,
640
- goal_link_id int(11) default NULL,
641
- created_at datetime NOT NULL,
642
- PRIMARY KEY (id),
643
- KEY goal_link_id (goal_link_id),
644
- KEY name (name)
645
- ) {$char_col};
646
- ";
647
-
648
- dbDelta($sql);
649
-
650
- /* Create/Upgrade Reports Table */
651
- $sql = "
652
- CREATE TABLE {$report_links_table} (
653
- id int(11) NOT NULL auto_increment,
654
- report_id int(11) NOT NULL,
655
- link_id int(11) NOT NULL,
656
- created_at datetime NOT NULL,
657
- PRIMARY KEY (id),
658
- KEY report_id (report_id),
659
- KEY link_id (link_id)
660
- ) {$char_col};
661
- ";
662
-
663
- dbDelta($sql);
664
-
665
- /* Create/Upgrade Link Rotations Table */
666
- $sql = "
667
- CREATE TABLE {$link_rotations_table} (
668
- id int(11) NOT NULL auto_increment,
669
- url varchar(255) default NULL,
670
- weight int(11) default 0,
671
- r_index int(11) default 0,
672
- link_id int(11) NOT NULL,
673
- created_at datetime NOT NULL,
674
- PRIMARY KEY (id),
675
- KEY link_id (link_id),
676
- KEY url (url),
677
- KEY weight (weight),
678
- KEY r_index (r_index)
679
- ) {$char_col};
680
- ";
681
-
682
- dbDelta($sql);
683
-
684
- /* Create/Upgrade Clicks / Rotations Table */
685
- $sql = "
686
- CREATE TABLE {$clicks_rotations_table} (
687
- id int(11) NOT NULL auto_increment,
688
- click_id int(11) NOT NULL,
689
- link_id int(11) NOT NULL,
690
- url text NOT NULL,
691
- PRIMARY KEY (id),
692
- KEY click_id (click_id),
693
- KEY link_id (link_id)
694
- ) {$char_col};
695
- ";
696
-
697
- dbDelta($sql);
698
-
699
- /***** SAVE DB VERSION *****/
700
- update_option('prlipro_db_version', $plp_db_version);
701
- }
702
-
703
  // be careful with this one -- I use it to forceably reinstall pretty link pro
704
  public function delete_dir($dir) {
705
  if (!file_exists($dir)) {
@@ -793,8 +617,7 @@ class PrliUtils {
793
 
794
  if(!empty($char_col))
795
  {
796
- $prli_table_names = array( "{$wpdb->prefix}prli_groups",
797
- "{$wpdb->prefix}prli_clicks",
798
  "{$wpdb->prefix}prli_links",
799
  "{$wpdb->prefix}prli_link_metas",
800
  "{$wpdb->prefix}prli_tweets",
@@ -804,6 +627,11 @@ class PrliUtils {
804
  "{$wpdb->prefix}prli_link_rotations",
805
  "{$wpdb->prefix}prli_clicks_rotations" );
806
 
 
 
 
 
 
807
  foreach($prli_table_names as $prli_table_name)
808
  {
809
  $query = "ALTER TABLE {$prli_table_name} {$char_col}";
@@ -869,6 +697,47 @@ class PrliUtils {
869
  $query = $wpdb->prepare($query,'prli-url-aliases');
870
  $results = $wpdb->query($query);
871
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
872
  }
873
 
874
  public function this_is_a_robot($browser_ua,$browsecap,$header='')
@@ -1006,6 +875,7 @@ class PrliUtils {
1006
  return $string;
1007
  }
1008
 
 
1009
  public static function get_page_title($url, $slug='') {
1010
  $title = '';
1011
  $wp_http = new WP_Http;
@@ -1019,7 +889,7 @@ class PrliUtils {
1019
 
1020
  // Look for <title>(.*?)</title> in the text
1021
  if($data and preg_match('#<title>[\s\n\r]*?(.*?)[\s\n\r]*?</title>#im', $data, $matches)) {
1022
- $title = trim($matches[1]);
1023
  }
1024
 
1025
  //Attempt to covert cyrillic and other weird shiz to UTF-8 - if it fails we'll just return the slug next
@@ -1042,13 +912,16 @@ class PrliUtils {
1042
 
1043
  public static function is_url($str) {
1044
  //For now we're not going to validate this - there's too many possible protocols/schemes to validate now
1045
- return true;
1046
 
1047
  // This uses the @diegoperini URL matching regex adapted for PHP from https://gist.github.com/dperini/729294
1048
- // return preg_match('_^(?::/?/?)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$_iuS', $str);
1049
 
1050
  //Let's see how PHP's built in validator does instead?
1051
  //return apply_filters('prli_is_valid_url', (filter_var($str, FILTER_VALIDATE_URL) !== FALSE), $str);
 
 
 
 
1052
  }
1053
 
1054
  public static function is_email($str) {
@@ -1059,15 +932,15 @@ class PrliUtils {
1059
  return preg_match('/\(?\d{3}\)?[- ]\d{3}-\d{4}/', $str);
1060
  }
1061
 
1062
- public static function get_plp_permalink($link) {
1063
- global $prli_blogurl;
1064
-
1065
  $struct = PrliUtils::get_permalink_pre_slug_uri();
1066
 
1067
- if(isset($link->slug))
1068
- return "{$prli_blogurl}{$struct}{$link->slug}";
1069
- else
1070
- return false;
 
 
1071
  }
1072
 
1073
  public static function browser_image($browser) {
@@ -1229,9 +1102,13 @@ class PrliUtils {
1229
 
1230
  // Set the default message
1231
  if(empty($message)) {
1232
- $message = sprintf( __( 'Get started by %1$sadding a URL%2$s that you want to turn into a pretty link.<br/>' .
1233
- 'Come back to see how many times it was clicked.' , 'pretty-link' ),
1234
- '<a href="' . admin_url( 'admin.php?page=add-new-pretty-link' ) . '">', '</a>' );
 
 
 
 
1235
  }
1236
 
1237
  //Pro users don't want to be spammed
@@ -1387,5 +1264,45 @@ class PrliUtils {
1387
  public static function db_now($format='Y-m-d H:i:s') {
1388
  return self::ts_to_mysql_date(time(),$format);
1389
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1390
  }
1391
 
83
  }
84
  }
85
 
 
 
 
 
 
86
  public static function debug_log($message) {
87
  if(defined('WP_DEBUG') && WP_DEBUG) {
88
  error_log(sprintf(__('*** Pretty Links Debug: %s', 'pretty-link'), $message));
89
  }
90
  }
91
 
92
+ public static function is_slug_available( $slug, $id = '' ) {
93
+ self::debug_log("*** In Slug is available for {$slug} & id=[{$id}]");
94
  global $wp_rewrite, $prli_link;
95
+ $url = self::get_pretty_link_url($slug);
96
 
97
  if(empty($slug)) {
98
+ $error = __('The Slug can\'t be empty', 'pretty-link');
99
+ self::debug_log("slug_empty: {$error}");
100
+ return new WP_Error('slug_empty', $error);
101
  }
102
 
103
  // Check Filepaths
104
  $filepath = ABSPATH . $slug;
105
  if( file_exists($filepath) ) {
106
+ $error = sprintf(__('There\'s a file this slug conflicts with: %s', 'pretty-link'), $filepath);
107
+ self::debug_log("slug_not_available: {$error}");
108
+ return new WP_Error('slug_not_available', $error);
109
  }
110
 
111
  // Check other Pretty Links
112
+ $slug_link = $prli_link->getOneFromSlug( $slug );
113
+ self::debug_log(print_r($slug_link,true));
114
+ if(!empty($slug_link) && ($id != $slug_link->id)) {
115
+ $error = sprintf(__('This Pretty Link Slug is already taken. There\'s already another pretty link with this slug: %s', 'pretty-link'), $slug);
116
+ self::debug_log("slug_not_available: {$error}");
117
+ return new WP_Error('slug_not_available', $error);
118
  }
 
 
 
119
 
120
+ // Check any other URLs
121
+ $resp = wp_remote_head($url);
 
 
 
122
 
123
+ self::debug_log("****** wp_remote_head returned: " . print_r($resp, true));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
+ if(!is_wp_error($resp)) {
126
+ if($resp['headers'] instanceof Requests_Utility_CaseInsensitiveDictionary) {
127
+ $resp_headers = $resp['headers']->getAll();
128
+ }
129
+ else {
130
+ $resp_headers = $resp['headers'];
131
+ }
132
+ if($resp['response']['code'] == 200) {
133
+ $error = sprintf(__('This Pretty Link Slug is already taken. The path resolved to URL: %s', 'pretty-link'), $url);
134
+ }
135
+ else if(in_array($resp['response']['code'], array(301,302,307)) &&
136
+ isset($resp_headers['location']) &&
137
+ preg_match('!^' . preg_quote($url,'!') . '/?$!', $resp_headers['location'])) {
138
+ $error = sprintf(__('This Pretty Link Slug is already taken. The path redirected to URL: %s', 'pretty-link'), $resp_headers['location']);
139
+ }
140
 
141
+ if(isset($error)) {
142
+ self::debug_log("slug_not_available: {$error}");
143
+ return new WP_Error('slug_not_available', $error);
 
 
 
144
  }
145
  }
146
 
223
  public function track_link($slug,$values) {
224
  global $wpdb, $prli_click, $prli_options, $prli_link, $plp_update;
225
 
226
+ $query = $wpdb->prepare("
227
+ SELECT *
228
+ FROM {$prli_link->table_name}
229
+ WHERE slug=%s
230
+ AND link_status='enabled'
231
+ LIMIT 1
232
+ ",
233
+ $slug
234
+ );
235
+
236
  $pretty_link = $wpdb->get_row($query);
237
  $pretty_link_target = apply_filters( 'prli_target_url', array( 'url' => $pretty_link->url, 'link_id' => $pretty_link->id, 'redirect_type' => $pretty_link->redirect_type ) );
238
  $prli_edition = ucwords(preg_replace('/-/', ' ', PRLI_EDITION));
524
  // around in case you want to re-install it at some point
525
  }
526
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
527
  // be careful with this one -- I use it to forceably reinstall pretty link pro
528
  public function delete_dir($dir) {
529
  if (!file_exists($dir)) {
617
 
618
  if(!empty($char_col))
619
  {
620
+ $prli_table_names = array( "{$wpdb->prefix}prli_clicks",
 
621
  "{$wpdb->prefix}prli_links",
622
  "{$wpdb->prefix}prli_link_metas",
623
  "{$wpdb->prefix}prli_tweets",
627
  "{$wpdb->prefix}prli_link_rotations",
628
  "{$wpdb->prefix}prli_clicks_rotations" );
629
 
630
+ $prli_db = new PrliDb();
631
+ if ($prli_db->table_exists("{$wpdb->prefix}prli_groups")) {
632
+ $prli_table_names[] = "{$wpdb->prefix}prli_groups";
633
+ }
634
+
635
  foreach($prli_table_names as $prli_table_name)
636
  {
637
  $query = "ALTER TABLE {$prli_table_name} {$char_col}";
697
  $query = $wpdb->prepare($query,'prli-url-aliases');
698
  $results = $wpdb->query($query);
699
  }
700
+
701
+ if($db_version && $db_version < 19) {
702
+ // Get 1000 links at a time
703
+ $q = "
704
+ SELECT *
705
+ FROM {$prli_link->table_name}
706
+ WHERE link_cpt_id IS NULL
707
+ OR link_cpt_id <= 0
708
+ ORDER BY created_at DESC
709
+ LIMIT 1000
710
+ ";
711
+
712
+ $count_q = "
713
+ SELECT COUNT(*)
714
+ FROM {$prli_link->table_name}
715
+ WHERE link_cpt_id IS NULL
716
+ OR link_cpt_id <= 0
717
+ ";
718
+
719
+ while(0 < ($count = $wpdb->get_var($count_q))) {
720
+
721
+ $links = $wpdb->get_results($q);
722
+
723
+ // Loop through Links in Link Table
724
+ foreach($links as $link) {
725
+ // If there's already a CPT associated then continue
726
+ if($link->link_cpt_id > 0) {
727
+ continue;
728
+ }
729
+
730
+ $cpt_id = $prli_link->create_cpt_for_link($link->name, $link->created_at, $link->updated_at);
731
+
732
+ if($cpt_id == false) {
733
+ PrliUtils::debug_log("Unable to create CPT Post for Link (Migration)");
734
+ }
735
+
736
+ // update the link db record with the Link CPT ID
737
+ $prli_link->update_link_cpt($link->id, $cpt_id);
738
+ }
739
+ }
740
+ }
741
  }
742
 
743
  public function this_is_a_robot($browser_ua,$browsecap,$header='')
875
  return $string;
876
  }
877
 
878
+ /** Attempt to get a page title from the target url */
879
  public static function get_page_title($url, $slug='') {
880
  $title = '';
881
  $wp_http = new WP_Http;
889
 
890
  // Look for <title>(.*?)</title> in the text
891
  if($data and preg_match('#<title>[\s\n\r]*?(.*?)[\s\n\r]*?</title>#im', $data, $matches)) {
892
+ $title = html_entity_decode(trim($matches[1]));
893
  }
894
 
895
  //Attempt to covert cyrillic and other weird shiz to UTF-8 - if it fails we'll just return the slug next
912
 
913
  public static function is_url($str) {
914
  //For now we're not going to validate this - there's too many possible protocols/schemes to validate now
 
915
 
916
  // This uses the @diegoperini URL matching regex adapted for PHP from https://gist.github.com/dperini/729294
917
+ //return apply_filters('prli_is_valid_url', preg_match('%^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\x{00a1}-\x{ffff}][a-z0-9\x{00a1}-\x{ffff}_-]{0,62})?[a-z0-9\x{00a1}-\x{ffff}]\.)+(?:[a-z\x{00a1}-\x{ffff}]{2,})\.?))(?::\d{2,5})?(?:[/?#]\S*)?$%iuS', $str));
918
 
919
  //Let's see how PHP's built in validator does instead?
920
  //return apply_filters('prli_is_valid_url', (filter_var($str, FILTER_VALIDATE_URL) !== FALSE), $str);
921
+ //
922
+
923
+ // Let's just make sure there's a mailto: or // somewhere here
924
+ return apply_filters('prli_is_valid_url', preg_match('%(^mailto:|//)%', $str));
925
  }
926
 
927
  public static function is_email($str) {
932
  return preg_match('/\(?\d{3}\)?[- ]\d{3}-\d{4}/', $str);
933
  }
934
 
935
+ public static function get_pretty_link_url($slug, $path_only=false) {
 
 
936
  $struct = PrliUtils::get_permalink_pre_slug_uri();
937
 
938
+ if(isset($slug)) {
939
+ $path = "{$struct}{$slug}";
940
+ return ($path_only ? $path : home_url($path));
941
+ }
942
+
943
+ return false;
944
  }
945
 
946
  public static function browser_image($browser) {
1102
 
1103
  // Set the default message
1104
  if(empty($message)) {
1105
+ $message = sprintf(
1106
+ // translators: %1$s: open link tag, %2$s: close link tag, %3$s: br tag
1107
+ esc_html__( 'Get started by %1$sadding a URL%2$s that you want to turn into a pretty link.%3$sCome back to see how many times it was clicked.' , 'pretty-link' ),
1108
+ '<a href="' . esc_url(admin_url( 'admin.php?page=add-new-pretty-link' )) . '">',
1109
+ '</a>',
1110
+ '<br>'
1111
+ );
1112
  }
1113
 
1114
  //Pro users don't want to be spammed
1264
  public static function db_now($format='Y-m-d H:i:s') {
1265
  return self::ts_to_mysql_date(time(),$format);
1266
  }
1267
+
1268
+ public static function is_post_request() {
1269
+ if(isset($_SERVER['REQUEST_METHOD'])) {
1270
+ return (strtolower($_SERVER['REQUEST_METHOD']) == 'post');
1271
+ }
1272
+ else {
1273
+ return (isset($_POST) && !empty($_POST));
1274
+ }
1275
+ }
1276
+
1277
+ public static function is_get_request() {
1278
+ if(isset($_SERVER['REQUEST_METHOD'])) {
1279
+ return (strtolower($_SERVER['REQUEST_METHOD']) == 'get');
1280
+ }
1281
+ else {
1282
+ return (!isset($_GET) || empty($_GET));
1283
+ }
1284
+ }
1285
+
1286
+ /**
1287
+ * Sanitize the HTML in the given string
1288
+ *
1289
+ * @param string $value
1290
+ * @return string
1291
+ */
1292
+ public static function sanitize_html($value) {
1293
+ return current_user_can('unfiltered_html') ? $value : wp_kses_post($value);
1294
+ }
1295
+
1296
+ /**
1297
+ * Ensure the given number $x is between $min and $max inclusive
1298
+ *
1299
+ * @param mixed $x
1300
+ * @param mixed $min
1301
+ * @param mixed $max
1302
+ * @return mixed
1303
+ */
1304
+ public static function clamp($x, $min, $max) {
1305
+ return min(max($x, $min), $max);
1306
+ }
1307
  }
1308
 
app/views/admin/errors.php CHANGED
@@ -4,13 +4,13 @@
4
  <div class="error notice is-dismissible below-h2">
5
  <ul>
6
  <?php foreach($errors as $error): ?>
7
- <li><strong><?php _e('ERROR', 'pretty-link'); ?></strong>: <?php print $error; ?></li>
8
  <?php endforeach; ?>
9
  </ul>
10
  </div>
11
  <?php endif; ?>
12
  <?php if( isset($message) and !empty($message) ): ?>
13
  <div class="updated notice notice-success is-dismissible">
14
- <p><?php echo $message; ?></p>
15
  </div>
16
  <?php endif; ?>
4
  <div class="error notice is-dismissible below-h2">
5
  <ul>
6
  <?php foreach($errors as $error): ?>
7
+ <li><strong><?php esc_html_e('ERROR', 'pretty-link'); ?></strong>: <?php echo esc_html($error); ?></li>
8
  <?php endforeach; ?>
9
  </ul>
10
  </div>
11
  <?php endif; ?>
12
  <?php if( isset($message) and !empty($message) ): ?>
13
  <div class="updated notice notice-success is-dismissible">
14
+ <p><?php echo esc_html($message); ?></p>
15
  </div>
16
  <?php endif; ?>
app/views/admin/onboarding/update.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+
3
+ <div class="wrap prli-update">
4
+ <h1><?php esc_html_e('Get Some Quick Wins with Pretty Links 3.0!', 'pretty-link'); ?></h1>
5
+
6
+ <p>
7
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-3-0.png'; ?>" alt="<?php esc_attr_e('Get Some Quick Wins with Pretty Links 3.0!', 'pretty-link'); ?>">
8
+ </p>
9
+
10
+ <p>
11
+ <?php
12
+ printf(
13
+ // translators: %1$s: open strong tag, %2$s: close strong tag
14
+ esc_html__('We hope you know that here at Pretty Links, we work every day to deliver amazing tools for business owners to help them %1$swin more%2$s. We want our customers to make more money, easier through superior affiliate link strategy and management.', 'pretty-link'),
15
+ '<strong><em>',
16
+ '</em></strong>'
17
+ );
18
+ ?>
19
+ </p>
20
+
21
+ <p>
22
+ <?php
23
+ printf(
24
+ // translators: %1$s: open strong tag, %2$s: close strong tag
25
+ esc_html__('That\'s why today, we\'re excited to announce that we\'re rolling out a major, new release. This release won\'t deliver any huge, new features but rather a set of incremental features & fixes that will %1$sinstantly give you some well deserved quick wins%2$s in your business.', 'pretty-link'),
26
+ '<strong><em>',
27
+ '</em></strong>'
28
+ );
29
+ ?>
30
+ </p>
31
+
32
+ <p>
33
+ <?php
34
+ printf(
35
+ // translators: %1$s: open strong tag, %2$s: close strong tag
36
+ esc_html__('That\'s why we\'re calling Pretty Links 3.0 - %1$sQuick Wins!%2$s', 'pretty-link'),
37
+ '<strong><em>',
38
+ '</em></strong>'
39
+ );
40
+ ?>
41
+ </p>
42
+
43
+ <h2><?php esc_html_e('What Changes Can You Expect, Exactly?', 'pretty-link'); ?></h2>
44
+
45
+ <p><?php esc_html_e('Check out these solid improvements that will make your experience with Pretty Links better in almost every way:', 'pretty-link'); ?></p>
46
+
47
+ <ul class="prli-bullet-list">
48
+ <li>
49
+ <p>
50
+ <?php
51
+ printf(
52
+ // translators: %1$s: open strong tag, %2$s: close strong tag
53
+ esc_html__('%1$sAn all-new Link Editor%2$s - We\'ve completely overhauled our link editing experience. Our new, power-packed link editor will make creating and managing your affiliate links easier than ever before!', 'pretty-link'),
54
+ '<strong>',
55
+ '</strong>'
56
+ );
57
+ ?>
58
+ </p>
59
+ <div class="prli-row prli-2-columns">
60
+ <div class="prli-column">
61
+ <a href="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-1.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
62
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-1.png'; ?>" alt="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
63
+ </a>
64
+ </div>
65
+ <div class="prli-column">
66
+ <a href="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-2.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
67
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-2.png'; ?>" alt="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
68
+ </a>
69
+ </div>
70
+ </div>
71
+ </li>
72
+ <li>
73
+ <p>
74
+ <?php
75
+ printf(
76
+ // translators: %1$s: open strong tag, %2$s: close strong tag
77
+ esc_html__('%1$sAll new Link Listing%2$s - Gone is the clumsy, old Link Listing feature! You’ll now be able to send links to the "Trash," customize what columns you see in your listing with "Screen Options" and change the number of rows displayed.', 'pretty-link'),
78
+ '<strong>',
79
+ '</strong>'
80
+ );
81
+ ?>
82
+ </p>
83
+ <div class="prli-row">
84
+ <div class="prli-column">
85
+ <a href="<?php echo PRLI_IMAGES_URL . '/update-all-new-link-listing.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('All new Link Listing', 'pretty-link'); ?>">
86
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-all-new-link-listing.png'; ?>" alt="<?php esc_attr_e('All new Link Listing', 'pretty-link'); ?>">
87
+ </a>
88
+ </div>
89
+ </div>
90
+ </li>
91
+ <li>
92
+ <p>
93
+ <?php
94
+ printf(
95
+ // translators: %1$s: open strong tag, %2$s: close strong tag
96
+ esc_html__('%1$sCustomizable Links Tags / Categories (Pro Only)%2$s - Once you upgrade to Quick Wins, you\'ll be able to categorize and tag your pretty links! This is a long-requested feature that will help you organize your links and group them any way that you\'d like to for ultimate productivity and monetization!', 'pretty-link'),
97
+ '<strong>',
98
+ '</strong>'
99
+ );
100
+ ?>
101
+ </p>
102
+ <div class="prli-row">
103
+ <div class="prli-column">
104
+ <a href="<?php echo PRLI_IMAGES_URL . '/update-categories-tags.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('Customizable Links Tags / Categories (Pro Only)', 'pretty-link'); ?>">
105
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-categories-tags.png'; ?>" alt="<?php esc_attr_e('Customizable Links Tags / Categories (Pro Only)', 'pretty-link'); ?>">
106
+ </a>
107
+ </div>
108
+ </div>
109
+ </li>
110
+ <li>
111
+ <p>
112
+ <?php
113
+ printf(
114
+ // translators: %1$s: open strong tag, %2$s: close strong tag
115
+ esc_html__('%1$sGutenberg Block Link Integration%2$s - You can now use your Pretty Links directly inside the Gutenberg Paragraph Block. All you have to do is select the "Pretty Link" button from your Paragraph Block\'s formatting bar then you can search and insert Pretty Links instantly!', 'pretty-link'),
116
+ '<strong>',
117
+ '</strong>'
118
+ );
119
+ ?>
120
+ </p>
121
+ <div class="prli-row">
122
+ <div class="prli-column">
123
+ <a href="<?php echo PRLI_IMAGES_URL . '/update-gutenberg-editor.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('Gutenberg Block Link Integration', 'pretty-link'); ?>">
124
+ <img src="<?php echo PRLI_IMAGES_URL . '/update-gutenberg-editor.png'; ?>" alt="<?php esc_attr_e('Gutenberg Block Link Integration', 'pretty-link'); ?>">
125
+ </a>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+
131
+ </ul>
132
+
133
+ <h2><?php esc_html_e('Tons of Fixes and Enhancements', 'pretty-link'); ?></h2>
134
+
135
+ <p><?php esc_html_e('In addition to these streamlined, new features we’ve made hundreds of enhancements and numerous small fixes. Pretty Links Quick Wins is going to make your link experience easier, faster, more secure and more capable than ever before!', 'pretty-link'); ?></p>
136
+
137
+ <p>
138
+ <?php
139
+ printf(
140
+ // translators: %1$s: open strong tag, %2$s: close strong tag
141
+ esc_html__('We\'re excited for you to start winning more today with %1$sPretty Link Quick Wins!%2$s', 'pretty-link'),
142
+ '<strong><em>',
143
+ '</em></strong>'
144
+ );
145
+ ?>
146
+ </p>
147
+
148
+ </div>
app/views/admin/onboarding/welcome.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+
3
+ <div class="wrap prli-welcome">
4
+ <h1><?php esc_html_e('Welcome to Pretty Links!', 'pretty-link'); ?></h1>
5
+
6
+ <div class="prli-welcome-badge">
7
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-desk.png'; ?>" alt="<?php esc_attr_e('Welcome to Pretty Links!', 'pretty-link'); ?>">
8
+ </div>
9
+
10
+ <p class="prli-welcome-about"><?php esc_html_e('Congratulations, you\'ve just installed the most powerful link management platform for WordPress on Earth!', 'pretty-link'); ?></p>
11
+ <p class="prli-welcome-about"><?php esc_html_e('With Pretty Links, you\'ll no longer need to manage links from a spreadsheet and you\'ll be able to maximize the visibility of your links - these benefits (and more) will make it possible to make more money from your content like never before!', 'pretty-link'); ?></p>
12
+
13
+ <hr>
14
+
15
+ <div class="prli-center-section">
16
+ <div>&nbsp;</div>
17
+ <h2><?php esc_html_e('Getting Started', 'pretty-link'); ?></h2>
18
+ <p><?php esc_html_e('Start by creating your first Pretty Link:', 'pretty-link'); ?></p>
19
+ </div>
20
+
21
+ <div class="prli-center-section">
22
+ <div>&nbsp;</div>
23
+ <p class="prli-welcome-step">
24
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-add-new.png'; ?>" alt="<?php esc_attr_e('Click "Add New Link"', 'pretty-link'); ?>">
25
+ <?php esc_html_e('1. Click "Add New Link"', 'pretty-link'); ?>
26
+ </p>
27
+ <p class="prli-welcome-step">
28
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-enter-url.png'; ?>" alt="<?php esc_attr_e('Enter the URL of your Affiliate Link', 'pretty-link'); ?>">
29
+ <?php esc_html_e('2. Enter the URL of your Affiliate Link', 'pretty-link'); ?>
30
+ </p>
31
+ <p class="prli-welcome-step">
32
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-customize-slug.png'; ?>" alt="<?php esc_attr_e('Customize your Pretty Link Slug', 'pretty-link'); ?>">
33
+ <?php esc_html_e('3. Customize your Pretty Link Slug', 'pretty-link'); ?>
34
+ </p>
35
+ <p class="prli-welcome-step">
36
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-click-update.png'; ?>" alt="<?php esc_attr_e('Click "Update"', 'pretty-link'); ?>">
37
+ <?php esc_html_e('4. Click "Update"', 'pretty-link'); ?>
38
+ </p>
39
+ <p class="prli-welcome-step">
40
+ <img class="prli-welcome-step" src="<?php echo PRLI_IMAGES_URL . '/welcome-copy-url.png'; ?>" alt="<?php esc_attr_e('Copy the Pretty Link URL', 'pretty-link'); ?>">
41
+ <?php esc_html_e('5. Copy the Pretty Link URL', 'pretty-link'); ?>
42
+ </p>
43
+ <div>&nbsp;</div>
44
+
45
+ <p><?php esc_html_e('Wasn\'t that easy? Now, you can use this link wherever you want!', 'pretty-link'); ?></p>
46
+
47
+ </div>
48
+
49
+ <hr>
50
+
51
+ <div class="prli-center-section">
52
+ <div>&nbsp;</div>
53
+ <h2><?php esc_html_e('The Power of Pretty Links Pro', 'pretty-link'); ?></h2>
54
+ <p><?php esc_html_e('There are many reasons that premium users of Pretty Links are able to take their business to the next level:', 'pretty-link'); ?></p>
55
+ </div>
56
+
57
+ <div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
58
+ <div class="prli-column prli-align-vertically">
59
+ <h3><?php esc_html_e('Automated, Site-Wide Link Placement (Keyword Replacement)', 'pretty-link'); ?></h3>
60
+ <p><?php esc_html_e('Imagine if you never had to hand-edit links, copy and paste from a spreadsheet, or actively have to keep up with you links ever again. Well that time has come! Now with Pretty Links, all you have to do is create your links and let Pretty Links do the rest!', 'pretty-link'); ?></p>
61
+ <p><?php esc_html_e('Pretty Links will scan your content for the keywords or URLs that you want to target and will replace them with Pretty Links automatically! This will save you tons of time so you can focus on growing your business!', 'pretty-link'); ?></p>
62
+ </div>
63
+ <div class="prli-column">
64
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-link.png'; ?>" alt="<?php esc_attr_e('Automated, Site-Wide Link Placement (Keyword Replacement)', 'pretty-link'); ?>">
65
+ </div>
66
+ </div>
67
+
68
+ <div class="prli-center-section prli-row prli-2-columns prli-is-wider-right">
69
+ <div class="prli-column">
70
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-categories.png'; ?>" alt="<?php esc_attr_e('Categories & Tags', 'pretty-link'); ?>">
71
+ </div>
72
+ <div class="prli-column prli-align-vertically">
73
+ <h3><?php esc_html_e('Categories & Tags', 'pretty-link'); ?></h3>
74
+ <p><?php esc_html_e('When you are dealing with a large number of links, it can be easy to be overwhelmed and confused by which links to you planned to use where. It\'s now easier than ever to organize your links and group them any way that you like for ultimate productivity and monetization!', 'pretty-link'); ?></p>
75
+ </div>
76
+ </div>
77
+
78
+ <div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
79
+ <div class="prli-column prli-align-vertically">
80
+ <h3><?php esc_html_e('Advanced Redirect Types', 'pretty-link'); ?></h3>
81
+ <p><?php esc_html_e('Lite users can take advantage of 301 & 302 server side redirects but our pro users can also redirect with cloaking, JavaScript, Meta-refresh and more.', 'pretty-link'); ?></p>
82
+ <p><?php esc_html_e('So if you have social media links, a landing page, or a new page or post you\'d like to redirect your customers to, this feature will definitely come in handy!', 'pretty-link'); ?></p>
83
+ </div>
84
+ <div class="prli-column">
85
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-advanced-redirects.png'; ?>" alt="<?php esc_attr_e('Advanced Redirect Types', 'pretty-link'); ?>">
86
+ </div>
87
+ </div>
88
+
89
+ <div class="prli-center-section prli-row prli-2-columns prli-is-wider-right">
90
+ <div class="prli-column">
91
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-dynamic-redirects.png'; ?>" alt="<?php esc_attr_e('Dynamic Redirect Types', 'pretty-link'); ?>">
92
+ </div>
93
+ <div class="prli-column prli-align-vertically">
94
+ <h3><?php esc_html_e('Dynamic Redirect Types', 'pretty-link'); ?></h3>
95
+ <p><?php esc_html_e('Would you like your Pretty Link to redirect somewhere custom depending on what country your user is in, device they\'re using, time they\'re clicking the link or just randomly? Our pro users can do this easily with our Dynamic Redirections!', 'pretty-link'); ?></p>
96
+ <p><?php esc_html_e('This feature is excellent if you are running a time-sensitive sales, want to create custom content for you customers, create stellar landing pages for customers in different countries!', 'pretty-link'); ?></p>
97
+ </div>
98
+ </div>
99
+
100
+ <div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
101
+ <div class="prli-column prli-align-vertically">
102
+ <h3><?php esc_html_e('Import and Export Links', 'pretty-link'); ?></h3>
103
+ <p><?php esc_html_e('Export your links to a spreadsheet or import them en masse - our pro users can do this with ease. Simply download your spreadsheet, upload to WordPress, and your links are automatically added to Pretty Links!', 'pretty-link'); ?></p>
104
+ </div>
105
+ <div class="prli-column">
106
+ <img src="<?php echo PRLI_IMAGES_URL . '/welcome-import-export.png'; ?>" alt="<?php esc_attr_e('Import and Export Links', 'pretty-link'); ?>">
107
+ </div>
108
+ </div>
109
+
110
+ <div class="prli-center-section">
111
+ <h3><?php esc_html_e('The list goes on and on', 'pretty-link'); ?></h3>
112
+ <p><?php esc_html_e('Our premium editions of Pretty Links are a HUGE upgrade from Lite. Don’t miss out on our critical PRO benefits!', 'pretty-link'); ?></p>
113
+ </div>
114
+
115
+ <div class="prli-center-section prli-button-section">
116
+ <a href="https://prettylinks.com/pl/welcome-page/upgrade" class="button button-primary"><?php esc_html_e('Upgrade to Pro', 'pretty-link'); ?></a>
117
+ <p><?php esc_html_e('Upgrade NOW and get 50% off of your subscription!!!', 'pretty-link'); ?></p>
118
+ </div>
119
+
120
+ </div>
app/views/admin/popups/rating.php CHANGED
@@ -1,20 +1,46 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
 
 
3
  <div id="prli-rating-popup" class="mfp-hide prli-popup prli-auto-open">
4
  <p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
5
- <div>&nbsp;</div>
6
- <h2><?php _e('Rate Pretty Link', 'pretty-link'); ?></h2>
7
- <p><?php _e('If you enjoy using Pretty Link would you mind taking a moment to rate it on WordPress.org? It won\'t take more than a minute.', 'pretty-link'); ?></p>
8
- <p><?php _e('Thanks for your support!', 'pretty-link'); ?></p>
9
- <div>&nbsp;</div>
10
- <div>&nbsp;</div>
11
 
12
- <center>
13
- <button data-popup="rating" class="prli-delay-popup button"><?php _e('Remind Me Later', 'pretty-link'); ?></button>
14
- <button data-popup="rating" data-href="https://wordpress.org/plugins/pretty-link/" class="prli-delay-popup button-primary"><?php _e('Review Pretty Link', 'pretty-link'); ?></button>
 
 
 
 
 
 
15
  <div>&nbsp;</div>
16
- <a href="" data-popup="rating" class="prli-stop-popup"><?php _e('Never Remind Me Again', 'pretty-link'); ?></a>
17
- </center>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  </div>
20
 
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
+ <?php $plp_update = new PrliUpdateController(); ?>
4
+
5
  <div id="prli-rating-popup" class="mfp-hide prli-popup prli-auto-open">
6
  <p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
7
+ <div id="prli-rating-stage-one">
8
+ <center><h2><?php esc_html_e('Are you enjoying using Pretty Links?', 'pretty-link'); ?></h2></center>
9
+ <div>&nbsp;</div>
 
 
 
10
 
11
+ <center>
12
+ <button data-popup="rating" class="prli-rating-enjoy-yes-popup button-primary"><?php esc_html_e('Yes', 'pretty-link'); ?></button>
13
+ <button data-popup="rating" class="prli-rating-enjoy-no-popup button"><?php esc_html_e('No', 'pretty-link'); ?></button>
14
+ </center>
15
+ </div>
16
+ <div id="prli-rating-stage-two-yes" class="prli-hidden">
17
+ <h2><?php esc_html_e('Rate Pretty Links', 'pretty-link'); ?></h2>
18
+ <p><?php esc_html_e('If you enjoy using Pretty Links would you mind taking a moment to rate it on WordPress.org? It won\'t take more than a minute.', 'pretty-link'); ?></p>
19
+ <p><?php esc_html_e('Thanks for your support!', 'pretty-link'); ?></p>
20
  <div>&nbsp;</div>
21
+ <div>&nbsp;</div>
22
+
23
+ <center>
24
+ <button data-popup="rating" class="prli-delay-popup button"><?php esc_html_e('Remind Me Later', 'pretty-link'); ?></button>
25
+ <button data-popup="rating" data-href="https://prettylinks.com/pl/footer/review" class="prli-stop-popup button-primary"><?php esc_html_e('Review Pretty Links', 'pretty-link'); ?></button>
26
+ </center>
27
+ </div>
28
+ <div id="prli-rating-stage-two-no" class="prli-hidden">
29
+ <h2><?php esc_html_e('Leave Feedback', 'pretty-link'); ?></h2>
30
+ <p><?php esc_html_e('To help us improve Pretty Links, would you mind taking a moment to leave feedback?', 'pretty-link'); ?></p>
31
+ <p><?php esc_html_e('Thanks for your support!', 'pretty-link'); ?></p>
32
+ <div>&nbsp;</div>
33
+ <div>&nbsp;</div>
34
+
35
+ <center>
36
+ <button data-popup="rating" class="prli-delay-popup button"><?php esc_html_e('Remind Me Later', 'pretty-link'); ?></button>
37
+ <a href="https://prettylinks.com/feedback/" target="_blank" class="prli-leave-feedback button-primary"><?php esc_html_e('Leave Feedback', 'pretty-link'); ?></a>
38
+ <?php if($plp_update->is_installed()): ?>
39
+ <div>&nbsp;</div>
40
+ <a href="" data-popup="rating" class="prli-stop-popup"><?php esc_html_e('Never Remind Me Again', 'pretty-link'); ?></a>
41
+ <?php endif; ?>
42
+ </center>
43
+ </div>
44
 
45
  </div>
46
 
app/views/admin/popups/upgrade.php CHANGED
@@ -1,29 +1,27 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div id="prli-upgrade-popup" class="mfp-hide prli-popup prli-auto-open">
4
- <p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
5
  <div>&nbsp;</div>
6
- <h2><?php _e('Upgrade Pretty Link PRO', 'pretty-link'); ?></h2>
7
- <p><?php _e('Upgrading will enable you to:', 'pretty-link'); ?><br/>
8
  <ul>
9
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
10
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
11
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
12
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Auto-prettylink your Pages &amp; Posts', 'pretty-link'); ?></li>
13
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
14
- <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('And much, much more!', 'pretty-link'); ?></li>
15
  </ul>
16
  </p>
17
- <p><?php _e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></p>
18
- <p><?php _e('We think you\'ll love it!', 'pretty-link'); ?></p>
19
  <div>&nbsp;</div>
20
  <div>&nbsp;</div>
21
 
22
  <center>
23
- <button data-popup="upgrade" class="prli-delay-popup button"><?php _e('Remind Me Later', 'pretty-link'); ?></button>
24
- <button data-popup="upgrade" data-href="https://prettylinks.com/pl/popup/upgrade" class="prli-delay-popup button-primary"><?php _e('Upgrade to Pretty Links Pro', 'pretty-link'); ?></button>
25
- <div>&nbsp;</div>
26
- <a href="" data-popup="upgrade" class="prli-stop-popup"><?php _e('Never Remind Me Again', 'pretty-link'); ?></a>
27
  </center>
28
 
29
  </div>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div id="prli-upgrade-popup" class="mfp-hide prli-popup prli-auto-open">
4
+ <p><img src="<?php echo esc_url(PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'); ?>" width="200" height="32" /></p>
5
  <div>&nbsp;</div>
6
+ <h2><?php esc_html_e('Upgrade to Pretty Links PRO', 'pretty-link'); ?></h2>
7
+ <p><?php esc_html_e('Unlock Pretty Links\' PRO features and you\'ll be able to:', 'pretty-link'); ?><br/>
8
  <ul>
9
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('Monetize existing content with automated Pretty Link placement', 'pretty-link'); ?></li>
10
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('Redirect with cloaking, Javascript or Meta-refresh', 'pretty-link'); ?></li>
11
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('Redirect by location, time, device or rotation', 'pretty-link'); ?></li>
12
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('Expire your Pretty Links', 'pretty-link'); ?></li>
13
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('Split-test your Pretty Links', 'pretty-link'); ?></li>
14
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php esc_html_e('And much, much more!', 'pretty-link'); ?></li>
15
  </ul>
16
  </p>
17
+ <p><?php esc_html_e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data.', 'pretty-link'); ?></p>
18
+ <p><?php esc_html_e('We think you\'ll love it!', 'pretty-link'); ?></p>
19
  <div>&nbsp;</div>
20
  <div>&nbsp;</div>
21
 
22
  <center>
23
+ <button data-popup="upgrade" data-href="https://prettylinks.com/pl/popup/upgrade" class="prli-delay-popup button-primary"><?php esc_html_e('Upgrade to Pretty Links Pro', 'pretty-link'); ?></button>
24
+ <button data-popup="upgrade" class="prli-delay-popup button"><?php esc_html_e('Maybe Later', 'pretty-link'); ?></button>
 
 
25
  </center>
26
 
27
  </div>
app/views/admin/update/activation_warning.php CHANGED
@@ -1,19 +1,65 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <?php global $plp_update; ?>
3
  <?php if(defined('PRETTYLINK_LICENSE_KEY') && isset($error)): ?>
4
- <div class="prli-red-notice"><?php printf(__('Error with PRETTYLINK_LICENSE_KEY: %s', 'pretty-link'), $error); ?></div>
 
 
 
 
 
 
 
5
  <?php elseif($plp_update->was_activated_with_username_and_password()): ?>
6
  <div class="prli-red-notice">
7
- <h2><?php _e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
8
- <p><?php _e('It looks like you used to have Pretty Links Pro activated with a username and password but now you need a license key to activate it.', 'pretty-link'); ?></p>
9
- <p><strong><?php printf(__('You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s', 'pretty-link'), '<a href="https://prettylinks.com/activation-warning/account" target="_blank">','</a>'); ?></strong></p>
10
- <p><?php printf(__('After you paste your license key on the %1$s"Pretty Link" -> "Activate Pro" admin page,%2$s you\'ll start getting updates again.', 'pretty-link'), '<a href="'.$plp_update->activate_page_url().'">','</a>'); ?></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  </div>
12
  <?php else: ?>
13
  <div class="prli-red-notice">
14
- <h2><?php _e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
15
- <p><strong><?php printf(__('You can retrieve or purchase a license key at %1$sPrettyLinkPro.com%2$s to enable automatic updates today.', 'pretty-link'), '<a href="https://prettylinks.com/pl/activation-warning/buy" target="_blank">','</a>'); ?></strong></p>
16
- <p><?php printf(__('After you paste your license key on the %1$s"Pretty Link" -> "Activate Pro" admin page,%2$s you\'ll start getting automatic updates.', 'pretty-link'), '<a href="'.$plp_update->activate_page_url().'">','</a>'); ?></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  </div>
18
  <?php endif; ?>
19
-
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <?php global $plp_update; ?>
3
  <?php if(defined('PRETTYLINK_LICENSE_KEY') && isset($error)): ?>
4
+ <div class="prli-red-notice">
5
+ <?php
6
+ printf(
7
+ esc_html__('Error with PRETTYLINK_LICENSE_KEY: %s', 'pretty-link'),
8
+ esc_html($error)
9
+ );
10
+ ?>
11
+ </div>
12
  <?php elseif($plp_update->was_activated_with_username_and_password()): ?>
13
  <div class="prli-red-notice">
14
+ <h2><?php esc_html_e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
15
+ <p><?php esc_html_e('It looks like you used to have Pretty Links Pro activated with a username and password but now you need a license key to activate it.', 'pretty-link'); ?></p>
16
+ <p>
17
+ <strong>
18
+ <?php
19
+ printf(
20
+ // translators: %1$s: open link tag, %2$s: close link tag
21
+ esc_html__('You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s', 'pretty-link'),
22
+ '<a href="https://prettylinks.com/activation-warning/account" target="_blank">',
23
+ '</a>'
24
+ );
25
+ ?>
26
+ </strong>
27
+ </p>
28
+ <p>
29
+ <?php
30
+ printf(
31
+ // translators: %1$s: open link tag, %2$s: close link tag
32
+ esc_html__('After you paste your license key on the %1$s"Pretty Link" -> "Activate Pro" admin page,%2$s you\'ll start getting updates again.', 'pretty-link'),
33
+ sprintf('<a href="%s">', esc_url($plp_update->activate_page_url())),
34
+ '</a>'
35
+ );
36
+ ?>
37
+ </p>
38
  </div>
39
  <?php else: ?>
40
  <div class="prli-red-notice">
41
+ <h2><?php esc_html_e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
42
+ <p>
43
+ <strong>
44
+ <?php
45
+ printf(
46
+ // translators: %1$s: open link tag, %2$s: close link tag
47
+ esc_html__('You can retrieve or purchase a license key at %1$sPrettyLinks.com%2$s to enable automatic updates today.', 'pretty-link'),
48
+ '<a href="https://prettylinks.com/pl/activation-warning/buy" target="_blank">',
49
+ '</a>'
50
+ );
51
+ ?>
52
+ </strong>
53
+ </p>
54
+ <p>
55
+ <?php
56
+ printf(
57
+ // translators: %1$s: open link tag, %2$s: close link tag
58
+ esc_html__('After you paste your license key on the %1$s"Pretty Links" -> "Activate Pro" admin page,%2$s you\'ll start getting automatic updates.', 'pretty-link'),
59
+ sprintf('<a href="%s">', esc_url($plp_update->activate_page_url())),
60
+ '</a>'
61
+ );
62
+ ?>
63
+ </p>
64
  </div>
65
  <?php endif; ?>
 
app/views/admin/update/addon_popup.php CHANGED
@@ -1,25 +1,34 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div class="prli-admin-notice prli-auto-open mfp-hide prli-white-popup prli-popup-leftalign">
4
- <h2 class="prli_error" style="text-align: center !important; padding-bottom: 15px !important; padding-top: 15px !important"><i class="mp-icon-attention"> </i> <?php _e('ACTION REQUIRED', 'pretty-link'); ?></h2>
5
- <p><?php printf(__('The %s features in your Pretty Link options have been moved from Pretty Link into a separate plugin.', 'pretty-link'), $a->name); ?></p>
6
- <p><?php __('Why you ask? Well, it\'s to streamline and increase the performance of Pretty Link for you.', 'pretty-link'); ?></p>
7
 
8
  <?php if($installed): ?>
9
- <p><?php printf(__('And good for you, it looks like you\'ve already got the %1$s Add-on installed. Just click the "Activate %2$s Add-on" button below and you\'ll get all these features back now.', 'pretty-link'), $a->name, $a->name); ?></p>
10
  <?php else: ?>
11
- <p><?php printf(__('Luckily it\'s easy to get these features back now. Just click the "Install %s Add-on" button below.', 'pretty-link'), $a->name); ?></p>
12
- <p><?php printf(__('If you have problems with the auto-install please refer to %1$sthe user manual%2$s for manual install instructions.', 'pretty-link'), '<a href="https://prettylinks.com/pl/addon-popup/um/manual-installation" target="_blank">', '</a>'); ?></p>
 
 
 
 
 
 
 
 
 
13
  <?php endif; ?>
14
  <br/>
15
  <center>
16
- <div data-addon="<?php echo $k; ?>">
17
  <?php if($installed): ?>
18
- <button data-href="<?php echo MeprAddonsHelper::activate_url("pretty-link-{$k}/main.php"); ?>" class="prli-btn prli-left-margin prli-addon-activate"><?php printf(__('Activate %s Add-on', 'pretty-link'), $a->name); ?></button>
19
  <?php else: ?>
20
- <button data-href="<?php echo MeprAddonsHelper::install_url('pretty-link-'.$k); ?>" class="prli-btn prli-left-margin prli-addon-install"><?php printf(__('Install %s Add-on', 'pretty-link'), $a->name); ?></button>
21
  <?php endif; ?>
22
- <button class="prli-btn prli-left-margin prli-addon-stop-notices"><?php _e('Don\'t Show This Message Again', 'pretty-link'); ?></button>
23
  </div>
24
  </center>
25
  <br/>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div class="prli-admin-notice prli-auto-open mfp-hide prli-white-popup prli-popup-leftalign">
4
+ <h2 class="prli_error" style="text-align: center !important; padding-bottom: 15px !important; padding-top: 15px !important"><i class="mp-icon-attention"> </i> <?php esc_html_e('ACTION REQUIRED', 'pretty-link'); ?></h2>
5
+ <p><?php echo esc_html(sprintf(__('The %s features in your Pretty Link options have been moved from Pretty Link into a separate plugin.', 'pretty-link'), $a->name)); ?></p>
6
+ <p><?php esc_html_e('Why you ask? Well, it\'s to streamline and increase the performance of Pretty Link for you.', 'pretty-link'); ?></p>
7
 
8
  <?php if($installed): ?>
9
+ <p><?php echo esc_html(sprintf(__('And good for you, it looks like you\'ve already got the %1$s Add-on installed. Just click the "Activate %2$s Add-on" button below and you\'ll get all these features back now.', 'pretty-link'), $a->name, $a->name)); ?></p>
10
  <?php else: ?>
11
+ <p><?php echo esc_html(sprintf(__('Luckily it\'s easy to get these features back now. Just click the "Install %s Add-on" button below.', 'pretty-link'), $a->name)); ?></p>
12
+ <p>
13
+ <?php
14
+ printf(
15
+ // translators: %1$s: open link tag, %2$s: close link tag
16
+ esc_html__('If you have problems with the auto-install please refer to %1$sthe user manual%2$s for manual install instructions.', 'pretty-link'),
17
+ '<a href="https://prettylinks.com/pl/addon-popup/um/manual-installation" target="_blank">',
18
+ '</a>'
19
+ );
20
+ ?>
21
+ </p>
22
  <?php endif; ?>
23
  <br/>
24
  <center>
25
+ <div data-addon="<?php echo esc_attr($k); ?>">
26
  <?php if($installed): ?>
27
+ <button data-href="<?php echo esc_url(MeprAddonsHelper::activate_url("pretty-link-{$k}/main.php")); ?>" class="prli-btn prli-left-margin prli-addon-activate"><?php echo esc_html(sprintf(__('Activate %s Add-on', 'pretty-link'), $a->name)); ?></button>
28
  <?php else: ?>
29
+ <button data-href="<?php echo esc_url(MeprAddonsHelper::install_url('pretty-link-'.$k)); ?>" class="prli-btn prli-left-margin prli-addon-install"><?php echo esc_html(sprintf(__('Install %s Add-on', 'pretty-link'), $a->name)); ?></button>
30
  <?php endif; ?>
31
+ <button class="prli-btn prli-left-margin prli-addon-stop-notices"><?php esc_html_e('Don\'t Show This Message Again', 'pretty-link'); ?></button>
32
  </div>
33
  </center>
34
  <br/>
app/views/admin/update/addons.php CHANGED
@@ -1,19 +1,19 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
- <div class="prli-page-title"><?php _e('Pretty Link Add-ons', 'pretty-link'); ?></div>
4
 
5
  <?php $addons = PrliUpdateController::addons(true); ?>
6
 
7
  <?php if(empty($addons)): ?>
8
- <h3><?php _e('There were no Add-ons found for your license or lack thereof...', 'pretty-link'); ?></h3>
9
  <?php else: ?>
10
  <table class="widefat">
11
 
12
  <thead>
13
  <tr>
14
- <th><?php _e('Add-on', 'pretty-link'); ?></th>
15
- <th><?php _e('Description', 'pretty-link'); ?></th>
16
- <th><?php _e('Install', 'pretty-link'); ?></th>
17
  </tr>
18
  </thead>
19
 
@@ -36,22 +36,22 @@
36
  <strong>
37
  <?php
38
 
39
- echo isset($info->extra_info->list_title) ? $info->extra_info->list_title : $info->product_name;
40
 
41
  if($update_available) {
42
- echo ' ' . __('(Update Available)', 'pretty-link');
43
  }
44
  ?>
45
  </strong>
46
  </td>
47
- <td><?php echo $info->extra_info->description; ?></td>
48
  <td>
49
  <?php if($installed && $active): ?>
50
- <a class="button" href="" style="pointer-events: none;" disabled><?php _e('Installed & Active', 'pretty-link'); ?></a>
51
  <?php elseif($installed && !$active): ?>
52
- <a class="button" href="" style="pointer-events: none;" disabled><?php _e('Installed & Inactive', 'pretty-link'); ?></a>
53
  <?php else: ?>
54
- <a class="button button-primary" href="<?php echo PrliAddonsHelper::install_url($slug); ?>"><?php _e('Install', 'pretty-link'); ?></a>
55
  <?php endif; ?>
56
  </td>
57
  </tr>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
+ <div class="prli-page-title"><?php esc_html_e('Pretty Link Add-ons', 'pretty-link'); ?></div>
4
 
5
  <?php $addons = PrliUpdateController::addons(true); ?>
6
 
7
  <?php if(empty($addons)): ?>
8
+ <h3><?php esc_html_e('There were no Add-ons found for your license or lack thereof...', 'pretty-link'); ?></h3>
9
  <?php else: ?>
10
  <table class="widefat">
11
 
12
  <thead>
13
  <tr>
14
+ <th><?php esc_html_e('Add-on', 'pretty-link'); ?></th>
15
+ <th><?php esc_html_e('Description', 'pretty-link'); ?></th>
16
+ <th><?php esc_html_e('Install', 'pretty-link'); ?></th>
17
  </tr>
18
  </thead>
19
 
36
  <strong>
37
  <?php
38
 
39
+ echo esc_html(isset($info->extra_info->list_title) ? $info->extra_info->list_title : $info->product_name);
40
 
41
  if($update_available) {
42
+ echo ' ' . esc_html__('(Update Available)', 'pretty-link');
43
  }
44
  ?>
45
  </strong>
46
  </td>
47
+ <td><?php echo esc_html($info->extra_info->description); ?></td>
48
  <td>
49
  <?php if($installed && $active): ?>
50
+ <a class="button" href="" style="pointer-events: none;" disabled><?php esc_html_e('Installed & Active', 'pretty-link'); ?></a>
51
  <?php elseif($installed && !$active): ?>
52
+ <a class="button" href="" style="pointer-events: none;" disabled><?php esc_html_e('Installed & Inactive', 'pretty-link'); ?></a>
53
  <?php else: ?>
54
+ <a class="button button-primary" href="<?php echo esc_url(PrliAddonsHelper::install_url($slug)); ?>"><?php esc_html_e('Install', 'pretty-link'); ?></a>
55
  <?php endif; ?>
56
  </td>
57
  </tr>
app/views/admin/update/edge_updates.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <?php global $plp_update; ?>
3
- <div id="<?php echo $plp_update->edge_updates_str; ?>-wrap">
4
- <input type="checkbox" id="<?php echo $plp_update->edge_updates_str; ?>" data-nonce="<?php echo wp_create_nonce('wp-edge-updates'); ?>" <?php checked($plp_update->edge_updates); ?>/>&nbsp;<?php _e('Include Pretty Links Pro edge (development) releases in automatic updates (not recommended for production websites)', 'pretty-link'); ?> <img src="<?php echo PRLI_IMAGES_URL . '/square-loader.gif'; ?>" alt="<?php _e('Loading...', 'pretty-link'); ?>" class="prli_loader" />
5
  </div>
6
 
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <?php global $plp_update; ?>
3
+ <div id="<?php echo esc_attr($plp_update->edge_updates_str); ?>-wrap">
4
+ <input type="checkbox" id="<?php echo esc_attr($plp_update->edge_updates_str); ?>" data-nonce="<?php echo esc_attr(wp_create_nonce('wp-edge-updates')); ?>" <?php checked($plp_update->edge_updates); ?>/>&nbsp;<?php esc_html_e('Include Pretty Links Pro edge (development) releases in automatic updates (not recommended for production websites)', 'pretty-link'); ?> <img src="<?php echo esc_url(PRLI_IMAGES_URL . '/square-loader.gif'); ?>" alt="<?php esc_attr_e('Loading...', 'pretty-link'); ?>" class="prli_loader" />
5
  </div>
6
 
app/views/admin/update/license.php CHANGED
@@ -1,82 +1,112 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
- <?php global $plp_update; ?>
 
 
 
3
 
4
- <div class="prli-page-title"><?php _e('Pretty Links Pro License', 'pretty-link'); ?></div>
5
 
6
  <?php if( !isset($li) or empty($li) ): ?>
7
- <p class="description"><?php printf(__('You must have a License Key to enable automatic updates for Pretty Links Pro. If you don\'t have a License please go to %1$s to get one. If you do have a license you can login at %2$s to manage your licenses and site activations.', 'pretty-link'), '<a href="https://prettylinks.com/pl/license-alert/buy">prettylinks.com</a>', '<a href="https://prettylinks.com/pl/license-alert/login">prettylinks.com/login</a>'); ?></p>
 
 
 
 
 
 
 
 
 
8
  <form name="activation_form" method="post" action="">
9
  <?php wp_nonce_field('activation_form'); ?>
10
 
11
  <table class="form-table">
12
  <tr class="form-field">
13
- <td valign="top" width="225px"><?php _e('Enter Your Pretty Links Pro License Key:', 'pretty-link'); ?></td>
14
  <td>
15
- <input type="text" name="<?php echo $plp_update->mothership_license_str; ?>" value="<?php echo (isset($_POST[$plp_update->mothership_license_str])?$_POST[$plp_update->mothership_license_str]:$plp_update->mothership_license); ?>"/>
16
  </td>
17
  </tr>
18
  </table>
19
  <p class="submit">
20
- <input type="submit" name="Submit" class="button button-primary" value="<?php printf(__('Activate License Key on %s', 'pretty-link'), PrliUtils::site_domain()); ?>" />
21
  </p>
22
  </form>
23
 
24
  <?php if(!$plp_update->is_installed()): ?>
25
  <div>&nbsp;</div>
26
 
27
- <div class="prli-page-title"><?php _e('Upgrade to Pro', 'pretty-link'); ?></div>
28
 
29
  <div>
30
- <?php printf(__('It looks like you haven\'t %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:', 'pretty-link'),'<a href="https://prettylinks.com/pl/license-alert/upgrade" target="_blank">','</a>') ?>
 
 
 
 
 
 
 
31
  </div>
32
 
33
  <div>&nbsp;</div>
34
 
35
  <ul style="padding-left: 25px;">
36
- <li>&bullet; <?php _e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
37
- <li>&bullet; <?php _e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
38
- <li>&bullet; <?php _e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
39
- <li>&bullet; <?php _e('Auto-prettylink your Pages &amp; Posts', 'pretty-link'); ?></li>
40
- <li>&bullet; <?php _e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
41
- <li>&bullet; <?php _e('And much, much more!', 'pretty-link'); ?></li>
42
  </ul>
43
 
44
  <div>&nbsp;</div>
45
- <div><?php _e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></div>
46
  <div>&nbsp;</div>
47
- <div><?php _e('We think you\'ll love it!', 'pretty-link'); ?></div>
48
  <div>&nbsp;</div>
49
- <div><a href="https://prettylinks.com/pl/license-alert/upgrade-1" class="button button-primary"><?php _e('Upgrade to Pro today!', 'pretty-link'); ?></a></div>
50
  <?php endif; ?>
51
  <?php else: ?>
52
  <div class="prli-license-active">
53
- <div><h4><?php _e('Active License Key Information:', 'pretty-link'); ?></h4></div>
54
  <table>
55
  <tr>
56
- <td><?php _e('License Key:', 'pretty-link'); ?></td>
57
- <td>********-****-****-****-<?php echo substr($li['license_key']['license'], -12); ?></td>
58
  </tr>
59
  <tr>
60
- <td><?php _e('Status:', 'pretty-link'); ?></td>
61
- <td><?php printf(__('<b>Active on %s</b>', 'pretty-link'), PrliUtils::site_domain()); ?></td>
62
  </tr>
63
  <tr>
64
- <td><?php _e('Product:', 'pretty-link'); ?></td>
65
- <td><?php echo $li['product_name']; ?></td>
66
  </tr>
67
  <tr>
68
- <td><?php _e('Activations:', 'pretty-link'); ?></td>
69
- <td><?php printf('<b>%1$d of %2$s</b> sites have been activated with this license key', $li['activation_count'], ucwords($li['max_activations'])); ?></td>
 
 
 
 
 
 
 
 
 
 
 
70
  </tr>
71
  </table>
72
- <div class="prli-deactivate-button"><a href="<?php echo admin_url('admin.php?page=pretty-link-updates&action=deactivate&_wpnonce='.wp_create_nonce('pretty-link_deactivate')); ?>" class="button button-primary" onclick="return confirm('<?php printf(__("Are you sure? Pretty Links Pro will not be functional on %s if this License Key is deactivated.", 'pretty-link'), PrliUtils::site_domain()); ?>');"><?php printf(__('Deactivate License Key on %s', 'pretty-link'), PrliUtils::site_domain()); ?></a></div>
73
  </div>
74
  <?php if(!$this->is_installed()): ?>
75
- <div><a href="<?php echo $this->update_plugin_url(); ?>" class="button button-primary"><?php _e('Upgrade plugin to Pro', 'pretty-link'); ?></a></div>
76
  <div>&nbsp;</div>
77
  <?php endif; ?>
78
  <?php require(PRLI_VIEWS_PATH.'/admin/update/edge_updates.php'); ?>
79
  <br/>
80
- <div id="prli-version-string"><?php printf(__("You're currently running version %s of Pretty Links Pro", 'pretty-link'), '<b>'.PRLI_VERSION.'</b>'); ?></div>
81
  <?php endif; ?>
82
 
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
+ <?php
3
+ global $plp_update;
4
+ $mothership_license_str = isset($_POST[$plp_update->mothership_license_str]) ? sanitize_key($_POST[$plp_update->mothership_license_str]) : $plp_update->mothership_license;
5
+ ?>
6
 
7
+ <div class="prli-page-title"><?php esc_html_e('Pretty Links Pro License', 'pretty-link'); ?></div>
8
 
9
  <?php if( !isset($li) or empty($li) ): ?>
10
+ <p class="description">
11
+ <?php
12
+ printf(
13
+ // translators: %1$s: link to pro site, %2$s: link to pro site login page
14
+ esc_html__('You must have a License Key to enable automatic updates for Pretty Links Pro. If you don\'t have a License please go to %1$s to get one. If you do have a license you can login at %2$s to manage your licenses and site activations.', 'pretty-link'),
15
+ '<a href="https://prettylinks.com/pl/license-alert/buy">prettylinks.com</a>',
16
+ '<a href="https://prettylinks.com/pl/license-alert/login">prettylinks.com/login</a>'
17
+ );
18
+ ?>
19
+ </p>
20
  <form name="activation_form" method="post" action="">
21
  <?php wp_nonce_field('activation_form'); ?>
22
 
23
  <table class="form-table">
24
  <tr class="form-field">
25
+ <td valign="top" width="225px"><?php esc_html_e('Enter Your Pretty Links Pro License Key:', 'pretty-link'); ?></td>
26
  <td>
27
+ <input type="text" name="<?php echo esc_attr($plp_update->mothership_license_str); ?>" value="<?php echo esc_attr($mothership_license_str); ?>"/>
28
  </td>
29
  </tr>
30
  </table>
31
  <p class="submit">
32
+ <input type="submit" name="Submit" class="button button-primary" value="<?php echo esc_attr(sprintf(__('Activate License Key on %s', 'pretty-link'), PrliUtils::site_domain())); ?>" />
33
  </p>
34
  </form>
35
 
36
  <?php if(!$plp_update->is_installed()): ?>
37
  <div>&nbsp;</div>
38
 
39
+ <div class="prli-page-title"><?php esc_html_e('Upgrade to Pro', 'pretty-link'); ?></div>
40
 
41
  <div>
42
+ <?php
43
+ printf(
44
+ // translators: %1$s: open link tag, %2$s: close link tag
45
+ esc_html__('It looks like you haven\'t %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:', 'pretty-link'),
46
+ '<a href="https://prettylinks.com/pl/license-alert/upgrade" target="_blank">',
47
+ '</a>'
48
+ );
49
+ ?>
50
  </div>
51
 
52
  <div>&nbsp;</div>
53
 
54
  <ul style="padding-left: 25px;">
55
+ <li>&bullet; <?php esc_html_e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
56
+ <li>&bullet; <?php esc_html_e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
57
+ <li>&bullet; <?php esc_html_e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
58
+ <li>&bullet; <?php esc_html_e('Auto-prettylink your Pages &amp; Posts', 'pretty-link'); ?></li>
59
+ <li>&bullet; <?php esc_html_e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
60
+ <li>&bullet; <?php esc_html_e('And much, much more!', 'pretty-link'); ?></li>
61
  </ul>
62
 
63
  <div>&nbsp;</div>
64
+ <div><?php esc_html_e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></div>
65
  <div>&nbsp;</div>
66
+ <div><?php esc_html_e('We think you\'ll love it!', 'pretty-link'); ?></div>
67
  <div>&nbsp;</div>
68
+ <div><a href="https://prettylinks.com/pl/license-alert/upgrade-1" class="button button-primary"><?php esc_html_e('Upgrade to Pro today!', 'pretty-link'); ?></a></div>
69
  <?php endif; ?>
70
  <?php else: ?>
71
  <div class="prli-license-active">
72
+ <div><h4><?php esc_html_e('Active License Key Information:', 'pretty-link'); ?></h4></div>
73
  <table>
74
  <tr>
75
+ <td><?php esc_html_e('License Key:', 'pretty-link'); ?></td>
76
+ <td>********-****-****-****-<?php echo esc_html(substr($li['license_key']['license'], -12)); ?></td>
77
  </tr>
78
  <tr>
79
+ <td><?php esc_html_e('Status:', 'pretty-link'); ?></td>
80
+ <td><b><?php echo esc_html(sprintf(__('Active on %s', 'pretty-link'), PrliUtils::site_domain())); ?></b></td>
81
  </tr>
82
  <tr>
83
+ <td><?php esc_html_e('Product:', 'pretty-link'); ?></td>
84
+ <td><?php echo esc_html($li['product_name']); ?></td>
85
  </tr>
86
  <tr>
87
+ <td><?php esc_html_e('Activations:', 'pretty-link'); ?></td>
88
+ <td>
89
+ <?php
90
+ printf(
91
+ // translators: %1$s: open b tag, %2$s: close b tag, %3$d: current activation count, %4$s: max activations
92
+ esc_html__('%1$s%3$d of %4$s%2$s sites have been activated with this license key', 'pretty-link'),
93
+ '<b>',
94
+ '</b>',
95
+ esc_html($li['activation_count']),
96
+ esc_html(ucwords($li['max_activations']))
97
+ );
98
+ ?>
99
+ </td>
100
  </tr>
101
  </table>
102
+ <div class="prli-deactivate-button"><a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-updates&action=deactivate&_wpnonce='.wp_create_nonce('pretty-link_deactivate'))); ?>" class="button button-primary" onclick="return confirm('<?php echo esc_attr(sprintf(__("Are you sure? Pretty Links Pro will not be functional on %s if this License Key is deactivated.", 'pretty-link'), PrliUtils::site_domain())); ?>');"><?php echo esc_html(sprintf(__('Deactivate License Key on %s', 'pretty-link'), PrliUtils::site_domain())); ?></a></div>
103
  </div>
104
  <?php if(!$this->is_installed()): ?>
105
+ <div><a href="<?php echo esc_url($this->update_plugin_url()); ?>" class="button button-primary"><?php esc_html_e('Upgrade plugin to Pro', 'pretty-link'); ?></a></div>
106
  <div>&nbsp;</div>
107
  <?php endif; ?>
108
  <?php require(PRLI_VIEWS_PATH.'/admin/update/edge_updates.php'); ?>
109
  <br/>
110
+ <div id="prli-version-string"><?php printf(esc_html__("You're currently running version %s of Pretty Links Pro", 'pretty-link'), '<b>'.esc_html(PRLI_VERSION).'</b>'); ?></div>
111
  <?php endif; ?>
112
 
app/views/admin/update/ui.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
- <?php echo PrliAppHelper::page_title(__('Activate Pretty Links Pro', 'pretty-link')); ?>
4
  <?php require(PRLI_VIEWS_PATH.'/admin/errors.php'); ?>
5
 
6
  <div class="prli_spacer"></div>
@@ -13,8 +13,8 @@
13
  <tr>
14
  <td class="prli-settings-table-nav">
15
  <ul class="prli-sidebar-nav">
16
- <li><a data-id="license"><?php _e('License', 'pretty-link'); ?></a></li>
17
- <!-- <li><a data-id="addons"><?php _e('Add-Ons', 'pretty-link'); ?></a></li> -->
18
  <?php do_action('prli_updates_nav_items'); ?>
19
  </ul>
20
  </td>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
+ <?php PrliAppHelper::page_title(__('Activate Pretty Links Pro', 'pretty-link')); ?>
4
  <?php require(PRLI_VIEWS_PATH.'/admin/errors.php'); ?>
5
 
6
  <div class="prli_spacer"></div>
13
  <tr>
14
  <td class="prli-settings-table-nav">
15
  <ul class="prli-sidebar-nav">
16
+ <li><a data-id="license"><?php esc_html_e('License', 'pretty-link'); ?></a></li>
17
+ <!-- <li><a data-id="addons"><?php esc_html_e('Add-Ons', 'pretty-link'); ?></a></li> -->
18
  <?php do_action('prli_updates_nav_items'); ?>
19
  </ul>
20
  </td>
app/views/clicks/csv_download.php CHANGED
@@ -1,10 +1,10 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
- <?php echo PrliAppHelper::page_title(__('Download Clicks', 'pretty-link')); ?>
4
- <span style="font-size: 14px; font-weight: bold;">For <?php echo stripslashes($link_name); ?>: </span>
5
 
6
- <h3><?php _e('Click Reports:', 'pretty-link'); ?></h3>
7
- <span class="description"><?php printf( __('All clicks on %s', 'pretty-link'), stripslashes($link_name) ); ?></span>
8
  <br/>
9
  <ul>
10
  <?php
@@ -25,7 +25,7 @@
25
  $hit_param_delim = (preg_match('#\?#',$hit_report_url)?'&':'?');
26
 
27
  ?>
28
- <li><a href="<?php echo $hit_report_url . $hit_param_delim; ?>prli_page=<?php echo $i; ?>"><?php echo $report_label; ?></a></li>
29
  <?php
30
  }
31
  ?>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
+ <?php PrliAppHelper::page_title(__('Download Clicks', 'pretty-link')); ?>
4
+ <span style="font-size: 14px; font-weight: bold;"><?php echo esc_html(sprintf(__('For %s', 'pretty-link'), stripslashes($link_name))); ?></span>
5
 
6
+ <h3><?php esc_html_e('Click Reports:', 'pretty-link'); ?></h3>
7
+ <span class="description"><?php echo esc_html(sprintf(__('All clicks on %s', 'pretty-link'), stripslashes($link_name))); ?></span>
8
  <br/>
9
  <ul>
10
  <?php
25
  $hit_param_delim = (preg_match('#\?#',$hit_report_url)?'&':'?');
26
 
27
  ?>
28
+ <li><a href="<?php echo esc_url($hit_report_url . $hit_param_delim . 'prli_page=' . $i); ?>"><?php echo esc_html($report_label); ?></a></li>
29
  <?php
30
  }
31
  ?>
app/views/clicks/list.php CHANGED
@@ -1,24 +1,24 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div class="wrap">
4
- <?php echo PrliAppHelper::page_title(__('Clicks', 'pretty-link')); ?>
5
  <br/>
6
- <span style="font-size: 14px;"><?php echo __('For', 'pretty-link').' '.stripslashes($link_name); ?>: </span>
7
  <?php
8
  // Don't show this sheesh if we're displaying the vuid or ip grouping
9
  if(empty($params['ip']) and empty($params['vuid'])) {
10
  ?>
11
- <a href="#" class="filter_toggle button button-primary" style="vertical-align:middle;"><?php _e('Customize Report', 'pretty-link'); ?></a>
12
  <?php
13
  }
14
  ?>
15
 
16
  <?php
17
  if(!empty($params['l']) && $params['l'] != 'all') {
18
- echo '<br/><a href="'.admin_url("admin.php?page=pretty-link-clicks").'">&laquo '.__("Back to Links", 'pretty-link').'</a>';
19
  }
20
  else if(!empty($params['ip']) || !empty($params['vuid'])) {
21
- echo '<br/><a href="'.admin_url('admin.php?page=pretty-link-clicks').'">&laquo '.__("Back to Clicks", 'pretty-link').'</a>';
22
  }
23
 
24
  if(empty($params['ip']) && empty($params['vuid'])) {
@@ -27,20 +27,20 @@
27
  <div class="filter_pane" style="margin-top:15px;">
28
  <form class="form-fields" name="form2" method="post" action="">
29
  <?php wp_nonce_field('prli-reports'); ?>
30
- <span><?php _e('Type:', 'pretty-link'); ?></span>&nbsp;
31
  <select id="type" name="type" style="display: inline;">
32
- <option value="all"<?php selected(empty($params['type']) || $params['type'] == 'all'); ?>><?php _e('All Clicks', 'pretty-link'); ?>&nbsp;</option>
33
- <option value="unique"<?php selected($params['type'] == 'unique'); ?>><?php _e('Unique Clicks', 'pretty-link'); ?>&nbsp;</option>
34
  </select>
35
  <br/>
36
  <br/>
37
- <span><?php _e('Date Range:', 'pretty-link'); ?></span>
38
  <div id="dateselectors" style="display: inline;">
39
- <input type="text" name="sdate" id="sdate" value="<?php echo $params['sdate']; ?>" style="display:inline;"/>&nbsp;<?php _e('to', 'pretty-link'); ?>&nbsp;<input type="text" name="edate" id="edate" value="<?php echo $params['edate']; ?>" style="display:inline;"/>
40
  </div>
41
  <br/>
42
  <br/>
43
- <div class="submit" style="display: inline;"><input type="submit" name="Submit" value="Customize" class="button button-primary" /> &nbsp; <a href="#" class="filter_toggle button"><?php _e('Cancel', 'pretty-link'); ?></a></div>
44
  </form>
45
  </div>
46
 
@@ -56,12 +56,12 @@
56
  <form class="form-fields" name="click_form" method="post" action="">
57
  <?php wp_nonce_field('prli-clicks'); ?>
58
 
59
- <input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
60
- <input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
61
  <input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
62
- <div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search Clicks"/>
63
  <?php if(!empty($search_str)): ?>
64
- &nbsp; <a href="<?php echo admin_url('admin.php?page=pretty-link-clicks'.(!empty($params['l'])?'&l='.$params['l']:'')); ?>" class="button"><?php _e('Reset', 'pretty-link'); ?></a>
65
  <?php endif; ?>
66
  </div>
67
  </form>
@@ -70,35 +70,35 @@
70
  <thead>
71
  <tr>
72
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
73
- <th class="manage-column" width="5%"><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=btype".(($sort_str == 'btype' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Browser', 'pretty-link'); echo (($sort_str == 'btype')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
74
  </th>
75
- <th class="manage-column" width="5%"><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=os".(($sort_str == 'os' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('OS', 'pretty-link'); echo (($sort_str == 'btype')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
76
  </th>
77
  <?php } ?>
78
  <th class="manage-column" width="12%">
79
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=ip".(($sort_str == 'ip' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('IP', 'pretty-link'); echo (($sort_str == 'ip')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
80
  </th>
81
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
82
  <th class="manage-column" width="12%">
83
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=vuid".(($sort_str == 'vuid' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Visitor', 'pretty-link'); echo (($sort_str == 'vuid')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
84
  </th>
85
  <?php } ?>
86
  <th class="manage-column" width="13%">
87
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=created_at".(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Timestamp', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
88
  </th>
89
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
90
  <th class="manage-column" width="16%">
91
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=host".(($sort_str == 'host' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Host', 'pretty-link'); echo (($sort_str == 'host')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
92
  </th>
93
  <?php } ?>
94
  <th class="manage-column" width="16%">
95
- <a href="?page=<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=uri".(($sort_str == 'uri' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('URI', 'pretty-link'); echo (($sort_str == 'uri')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
96
  </th>
97
  <th class="manage-column" width="16%">
98
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=referer".(($sort_str == 'referer' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Referrer', 'pretty-link'); echo (($sort_str == 'referer')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
99
  </th>
100
  <th class="manage-column" width="13%">
101
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=link".(($sort_str == 'link' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Link', 'pretty-link'); echo (($sort_str == 'link')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a>
102
  </th>
103
  </tr>
104
  </thead>
@@ -108,7 +108,7 @@
108
  {
109
  ?>
110
  <tr>
111
- <td colspan="8"><?php _e('No Clicks have been recorded yet', 'pretty-link'); ?></td>
112
  </tr>
113
  <?php
114
  }
@@ -119,7 +119,7 @@
119
  $alternate = ( $row_index++ % 2 ? '' : 'alternate' );
120
 
121
  ?>
122
- <tr id="record_<?php echo $click->id; ?>" class="<?php echo $alternate; ?>">
123
 
124
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
125
  <td>
@@ -129,38 +129,36 @@
129
  ?>
130
 
131
  <?php if(false===$browser_image): ?>
132
- <span style="font-size: 16px; cursor: pointer;" title="<?php echo $click->btype; ?>"><strong>?</strong></span>
133
  <?php else: ?>
134
- <img src="<?php echo esc_html(PRLI_BROWSER_URL); ?>/<?php echo $browser_image; ?>" alt="<?php echo $click->btype . " v" . $click->bversion; ?>" title="<?php echo $click->btype . " v" . $click->bversion; ?>" width="16px" height="16px" style="width: 16px; height: 16px;" />
135
  <?php endif; ?>
136
  </td>
137
 
138
  <td>
139
  <?php if(false===$os_image): ?>
140
- <span style="font-size: 16px; cursor: pointer;" title="<?php echo $click->os; ?>"><strong>?</strong></span>
141
  <?php else: ?>
142
- <img src="<?php echo esc_html(PRLI_OS_URL); ?>/<?php echo $os_image; ?>" alt="<?php echo $click->os; ?>" title="<?php echo $click->os; ?>" width="16px" height="16px" style="width: 16px; height: 16px;" /></td>
143
  <?php endif; ?>
144
  </td>
145
  <?php endif; ?>
146
 
147
- <?php $click_ip = esc_attr( $click->ip ); ?>
148
-
149
- <td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&ip={$click_ip}"); ?>" title="<?php printf(__('View All Activity for IP Address: %s', 'pretty-link'), $click_ip); ?>"><?php echo $click_ip; ?> (<?php echo $click->ip_count; ?>)</a></td>
150
 
151
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
152
- <td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&vuid={$click->vuid}") ?>" title="<?php printf(__('View All Activity for Visitor: %s', 'pretty-link'), $click->vuid); ?>"><?php echo $click->vuid; ?><?php echo (($click->vuid != null)?" ($click->vuid_count)":''); ?></a></td>
153
  <?php endif; ?>
154
 
155
- <td><?php echo $click->created_at; ?></td>
156
 
157
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
158
- <td><?php echo $click->host; ?></td>
159
  <?php endif; ?>
160
 
161
- <td><?php echo $click->uri; ?></td>
162
- <td><a href="<?php echo esc_attr( $click->referer ); ?>"><?php echo esc_attr( $click->referer ); ?></a></td>
163
- <td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&l={$click->link_id}"); ?>" title="<?php printf(__('View clicks for %s', 'pretty-link'), stripslashes($click->link_name)); ?>"><?php echo stripslashes($click->link_name); ?></a></td>
164
  </tr>
165
  <?php
166
 
@@ -170,26 +168,26 @@
170
  <tfoot>
171
  <tr>
172
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
173
- <th class="manage-column"><?php _e('Browser', 'pretty-link'); ?></th>
174
- <th class="manage-column"><?php _e('OS', 'pretty-link'); ?></th>
175
  <?php } ?>
176
- <th class="manage-column"><?php _e('IP', 'pretty-link'); ?></th>
177
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
178
- <th class="manage-column"><?php _e('Visitor', 'pretty-link'); ?></th>
179
  <?php } ?>
180
- <th class="manage-column"><?php _e('Timestamp', 'pretty-link'); ?></th>
181
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
182
- <th class="manage-column"><?php _e('Host', 'pretty-link'); ?></th>
183
  <?php } ?>
184
- <th class="manage-column"><?php _e('URI', 'pretty-link'); ?></th>
185
- <th class="manage-column"><?php _e('Referrer', 'pretty-link'); ?></th>
186
- <th class="manage-column"><?php _e('Link', 'pretty-link'); ?></th>
187
  </tr>
188
  </tfoot>
189
  </table>
190
 
191
  <br/>
192
- <a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&action=csv{$page_params}"); ?>" class="button button-primary"><?php _e('Download CSV', 'pretty-link'); ?> (<?php echo stripslashes($link_name); ?>)</a>
193
 
194
  <?php
195
  require(PRLI_VIEWS_PATH.'/shared/table-nav.php');
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
 
3
  <div class="wrap">
4
+ <?php PrliAppHelper::page_title(__('Clicks', 'pretty-link')); ?>
5
  <br/>
6
+ <span style="font-size: 14px;"><?php echo esc_html(sprintf(__('For %s', 'pretty-link'), stripslashes($link_name))); ?>: </span>
7
  <?php
8
  // Don't show this sheesh if we're displaying the vuid or ip grouping
9
  if(empty($params['ip']) and empty($params['vuid'])) {
10
  ?>
11
+ <a href="#" class="filter_toggle button button-primary" style="vertical-align:middle;"><?php esc_html_e('Customize Report', 'pretty-link'); ?></a>
12
  <?php
13
  }
14
  ?>
15
 
16
  <?php
17
  if(!empty($params['l']) && $params['l'] != 'all') {
18
+ echo '<br/><a href="'.esc_url(admin_url("admin.php?page=pretty-link-clicks")).'">&laquo; '.esc_html__("Back to Links", 'pretty-link').'</a>';
19
  }
20
  else if(!empty($params['ip']) || !empty($params['vuid'])) {
21
+ echo '<br/><a href="'.esc_url(admin_url('admin.php?page=pretty-link-clicks')).'">&laquo; '.esc_html__("Back to Clicks", 'pretty-link').'</a>';
22
  }
23
 
24
  if(empty($params['ip']) && empty($params['vuid'])) {
27
  <div class="filter_pane" style="margin-top:15px;">
28
  <form class="form-fields" name="form2" method="post" action="">
29
  <?php wp_nonce_field('prli-reports'); ?>
30
+ <span><?php esc_html_e('Type:', 'pretty-link'); ?></span>&nbsp;
31
  <select id="type" name="type" style="display: inline;">
32
+ <option value="all"<?php selected(empty($params['type']) || $params['type'] == 'all'); ?>><?php esc_html_e('All Clicks', 'pretty-link'); ?>&nbsp;</option>
33
+ <option value="unique"<?php selected($params['type'] == 'unique'); ?>><?php esc_html_e('Unique Clicks', 'pretty-link'); ?>&nbsp;</option>
34
  </select>
35
  <br/>
36
  <br/>
37
+ <span><?php esc_html_e('Date Range:', 'pretty-link'); ?></span>
38
  <div id="dateselectors" style="display: inline;">
39
+ <input type="text" name="sdate" id="sdate" value="<?php echo esc_attr($params['sdate']); ?>" style="display:inline;"/>&nbsp;<?php esc_html_e('to', 'pretty-link'); ?>&nbsp;<input type="text" name="edate" id="edate" value="<?php echo esc_attr($params['edate']); ?>" style="display:inline;"/>
40
  </div>
41
  <br/>
42
  <br/>
43
+ <div class="submit" style="display: inline;"><input type="submit" name="Submit" value="<?php esc_attr_e('Customize', 'pretty-link'); ?>" class="button button-primary" /> &nbsp; <a href="#" class="filter_toggle button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a></div>
44
  </form>
45
  </div>
46
 
56
  <form class="form-fields" name="click_form" method="post" action="">
57
  <?php wp_nonce_field('prli-clicks'); ?>
58
 
59
+ <input type="hidden" name="sort" id="sort" value="<?php echo esc_attr($sort_str); ?>" />
60
+ <input type="hidden" name="sdir" id="sort" value="<?php echo esc_attr($sdir_str); ?>" />
61
  <input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
62
+ <div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="<?php esc_attr_e('Search Clicks', 'pretty-link'); ?>"/>
63
  <?php if(!empty($search_str)): ?>
64
+ &nbsp; <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-clicks'.(!empty($params['l'])?'&l='.$params['l']:''))); ?>" class="button"><?php esc_html_e('Reset', 'pretty-link'); ?></a>
65
  <?php endif; ?>
66
  </div>
67
  </form>
70
  <thead>
71
  <tr>
72
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
73
+ <th class="manage-column" width="5%"><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=btype".(($sort_str == 'btype' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Browser', 'pretty-link'); echo (($sort_str == 'btype')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
74
  </th>
75
+ <th class="manage-column" width="5%"><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=os".(($sort_str == 'os' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('OS', 'pretty-link'); echo (($sort_str == 'btype')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
76
  </th>
77
  <?php } ?>
78
  <th class="manage-column" width="12%">
79
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=ip".(($sort_str == 'ip' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('IP', 'pretty-link'); echo (($sort_str == 'ip')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
80
  </th>
81
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
82
  <th class="manage-column" width="12%">
83
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=vuid".(($sort_str == 'vuid' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Visitor', 'pretty-link'); echo (($sort_str == 'vuid')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
84
  </th>
85
  <?php } ?>
86
  <th class="manage-column" width="13%">
87
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=created_at".(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Timestamp', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
88
  </th>
89
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
90
  <th class="manage-column" width="16%">
91
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=host".(($sort_str == 'host' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Host', 'pretty-link'); echo (($sort_str == 'host')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
92
  </th>
93
  <?php } ?>
94
  <th class="manage-column" width="16%">
95
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=uri".(($sort_str == 'uri' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('URI', 'pretty-link'); echo (($sort_str == 'uri')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
96
  </th>
97
  <th class="manage-column" width="16%">
98
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=referer".(($sort_str == 'referer' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Referrer', 'pretty-link'); echo (($sort_str == 'referer')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
99
  </th>
100
  <th class="manage-column" width="13%">
101
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=link".(($sort_str == 'link' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Link', 'pretty-link'); echo (($sort_str == 'link')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
102
  </th>
103
  </tr>
104
  </thead>
108
  {
109
  ?>
110
  <tr>
111
+ <td colspan="8"><?php esc_html_e('No Clicks have been recorded yet', 'pretty-link'); ?></td>
112
  </tr>
113
  <?php
114
  }
119
  $alternate = ( $row_index++ % 2 ? '' : 'alternate' );
120
 
121
  ?>
122
+ <tr id="record_<?php echo esc_attr($click->id); ?>" class="<?php echo esc_attr($alternate); ?>">
123
 
124
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
125
  <td>
129
  ?>
130
 
131
  <?php if(false===$browser_image): ?>
132
+ <span style="font-size: 16px; cursor: pointer;" title="<?php echo esc_attr($click->btype); ?>"><strong>?</strong></span>
133
  <?php else: ?>
134
+ <img src="<?php echo esc_url(PRLI_BROWSER_URL . '/' . $browser_image); ?>" alt="<?php echo esc_attr($click->btype . " v" . $click->bversion); ?>" title="<?php echo esc_attr($click->btype . " v" . $click->bversion); ?>" width="16px" height="16px" style="width: 16px; height: 16px;" />
135
  <?php endif; ?>
136
  </td>
137
 
138
  <td>
139
  <?php if(false===$os_image): ?>
140
+ <span style="font-size: 16px; cursor: pointer;" title="<?php echo esc_attr($click->os); ?>"><strong>?</strong></span>
141
  <?php else: ?>
142
+ <img src="<?php echo esc_url(PRLI_OS_URL . '/' . $os_image); ?>" alt="<?php echo esc_attr($click->os); ?>" title="<?php echo esc_attr($click->os); ?>" width="16px" height="16px" style="width: 16px; height: 16px;" /></td>
143
  <?php endif; ?>
144
  </td>
145
  <?php endif; ?>
146
 
147
+ <td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&ip={$click->ip}")); ?>" title="<?php echo esc_attr(sprintf(__('View All Activity for IP Address: %s', 'pretty-link'), $click->ip)); ?>"><?php echo esc_html($click->ip); ?> (<?php echo esc_html($click->ip_count); ?>)</a></td>
 
 
148
 
149
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
150
+ <td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&vuid={$click->vuid}")); ?>" title="<?php echo esc_attr(sprintf(__('View All Activity for Visitor: %s', 'pretty-link'), $click->vuid)); ?>"><?php echo esc_html($click->vuid); ?><?php echo (($click->vuid != null)?" (".esc_html($click->vuid_count).")":''); ?></a></td>
151
  <?php endif; ?>
152
 
153
+ <td><?php echo esc_html($click->created_at); ?></td>
154
 
155
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
156
+ <td><?php echo esc_html($click->host); ?></td>
157
  <?php endif; ?>
158
 
159
+ <td><?php echo esc_html($click->uri); ?></td>
160
+ <td><a href="<?php echo esc_url( $click->referer ); ?>"><?php echo esc_html( $click->referer ); ?></a></td>
161
+ <td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&l={$click->link_id}")); ?>" title="<?php echo esc_attr(sprintf(__('View clicks for %s', 'pretty-link'), stripslashes($click->link_name))); ?>"><?php echo esc_html(stripslashes($click->link_name)); ?></a></td>
162
  </tr>
163
  <?php
164
 
168
  <tfoot>
169
  <tr>
170
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
171
+ <th class="manage-column"><?php esc_html_e('Browser', 'pretty-link'); ?></th>
172
+ <th class="manage-column"><?php esc_html_e('OS', 'pretty-link'); ?></th>
173
  <?php } ?>
174
+ <th class="manage-column"><?php esc_html_e('IP', 'pretty-link'); ?></th>
175
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
176
+ <th class="manage-column"><?php esc_html_e('Visitor', 'pretty-link'); ?></th>
177
  <?php } ?>
178
+ <th class="manage-column"><?php esc_html_e('Timestamp', 'pretty-link'); ?></th>
179
  <?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
180
+ <th class="manage-column"><?php esc_html_e('Host', 'pretty-link'); ?></th>
181
  <?php } ?>
182
+ <th class="manage-column"><?php esc_html_e('URI', 'pretty-link'); ?></th>
183
+ <th class="manage-column"><?php esc_html_e('Referrer', 'pretty-link'); ?></th>
184
+ <th class="manage-column"><?php esc_html_e('Link', 'pretty-link'); ?></th>
185
  </tr>
186
  </tfoot>
187
  </table>
188
 
189
  <br/>
190
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&action=csv{$page_params}")); ?>" class="button button-primary"><?php esc_html_e('Download CSV', 'pretty-link'); ?> (<?php echo esc_html(stripslashes($link_name)); ?>)</a>
191
 
192
  <?php
193
  require(PRLI_VIEWS_PATH.'/shared/table-nav.php');
app/views/groups/edit.php CHANGED
@@ -1,34 +1,40 @@
1
- <?php if(!defined('ABSPATH')) die('You are not allowed to call this page directly.'); ?>
 
 
 
2
 
 
 
 
3
  <div class="wrap">
4
- <?php echo PrliAppHelper::page_title(__('Edit Group', 'pretty-link')); ?>
5
 
6
  <?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
7
 
8
- <form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>">
9
  <input type="hidden" name="action" value="update">
10
- <input type="hidden" name="id" value="<?php echo $id; ?>">
11
  <?php wp_nonce_field('update-options'); ?>
12
 
13
  <table class="form-table">
14
  <tr class="form-field">
15
- <td width="75px" valign="top"><?php _e('Name:', 'pretty-link'); ?> </td>
16
- <td><input type="text" name="name" value="<?php echo htmlspecialchars(stripslashes(((isset($_POST['name']) and $record == null)?$_POST['name']:$record->name))); ?>" size="75">
17
- <br/><span class="setting-description"><?php _e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
18
  </tr>
19
  <tr class="form-field">
20
- <td valign="top"><?php _e('Description:', 'pretty-link'); ?> </td>
21
- <td><textarea style="height: 100px;" name="description"><?php echo ((isset($_POST['description']) and $record == null)?$_POST['description']:$record->description); ?></textarea>
22
- <br/><span class="setting-description"><?php _e('A Description of this group.', 'pretty-link'); ?></span></td>
23
  </tr>
24
  <tr class="form-field" valign="top">
25
- <td valign="top"><?php _e('Links:', 'pretty-link'); ?> </td>
26
  <td valign="top">
27
  <div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
28
  <table width="100%" cellspacing="0">
29
  <thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
30
- <th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php _e('Name', 'pretty-link'); ?></strong></th>
31
- <th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php _e('Current Group', 'pretty-link'); ?></strong></th>
32
  </thead>
33
  <?php
34
  for($i = 0; $i < count($links); $i++) {
@@ -36,8 +42,11 @@
36
 
37
  ?>
38
  <tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
39
- <td style="min-width: 50%; width: 50%"><input type="checkbox" style="display:inline;width: 15px; padding: 0; margin: 0; float: left; text-align: left;" name="link[<?php echo $link->id; ?>]" <?php echo (((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on') or (empty($_POST) and $link->group_id == $record->id))?'checked="true"':''); ?>/><span>&nbsp;<?php echo htmlspecialchars(stripslashes($link->name)) . " <strong>(" . $link->slug . ")</strong>"; ?></span></td>
40
- <td style="min-width: 50%; width: 50%"><?php echo htmlspecialchars(stripslashes($link->group_name)); ?></td>
 
 
 
41
  </tr>
42
  <?php
43
 
@@ -45,13 +54,22 @@
45
  ?>
46
  </table>
47
  </div>
48
- <span class="setting-description"><?php _e('Select some links for this group. <strong>Note: each link can only be in one group at a time.</strong>', 'pretty-link'); ?></span>
 
 
 
 
 
 
 
 
 
49
  </td>
50
  </tr>
51
  </table>
52
 
53
  <p class="submit">
54
- <input type="submit" class="button button-primary" name="submit" value="<?php _e('Update', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo admin_url('admin.php?page=pretty-link-groups'); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
55
  </p>
56
  </form>
57
  </div>
1
+ <?php
2
+ if(!defined('ABSPATH')) {
3
+ die('You are not allowed to call this page directly.');
4
+ }
5
 
6
+ $name = stripslashes(isset($values['name']) && empty($record) ? $values['name'] : $record->name);
7
+ $description = stripslashes(isset($values['description']) && empty($record) ? $values['description'] : $record->description);
8
+ ?>
9
  <div class="wrap">
10
+ <?php PrliAppHelper::page_title(__('Edit Group', 'pretty-link')); ?>
11
 
12
  <?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
13
 
14
+ <form name="form1" method="post" action="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>">
15
  <input type="hidden" name="action" value="update">
16
+ <input type="hidden" name="id" value="<?php echo esc_attr($id); ?>">
17
  <?php wp_nonce_field('update-options'); ?>
18
 
19
  <table class="form-table">
20
  <tr class="form-field">
21
+ <td width="75px" valign="top"><?php esc_html_e('Name:', 'pretty-link'); ?> </td>
22
+ <td><input type="text" name="name" value="<?php echo esc_attr($name); ?>" size="75">
23
+ <br/><span class="setting-description"><?php esc_html_e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
24
  </tr>
25
  <tr class="form-field">
26
+ <td valign="top"><?php esc_html_e('Description:', 'pretty-link'); ?> </td>
27
+ <td><textarea style="height: 100px;" name="description"><?php echo esc_textarea($description); ?></textarea>
28
+ <br/><span class="setting-description"><?php esc_html_e('A Description of this group.', 'pretty-link'); ?></span></td>
29
  </tr>
30
  <tr class="form-field" valign="top">
31
+ <td valign="top"><?php esc_html_e('Links:', 'pretty-link'); ?> </td>
32
  <td valign="top">
33
  <div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
34
  <table width="100%" cellspacing="0">
35
  <thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
36
+ <th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php esc_html_e('Name', 'pretty-link'); ?></strong></th>
37
+ <th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php esc_html_e('Current Group', 'pretty-link'); ?></strong></th>
38
  </thead>
39
  <?php
40
  for($i = 0; $i < count($links); $i++) {
42
 
43
  ?>
44
  <tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
45
+ <td style="min-width: 50%; width: 50%">
46
+ <input type="checkbox" style="display:inline;width: 15px; padding: 0; margin: 0; float: left; text-align: left;" name="link[<?php echo esc_attr($link->id); ?>]" <?php echo (((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on') or (empty($_POST) and !empty($record) && $link->group_id == $record->id))?'checked="true"':''); ?>/>
47
+ <span><?php echo esc_html(stripslashes($link->name)) . " <strong>(" . esc_html(stripslashes($link->slug)) . ")</strong>"; ?></span>
48
+ </td>
49
+ <td style="min-width: 50%; width: 50%"><?php echo esc_html(stripslashes($link->group_name)); ?></td>
50
  </tr>
51
  <?php
52
 
54
  ?>
55
  </table>
56
  </div>
57
+ <span class="setting-description">
58
+ <?php
59
+ printf(
60
+ // translators: %1$s: open strong tag, %2$s close strong tag
61
+ esc_html__('Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s', 'pretty-link'),
62
+ '<strong>',
63
+ '</strong>'
64
+ );
65
+ ?>
66
+ </span>
67
  </td>
68
  </tr>
69
  </table>
70
 
71
  <p class="submit">
72
+ <input type="submit" class="button button-primary" name="submit" value="<?php esc_attr_e('Update', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups')); ?>" class="button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a>
73
  </p>
74
  </form>
75
  </div>
app/views/groups/list.php CHANGED
@@ -3,8 +3,8 @@ if(!defined('ABSPATH'))
3
  die('You are not allowed to call this page directly.');
4
  ?>
5
  <div class="wrap">
6
- <?php echo PrliAppHelper::page_title(__('Groups', 'pretty-link')); ?>
7
- <a href="<?php echo admin_url('admin.php?page=pretty-link-groups&action=new'); ?>" class="page-title-action"><?php _e('Add Group', 'pretty-link'); ?></a>
8
  <hr class="wp-header-end">
9
 
10
  <?php if(empty($groups)): ?>
@@ -14,14 +14,14 @@ if(!defined('ABSPATH'))
14
  <div id="search_pane" style="float: right;">
15
  <form class="form-fields" name="group_form" method="post" action="">
16
  <?php wp_nonce_field('prli-groups'); ?>
17
- <input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
18
- <input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
19
  <input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
20
- <div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search"/>
21
  <?php
22
  if(!empty($search_str)) {
23
  ?>
24
- &nbsp; <a href="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>" class="button"><?php _e('Reset', 'pretty-link'); ?></a>
25
  <?php
26
  }
27
  ?>
@@ -36,9 +36,21 @@ if(!defined('ABSPATH'))
36
  <table class="widefat post fixed" cellspacing="0">
37
  <thead>
38
  <tr>
39
- <th class="manage-column" width="50%"><a href="<?php echo admin_url('admin.php?page=pretty-link-groups&sort=name'.(($sort_str == 'name' && $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Name', 'pretty-link'); echo (($sort_str == 'name')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
40
- <th class="manage-column" width="20%"><a href="<?php echo admin_url('admin.php?page=pretty-link-groups&sort=link_count'.(($sort_str == 'link_count' && $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Links', 'pretty-link'); echo (($sort_str == 'link_count')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
41
- <th class="manage-column" width="30%"><a href="<?php echo admin_url('admin.php?page=pretty-link-groups&sort=created_at'.(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php _e('Created', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
 
 
 
 
 
 
 
 
 
 
 
 
42
  </tr>
43
  </thead>
44
  <?php
@@ -47,7 +59,7 @@ if(!defined('ABSPATH'))
47
  {
48
  ?>
49
  <tr>
50
- <td colspan="5"><?php _e('No Pretty Link Groups were found', 'pretty-link'); ?></td>
51
  </tr>
52
  <?php
53
  }
@@ -58,19 +70,19 @@ if(!defined('ABSPATH'))
58
  {
59
  $alternate = ( $row_index++ % 2 ? '' : 'alternate' );
60
  ?>
61
- <tr id="record_<?php echo $group->id; ?>" class="<?php echo $alternate; ?>">
62
  <td class="edit_group">
63
- <a class="group_name" href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}"); ?>" title="<?php printf(__('Edit %s', 'pretty-link'), htmlspecialchars(stripslashes($group->name))); ?>"><?php echo htmlspecialchars(stripslashes($group->name)); ?></a>
64
  <br/>
65
  <div class="group_actions">
66
- <a href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}"); ?>" title="<?php printf(__('Edit %s', 'pretty-link'), htmlspecialchars(stripslashes($group->name))); ?>"><?php _e('Edit', 'pretty-link'); ?></a>&nbsp;|
67
- <a href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=destroy&id={$group->id}"); ?>" onclick="return confirm('<?php printf(__('Are you sure you want to delete your %s Pretty Link Group?', 'pretty-link'), htmlspecialchars(stripslashes($group->name))); ?>');" title="Delete <?php echo htmlspecialchars(stripslashes($group->name)); ?>"><?php _e('Delete', 'pretty-link'); ?></a>&nbsp;|
68
- <a href="<?php echo admin_url("admin.php?page=pretty-link&group={$group->id}"); ?>" title="View links in <?php echo htmlspecialchars(stripslashes($group->name)); ?>"><?php _e('Links', 'pretty-link'); ?></a>&nbsp;|
69
- <a href="<?php echo admin_url( "admin.php?page=pretty-link-clicks&group={$group->id}" ); ?>" title="<?php printf(__('View hits in %s', 'pretty-link'), htmlspecialchars(stripslashes($group->name))); ?>"><?php _e('Clicks', 'pretty-link'); ?></a>
70
  </div>
71
  </td>
72
- <td><a href="<?php echo admin_url("admin.php?page=pretty-link&group={$group->id}"); ?>" title="View links in <?php echo htmlspecialchars(stripslashes($group->name)); ?>"><?php echo $group->link_count; ?></a></td>
73
- <td><?php echo $group->created_at; ?></td>
74
  </tr>
75
  <?php
76
  }
@@ -78,9 +90,9 @@ if(!defined('ABSPATH'))
78
  ?>
79
  <tfoot>
80
  <tr>
81
- <th class="manage-column"><?php _e('Name', 'pretty-link'); ?></th>
82
- <th class="manage-column"><?php _e('Links', 'pretty-link'); ?></th>
83
- <th class="manage-column"><?php _e('Created', 'pretty-link'); ?></th>
84
  </tr>
85
  </tfoot>
86
  </table>
3
  die('You are not allowed to call this page directly.');
4
  ?>
5
  <div class="wrap">
6
+ <?php PrliAppHelper::page_title(__('Groups', 'pretty-link')); ?>
7
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&action=new')); ?>" class="page-title-action"><?php esc_html_e('Add Group', 'pretty-link'); ?></a>
8
  <hr class="wp-header-end">
9
 
10
  <?php if(empty($groups)): ?>
14
  <div id="search_pane" style="float: right;">
15
  <form class="form-fields" name="group_form" method="post" action="">
16
  <?php wp_nonce_field('prli-groups'); ?>
17
+ <input type="hidden" name="sort" id="sort" value="<?php echo esc_attr($sort_str); ?>" />
18
+ <input type="hidden" name="sdir" id="sort" value="<?php echo esc_attr($sdir_str); ?>" />
19
  <input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
20
+ <div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="<?php esc_attr_e('Search', 'pretty-link'); ?>"/>
21
  <?php
22
  if(!empty($search_str)) {
23
  ?>
24
+ &nbsp; <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>" class="button"><?php esc_html_e('Reset', 'pretty-link'); ?></a>
25
  <?php
26
  }
27
  ?>
36
  <table class="widefat post fixed" cellspacing="0">
37
  <thead>
38
  <tr>
39
+ <th class="manage-column" width="50%">
40
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=name'.(($sort_str == 'name' && $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
41
+ <?php esc_html_e('Name', 'pretty-link'); echo (($sort_str == 'name')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
42
+ </a>
43
+ </th>
44
+ <th class="manage-column" width="20%">
45
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=link_count'.(($sort_str == 'link_count' && $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
46
+ <?php esc_html_e('Links', 'pretty-link'); echo (($sort_str == 'link_count')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
47
+ </a>
48
+ </th>
49
+ <th class="manage-column" width="30%">
50
+ <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=created_at'.(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
51
+ <?php esc_html_e('Created', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?'&nbsp;&nbsp;&nbsp;<img src="'.esc_url(PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
52
+ </a>
53
+ </th>
54
  </tr>
55
  </thead>
56
  <?php
59
  {
60
  ?>
61
  <tr>
62
+ <td colspan="5"><?php esc_html_e('No Pretty Link Groups were found', 'pretty-link'); ?></td>
63
  </tr>
64
  <?php
65
  }
70
  {
71
  $alternate = ( $row_index++ % 2 ? '' : 'alternate' );
72
  ?>
73
+ <tr id="record_<?php echo esc_attr($group->id); ?>" class="<?php echo $alternate; ?>">
74
  <td class="edit_group">
75
+ <a class="group_name" href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('Edit %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php echo esc_html(stripslashes($group->name)); ?></a>
76
  <br/>
77
  <div class="group_actions">
78
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('Edit %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Edit', 'pretty-link'); ?></a>&nbsp;|
79
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=destroy&id={$group->id}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to delete your %s Pretty Link Group?', 'pretty-link'), stripslashes($group->name))); ?>');" title="<?php echo esc_attr(sprintf(__('Delete %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Delete', 'pretty-link'); ?></a>&nbsp;|
80
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View links in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Links', 'pretty-link'); ?></a>&nbsp;|
81
+ <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View hits in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Clicks', 'pretty-link'); ?></a>
82
  </div>
83
  </td>
84
+ <td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View links in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php echo esc_html($group->link_count); ?></a></td>
85
+ <td><?php echo esc_html($group->created_at); ?></td>
86
  </tr>
87
  <?php
88
  }
90
  ?>
91
  <tfoot>
92
  <tr>
93
+ <th class="manage-column"><?php esc_html_e('Name', 'pretty-link'); ?></th>
94
+ <th class="manage-column"><?php esc_html_e('Links', 'pretty-link'); ?></th>
95
+ <th class="manage-column"><?php esc_html_e('Created', 'pretty-link'); ?></th>
96
  </tr>
97
  </tfoot>
98
  </table>
app/views/groups/new.php CHANGED
@@ -2,61 +2,74 @@
2
  if(!defined('ABSPATH'))
3
  die('You are not allowed to call this page directly.');
4
 
5
- $name = isset($_POST['name']) ? esc_html($_POST['name']) : '';
 
6
  ?>
7
 
8
  <div class="wrap">
9
- <?php echo PrliAppHelper::page_title(__('New Group', 'pretty-link')); ?>
10
 
11
  <?php
12
  require(PRLI_VIEWS_PATH.'/shared/errors.php');
13
  ?>
14
 
15
- <form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>">
16
  <input type="hidden" name="action" value="create">
17
  <?php wp_nonce_field('update-options'); ?>
18
 
19
  <table class="form-table">
20
  <tr class="form-field">
21
- <td width="75px" valign="top"><?php _e('Name*:', 'pretty-link'); ?> </td>
22
- <td><input type="text" name="name" value="<?php echo $name; ?>" size="75">
23
- <br/><span class="setting-description"><?php _e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
24
  </tr>
25
  <tr class="form-field">
26
- <td valign="top"><?php _e('Description:', 'pretty-link'); ?> </td>
27
- <td><textarea style="height: 100px;" name="description"><?php echo ((isset($_POST['description']))?sanitize_textarea_field($_POST['description']):''); ?></textarea>
28
- <br/><span class="setting-description"><?php _e('A Description of this group.', 'pretty-link'); ?></span></td>
29
  </tr>
30
  <tr class="form-field" valign="top">
31
- <td valign="top"><?php _e('Links:', 'pretty-link'); ?> </td>
32
  <td valign="top">
33
  <div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
34
  <table width="100%" cellspacing="0">
35
  <thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
36
- <th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php _e('Name', 'pretty-link'); ?></strong></th>
37
- <th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php _e('Current Group', 'pretty-link'); ?></strong></th>
38
  </thead>
39
  <?php
40
  for($i = 0; $i < count($links); $i++) {
41
  $link = $links[$i];
42
  ?>
43
  <tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
44
- <td style="min-width: 50%; width: 50%;"><input type="checkbox" style="width: 15px;" name="link[<?php echo $link->id; ?>]" <?php echo ((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on')?'checked="true"':''); ?>/>&nbsp;<?php echo htmlspecialchars(stripslashes($link->name)) . " <strong>(" . $link->slug . ")</strong>"; ?></td>
45
- <td style="min-width: 50%; width: 50%;"><?php echo htmlspecialchars(stripslashes($link->group_name)); ?></td>
 
 
 
46
  </tr>
47
  <?php
48
  }
49
  ?>
50
  </table>
51
  </div>
52
- <span class="setting-description"><?php _e('Select some links for this group. <strong>Note: each link can only be in one group at a time.</strong>', 'pretty-link'); ?></span>
 
 
 
 
 
 
 
 
 
53
  </td>
54
  </tr>
55
  </table>
56
 
57
  <p class="submit">
58
- <input type="submit" class="button button-primary" name="submit" value="<?php _e('Create', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
59
  </p>
60
 
61
  </form>
62
- </div>
2
  if(!defined('ABSPATH'))
3
  die('You are not allowed to call this page directly.');
4
 
5
+ $name = isset($_POST['name']) ? sanitize_text_field(stripslashes($_POST['name'])) : '';
6
+ $description = isset($_POST['description']) ? sanitize_textarea_field(stripslashes($_POST['description'])) : '';
7
  ?>
8
 
9
  <div class="wrap">
10
+ <?php PrliAppHelper::page_title(__('New Group', 'pretty-link')); ?>
11
 
12
  <?php
13
  require(PRLI_VIEWS_PATH.'/shared/errors.php');
14
  ?>
15
 
16
+ <form name="form1" method="post" action="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>">
17
  <input type="hidden" name="action" value="create">
18
  <?php wp_nonce_field('update-options'); ?>
19
 
20
  <table class="form-table">
21
  <tr class="form-field">
22
+ <td width="75px" valign="top"><?php esc_html_e('Name*:', 'pretty-link'); ?> </td>
23
+ <td><input type="text" name="name" value="<?php echo esc_attr($name); ?>" size="75">
24
+ <br/><span class="setting-description"><?php esc_html_e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
25
  </tr>
26
  <tr class="form-field">
27
+ <td valign="top"><?php esc_html_e('Description:', 'pretty-link'); ?> </td>
28
+ <td><textarea style="height: 100px;" name="description"><?php echo esc_textarea($description) ?></textarea>
29
+ <br/><span class="setting-description"><?php esc_html_e('A Description of this group.', 'pretty-link'); ?></span></td>
30
  </tr>
31
  <tr class="form-field" valign="top">
32
+ <td valign="top"><?php esc_html_e('Links:', 'pretty-link'); ?> </td>
33
  <td valign="top">
34
  <div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
35
  <table width="100%" cellspacing="0">
36
  <thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
37
+ <th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php esc_html_e('Name', 'pretty-link'); ?></strong></th>
38
+ <th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php esc_html_e('Current Group', 'pretty-link'); ?></strong></th>
39
  </thead>
40
  <?php
41
  for($i = 0; $i < count($links); $i++) {
42
  $link = $links[$i];
43
  ?>
44
  <tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
45
+ <td style="min-width: 50%; width: 50%;">
46
+ <input type="checkbox" style="width: 15px;" name="link[<?php echo esc_attr($link->id); ?>]" <?php echo ((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on')?'checked="true"':''); ?>/>
47
+ <?php echo esc_html(stripslashes($link->name)) . " <strong>(" . esc_html(stripslashes($link->slug)) . ")</strong>"; ?>
48
+ </td>
49
+ <td style="min-width: 50%; width: 50%;"><?php echo esc_html(stripslashes($link->group_name)); ?></td>
50
  </tr>
51
  <?php
52
  }
53
  ?>
54
  </table>
55
  </div>
56
+ <span class="setting-description">
57
+ <?php
58
+ printf(
59
+ // translators: %1$s: open strong tag, %2$s close strong tag
60
+ esc_html__('Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s', 'pretty-link'),
61
+ '<strong>',
62
+ '</strong>'
63
+ );
64
+ ?>
65
+ </span>
66
  </td>
67
  </tr>
68
  </table>
69
 
70
  <p class="submit">
71
+ <input type="submit" class="button button-primary" name="submit" value="<?php esc_attr_e('Create', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>" class="button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a>
72
  </p>
73
 
74
  </form>
75
+ </div>
app/views/links/edit.php DELETED
@@ -1,19 +0,0 @@
1
- <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
-
3
- <div class="wrap">
4
- <?php echo PrliAppHelper::page_title(__('Edit Link', 'pretty-link')); ?>
5
-
6
- <?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
7
-
8
- <form name="form1" method="post" action="<?php echo admin_url('admin.php?page=pretty-link'); ?>">
9
- <input type="hidden" name="action" value="update">
10
- <input type="hidden" name="id" value="<?php echo $id; ?>">
11
- <?php wp_nonce_field('update-options'); ?>
12
-
13
- <?php require(PRLI_VIEWS_PATH.'/links/form.php'); ?>
14
-
15
- <p class="submit">
16
- <input type="submit" class="button button-primary" name="submit" value="<?php _e('Update', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo admin_url('admin.php?page=pretty-link'); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
17
- </p>
18
- </form>
19
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/views/links/form.php CHANGED
@@ -1,243 +1,47 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
 
3
- <table class="form-table">
4
- <tr>
5
- <th scope="row">
6
- <?php _e('Redirection*', 'pretty-link'); ?>
7
- <?php PrliAppHelper::info_tooltip(
8
- 'prli-link-options-redirection-type',
9
- __('Redirection Type', 'pretty-link'),
10
- __('This is the method of redirection for your link.', 'pretty-link')
11
- ); ?>
12
- </th>
13
- <td>
14
- <select id="redirect_type" name="redirect_type" style="padding: 0px; margin: 0px;">
15
- <option value="307"<?php echo esc_html($values['redirect_type']['307']); ?>><?php _e("307 (Temporary)", 'pretty-link') ?>&nbsp;</option>
16
- <option value="302"<?php echo esc_html($values['redirect_type']['302']); ?>><?php _e("302 (Temporary)", 'pretty-link') ?>&nbsp;</option>
17
- <option value="301"<?php echo esc_html($values['redirect_type']['301']); ?>><?php _e("301 (Permanent)", 'pretty-link') ?>&nbsp;</option>
18
- <?php do_action('prli_redirection_types', $values, false); ?>
19
- </select>
20
- <?php
21
- global $plp_update;
22
- if(!$plp_update->is_installed()) {
23
- ?>
24
- <p class="description"><?php printf(__('Make your life easier by upgrading to %1$sPretty Links Pro%2$s -- get more redirection types, speed, automations and <b>results from your links</b> by %1$sgoing pro today!%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
25
- <?php
26
- } ?>
27
- </td>
28
- </tr>
29
- <tr id="prli_target_url">
30
- <th scope="row">
31
- <?php _e('Target URL*', 'pretty-link'); ?>
32
- <?php PrliAppHelper::info_tooltip(
33
- 'prli-link-options-target-url',
34
- __('Target URL', 'pretty-link'),
35
- __('This is the URL that your Pretty Link will redirect to.', 'pretty-link')
36
- ); ?>
37
- </th>
38
- <td>
39
- <textarea class="large-text" name="url"><?php echo esc_html($values['url'],ENT_COMPAT,'UTF-8'); ?></textarea>
40
- </td>
41
- </tr>
42
- <tr>
43
- <th scope="row">
44
- <?php _e('Pretty Link*', 'pretty-link'); ?>
45
- <?php PrliAppHelper::info_tooltip(
46
- 'prli-link-options-slug',
47
- __('Pretty Link', 'pretty-link'),
48
- __('This is how your pretty link will appear. You can edit the Pretty Link slug here.', 'pretty-link')
49
- ); ?>
50
- </th>
51
- <td>
52
- <strong><?php global $prli_blogurl; echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" class="regular-text" value="<?php echo esc_attr($values['slug']); ?>" />
53
  </td>
54
  </tr>
55
  <tr>
56
- <th scope="row">
57
- <?php _e('Title', 'pretty-link'); ?>
58
- <?php PrliAppHelper::info_tooltip(
59
- 'prli-link-options-name',
60
- __('Title', 'pretty-link'),
61
- __('Leave this blank and Pretty Link will attempt to detect the title from the target url. Alternatively you can enter a custom title here.', 'pretty-link')
62
- ); ?>
63
- </th>
64
- <td>
65
- <input type="text" name="name" class="large-text" value="<?php echo esc_attr($values['name']); ?>" />
66
  </td>
67
- </tr>
68
- <tr>
69
- <th scope="row">
70
- <?php _e('Notes', 'pretty-link'); ?>
71
- <?php PrliAppHelper::info_tooltip(
72
- 'prli-link-options-notes',
73
- __('Notes', 'pretty-link'),
74
- __('This is a field where you can enter notes about a particular link. This notes field is mainly for your own link management needs. It isn\'t currently used anywhere on the front end.', 'pretty-link')
75
- ); ?>
76
- </th>
77
- <td>
78
- <textarea class="large-text" name="description"><?php echo esc_html($values['description'],ENT_COMPAT,'UTF-8'); ?></textarea>
79
  </td>
80
  </tr>
81
  </table>
82
 
83
- <div class="prli-sub-box-white">
84
- <h3 class="prli-page-title"><a href="" class="prli-toggle-link" data-box="prli-link-advanced-options"><?php _e('Advanced Options', 'pretty-link'); ?></a></h3>
85
- <div class="prli-sub-box prli-link-advanced-options prli-hidden">
86
- <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
87
- <table class="form-table" id="prli-link-advanced-options-box">
88
- <tbody>
89
- <tr>
90
- <th scope="row">
91
- <?php _e('Group', 'pretty-link'); ?>
92
- <?php PrliAppHelper::info_tooltip(
93
- 'prli-link-options-group',
94
- __('Link Group', 'pretty-link'),
95
- __('Select a Group for this Link', 'pretty-link')
96
- ); ?>
97
- </th>
98
- <td>
99
- <select name="group_id" id="group_dropdown" style="padding: 0px; margin: 0px;">
100
- <option><?php _e("None", 'pretty-link') ?></option>
101
- <?php
102
- foreach($values['groups'] as $group) {
103
- ?>
104
- <option value="<?php echo esc_attr($group['id']); ?>"<?php echo esc_html($group['value']); ?>><?php echo esc_html($group['name']); ?>&nbsp;</option>
105
- <?php
106
- }
107
- ?>
108
- </select>
109
- <input class="defaultText" id="add_group_textbox" title="<?php _e('Add a New Group', 'pretty-link') ?>" type="text" prli_nonce="<?php echo wp_create_nonce('prli-add-new-group'); ?>" style="vertical-align:middle;" /><div id="add_group_message"></div>
110
- </td>
111
- </tr>
112
- <tr>
113
- <th scope="row">
114
- <?php _e('No Follow', 'pretty-link'); ?>
115
- <?php PrliAppHelper::info_tooltip(
116
- 'prli-link-options-nofollow',
117
- __('Nofollow Link', 'pretty-link'),
118
- __('Add a nofollow and noindex to this link\'s http redirect header', 'pretty-link')
119
- ); ?>
120
- </th>
121
- <td>
122
- <input type="checkbox" name="nofollow" <?php echo esc_html($values['nofollow']); ?>/>
123
- </td>
124
- </tr>
125
- <tr id="prli_time_delay" style="display: none">
126
- <th scope="row">
127
- <?php _e('Delay Redirect', 'pretty-link'); ?>
128
- <?php PrliAppHelper::info_tooltip(
129
- 'prli-link-delay-redirect',
130
- __('Delay Redirect', 'pretty-link'),
131
- __('Time in seconds to wait before redirecting', 'pretty-link')
132
- ); ?>
133
- </th>
134
- <td>
135
- <input type="number" name="delay" class="small-text" value="<?php echo esc_attr($values['delay']); ?>" />
136
- </td>
137
- </tr>
138
- <tr>
139
- <th scope="row">
140
- <?php _e("Parameter Forwarding", 'pretty-link') ?>
141
- <?php PrliAppHelper::info_tooltip(
142
- 'prli-link-parameter-forwarding',
143
- __('Parameter Forwarding', 'pretty-link'),
144
- __('Forward parameters passed to this link onto the Target URL', 'pretty-link')
145
- ); ?>
146
- </th>
147
- <td>
148
- <input type="checkbox" name="param_forwarding" id="param_forwarding" <?php echo checked($values['param_forwarding']); ?> />
149
- </td>
150
- </tr>
151
- <tr>
152
- <th scope="row">
153
- <?php _e("Tracking", 'pretty-link') ?>
154
- <?php PrliAppHelper::info_tooltip(
155
- 'prli-link-tracking-options',
156
- __('Tracking', 'pretty-link'),
157
- __('Enable Pretty Link\'s built-in hit (click) tracking', 'pretty-link')
158
- ); ?>
159
- </th>
160
- <td>
161
- <input type="checkbox" name="track_me" <?php echo esc_html($values['track_me']); ?> />
162
- </td>
163
- </tr>
164
- <tr id="prli_google_analytics" style="display: none">
165
- <th scope="row">
166
- <?php _e('Google Analytics', 'pretty-link'); ?>
167
- <?php PrliAppHelper::info_tooltip(
168
- 'prli-link-ga',
169
- __('Google Analytics Tracking', 'pretty-link'),
170
- __('Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work.', 'pretty-link')
171
- ); ?>
172
- </th>
173
- <td>
174
- <?php
175
- global $plp_update;
176
- if($plp_update->is_installed()):
177
- if($ga_info = PlpUtils::ga_installed()):
178
- ?>
179
- <input type="checkbox" name="google_tracking" <?php echo esc_html($values['google_tracking']); ?> />
180
- <p class="description"><?php printf(__('It appears that <strong>%s</strong> is currently installed. Pretty Link will attempt to use its settings to track this link.', 'pretty-link'), $ga_info['name']); ?></p>
181
- <?php
182
- else:
183
- ?>
184
- <input type="hidden" name="google_tracking" value="" />
185
- <p class="description"><strong><?php _e('No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is.', 'pretty-link'); ?></strong></p>
186
- <?php
187
- endif;
188
- endif;
189
- ?>
190
- </td>
191
- </tr>
192
- </tbody>
193
- </table>
194
- </div>
195
- </div>
196
- <div>&nbsp;</div>
197
- <div class="prli-sub-box-white">
198
- <h3><a href="" class="prli-toggle-link" data-box="prli-link-pro-options"><?php _e('Pro Options', 'pretty-link'); ?></a></h3>
199
- <div class="prli-sub-box prli-link-pro-options prli-hidden">
200
- <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
201
- <?php
202
- global $plp_update;
203
- if($plp_update->is_installed()) {
204
- ?>
205
- <table class="form-table" id="prli-link-pro-options-box">
206
- <?php
207
-
208
- $id = isset($id)?$id:false;
209
- // Add stuff to the form here
210
- do_action('prli_link_fields',$id);
211
-
212
- ?>
213
- </table>
214
- <?php
215
- }
216
- else {
217
- ?>
218
- <h2><?php _e('Oops!', 'pretty-link'); ?></h2>
219
-
220
- <div>
221
- <?php printf(__('It looks like you haven\'t %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade-1" target="_blank">','</a>') ?>
222
- </div>
223
- <div>&nbsp;</div>
224
- <ul style="padding-left: 25px;">
225
- <li>&bullet; <?php _e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
226
- <li>&bullet; <?php _e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
227
- <li>&bullet; <?php _e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
228
- <li>&bullet; <?php _e('Auto-prettylink your Pages &amp; Posts', 'pretty-link'); ?></li>
229
- <li>&bullet; <?php _e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
230
- <li>&bullet; <?php _e('And much, much more!', 'pretty-link'); ?></li>
231
- </ul>
232
- <div>&nbsp;</div>
233
- <div><?php _e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></div>
234
- <div>&nbsp;</div>
235
- <div><?php _e('We think you\'ll love it!', 'pretty-link'); ?></div>
236
- <div>&nbsp;</div>
237
- <div><a href="https://prettylinks.com/pl/link-form/upgrade-2" class="button button-primary"><?php _e('Upgrade to Pro today!', 'pretty-link'); ?></a></div>
238
- <?php
239
- }
240
- ?>
241
- </div>
242
- </div>
243
-
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
 
3
+ <?php
4
+ if(isset($values['link_id']) && $values['link_id'] > 0) {
5
+ ?>
6
+ <input type="hidden" name="link_id" value="<?php echo esc_attr($values['link_id']); ?>" />
7
+ <?php
8
+ }
9
+
10
+ $link_nonce = wp_create_nonce(PrliLink::$nonce_str . wp_salt());
11
+ ?>
12
+
13
+ <input type="hidden" name="<?php echo esc_attr(PrliLink::$nonce_str); ?>" value="<?php echo esc_attr($link_nonce); ?>" />
14
+
15
+ <div id="pretty_link_errors" class="prli-hidden">
16
+ <p><!-- This is where our errors will show up --></p>
17
+ </div>
18
+
19
+ <table class="prli-settings-table">
20
+ <tr class="prli-mobile-nav">
21
+ <td colspan="2">
22
+ <a href="" class="prli-toggle-nav"><i class="pl-icon-menu"> </i></a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  </td>
24
  </tr>
25
  <tr>
26
+ <td class="prli-settings-table-nav">
27
+ <ul class="prli-sidebar-nav">
28
+ <li><a data-id="basic"><?php esc_html_e('Basic', 'pretty-link'); ?></a></li>
29
+ <li><a data-id="advanced"><?php esc_html_e('Advanced', 'pretty-link'); ?></a></li>
30
+ <li><a data-id="pro"><?php esc_html_e('Pro', 'pretty-link'); ?></a></li>
31
+ <?php do_action('prli_admin_link_nav'); ?>
32
+ </ul>
 
 
 
33
  </td>
34
+ <td class="prli-settings-table-pages">
35
+ <div class="prli-page" id="basic">
36
+ <?php require(PRLI_VIEWS_PATH . '/links/form_basic.php'); ?>
37
+ </div>
38
+ <div class="prli-page" id="advanced">
39
+ <?php require(PRLI_VIEWS_PATH . '/links/form_advanced.php'); ?>
40
+ </div>
41
+ <div class="prli-page" id="pro">
42
+ <?php require(PRLI_VIEWS_PATH . '/links/form_pro.php'); ?>
43
+ </div>
 
 
44
  </td>
45
  </tr>
46
  </table>
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/views/links/form_advanced.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+
3
+ <table class="form-table">
4
+ <tr>
5
+ <th scope="row">
6
+ <?php esc_html_e('No Follow', 'pretty-link'); ?>
7
+ <?php PrliAppHelper::info_tooltip(
8
+ 'prli-link-options-nofollow',
9
+ esc_html__('Nofollow Link', 'pretty-link'),
10
+ esc_html__('Add a nofollow and noindex to this link\'s http redirect header', 'pretty-link')
11
+ ); ?>
12
+ </th>
13
+ <td>
14
+ <input type="checkbox" name="nofollow" <?php checked($values['nofollow']); ?>/>
15
+ </td>
16
+ </tr>
17
+ <tr id="prli_time_delay" style="display: none">
18
+ <th scope="row">
19
+ <?php esc_html_e('Delay Redirect', 'pretty-link'); ?>
20
+ <?php PrliAppHelper::info_tooltip(
21
+ 'prli-link-delay-redirect',
22
+ esc_html__('Delay Redirect', 'pretty-link'),
23
+ esc_html__('Time in seconds to wait before redirecting', 'pretty-link')
24
+ ); ?>
25
+ </th>
26
+ <td>
27
+ <input type="number" name="delay" class="small-text" value="<?php echo esc_attr($values['delay']); ?>" />
28
+ </td>
29
+ </tr>
30
+ <tr>
31
+ <th scope="row">
32
+ <?php esc_html_e("Parameter Forwarding", 'pretty-link') ?>
33
+ <?php PrliAppHelper::info_tooltip(
34
+ 'prli-link-parameter-forwarding',
35
+ esc_html__('Parameter Forwarding', 'pretty-link'),
36
+ esc_html__('Forward parameters passed to this link onto the Target URL', 'pretty-link')
37
+ ); ?>
38
+ </th>
39
+ <td>
40
+ <input type="checkbox" name="param_forwarding" id="param_forwarding" <?php checked($values['param_forwarding']); ?> />
41
+ </td>
42
+ </tr>
43
+ <tr>
44
+ <th scope="row">
45
+ <?php esc_html_e("Tracking", 'pretty-link') ?>
46
+ <?php PrliAppHelper::info_tooltip(
47
+ 'prli-link-tracking-options',
48
+ esc_html__('Tracking', 'pretty-link'),
49
+ esc_html__('Enable Pretty Link\'s built-in hit (click) tracking', 'pretty-link')
50
+ ); ?>
51
+ </th>
52
+ <td>
53
+ <input type="checkbox" name="track_me" <?php checked($values['track_me']); ?> />
54
+ </td>
55
+ </tr>
56
+ <tr id="prli_google_analytics" style="display: none">
57
+ <th scope="row">
58
+ <?php esc_html_e('Google Analytics', 'pretty-link'); ?>
59
+ <?php PrliAppHelper::info_tooltip(
60
+ 'prli-link-ga',
61
+ esc_html__('Google Analytics Tracking', 'pretty-link'),
62
+ esc_html__('Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work.', 'pretty-link')
63
+ ); ?>
64
+ </th>
65
+ <td>
66
+ <?php
67
+ global $plp_update;
68
+ if($plp_update->is_installed()):
69
+ if($ga_info = PlpUtils::ga_installed()):
70
+ ?>
71
+ <input type="checkbox" name="google_tracking" <?php echo esc_html($values['google_tracking']); ?> />
72
+ <p class="description">
73
+ <?php
74
+ printf(
75
+ esc_html__('It appears that %s is currently installed. Pretty Link will attempt to use its settings to track this link.', 'pretty-link'),
76
+ '<strong>' . esc_html($ga_info['name']) . '</strong>'
77
+ );
78
+ ?>
79
+ </p>
80
+ <?php
81
+ else:
82
+ ?>
83
+ <input type="hidden" name="google_tracking" value="" />
84
+ <p class="description"><strong><?php esc_html_e('No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is.', 'pretty-link'); ?></strong></p>
85
+ <?php
86
+ endif;
87
+ endif;
88
+ ?>
89
+ </td>
90
+ </tr>
91
+ </table>
92
+
app/views/links/form_basic.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+
3
+ <table class="form-table">
4
+ <tr>
5
+ <th scope="row">
6
+ <?php esc_html_e('Redirection*', 'pretty-link'); ?>
7
+ <?php PrliAppHelper::info_tooltip(
8
+ 'prli-link-options-redirection-type',
9
+ esc_html__('Redirection Type', 'pretty-link'),
10
+ esc_html__('This is the method of redirection for your link.', 'pretty-link')
11
+ ); ?>
12
+ </th>
13
+ <td>
14
+ <select id="redirect_type" name="redirect_type" style="padding: 0px; margin: 0px;">
15
+ <option value="307"<?php echo $values['redirect_type']['307']; ?>><?php esc_html_e("307 (Temporary)", 'pretty-link') ?>&nbsp;</option>
16
+ <option value="302"<?php echo $values['redirect_type']['302']; ?>><?php esc_html_e("302 (Temporary)", 'pretty-link') ?>&nbsp;</option>
17
+ <option value="301"<?php echo $values['redirect_type']['301']; ?>><?php esc_html_e("301 (Permanent)", 'pretty-link') ?>&nbsp;</option>
18
+ <?php do_action('prli_redirection_types', $values, false); ?>
19
+ </select>
20
+ <?php
21
+ global $plp_update;
22
+ if(!$plp_update->is_installed()) {
23
+ ?>
24
+ <p class="description"><?php printf(esc_html__('Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
25
+ <?php
26
+ }
27
+ ?>
28
+ </td>
29
+ </tr>
30
+ <tr id="prli_target_url">
31
+ <th scope="row">
32
+ <?php esc_html_e('Target URL*', 'pretty-link'); ?>
33
+ <?php PrliAppHelper::info_tooltip(
34
+ 'prli-link-options-target-url',
35
+ esc_html__('Target URL', 'pretty-link'),
36
+ esc_html__('This is the URL that your Pretty Link will redirect to.', 'pretty-link')
37
+ ); ?>
38
+ </th>
39
+ <td>
40
+ <textarea class="large-text" name="url"><?php echo esc_textarea($values['url']); ?></textarea>
41
+ </td>
42
+ </tr>
43
+ <tr>
44
+ <th scope="row">
45
+ <?php esc_html_e('Pretty Link*', 'pretty-link'); ?>
46
+ <?php PrliAppHelper::info_tooltip(
47
+ 'prli-link-options-slug',
48
+ esc_html__('Pretty Link', 'pretty-link'),
49
+ esc_html__('This is how your pretty link will appear. You can edit the Pretty Link slug here.', 'pretty-link')
50
+ ); ?>
51
+ </th>
52
+ <td>
53
+ <strong><?php global $prli_blogurl; echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" class="regular-text" value="<?php echo esc_attr($values['slug']); ?>" />
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <th scope="row">
58
+ <?php esc_html_e('Notes', 'pretty-link'); ?>
59
+ <?php PrliAppHelper::info_tooltip(
60
+ 'prli-link-options-notes',
61
+ esc_html__('Notes', 'pretty-link'),
62
+ esc_html__('This is a field where you can enter notes about a particular link. This notes field is mainly for your own link management needs. It isn\'t currently used anywhere on the front end.', 'pretty-link')
63
+ ); ?>
64
+ </th>
65
+ <td>
66
+ <textarea class="large-text" name="description"><?php echo esc_textarea($values['description']); ?></textarea>
67
+ </td>
68
+ </tr>
69
+ </table>
70
+
app/views/links/form_pro.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+
3
+ <?php
4
+ global $plp_update;
5
+ if($plp_update->is_installed()) {
6
+ $id = isset($id)?$id:false;
7
+ // Add stuff to the form here
8
+ do_action('prli_link_fields',$id);
9
+ }
10
+ else {
11
+ ?>
12
+ <table class="form-table">
13
+ <tr class="prli-pro-only">
14
+ <th scope="row">
15
+ <?php esc_html_e('Expire', 'pretty-link'); ?>
16
+ <?php PrliAppHelper::info_tooltip(
17
+ 'plp-expire',
18
+ esc_html__('Expire Link', 'pretty-link'),
19
+ esc_html__('Set this link to expire after a specific date or number of clicks.', 'pretty-link')
20
+ ); ?>
21
+ <?php echo PrliAppHelper::pro_only_feature_indicator('link-expire'); ?>
22
+ </th>
23
+ <td>
24
+ <input class="prli-toggle-checkbox" type="checkbox" disabled />
25
+ </td>
26
+ </tr>
27
+
28
+ <tr class="prli-pro-only">
29
+ <th scope="row">
30
+ <?php esc_html_e('Keywords', 'pretty-link'); ?>
31
+ <?php PrliAppHelper::info_tooltip(
32
+ 'prli-link-pro-options-keywords',
33
+ esc_html__('Auto-Replace Keywords', 'pretty-link'),
34
+ esc_html__('Enter a comma separated list of keywords / keyword phrases that you\'d like to replace with this link in your Posts & Pages.', 'pretty-link')); ?>
35
+ <?php echo PrliAppHelper::pro_only_feature_indicator('link-keywords'); ?>
36
+ </th>
37
+ <td>
38
+ <input type="text" class="large-text" disabled />
39
+ </td>
40
+ </tr>
41
+
42
+ <tr class="prli-pro-only">
43
+ <th scope="row">
44
+ <?php esc_html_e('URL Replacements', 'pretty-link'); ?>
45
+ <?php PrliAppHelper::info_tooltip(
46
+ 'prli-link-pro-options-url-replacements',
47
+ esc_html__('Auto-Replace URLs', 'pretty-link'),
48
+ sprintf(
49
+ // translators: %1$s: open code tag, %2$s: close code tag
50
+ esc_html__('Enter a comma separated list of the URLs that you\'d like to replace with this Pretty Link in your Posts & Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s', 'pretty-link'),
51
+ '<code>',
52
+ '</code>'
53
+ )
54
+ ); ?>
55
+ <?php echo PrliAppHelper::pro_only_feature_indicator('link-url-replacements'); ?>
56
+ </th>
57
+ <td>
58
+ <input type="text" class="large-text" disabled />
59
+ </td>
60
+ </tr>
61
+
62
+ <tr class="prli-pro-only">
63
+ <th scope="row">
64
+ <?php esc_html_e('Head Scripts', 'pretty-link'); ?>
65
+ <?php PrliAppHelper::info_tooltip(
66
+ 'prli-link-pro-options-head-scripts',
67
+ esc_html__('Head Scripts', 'pretty-link'),
68
+ sprintf(
69
+ // translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
70
+ esc_html__('Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head for this pretty link.%1$s%1$sThese scripts will be in addition to any global one\'s you\'ve defined in the options.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects.', 'pretty-link'),
71
+ '<br>',
72
+ '<b>',
73
+ '</b>'
74
+ )
75
+ ); ?>
76
+ </th>
77
+ <td>
78
+ <textarea class="large-text" disabled></textarea>
79
+ </td>
80
+ </tr>
81
+
82
+ <tr class="prli-pro-only">
83
+ <th scope="row">
84
+ <?php esc_html_e('Dynamic Redirection', 'pretty-link'); ?>
85
+ <?php PrliAppHelper::info_tooltip(
86
+ 'prli-link-pro-options-dynamic-redirection-options',
87
+ esc_html__('Dynamic Redirection Options', 'pretty-link'),
88
+ esc_html__('These powerful options are available to give you dynamic control over redirection for this pretty link.', 'pretty-link')
89
+ ); ?>
90
+ <?php echo PrliAppHelper::pro_only_feature_indicator('dynamic-redirection'); ?>
91
+ </th>
92
+ <td>
93
+ <select disabled>
94
+ <option value="none"><?php esc_html_e('None', 'pretty-link'); ?></option>
95
+ <option value="rotate"><?php esc_html_e('Rotation', 'pretty-link'); ?></option>
96
+ <option value="geo"><?php esc_html_e('Geographic', 'pretty-link'); ?></option>
97
+ <option value="tech"><?php esc_html_e('Technology', 'pretty-link'); ?></option>
98
+ <option value="time"><?php esc_html_e('Time', 'pretty-link'); ?></option>
99
+ </select>
100
+ </td>
101
+ </tr>
102
+ </table>
103
+ <?php
104
+ }
app/views/links/list.php DELETED
@@ -1,163 +0,0 @@
1
- <?php
2
- if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
3
-
4
- $group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
5
- $size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:'10';
6
- $search = (isset($_REQUEST['search']))?sanitize_text_field($_REQUEST['search']):'';
7
-
8
- $url_params = "&group={$group}&size={$size}&search={$search}"
9
- ?>
10
-
11
- <div class="wrap">
12
- <?php echo PrliAppHelper::page_title(__('Pretty Links', 'pretty-link')); ?>
13
- <a href="<?php echo admin_url('admin.php?page=add-new-pretty-link'); ?>" class="page-title-action"><?php _e('Add Pretty Link', 'pretty-link'); ?></a>
14
- <hr class="wp-header-end">
15
-
16
- <?php if(empty($params['group'])): ?>
17
- <?php $permalink_structure = get_option('permalink_structure'); ?>
18
- <?php if(!$permalink_structure or empty($permalink_structure)): ?>
19
- <div class="error"><p><strong><?php _e("WordPress Must be Configured:</strong> Pretty Link won't work until you select a Permalink Structure other than 'Default'", 'pretty-link'); ?> ... <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('Permalink Settings', 'pretty-link'); ?></a></p></div>
20
- <?php endif; //end $permalink_structure ?>
21
- <?php if($record_count <= 0): ?>
22
- <div class="updated notice notice-success is-dismissible"><p><?php echo $prli_message; ?></p></div>
23
- <?php endif; //end $record_count message ?>
24
- <?php do_action('prli-link-message'); ?>
25
- <div id="search_pane" style="float: right;">
26
- <form class="form-fields" name="link_form" method="post" action="">
27
- <?php wp_nonce_field('prli-links'); ?>
28
- <input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
29
- <input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
30
- <input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
31
- <div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search"/>
32
- <?php
33
- if(!empty($search_str)) {
34
- $link_nonce = wp_create_nonce( 'link-actions' );
35
- ?>
36
- &nbsp; <a href="<?php echo admin_url("admin.php?page=pretty-link&action=reset&_wpnonce={$link_nonce}"); ?>" class="button"><?php _e('Reset', 'pretty-link'); ?></a>
37
- <?php
38
- }
39
- ?>
40
- </div>
41
- </form>
42
- </div>
43
- <?php else: //else if Groups ?>
44
- <h3><?php echo $prli_message; ?></h3>
45
- <a href="<?php echo admin_url('admin.php?page=pretty-link-groups'); ?>">&laquo <?php _e('Back to Groups', 'pretty-link'); ?></a>
46
- <br/><br/>
47
- <?php endif; //end if Groups ?>
48
- <?php $footer = false; require(PRLI_VIEWS_PATH.'/shared/link-table-nav.php'); ?>
49
- <table class="prli-edit-table widefat post fixed" cellspacing="0">
50
- <thead>
51
- <tr>
52
- <th class="manage-column" width="30%"><input type="checkbox" name="check-all" class="select-all-link-action-checkboxes" style="margin-left: 1px;"/>&nbsp;&nbsp;<a href="<?php echo admin_url('admin.php?page=pretty-link&sort=name' . (($sort_str == 'name' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Name', 'pretty-link'); echo (($sort_str == 'name')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
53
- <?php do_action('prli_link_column_header'); ?>
54
- <th class="manage-column" width="10%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=clicks' . (($sort_str == 'clicks' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Clicks / Uniq', 'pretty-link'); echo (($sort_str == 'clicks')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
55
- <th class="manage-column" width="5%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=group_name' . (($sort_str == 'group_name' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params) ?>"><?php _e('Group', 'pretty-link'); echo (($sort_str == 'group_name')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
56
- <th class="manage-column" width="12%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=created_at' . (($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Created', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL . '/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
57
- <th class="manage-column" width="20%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=slug' . (($sort_str == 'slug' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Links', 'pretty-link'); echo (($sort_str == 'slug')?'&nbsp;&nbsp;&nbsp;<img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
58
- </tr>
59
- </thead>
60
- <tr id="bulk-edit" class="inline-edit-row inline-edit-row-post inline-edit-post bulk-edit-row bulk-edit-row-post bulk-edit-post" style="display: none;">
61
- <td class="colspanchange">
62
- <form id="prli-bulk-action-form" action="<?php echo admin_url('admin.php'); ?>" method="post">
63
- <input type="hidden" name="page" value="pretty-link" />
64
- <input type="hidden" name="action" value="bulk-edit" />
65
- <input type="hidden" name="_wpnonce" value="<?php echo wp_create_nonce('prli-bulk-edit'); ?>" />
66
- <fieldset class="inline-edit-col-left">
67
- <div class="inline-edit-col">
68
- <h4><?php _e('Bulk Edit', 'pretty-link'); ?></h4>
69
- <div id="bulk-title-div">
70
- <div id="bulk-titles"></div>
71
- </div>
72
- </div>
73
- </fieldset>
74
- <fieldset class="inline-edit-col-center">
75
- <h4><?php _e('Basic Link Options', 'pretty-link'); ?></h4>
76
- <div class="bacheck-title"><?php _e('Redirect Type', 'pretty-link'); ?></div>
77
- <?php PrliLinksHelper::redirect_type_dropdown( 'bu[redirect_type]', '', array(__('- No Change -', 'pretty-link') => '##nochange##'), 'bulk-edit-select' ) ?>
78
- <br/>
79
- <div class="bacheck-title"><?php _e('Group', 'pretty-link'); ?></div>
80
- <?php PrliLinksHelper::groups_dropdown('bu[group_id]', '', array(__('- No Change -', 'pretty-link') => '##nochange##'), 'bulk-edit-select'); ?>
81
- <br/>
82
- <?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[track_me]', __('Track', 'pretty-link'), 'bulk-edit-select'); ?>
83
- <br/>
84
- <?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[nofollow]', __('Nofollow', 'pretty-link'), 'bulk-edit-select'); ?>
85
- <br/>
86
- <?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[param_forwarding]', __('Forward Params', 'pretty-link'), 'bulk-edit-select'); ?>
87
- <br/>
88
- </fieldset>
89
- <fieldset class="inline-edit-col-right">
90
- <?php do_action('prli_bulk_action_right_col'); ?>
91
- </fieldset>
92
- <p class="submit inline-edit-save">
93
- <a href="javascript:" title="<?php _e('Cancel', 'pretty-link'); ?>" class="button-secondary bulk-edit-cancel alignleft"><?php _e('Cancel', 'pretty-link'); ?></a>
94
- <a href="javascript:" title="<?php _e('Update', 'pretty-link'); ?>" class="button-primary bulk-edit-update alignright"><?php _e('Bulk Update', 'pretty-link'); ?></a><br class="clear">
95
- </p>
96
- </form>
97
- </td>
98
- </tr>
99
- <?php
100
-
101
- if($record_count <= 0) {
102
- ?>
103
- <tr>
104
- <td colspan="5"><?php printf(__('No Pretty Links were found, %sCreate One%s', 'pretty-link'), '<a href="' . admin_url('admin.php?page=add-new-pretty-link') . '">', '</a>'); ?></td>
105
- </tr>
106
- <?php
107
- }
108
- else {
109
- global $prli_blogurl;
110
- $row_index=0;
111
- foreach($links as $link) {
112
- $alternate = ( $row_index++ % 2 ? '' : ' alternate' );
113
- $struct = PrliUtils::get_permalink_pre_slug_uri();
114
- $pretty_link_url = "{$prli_blogurl}{$struct}{$link->slug}";
115
- $plnotes = empty($link->description) ? $link->name : $link->description;
116
- ?>
117
-
118
- <tr id="record_<?php echo $link->id; ?>" class="link_row<?php echo $alternate; ?>">
119
- <td class="edit_link">
120
-
121
- <input type="checkbox" name="link-action[<?php echo $link->id; ?>]" class="link-action-checkbox" data-id="<?php echo $link->id; ?>" data-title="<?php echo esc_attr(stripslashes($link->name)); ?>" />&nbsp;&nbsp;<?php PrliLinksHelper::link_list_icons($link); ?>
122
- <a class="slug_name" href="<?php echo admin_url('admin.php?page=pretty-link&action=edit&id='.$link->id); ?>" title="<?php echo esc_attr(stripslashes($plnotes)); ?>"><?php echo stripslashes($link->name); ?></a>
123
- <div class="link_actions">
124
- <br/>
125
- <?php echo PrliLinksHelper::link_list_actions($link, $pretty_link_url); ?>
126
- </div>
127
- </td>
128
- <?php do_action('prli_link_column_row',$link->id); ?>
129
- <td>
130
- <?php if($prli_options->extended_tracking!='count')
131
- echo (($link->track_me)?"<a href=\"". admin_url( "admin.php?page=pretty-link-clicks&l={$link->id}" ) . "\" title=\"View clicks for $link->slug\">" . (empty($link->clicks)?0:$link->clicks) . "/" . (empty($link->uniques)?0:$link->uniques) . "</a>":"<img src=\"".PRLI_IMAGES_URL."/not_tracking.png\" title=\"This link isn't being tracked\"/>");
132
- else
133
- echo (($link->track_me)?(empty($link->clicks)?0:$link->clicks) . "/" . (empty($link->uniques)?0:$link->uniques):"<img src=\"".PRLI_IMAGES_URL."/not_tracking.png\" title=\"This link isn't being tracked\"/>");
134
- ?>
135
- </td>
136
- <td><a href="<?php echo admin_url( "admin.php?page=pretty-link&group={$link->group_id}"); ?>"><?php echo $link->group_name; ?></a></td>
137
- <td><?php echo $link->created_at; ?></td>
138
- </td>
139
- <td>
140
- <input type='text' style="font-size: 10px; width: 65%;" readonly="true" onclick='this.select();' onfocus='this.select();' value='<?php echo $pretty_link_url; ?>' />
141
- <span class="list-clipboard prli-clipboard"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo $pretty_link_url; ?>"></i></span>
142
- <?php if( $link->redirect_type != 'pixel' ) { ?>
143
- <div style="font-size: 8px;" title="<?php echo $link->url; ?>"><strong><?php _e('Target URL:', 'pretty-link'); ?></strong> <?php echo htmlentities((substr($link->url,0,47) . ((strlen($link->url) >= 47)?'...':'')),ENT_COMPAT,'UTF-8'); ?></div>
144
- <?php } ?>
145
- </td>
146
- </tr>
147
- <?php
148
- }
149
- }
150
- ?>
151
- <tfoot>
152
- <tr>
153
- <th class="manage-column"><?php do_action('prli-list-header-icon'); ?><?php _e('Name', 'pretty-link'); ?></th>
154
- <?php do_action('prli_link_column_footer'); ?>
155
- <th class="manage-column"><?php _e('Clicks / Uniq', 'pretty-link'); ?></th>
156
- <th class="manage-column"><?php _e('Group', 'pretty-link'); ?></th>
157
- <th class="manage-column"><?php _e('Created', 'pretty-link'); ?></th>
158
- <th class="manage-column"><?php _e('Links', 'pretty-link'); ?></th>
159
- </tr>
160
- </tfoot>
161
- </table>
162
- <?php $footer = true; require(PRLI_VIEWS_PATH.'/shared/link-table-nav.php'); ?>
163
- </div> <!-- end wrap -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/views/links/new.php DELETED
@@ -1,18 +0,0 @@
1
- <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
-
3
- <div class="wrap">
4
- <?php echo PrliAppHelper::page_title(__('Add Pretty Link', 'pretty-link')); ?>
5
-
6
- <?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
7
-
8
- <form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link"); ?>">
9
- <input type="hidden" name="action" value="create">
10
- <?php wp_nonce_field('update-options'); ?>
11
-
12
- <?php require(PRLI_VIEWS_PATH.'/links/form.php'); ?>
13
-
14
- <p class="submit">
15
- <input type="submit" class="button button-primary" name="submit" value="<?php _e('Create', 'pretty-link'); ?>" /> &nbsp; <a href="<?php echo admin_url('admin.php?page=pretty-link'); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
16
- </p>
17
- </form>
18
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/views/options/form.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <div class="wrap">
3
- <?php echo PrliAppHelper::page_title(__('Options', 'pretty-link')); ?>
4
- <a href="https://prettylinks.com/user-manual-2" class="page-title-action"><?php _e('User Manual', 'pretty-link'); ?></a>
5
  <hr class="wp-header-end">
6
 
7
  <?php
@@ -9,7 +9,19 @@
9
  if(!$permalink_structure or empty($permalink_structure)) {
10
  global $prli_siteurl;
11
  ?>
12
- <div class="error"><p><strong><?php _e('WordPress Must be Configured:', 'pretty-link'); ?></strong> <?php _e("Pretty Link won't work until you select a Permalink Structure other than 'Default'", 'pretty-link'); ?> ... <a href="<?php echo $prli_siteurl; ?>/wp-admin/options-permalink.php"><?php _e('Permalink Settings', 'pretty-link'); ?></a></p></div>
 
 
 
 
 
 
 
 
 
 
 
 
13
  <?php
14
  }
15
 
@@ -20,8 +32,8 @@
20
  <div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
21
  <?php endif; ?>
22
 
23
- <form name="form1" id="prli-options" method="post" action="<?php echo admin_url('/admin.php?page=pretty-link-options'); ?>">
24
- <input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">
25
  <?php wp_nonce_field('update-options'); ?>
26
 
27
  <table class="prli-settings-table">
@@ -34,132 +46,234 @@
34
  <td class="prli-settings-table-nav">
35
  <ul class="prli-sidebar-nav">
36
  <?php if($plp_update->is_installed()): ?>
37
- <li><a data-id="general"><?php _e('General', 'pretty-link'); ?></a></li>
38
  <?php endif; ?>
39
- <li><a data-id="links"><?php _e('Links', 'pretty-link'); ?></a></li>
40
- <li><a data-id="reporting"><?php _e('Reporting', 'pretty-link'); ?></a></li>
 
 
 
 
 
41
  <?php do_action('prli_admin_options_nav'); ?>
42
  </ul>
43
  </td>
44
  <td class="prli-settings-table-pages">
45
  <?php if($plp_update->is_installed()): ?>
46
  <div class="prli-page" id="general">
47
- <div class="prli-page-title"><?php _e('General Options', 'pretty-link'); ?></div>
48
  <?php do_action('prli_admin_general_options'); ?>
49
  </div>
50
  <?php endif; ?>
51
 
52
  <div class="prli-page" id="links">
53
- <div class="prli-page-title"><?php _e('Default Link Options', 'pretty-link'); ?></div>
54
  <table class="form-table">
55
  <tbody>
56
  <tr valign="top">
57
  <th scope="row">
58
- <label for="<?php echo $link_redirect_type; ?>"><?php _e('Redirection Type', 'pretty-link') ?></label>
59
  <?php PrliAppHelper::info_tooltip('prli-options-default-link-redirection',
60
- __('Redirection Type', 'pretty-link'),
61
- __('Select the type of redirection you want your newly created links to have.', 'pretty-link'));
62
  ?>
63
  </th>
64
  <td>
65
  <?php PrliLinksHelper::redirect_type_dropdown($link_redirect_type, $prli_options->link_redirect_type); ?>
 
 
 
 
 
 
 
 
66
  </td>
67
  </tr>
68
  <tr valign="top">
69
  <th scope="row">
70
- <label for="<?php echo $link_track_me; ?>"><?php _e('Enable Tracking', 'pretty-link'); ?></label>
71
  <?php PrliAppHelper::info_tooltip('prli-options-track-link',
72
- __('Enable Tracking', 'pretty-link'),
73
- __('Default all new links to be tracked.', 'pretty-link'));
74
  ?>
75
  </th>
76
  <td>
77
- <input type="checkbox" name="<?php echo $link_track_me; ?>" <?php checked($prli_options->link_track_me != 0); ?>/>
78
  </td>
79
  </tr>
80
  <tr valign="top">
81
  <th scope="row">
82
- <label for="<?php echo $link_nofollow; ?>"><?php _e('Enable No Follow', 'pretty-link'); ?></label>
83
  <?php PrliAppHelper::info_tooltip('prli-options-add-nofollow',
84
- __('Add No Follow', 'pretty-link'),
85
- __('Add the \'nofollow\' attribute by default to new links.', 'pretty-link'));
86
  ?>
87
  </th>
88
  <td>
89
- <input type="checkbox" name="<?php echo $link_nofollow; ?>" <?php checked($prli_options->link_nofollow != 0); ?>/>
90
  </td>
91
  </tr>
92
  <tr valign="top">
93
  <th scope="row">
94
- <label for="<?php echo $link_prefix; ?>"><?php _e('Enable Permalink Fix', 'pretty-link'); ?></label>
95
  <?php PrliAppHelper::info_tooltip('prli-options-use-prefix-permalinks',
96
- __('Use fix for index.php Permalink Structure', 'pretty-link'),
97
- __("This option should ONLY be checked if you have elements in your permalink structure that must be present in any link on your site. For example, some WordPress installs don't have the benefit of full rewrite capabilities and in this case you'd need an index.php included in each link (http://example.com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this is the case for you then check this option but the vast majority of users will want to keep this unchecked.", 'pretty-link'));
98
  ?>
99
  </th>
100
  <td>
101
- <input type="checkbox" name="<?php echo $link_prefix; ?>" <?php checked($prli_options->link_prefix != 0); ?>/>
102
  </td>
103
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  <?php do_action('prli_custom_link_options'); ?>
105
  </tbody>
106
  </table>
107
  </div>
108
 
109
  <div class="prli-page" id="reporting">
110
- <div class="prli-page-title"><?php _e('Reporting Options', 'pretty-link'); ?></div>
111
  <table class="form-table">
112
  <tbody>
113
  <tr valign="top">
114
  <th scope="row">
115
- <?php _e('Tracking Style', 'pretty-link'); ?>
116
  <?php PrliAppHelper::info_tooltip('prli-options-tracking-style',
117
- __('Tracking Style', 'pretty-link'),
118
- __("Changing your tracking style can affect the accuracy of your existing statistics. Extended mode must be used for Conversion reporting.", 'pretty-link'));
119
  ?>
120
  </th>
121
  <td>
122
- <input type="radio" name="<?php echo $extended_tracking; ?>" value="normal" <?php checked($prli_options->extended_tracking,'normal'); ?>/><span class="prli-radio-text"><?php _e('Normal Tracking', 'pretty-link'); ?></span><br/><br/>
123
- <input type="radio" name="<?php echo $extended_tracking; ?>" value="extended"<?php checked($prli_options->extended_tracking,'extended'); ?>/><span class="prli-radio-text"><?php _e('Extended Tracking (more stats / slower performance)', 'pretty-link'); ?></span><br/><br/>
124
- <input type="radio" name="<?php echo $extended_tracking; ?>" value="count"<?php checked($prli_options->extended_tracking,'count'); ?>/><span class="prli-radio-text"><?php _e('Simple Click Count Tracking (less stats / faster performance)', 'pretty-link'); ?></span><br/>
125
  </td>
126
  </tr>
127
  <tr valign="top">
128
  <th scope="row">
129
- <label for="<?php echo $prli_exclude_ips; ?>">
130
- <?php _e('Excluded IP Addresses:', 'pretty-link'); ?>
131
  <?php PrliAppHelper::info_tooltip('prli-options-excluded-ips',
132
- __('Excluded IP Addresses', 'pretty-link'),
133
- sprintf(__("Enter IP Addresses or IP Ranges you want to exclude from your Click data and Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*<br/><br/><strong>FYI, your current IP address is %s.", 'pretty-link'), $prli_utils->get_current_client_ip()));
 
 
 
 
134
  ?>
135
  </label>
136
  </th>
137
  <td>
138
- <input type="text" name="<?php echo $prli_exclude_ips; ?>" class="regular-text" value="<?php echo $prli_options->prli_exclude_ips; ?>">
139
  </td>
140
  </tr>
141
  <tr valign="top">
142
  <th scope="row">
143
- <?php _e('Auto-Trim Clicks', 'pretty-link'); ?>
144
  <?php PrliAppHelper::info_tooltip('prli-options-auto-trim-clicks',
145
- __('Automatically Trim Clicks', 'pretty-link'),
146
- __("Will automatically delete all hits older than 90 days. We strongly recommend doing this to keep your database performance up. This will permanently delete this click data, and is not undo-able. ", 'pretty-link'));
147
  ?>
148
  </th>
149
  <td>
150
- <input type="checkbox" name="<?php echo $auto_trim_clicks; ?>" <?php checked($prli_options->auto_trim_clicks != 0); ?> />
151
  </td>
152
  </tr>
153
  <tr valign="top">
154
  <th scope="row">
155
- <?php _e('Filter Robots', 'pretty-link'); ?>
156
  <?php PrliAppHelper::info_tooltip('prli-options-filter-robots',
157
- __('Filter Robots', 'pretty-link'),
158
- __("Filter known Robots and unidentifiable browser clients from your click data, stats and reports. Works best if Tracking Style above is set to 'Extended Tracking'.", 'pretty-link'));
159
  ?>
160
  </th>
161
  <td>
162
- <input type="checkbox" class="prli-toggle-checkbox" data-box="prli-whitelist-ips" name="<?php echo $filter_robots; ?>" <?php checked($prli_options->filter_robots != 0); ?> />
163
  </td>
164
  </tr>
165
  </tbody>
@@ -170,28 +284,719 @@
170
  <tbody>
171
  <tr valign="top">
172
  <th scope="row">
173
- <label for="<?php echo $whitelist_ips; ?>">
174
- <?php _e('Whitelist IP Addresses', 'pretty-link'); ?>
175
  <?php PrliAppHelper::info_tooltip('prli-options-whitelist-ips',
176
- __('Whiltelist IP Addresses', 'pretty-link'),
177
- __("Enter IP Addresses or IP Ranges you want to always include in your Click data and Stats even if they are flagged as robots. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*", 'pretty-link'));
178
  ?>
179
  </label>
180
  </th>
181
- <td><input type="text" name="<?php echo $whitelist_ips; ?>" class="regular-text" value="<?php echo $prli_options->whitelist_ips; ?>"></td>
182
  </tr>
183
  </tbody>
184
  </table>
185
  </div>
186
  </div>
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  <?php do_action('prli_admin_options_pages'); ?>
189
  </td>
190
  </tr>
191
  </table>
192
 
193
  <p class="submit">
194
- <input type="submit" name="submit" class="button button-primary" value="<?php _e('Update', 'pretty-link') ?>" />
195
  </p>
196
 
197
  </form>
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <div class="wrap">
3
+ <?php PrliAppHelper::page_title(esc_html__('Options', 'pretty-link')); ?>
4
+ <a href="https://prettylinks.com/user-manual-2" class="page-title-action"><?php esc_html_e('User Manual', 'pretty-link'); ?></a>
5
  <hr class="wp-header-end">
6
 
7
  <?php
9
  if(!$permalink_structure or empty($permalink_structure)) {
10
  global $prli_siteurl;
11
  ?>
12
+ <div class="error">
13
+ <p>
14
+ <?php
15
+ printf(
16
+ // translators: %1$s: open strong tag, %2$s: close strong tag
17
+ esc_html__('%1$sWordPress Must be Configured:%2$s Pretty Links won\'t work until you select a Permalink Structure other than \'Default\'', 'pretty-link'),
18
+ '<strong>',
19
+ '</strong>'
20
+ );
21
+ ?>
22
+ ... <a href="<?php echo esc_url(admin_url('options-permalink.php')); ?>"><?php esc_html_e('Permalink Settings', 'pretty-link'); ?></a>
23
+ </p>
24
+ </div>
25
  <?php
26
  }
27
 
32
  <div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
33
  <?php endif; ?>
34
 
35
+ <form name="form1" id="prli-options" method="post" action="<?php echo esc_url(admin_url('/admin.php?page=pretty-link-options')); ?>">
36
+ <input type="hidden" name="<?php echo esc_attr($hidden_field_name); ?>" value="Y">
37
  <?php wp_nonce_field('update-options'); ?>
38
 
39
  <table class="prli-settings-table">
46
  <td class="prli-settings-table-nav">
47
  <ul class="prli-sidebar-nav">
48
  <?php if($plp_update->is_installed()): ?>
49
+ <li><a data-id="general"><?php esc_html_e('General', 'pretty-link'); ?></a></li>
50
  <?php endif; ?>
51
+ <li><a data-id="links"><?php esc_html_e('Links', 'pretty-link'); ?></a></li>
52
+ <li><a data-id="reporting"><?php esc_html_e('Reporting', 'pretty-link'); ?></a></li>
53
+ <li><a data-id="replacements"><?php esc_html_e('Replacements', 'pretty-link'); ?></a></li>
54
+ <li><a data-id="auto-create"><?php esc_html_e('Auto-Create Links', 'pretty-link'); ?></a></li>
55
+ <li><a data-id="prettybar"><?php esc_html_e('Pretty Bar', 'pretty-link'); ?></a></li>
56
+ <li><a data-id="social"><?php esc_html_e('Social', 'pretty-link'); ?></a></li>
57
+ <li><a data-id="public-links"><?php esc_html_e('Public', 'pretty-link'); ?></a></li>
58
  <?php do_action('prli_admin_options_nav'); ?>
59
  </ul>
60
  </td>
61
  <td class="prli-settings-table-pages">
62
  <?php if($plp_update->is_installed()): ?>
63
  <div class="prli-page" id="general">
64
+ <div class="prli-page-title"><?php esc_html_e('General Options', 'pretty-link'); ?></div>
65
  <?php do_action('prli_admin_general_options'); ?>
66
  </div>
67
  <?php endif; ?>
68
 
69
  <div class="prli-page" id="links">
70
+ <div class="prli-page-title"><?php esc_html_e('Default Link Options', 'pretty-link'); ?></div>
71
  <table class="form-table">
72
  <tbody>
73
  <tr valign="top">
74
  <th scope="row">
75
+ <label for="<?php echo esc_attr($link_redirect_type); ?>"><?php esc_html_e('Redirection', 'pretty-link') ?></label>
76
  <?php PrliAppHelper::info_tooltip('prli-options-default-link-redirection',
77
+ esc_html__('Redirection Type', 'pretty-link'),
78
+ esc_html__('Select the type of redirection you want your newly created links to have.', 'pretty-link'));
79
  ?>
80
  </th>
81
  <td>
82
  <?php PrliLinksHelper::redirect_type_dropdown($link_redirect_type, $prli_options->link_redirect_type); ?>
83
+ <?php
84
+ global $plp_update;
85
+ if(!$plp_update->is_installed()) {
86
+ ?>
87
+ <p class="description"><?php printf(esc_html__('Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
88
+ <?php
89
+ }
90
+ ?>
91
  </td>
92
  </tr>
93
  <tr valign="top">
94
  <th scope="row">
95
+ <label for="<?php echo esc_attr($link_track_me); ?>"><?php esc_html_e('Enable Tracking', 'pretty-link'); ?></label>
96
  <?php PrliAppHelper::info_tooltip('prli-options-track-link',
97
+ esc_html__('Enable Tracking', 'pretty-link'),
98
+ esc_html__('Default all new links to be tracked.', 'pretty-link'));
99
  ?>
100
  </th>
101
  <td>
102
+ <input type="checkbox" name="<?php echo esc_attr($link_track_me); ?>" <?php checked($prli_options->link_track_me != 0); ?>/>
103
  </td>
104
  </tr>
105
  <tr valign="top">
106
  <th scope="row">
107
+ <label for="<?php echo esc_attr($link_nofollow); ?>"><?php esc_html_e('Enable No Follow', 'pretty-link'); ?></label>
108
  <?php PrliAppHelper::info_tooltip('prli-options-add-nofollow',
109
+ esc_html__('Add No Follow', 'pretty-link'),
110
+ esc_html__('Add the \'nofollow\' attribute by default to new links.', 'pretty-link'));
111
  ?>
112
  </th>
113
  <td>
114
+ <input type="checkbox" name="<?php echo esc_attr($link_nofollow); ?>" <?php checked($prli_options->link_nofollow != 0); ?>/>
115
  </td>
116
  </tr>
117
  <tr valign="top">
118
  <th scope="row">
119
+ <label for="<?php echo esc_attr($link_prefix); ?>"><?php esc_html_e('Enable Permalink Fix', 'pretty-link'); ?></label>
120
  <?php PrliAppHelper::info_tooltip('prli-options-use-prefix-permalinks',
121
+ esc_html__('Use fix for index.php Permalink Structure', 'pretty-link'),
122
+ esc_html__("This option should ONLY be checked if you have elements in your permalink structure that must be present in any link on your site. For example, some WordPress installs don't have the benefit of full rewrite capabilities and in this case you'd need an index.php included in each link (http://example.com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this is the case for you then check this option but the vast majority of users will want to keep this unchecked.", 'pretty-link'));
123
  ?>
124
  </th>
125
  <td>
126
+ <input type="checkbox" name="<?php echo esc_attr($link_prefix); ?>" <?php checked($prli_options->link_prefix != 0); ?>/>
127
  </td>
128
  </tr>
129
+
130
+ <?php if(!$plp_update->is_installed()): ?>
131
+
132
+ <tr valign="top" class="prli-pro-only">
133
+ <th scope="row">
134
+ <label><?php esc_html_e('Base Slug Prefix', 'pretty-link'); ?></label>
135
+ <?php PrliAppHelper::info_tooltip('prli-base-slug-prefix',
136
+ esc_html__('Base Slug Prefix', 'pretty-link'),
137
+ sprintf(
138
+ // translators: %1$s: open b tag, %2$s close b tag
139
+ esc_html__('Use this to prefix all newly generated pretty links with a directory of your choice. For example set to %1$sout%2$s to make your pretty links look like http://site.com/%1$sout%2$s/xyz. Changing this option will NOT affect existing pretty links. If you do not wish to use a directory prefix, leave this text field blank. Whatever you type here will be sanitized and modified to ensure it is URL-safe. So %1$sHello World%2$s might get changed to something like %1$shello-world%2$s instead. Lowercase letters, numbers, dashes, and underscores are allowed.', 'pretty-link'),
140
+ '<b>',
141
+ '</b>'
142
+ ));
143
+ ?>
144
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-base-slug-prefix'); ?>
145
+ </th>
146
+ <td>
147
+ <input type="text" class="regular-text" disabled />
148
+ </td>
149
+ </tr>
150
+
151
+ <tr valign="top" class="prli-pro-only">
152
+ <th scope="row">
153
+ <label><?php esc_html_e('Slug Character Count', 'pretty-link'); ?></label>
154
+ <?php PrliAppHelper::info_tooltip('prli-num-slug-chars',
155
+ esc_html__('Slug Character Count', 'pretty-link'),
156
+ esc_html__("The number of characters to use when auto-generating a random slug for pretty links. The default is 4. You cannot use less than 2.", 'pretty-link'));
157
+ ?>
158
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-slug-character-count'); ?>
159
+ </th>
160
+ <td>
161
+ <input type="number" min="2" disabled value="4" />
162
+ </td>
163
+ </tr>
164
+
165
+ <tr valign="top" class="prli-pro-only">
166
+ <th scope="row">
167
+ <label><?php esc_html_e('Enable Google Analytics', 'pretty-link') ?></label>
168
+ <?php PrliAppHelper::info_tooltip('prli-options-use-ga', esc_html__('Enable Google Analytics', 'pretty-link'),
169
+ esc_html__("Requires Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast), or the Google Analytics Plugin to be installed and configured on your site.", 'pretty-link'));
170
+ ?>
171
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-google-analytics'); ?>
172
+ </th>
173
+ <td>
174
+ <input type="checkbox" disabled />
175
+ </td>
176
+ </tr>
177
+
178
+ <tr valign="top" class="prli-pro-only">
179
+ <th scope="row">
180
+ <label><?php printf(esc_html__('Enable %sQR Codes%s', 'pretty-link'), '<a href="http://en.wikipedia.org/wiki/QR_code">', '</a>'); ?></label>
181
+ <?php PrliAppHelper::info_tooltip('prli-options-generate-qr-codes',
182
+ esc_html__('Generate QR Codes', 'pretty-link'),
183
+ esc_html__("This will enable a link in your pretty link admin that will allow you to automatically download a QR Code for each individual Pretty Link.", 'pretty-link'));
184
+ ?>
185
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-qr-codes'); ?>
186
+ </th>
187
+ <td>
188
+ <input type="checkbox" disabled />
189
+ </td>
190
+ </tr>
191
+
192
+ <tr valign="top" class="prli-pro-only">
193
+ <th scope="row">
194
+ <label><?php esc_html_e('Global Head Scripts', 'pretty-link'); ?></label>
195
+ <?php PrliAppHelper::info_tooltip('prli-options-global-head-scripts',
196
+ esc_html__('Global Head Scripts', 'pretty-link'),
197
+ sprintf(
198
+ // translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
199
+ esc_html__('Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head.%1$s%1$sWhat you enter in this box will be applied to all supported pretty links.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects.', 'pretty-link'),
200
+ '<br>',
201
+ '<b>',
202
+ '</b>'
203
+ ));
204
+ ?>
205
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-global-head-scripts'); ?>
206
+ </th>
207
+ <td>
208
+ <textarea class="large-text" disabled></textarea>
209
+ </td>
210
+ </tr>
211
+
212
+ <?php endif; ?>
213
+
214
  <?php do_action('prli_custom_link_options'); ?>
215
  </tbody>
216
  </table>
217
  </div>
218
 
219
  <div class="prli-page" id="reporting">
220
+ <div class="prli-page-title"><?php esc_html_e('Reporting Options', 'pretty-link'); ?></div>
221
  <table class="form-table">
222
  <tbody>
223
  <tr valign="top">
224
  <th scope="row">
225
+ <?php esc_html_e('Tracking Style', 'pretty-link'); ?>
226
  <?php PrliAppHelper::info_tooltip('prli-options-tracking-style',
227
+ esc_html__('Tracking Style', 'pretty-link'),
228
+ esc_html__("Changing your tracking style can affect the accuracy of your existing statistics. Extended mode must be used for Conversion reporting.", 'pretty-link'));
229
  ?>
230
  </th>
231
  <td>
232
+ <input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="normal" <?php checked($prli_options->extended_tracking,'normal'); ?>/><span class="prli-radio-text"><?php esc_html_e('Normal Tracking', 'pretty-link'); ?></span><br/><br/>
233
+ <input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="extended"<?php checked($prli_options->extended_tracking,'extended'); ?>/><span class="prli-radio-text"><?php esc_html_e('Extended Tracking (more stats / slower performance)', 'pretty-link'); ?></span><br/><br/>
234
+ <input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="count"<?php checked($prli_options->extended_tracking,'count'); ?>/><span class="prli-radio-text"><?php esc_html_e('Simple Click Count Tracking (less stats / faster performance)', 'pretty-link'); ?></span><br/>
235
  </td>
236
  </tr>
237
  <tr valign="top">
238
  <th scope="row">
239
+ <label for="<?php echo esc_attr($prli_exclude_ips); ?>">
240
+ <?php esc_html_e('Excluded IP Addresses:', 'pretty-link'); ?>
241
  <?php PrliAppHelper::info_tooltip('prli-options-excluded-ips',
242
+ esc_html__('Excluded IP Addresses', 'pretty-link'),
243
+ esc_html__('Enter IP Addresses or IP Ranges you want to exclude from your Click data and Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*', 'pretty-link') .
244
+ sprintf(
245
+ '<br/><br/><strong>%s</strong>',
246
+ esc_html(sprintf(__('FYI, your current IP address is %s.', 'pretty-link'), $prli_utils->get_current_client_ip()))
247
+ ));
248
  ?>
249
  </label>
250
  </th>
251
  <td>
252
+ <input type="text" name="<?php echo esc_attr($prli_exclude_ips); ?>" class="regular-text" value="<?php echo esc_attr($prli_options->prli_exclude_ips); ?>">
253
  </td>
254
  </tr>
255
  <tr valign="top">
256
  <th scope="row">
257
+ <?php esc_html_e('Auto-Trim Clicks', 'pretty-link'); ?>
258
  <?php PrliAppHelper::info_tooltip('prli-options-auto-trim-clicks',
259
+ esc_html__('Automatically Trim Clicks', 'pretty-link'),
260
+ esc_html__("Will automatically delete all hits older than 90 days. We strongly recommend doing this to keep your database performance up. This will permanently delete this click data, and is not undo-able. ", 'pretty-link'));
261
  ?>
262
  </th>
263
  <td>
264
+ <input type="checkbox" name="<?php echo esc_attr($auto_trim_clicks); ?>" <?php checked($prli_options->auto_trim_clicks != 0); ?> />
265
  </td>
266
  </tr>
267
  <tr valign="top">
268
  <th scope="row">
269
+ <?php esc_html_e('Filter Robots', 'pretty-link'); ?>
270
  <?php PrliAppHelper::info_tooltip('prli-options-filter-robots',
271
+ esc_html__('Filter Robots', 'pretty-link'),
272
+ esc_html__("Filter known Robots and unidentifiable browser clients from your click data, stats and reports. Works best if Tracking Style above is set to 'Extended Tracking'.", 'pretty-link'));
273
  ?>
274
  </th>
275
  <td>
276
+ <input type="checkbox" class="prli-toggle-checkbox" data-box="prli-whitelist-ips" name="<?php echo esc_attr($filter_robots); ?>" <?php checked($prli_options->filter_robots != 0); ?> />
277
  </td>
278
  </tr>
279
  </tbody>
284
  <tbody>
285
  <tr valign="top">
286
  <th scope="row">
287
+ <label for="<?php echo esc_attr($whitelist_ips); ?>">
288
+ <?php esc_html_e('Whitelist IP Addresses', 'pretty-link'); ?>
289
  <?php PrliAppHelper::info_tooltip('prli-options-whitelist-ips',
290
+ esc_html__('Whitelist IP Addresses', 'pretty-link'),
291
+ esc_html__("Enter IP Addresses or IP Ranges you want to always include in your Click data and Stats even if they are flagged as robots. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*", 'pretty-link'));
292
  ?>
293
  </label>
294
  </th>
295
+ <td><input type="text" name="<?php echo esc_attr($whitelist_ips); ?>" class="regular-text" value="<?php echo esc_attr($prli_options->whitelist_ips); ?>"></td>
296
  </tr>
297
  </tbody>
298
  </table>
299
  </div>
300
  </div>
301
 
302
+ <?php if(!$plp_update->is_installed()): ?>
303
+
304
+ <div class="prli-page" id="replacements">
305
+ <div class="prli-page-title"><?php esc_html_e('Keyword &amp; URL Auto Replacements Options', 'pretty-link'); ?></div>
306
+
307
+ <table class="form-table">
308
+ <tbody>
309
+ <tr valign="top" class="prli-pro-only">
310
+ <th scope="row">
311
+ <label>
312
+ <?php esc_html_e('Enable Replacements', 'pretty-link'); ?>
313
+ <?php PrliAppHelper::info_tooltip('prli-keyword-replacement',
314
+ esc_html__('Enable Keyword and URL Auto Replacement', 'pretty-link'),
315
+ esc_html__('If checked, this will enable you to automatically replace keywords and/or URLs on your blog with pretty links. You will specify the specific keywords and urls from your Pretty Link edit page.', 'pretty-link'));
316
+ ?>
317
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-enable-replacements'); ?>
318
+ </label>
319
+ </th>
320
+ <td>
321
+ <input class="prli-toggle-checkbox" type="checkbox" checked disabled />
322
+ </td>
323
+ </tr>
324
+ </tbody>
325
+ </table>
326
+
327
+ <div class="prli-sub-box pretty-link-keyword-replacement-options">
328
+ <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
329
+ <table class="form-table">
330
+ <tbody>
331
+ <tr valign="top" class="prli-pro-only">
332
+ <th scope="row">
333
+ <label>
334
+ <?php esc_html_e('Thresholds', 'pretty-link'); ?>
335
+ <?php PrliAppHelper::info_tooltip('prli-keyword-replacement-thresholds',
336
+ esc_html__('Set Keyword Replacement Thresholds', 'pretty-link'),
337
+ esc_html__('Don\'t want to have too many keyword replacements per page? Select to set some reasonable keyword replacement thresholds.', 'pretty-link'));
338
+ ?>
339
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-thresholds'); ?>
340
+ </label>
341
+ </th>
342
+ <td>
343
+ <input class="prli-toggle-checkbox" type="checkbox" disabled />
344
+ </td>
345
+ </tr>
346
+ </tbody>
347
+ </table>
348
+ <table class="form-table">
349
+ <tbody>
350
+ <tr valign="top" class="prli-pro-only">
351
+ <th scope="row">
352
+ <label>
353
+ <?php esc_html_e('Open in New Window', 'pretty-link'); ?>
354
+ <?php PrliAppHelper::info_tooltip('prli-keyword-replacement-thresholds',
355
+ esc_html__('Open Keyword Replacement Links in New Window', 'pretty-link'),
356
+ sprintf(
357
+ // translators: %1$s: open strong tag, %2$s: close strong tag
358
+ esc_html__('Ensure that these keyword replacement links are opened in a separate window. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
359
+ '<strong>',
360
+ '</strong>'
361
+ ));
362
+ ?>
363
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-new-window'); ?>
364
+ </label>
365
+ </th>
366
+ <td>
367
+ <input type="checkbox" disabled />
368
+ </td>
369
+ </tr>
370
+ <tr valign="top" class="prli-pro-only">
371
+ <th scope="row">
372
+ <label>
373
+ <?php esc_html_e('Add No Follows', 'pretty-link'); ?>
374
+ <?php PrliAppHelper::info_tooltip('prli-keyword-links-nofollow',
375
+ esc_html__('Add \'nofollow\' attribute to all Keyword Pretty Links', 'pretty-link'),
376
+ sprintf(
377
+ // translators: %1$s: open code tag, %2$s: close code tag, %3$s: open strong tag, %4$s close strong tag
378
+ esc_html__('This adds the html %1$sNOFOLLOW%2$s attribute to all keyword replacement links. %3$sNote:%4$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
379
+ '<code>',
380
+ '</code>',
381
+ '<strong>',
382
+ '</strong>'
383
+ ));
384
+ ?>
385
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-no-follows'); ?>
386
+ </label>
387
+ </th>
388
+ <td>
389
+ <input type="checkbox" disabled />
390
+ </td>
391
+ </tr>
392
+ <tr valign="top" class="prli-pro-only">
393
+ <th scope="row">
394
+ <label>
395
+ <?php esc_html_e('Custom CSS', 'pretty-link'); ?>
396
+ <?php PrliAppHelper::info_tooltip('prli-keyword-custom-css',
397
+ esc_html__('Add custom CSS to your keyword replacement links', 'pretty-link'),
398
+ sprintf(
399
+ // translators: %1$s: open strong tag, %2$s: close strong tag
400
+ esc_html__('Add some custom formatting to your keyword pretty link replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
401
+ '<strong>',
402
+ '</strong>'
403
+ ));
404
+ ?>
405
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-custom-css'); ?>
406
+ </label>
407
+ </th>
408
+ <td>
409
+ <input type="text" class="regular-text" disabled />
410
+ </td>
411
+ </tr>
412
+ <tr valign="top" class="prli-pro-only">
413
+ <th valign="row">
414
+ <label>
415
+ <?php esc_html_e('Custom Hover CSS', 'pretty-link'); ?>
416
+ <?php PrliAppHelper::info_tooltip('prli-keyword-custom-hover-css',
417
+ esc_html__('Add custom hover CSS to your keyword replacement links', 'pretty-link'),
418
+ sprintf(
419
+ // translators: %1$s: open strong tag, %2$s: close strong tag
420
+ esc_html__('Add some custom formatting to the hover attribute of your keyword pretty links. %1$sNote%2$s: This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
421
+ '<strong>',
422
+ '</strong>'
423
+ ));
424
+ ?>
425
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-custom-hover-css'); ?>
426
+ </label>
427
+ </th>
428
+ <td>
429
+ <input type="text" class="regular-text" disabled />
430
+ </td>
431
+ </tr>
432
+ <tr valign="top" class="prli-pro-only">
433
+ <th valign="row">
434
+ <label>
435
+ <?php esc_html_e('Link to Disclosures', 'pretty-link'); ?>
436
+ <?php PrliAppHelper::info_tooltip(
437
+ 'prlipro-link-to-disclosures',
438
+ esc_html__('Automatically Add a Link to Disclosures', 'pretty-link'),
439
+ esc_html__('When enabled, this will add a link to your official affiliate link disclosure page to any page, post or custom post type that have any keyword or URL replacements. You\'ll also be able to customize the URL and position of the disclosure link.', 'pretty-link')
440
+ );
441
+ ?>
442
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-link-to-disclosures'); ?>
443
+ </label>
444
+ </th>
445
+ <td>
446
+ <input type="checkbox" class="prli-toggle-checkbox" disabled />
447
+ </td>
448
+ </tr>
449
+ <tr valign="top" class="prli-pro-only">
450
+ <th valign="row">
451
+ <label>
452
+ <?php esc_html_e('Keyword Disclosures', 'pretty-link'); ?>
453
+ <?php PrliAppHelper::info_tooltip(
454
+ 'prlipro-enable-keyword-link-disclosures',
455
+ esc_html__('Automatically Add Affiliate Link Disclosures to Keyword Replacements', 'pretty-link'),
456
+ sprintf(
457
+ // translators: %1$s: open b tag, %2$s close b tag
458
+ esc_html__('When enabled, this will add an affiliate link disclosure next to each one of your keyword replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
459
+ '<b>',
460
+ '</b>'
461
+ )
462
+ );
463
+ ?>
464
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-keyword-disclosures'); ?>
465
+ </label>
466
+ </th>
467
+ <td>
468
+ <input type="checkbox" class="prli-toggle-checkbox" disabled />
469
+ </td>
470
+ </tr>
471
+ <tr valign="top" class="prli-pro-only">
472
+ <th valign="row">
473
+ <label>
474
+ <?php esc_html_e('Replace All URLs', 'pretty-link'); ?>
475
+ <?php PrliAppHelper::info_tooltip('prli-replace-urls',
476
+ esc_html__('Replace All non-Pretty Link URLs With Pretty Link URLs', 'pretty-link'),
477
+ esc_html__('This feature will take each url it finds and create or use an existing pretty link pointing to the url and replace it with the pretty link.', 'pretty-link'));
478
+ ?>
479
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-urls'); ?>
480
+ </label>
481
+ </th>
482
+ <td>
483
+ <input type="checkbox" class="prli-toggle-checkbox" disabled />
484
+ </td>
485
+ </tr>
486
+ <tr valign="top" class="prli-pro-only">
487
+ <th valign="row">
488
+ <label>
489
+ <?php esc_html_e('Replace in Comments', 'pretty-link'); ?>
490
+ <?php PrliAppHelper::info_tooltip('prli-replace-in-comments',
491
+ esc_html__('Replace Keywords and URLs in Comments', 'pretty-link'),
492
+ esc_html__('This option will enable the keyword / URL replacement routine to run in Comments.', 'pretty-link'));
493
+ ?>
494
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-in-comments'); ?>
495
+ </label>
496
+ </th>
497
+ <td>
498
+ <input type="checkbox" disabled />
499
+ </td>
500
+ </tr>
501
+ <tr valign="top" class="prli-pro-only">
502
+ <th valign="row">
503
+ <label>
504
+ <?php esc_html_e('Replace in Feeds', 'pretty-link'); ?>
505
+ <?php PrliAppHelper::info_tooltip('prli-replace-in-feeds',
506
+ esc_html__('Replace Keywords and URLs in Feeds', 'pretty-link'),
507
+ sprintf(
508
+ // translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
509
+ esc_html__('This option will enable the keyword / URL replacement routine to run in RSS Feeds.%1$s%2$sNote:%3$s This option can slow the load speed of your RSS feed -- unless used in conjunction with a caching plugin like W3 Total Cache or WP Super Cache.%1$s%2$sNote #2%3$s This option will only work if you have "Full Text" selected in your General WordPress Reading settings.%1$s%2$sNote #3:%3$s If this option is used along with "Replace Keywords and URLs in Comments" then your post comment feeds will have keywords replaced in them as well.', 'pretty-link'),
510
+ '<br>',
511
+ '<strong>',
512
+ '</strong>'
513
+ ));
514
+ ?>
515
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-in-feeds'); ?>
516
+ </label>
517
+ </th>
518
+ <td>
519
+ <input type="checkbox" disabled />
520
+ </td>
521
+ </tr>
522
+ <tr valign="top" class="prli-pro-only">
523
+ <th valign="row">
524
+ <label>
525
+ <?php esc_html_e('Index Replacements', 'pretty-link'); ?>
526
+ <?php PrliAppHelper::info_tooltip('plp-index-keywords',
527
+ esc_html__('Index Replacements', 'pretty-link'),
528
+ sprintf(
529
+ // translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
530
+ esc_html__('This feature will index all of your keyword & URL replacements to dramatically improve performance.%1$s%1$sIf your site has a large number of replacements and/or posts then this feature may increase the load on your server temporarily and your replacements may not show up on your posts for a day or two initially (until all posts are indexed).%1$s%1$s%2$sNote:%3$s this feature requires the use of wp-cron.', 'pretty-link'),
531
+ '<br>',
532
+ '<strong>',
533
+ '</strong>'
534
+ ));
535
+ ?>
536
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-index'); ?>
537
+ </label>
538
+ </th>
539
+ <td>
540
+ <input type="checkbox" class="prli-toggle-checkbox" disabled />
541
+ </td>
542
+ </tr>
543
+ </tbody>
544
+ </table>
545
+ </div>
546
+ </div>
547
+
548
+ <div class="prli-page" id="auto-create">
549
+ <div class="prli-page-title"><?php esc_html_e('Auto-Create Shortlink Options', 'pretty-link'); ?></div>
550
+
551
+ <table class="form-table">
552
+ <tbody>
553
+ <tr valign="top" class="prli-pro-only">
554
+ <th scope="row">
555
+ <label>
556
+ <?php esc_html_e('Post Shortlinks', 'pretty-link'); ?>
557
+ <?php
558
+ PrliAppHelper::info_tooltip("prli-post-auto",
559
+ esc_html__('Create Pretty Links for Posts', 'pretty-link'),
560
+ esc_html__('Automatically Create a Pretty Link for each of your published Posts', 'pretty-link')
561
+ );
562
+ ?>
563
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-auto-create-post'); ?>
564
+ </label>
565
+ </th>
566
+ <td>
567
+ <input class="prli-toggle-checkbox" type="checkbox" disabled />
568
+ </td>
569
+ </tr>
570
+ <tr valign="top" class="prli-pro-only">
571
+ <th scope="row">
572
+ <label>
573
+ <?php esc_html_e('Page Shortlinks', 'pretty-link'); ?>
574
+ <?php
575
+ PrliAppHelper::info_tooltip("prli-page-auto",
576
+ esc_html__('Create Pretty Links for Pages', 'pretty-link'),
577
+ esc_html__('Automatically Create a Pretty Link for each of your published Pages', 'pretty-link')
578
+ );
579
+ ?>
580
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-auto-create-page'); ?>
581
+ </label>
582
+ </th>
583
+ <td>
584
+ <input class="prli-toggle-checkbox" type="checkbox" disabled />
585
+ </td>
586
+ </tr>
587
+ </tbody>
588
+ </table>
589
+
590
+ </div>
591
+
592
+ <div class="prli-page" id="prettybar">
593
+ <div class="prli-page-title"><?php esc_html_e('Pretty Bar Options', 'pretty-link'); ?></div>
594
+ <table class="form-table">
595
+ <tbody>
596
+ <tr valign="top" class="prli-pro-only">
597
+ <th scope="row">
598
+ <label>
599
+ <?php esc_html_e('Image URL', 'pretty-link'); ?>
600
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-image-url',
601
+ esc_html__('Pretty Bar Image URL', 'pretty-link'),
602
+ esc_html__('If set, this will replace the logo image on the Pretty Bar. The image that this URL references should be 48x48 Pixels to fit.', 'pretty-link'));
603
+ ?>
604
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-image'); ?>
605
+ </label>
606
+ </th>
607
+ <td>
608
+ <input type="text" class="large-text" disabled />
609
+ </td>
610
+ </tr>
611
+ <tr valign="top" class="prli-pro-only">
612
+ <th scope="row">
613
+ <label>
614
+ <?php esc_html_e('Background Image URL', 'pretty-link'); ?>
615
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-background-image-url',
616
+ esc_html__('Pretty Bar Background Image URL', 'pretty-link'),
617
+ esc_html__('If set, this will replace the background image on Pretty Bar. The image that this URL references should be 65px tall - this image will be repeated horizontally across the bar.', 'pretty-link'));
618
+ ?>
619
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-background-image'); ?>
620
+ </label>
621
+ </th>
622
+ <td>
623
+ <input type="text" class="large-text" disabled />
624
+ </td>
625
+ </tr>
626
+ <tr valign="top" class="prli-pro-only">
627
+ <th scope="row">
628
+ <label>
629
+ <?php esc_html_e('Background Color', 'pretty-link'); ?>
630
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-color',
631
+ esc_html__('Pretty Bar Background Color', 'pretty-link'),
632
+ esc_html__('This will alter the background color of the Pretty Bar if you haven\'t specified a Pretty Bar background image.', 'pretty-link'));
633
+ ?>
634
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-background-color'); ?>
635
+ </label>
636
+ </th>
637
+ <td>
638
+ <input type="text" class="plp-colorpicker" size="8" disabled />
639
+ </td>
640
+ </tr>
641
+ <tr valign="top" class="prli-pro-only">
642
+ <th scope="row">
643
+ <label>
644
+ <?php esc_html_e('Text Color', 'pretty-link'); ?>
645
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-text-color',
646
+ esc_html__('Pretty Bar Text Color', 'pretty-link'),
647
+ sprintf(
648
+ // translators: %1$s: open code tag, %2$s: close code tag
649
+ esc_html__('If not set, this defaults to black (RGB value %1$s#000000%2$s) but you can change it to whatever color you like.', 'pretty-link'),
650
+ '<code>',
651
+ '</code>'
652
+ ));
653
+ ?>
654
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-text-color'); ?>
655
+ </label>
656
+ </th>
657
+ <td>
658
+ <input type="text" class="plp-colorpicker" size="8" disabled />
659
+ </td>
660
+ </tr>
661
+ <tr valign="top" class="prli-pro-only">
662
+ <th scope="row">
663
+ <label>
664
+ <?php esc_html_e('Link Color', 'pretty-link'); ?>
665
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-link-color',
666
+ esc_html__('Pretty Bar Link Color', 'pretty-link'),
667
+ sprintf(
668
+ // translators: %1$s: open code tag, %2$s: close code tag
669
+ esc_html__('If not set, this defaults to blue (RGB value %1$s#0000ee%2$s) but you can change it to whatever color you like.', 'pretty-link'),
670
+ '<code>',
671
+ '</code>'
672
+ ));
673
+ ?>
674
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-color'); ?>
675
+ </label>
676
+ </th>
677
+ <td>
678
+ <input type="text" class="plp-colorpicker" size="8" disabled />
679
+ </td>
680
+ </tr>
681
+ <tr valign="top" class="prli-pro-only">
682
+ <th scope="row">
683
+ <label>
684
+ <?php esc_html_e('Link Hover Color', 'pretty-link'); ?>
685
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-link-hover-color',
686
+ esc_html__('Pretty Bar Link Hover Color', 'pretty-link'),
687
+ sprintf(
688
+ // translators: %1$s: open code tag, %2$s: close code tag
689
+ esc_html__('If not set, this defaults to RGB value %1$s#ababab%2$s but you can change it to whatever color you like.', 'pretty-link'),
690
+ '<code>',
691
+ '</code>'
692
+ ));
693
+ ?>
694
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-hover-color'); ?>
695
+ </label>
696
+ </th>
697
+ <td>
698
+ <input type="text" class="plp-colorpicker" size="8" disabled />
699
+ </td>
700
+ </tr>
701
+ <tr valign="top" class="prli-pro-only">
702
+ <th scope="row">
703
+ <label>
704
+ <?php esc_html_e('Visited Link Color', 'pretty-link'); ?>
705
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-visited-link-color',
706
+ esc_html__('Pretty Bar Visited Link Color', 'pretty-link'),
707
+ sprintf(
708
+ // translators: %1$s: open code tag, %2$s: close code tag
709
+ esc_html__('If not set, this defaults to RGB value %1$s#551a8b%2$s but you can change it to whatever color you like.', 'pretty-link'),
710
+ '<code>',
711
+ '</code>'
712
+ ));
713
+ ?>
714
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-visited-color'); ?>
715
+ </label>
716
+ </th>
717
+ <td>
718
+ <input type="text" class="plp-colorpicker" size="8" disabled />
719
+ </td>
720
+ </tr>
721
+ <tr valign="top" class="prli-pro-only">
722
+ <th scope="row">
723
+ <label>
724
+ <?php esc_html_e('Title Char Limit', 'pretty-link'); ?>
725
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-title-char-limit',
726
+ esc_html__('Pretty Bar Title Char Limit', 'pretty-link'),
727
+ sprintf(
728
+ // translators: %1$s: open code tag, %2$s: close code tag
729
+ esc_html__('If your Website has a long title then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s30%2$s characters or less so the Pretty Bar\'s format looks good across different browsers and screen resolutions.', 'pretty-link'),
730
+ '<code>',
731
+ '</code>'
732
+ ));
733
+ ?>
734
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-title-char-limit'); ?>
735
+ </label>
736
+ </th>
737
+ <td>
738
+ <input type="text" size="4" disabled />
739
+ </td>
740
+ </tr>
741
+ <tr valign="top" class="prli-pro-only">
742
+ <th scope="row">
743
+ <label>
744
+ <?php esc_html_e('Description Char Limit', 'pretty-link'); ?>
745
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-desc-char-limit',
746
+ esc_html__('Pretty Bar Description Char Limit', 'pretty-link'),
747
+ sprintf(
748
+ // translators: %1$s: open code tag, %2$s: close code tag
749
+ esc_html__('If your Website has a long Description (tagline) then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s40%2$s characters or less so the Pretty Bar\'s format looks good across different browsers and screen resolutions.', 'pretty-link'),
750
+ '<code>',
751
+ '</code>'
752
+ ));
753
+ ?>
754
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-description-char-limit'); ?>
755
+ </label>
756
+ </th>
757
+ <td>
758
+ <input type="text" size="4" disabled />
759
+ </td>
760
+ </tr>
761
+ <tr valign="top" class="prli-pro-only">
762
+ <th scope="row">
763
+ <label>
764
+ <?php esc_html_e('Target URL Char Limit', 'pretty-link'); ?>
765
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-target-url-char-limit',
766
+ esc_html__('Pretty Bar Target URL Char Limit', 'pretty-link'),
767
+ sprintf(
768
+ // translators: %1$s: open code tag, %2$s: close code tag
769
+ esc_html__('If you link to a lot of large Target URLs you may want to adjust this value. It is recommended that you keep this value to %1$s40%2$s or below so the Pretty Bar\'s format looks good across different browsers and URL sizes', 'pretty-link'),
770
+ '<code>',
771
+ '</code>'
772
+ ));
773
+ ?>
774
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-target-url-char-limit'); ?>
775
+ </label>
776
+ </th>
777
+ <td>
778
+ <input type="text" size="4" disabled />
779
+ </td>
780
+ </tr>
781
+ <tr valign="top" class="prli-pro-only">
782
+ <th scope="row">
783
+ <label>
784
+ <?php esc_html_e('Show Title', 'pretty-link'); ?>
785
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-show-title',
786
+ esc_html__('Pretty Bar Show Title', 'pretty-link'),
787
+ esc_html__('Make sure this is checked if you want the title of your blog (and link) to show up on the Pretty Bar.', 'pretty-link'));
788
+ ?>
789
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-title'); ?>
790
+ </label>
791
+ </th>
792
+ <td>
793
+ <input type="checkbox" disabled />
794
+ </td>
795
+ </tr>
796
+ <tr valign="top" class="prli-pro-only">
797
+ <th scope="row">
798
+ <label>
799
+ <?php esc_html_e('Show Description', 'pretty-link'); ?>
800
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-show-description',
801
+ esc_html__('Pretty Bar Show Description', 'pretty-link'),
802
+ esc_html__('Make sure this is checked if you want your site description to show up on the Pretty Bar.', 'pretty-link'));
803
+ ?>
804
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-description'); ?>
805
+ </label>
806
+ </th>
807
+ <td>
808
+ <input type="checkbox" disabled />
809
+ </td>
810
+ </tr>
811
+ <tr valign="top" class="prli-pro-only">
812
+ <th scope="row">
813
+ <label>
814
+ <?php esc_html_e('Show Share Links', 'pretty-link'); ?>
815
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-show-share-links',
816
+ esc_html__('Pretty Bar Show Share Links', 'pretty-link'),
817
+ esc_html__('Make sure this is checked if you want "share links" to show up on the Pretty Bar.', 'pretty-link'));
818
+ ?>
819
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-share-links'); ?>
820
+ </label>
821
+ </th>
822
+ <td>
823
+ <input type="checkbox" disabled />
824
+ </td>
825
+ </tr>
826
+ <tr valign="top" class="prli-pro-only">
827
+ <th scope="row">
828
+ <label>
829
+ <?php esc_html_e('Show Target URL', 'pretty-link'); ?>
830
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-show-target-url-links',
831
+ esc_html__('Pretty Bar Show Target URL Links', 'pretty-link'),
832
+ esc_html__('Make sure this is checked if you want a link displaying the Target URL to show up on the Pretty Bar.', 'pretty-link'));
833
+ ?>
834
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-target-url'); ?>
835
+ </label>
836
+ </th>
837
+ <td>
838
+ <input type="checkbox" disabled />
839
+ </td>
840
+ </tr>
841
+ <tr valign="top" class="prli-pro-only">
842
+ <th scope="row">
843
+ <label>
844
+ <?php esc_html_e('Hide Attribution Link', 'pretty-link'); ?>
845
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-hide-attrib-link',
846
+ esc_html__('Hide Attribution Link', 'pretty-link'),
847
+ sprintf(
848
+ // translators: %1$s: br tag, %2$s: open strong tag, %3$s close strong tag, %4$s open em tag, %5$s close em tag, %6$s open link tag, %7$s close link tag
849
+ esc_html__('Check this to hide the pretty link attribution link on the pretty bar.%1$s%1$s%2$sWait, before you do this, you might want to leave this un-checked and set the alternate URL of this link to your %4$sPretty Links Pro%5$s %6$sAffiliate URL%7$s to earn a few bucks while you are at it.%3$s', 'pretty-link'),
850
+ '<br>',
851
+ '<strong>',
852
+ '</strong>',
853
+ '<em>',
854
+ '</em>',
855
+ '<a href="https://prettylinks.com/plp/options/aff-attribution">',
856
+ '</a>'
857
+ ));
858
+ ?>
859
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-hide-attrib-link'); ?>
860
+ </label>
861
+ </th>
862
+ <td>
863
+ <input type="checkbox" class="prli-toggle-checkbox" disabled />
864
+ </td>
865
+ </tr>
866
+ </tbody>
867
+ </table>
868
+
869
+ <div class="prli-sub-box prettybar-attrib-url">
870
+ <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
871
+ <table class="form-table">
872
+ <tbody>
873
+ <tr valign="top" class="prli-pro-only">
874
+ <th scope="row">
875
+ <label>
876
+ <?php esc_html_e('Attribution URL', 'pretty-link'); ?>
877
+ <?php PrliAppHelper::info_tooltip('prli-prettybar-attribution-url',
878
+ esc_html__('Alternate Pretty Bar Attribution URL', 'pretty-link'),
879
+ sprintf(
880
+ // translators: %1$s open em tag, %2$s close em tag, %3$s open link tag, %4$s close link tag
881
+ esc_html__('If set, this will replace the Pretty Bars attribution URL. This is a very good place to put your %1$sPretty Links Pro%2$s %3$sAffiliate Link%4$s.', 'pretty-link'),
882
+ '<em>',
883
+ '</em>',
884
+ '<a href="https://prettylinks.com/plp/options/aff-attribution-2">',
885
+ '</a>'
886
+ ));
887
+ ?>
888
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-attrib-url'); ?>
889
+ </label>
890
+ </th>
891
+ <td>
892
+ <input type="text" class="regular-text" disabled />
893
+ </td>
894
+ </tr>
895
+ </tbody>
896
+ </table>
897
+ </div>
898
+ </div>
899
+
900
+ <div class="prli-page" id="social">
901
+ <div class="prli-page-title"><?php esc_html_e('Social Buttons Options', 'pretty-link'); ?></div>
902
+ <label class="prli-label prli-pro-only">
903
+ <?php esc_html_e('Buttons', 'pretty-link'); ?>
904
+ <?php PrliAppHelper::info_tooltip('prli-social-buttons',
905
+ esc_html__('Social Buttons', 'pretty-link'),
906
+ sprintf(
907
+ // translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
908
+ esc_html__('Select which buttons you want to be visible on the Social Buttons Bar.%1$s%1$s%2$sNote:%3$s In order for the Social Buttons Bar to be visible on Pages and or Posts, you must first enable it in the "Page &amp; Post Options" section above.', 'pretty-link'),
909
+ '<br>',
910
+ '<code>',
911
+ '</code>'
912
+ ));
913
+ ?>
914
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-social-buttons'); ?>
915
+ </label>
916
+ <ul class="prli-social-button-checkboxes">
917
+ <?php foreach(array('facebook', 'twitter', 'gplus', 'pinterest', 'linkedin', 'reddit', 'stumbleupon', 'digg', 'email') as $b) : ?>
918
+ <li class="pl-social-<?php echo esc_attr($b); ?>-button">
919
+ <input type="checkbox" disabled />
920
+ <i class="pl-icon-<?php echo esc_attr($b); ?>"> </i>
921
+ </li>
922
+ <?php endforeach; ?>
923
+ </ul>
924
+ <br/>
925
+ <table class="form-table">
926
+ <tbody>
927
+ <tr valign="top" class="prli-pro-only">
928
+ <th scope="row">
929
+ <label>
930
+ <?php esc_html_e('Buttons Placement', 'pretty-link'); ?>
931
+ <?php PrliAppHelper::info_tooltip('prli-social-buttons-placement',
932
+ esc_html__('Social Buttons Placement', 'pretty-link'),
933
+ sprintf(
934
+ // translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
935
+ esc_html__('This determines where your Social Buttons Placement should appear in relation to content on Pages and/or Posts.%1$s%1$s%2$sNote:%3$s If you want this bar to appear then you must enable it in the "Auto-Create Links" section above.', 'pretty-link'),
936
+ '<br>',
937
+ '<code>',
938
+ '</code>'
939
+ ));
940
+ ?>
941
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-social-buttons-placement'); ?>
942
+ </label>
943
+ </th>
944
+ <td>
945
+ <input type="radio" value="top" disabled /><span class="prli-radio-text"><?php esc_html_e('Top', 'pretty-link'); ?></span><br/><br/>
946
+ <input type="radio" value="bottom" checked disabled /><span class="prli-radio-text"><?php esc_html_e('Bottom', 'pretty-link'); ?></span><br/><br/>
947
+ <input type="radio" value="top-and-bottom" disabled /><span class="prli-radio-text"><?php esc_html_e('Top and Bottom', 'pretty-link'); ?></span><br/><br/>
948
+ <input type="radio" value="none" disabled /><span class="prli-radio-text"><?php esc_html_e('None', 'pretty-link'); ?></span>
949
+ <?php PrliAppHelper::info_tooltip('prli-social-buttons-placement-none',
950
+ esc_html__('Social Buttons Manual Placement', 'pretty-link'),
951
+ sprintf(
952
+ // translators: %1$s: example shortcode, %2$s: example template tag
953
+ esc_html__('If you select none, you can still show your Social Buttons by manually adding the %1$s shortcode to your blog posts or %2$s template tag to your WordPress Theme.', 'pretty-link'),
954
+ '<code>[social_buttons_bar]</code>',
955
+ '<code>&lt;?php the_social_buttons_bar(); ?&gt;</code>'
956
+ ));
957
+ ?>
958
+ </td>
959
+ </tr>
960
+ </tbody>
961
+ </table>
962
+
963
+ </div>
964
+
965
+ <div class="prli-page" id="public-links">
966
+ <div class="prli-page-title"><?php esc_html_e('Public Links Creation Options', 'pretty-link'); ?></div>
967
+ <table class="form-table">
968
+ <tbody>
969
+ <tr valign="top" class="prli-pro-only">
970
+ <th scope="row">
971
+ <label>
972
+ <?php esc_html_e('Enable Public Links', 'pretty-link'); ?>
973
+ <?php PrliAppHelper::info_tooltip('prli-enable-public-link-creation',
974
+ esc_html__('Enable Public Link Creation on this Site', 'pretty-link'),
975
+ sprintf(
976
+ esc_html__('This option will give you the ability to turn your website into a link shortening service for your users. Once selected, you can enable the Pretty Links Pro Sidebar Widget or just display the link creation form with the %s shortcode in any post or page on your website.', 'pretty-link'),
977
+ '<code>[prli_create_form]</code>'
978
+ ));
979
+ ?>
980
+ <?php echo PrliAppHelper::pro_only_feature_indicator('option-enable-public-link-creation'); ?>
981
+ </label>
982
+ </th>
983
+ <td>
984
+ <input class="prli-toggle-checkbox" type="checkbox" disabled />
985
+ </td>
986
+ </tr>
987
+ </tbody>
988
+ </table>
989
+ </div>
990
+
991
+ <?php endif; ?>
992
+
993
  <?php do_action('prli_admin_options_pages'); ?>
994
  </td>
995
  </tr>
996
  </table>
997
 
998
  <p class="submit">
999
+ <input type="submit" name="submit" class="button button-primary" value="<?php esc_attr_e('Update', 'pretty-link') ?>" />
1000
  </p>
1001
 
1002
  </form>
app/views/shared/errors.php CHANGED
@@ -9,7 +9,7 @@
9
  foreach( $errors as $error )
10
  {
11
  ?>
12
- <li><strong><?php _e('ERROR', 'pretty-link'); ?></strong>: <?php echo esc_html($error); ?></li>
13
  <?php
14
  }
15
  ?>
9
  foreach( $errors as $error )
10
  {
11
  ?>
12
+ <li><strong><?php esc_html_e('ERROR', 'pretty-link'); ?></strong>: <?php echo esc_html($error); ?></li>
13
  <?php
14
  }
15
  ?>
app/views/shared/jsredirect.php DELETED
@@ -1,7 +0,0 @@
1
- <?php
2
- if(!defined('ABSPATH'))
3
- die('You are not allowed to call this page directly.');
4
- ?>
5
- <script type="text/javascript">
6
- window.location = '<?php echo esc_url_raw($redirect_url); ?>';
7
- </script>
 
 
 
 
 
 
 
app/views/shared/link-table-nav.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  $curr_size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:10;
4
- $curr_url = esc_html($_REQUEST['page'].$page_params);
5
  $group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
6
  $sort = (isset($_REQUEST['sort']))?sanitize_text_field($_REQUEST['sort']):'';
7
  $sdir = (isset($_REQUEST['sdir']))?sanitize_text_field($_REQUEST['sdir']):'';
@@ -10,39 +10,36 @@ $search = (isset($_REQUEST['search']))?sanitize_text_field($_REQUEST['search
10
  // Only show the pager bar if there is more than 1 page
11
  if($page_count > 1) {
12
  ?>
13
- <div class="tablenav"<?php echo (isset($navstyle)?" style=\"$navstyle\"":''); ?>>
14
- <div class='tablenav-pages'>
15
  <span class="displaying-num">
16
- <?php
17
- _e('Displaying', 'pretty-link');
18
- echo " $page_first_record&#8211;$page_last_record of $record_count";
19
- ?>
20
  </span>
21
 
22
  <?php
23
  // Only show the prev page button if the current page is not the first page
24
  if($current_page > 1) {
25
  ?>
26
- <a class='prev page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo ($current_page-1); ?>&size=<?php echo $curr_size; ?>'>&laquo;</a>
27
  <?php
28
  }
29
 
30
  // First page is always displayed
31
  if($current_page==1) {
32
  ?>
33
- <a class='page-numbers disabled' href="#">1</a>
34
  <?php
35
  }
36
  else {
37
  ?>
38
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=1&size=<?php echo $curr_size; ?>'>1</a>
39
  <?php
40
  }
41
 
42
  // If the current page is more than 2 spaces away from the first page then we put some dots in here
43
  if($current_page >= 5) {
44
  ?>
45
- <span class='page-numbers dots'>...</span>
46
  <?php
47
  }
48
 
@@ -52,12 +49,12 @@ if($page_count > 1) {
52
  for($i = $low_page; $i <= $high_page; $i++) {
53
  if($current_page==$i) {
54
  ?>
55
- <a class='page-numbers disabled' href="#"><?php echo $i; ?></a>
56
  <?php
57
  }
58
  else {
59
  ?>
60
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo $i; ?>&size=<?php echo $curr_size; ?>'><?php echo $i; ?></a>
61
  <?php
62
  }
63
  }
@@ -65,30 +62,30 @@ if($page_count > 1) {
65
  // If the current page is more than 2 away from the last page then show ellipsis
66
  if($current_page < ($page_count - 3)) {
67
  ?>
68
- <span class='page-numbers dots'>...</span>
69
  <?php
70
  }
71
 
72
  // Display the last page icon
73
  if($current_page == $page_count) {
74
  ?>
75
- <a class='page-numbers disabled' href="#"><?php echo $page_count; ?></a>
76
  <?php
77
  }
78
  else {
79
  ?>
80
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo $page_count; ?>&size=<?php echo $curr_size; ?>'><?php echo $page_count; ?></a>
81
  <?php
82
  }
83
 
84
  // Display the next page icon if there is a next page
85
  if($current_page < $page_count) {
86
  ?>
87
- <a class='next page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo ($current_page + 1); ?>&size=<?php echo $curr_size; ?>'>&raquo;</a>
88
  <?php
89
  }
90
  ?>
91
- <select class="prli-page-size" data-url="<?php echo admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size="); ?>">
92
  <option value="10" selected="selected">10</option>
93
  <option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
94
  <option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
@@ -104,9 +101,11 @@ if($page_count > 1) {
104
  else {
105
  ?>
106
  <div class="tablenav"<?php echo (isset($navstyle)?" style=\"$navstyle\"":''); ?>>
107
- <div class='tablenav-pages'>
108
- <span class="displaying-num"><?php _e('Displaying', 'pretty-link'); ?> <?php echo "$page_first_record&#8211;$page_last_record of $record_count"; ?></span>
109
- <select class="prli-page-size" data-url="<?php echo admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size="); ?>">
 
 
110
  <option value="10" selected="selected">10</option>
111
  <option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
112
  <option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
 
3
  $curr_size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:10;
4
+ $curr_url = sanitize_text_field($_REQUEST['page']) . $page_params;
5
  $group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
6
  $sort = (isset($_REQUEST['sort']))?sanitize_text_field($_REQUEST['sort']):'';
7
  $sdir = (isset($_REQUEST['sdir']))?sanitize_text_field($_REQUEST['sdir']):'';
10
  // Only show the pager bar if there is more than 1 page
11
  if($page_count > 1) {
12
  ?>
13
+ <div class="tablenav"<?php echo (isset($navstyle)?' style="'.esc_attr($navstyle).'"':''); ?>>
14
+ <div class="tablenav-pages">
15
  <span class="displaying-num">
16
+ <?php echo esc_html(sprintf(__('Displaying %1$s&#8211;%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
 
 
 
17
  </span>
18
 
19
  <?php
20
  // Only show the prev page button if the current page is not the first page
21
  if($current_page > 1) {
22
  ?>
23
+ <a class="prev page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page-1) . '&size=' . $curr_size); ?>">&laquo;</a>
24
  <?php
25
  }
26
 
27
  // First page is always displayed
28
  if($current_page==1) {
29
  ?>
30
+ <a class="page-numbers disabled" href="#">1</a>
31
  <?php
32
  }
33
  else {
34
  ?>
35
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=1&size=' . $curr_size); ?>">1</a>
36
  <?php
37
  }
38
 
39
  // If the current page is more than 2 spaces away from the first page then we put some dots in here
40
  if($current_page >= 5) {
41
  ?>
42
+ <span class="page-numbers dots">...</span>
43
  <?php
44
  }
45
 
49
  for($i = $low_page; $i <= $high_page; $i++) {
50
  if($current_page==$i) {
51
  ?>
52
+ <a class="page-numbers disabled" href="#"><?php echo esc_html($i); ?></a>
53
  <?php
54
  }
55
  else {
56
  ?>
57
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $i . '&size=' . $curr_size); ?>"><?php echo esc_html($i); ?></a>
58
  <?php
59
  }
60
  }
62
  // If the current page is more than 2 away from the last page then show ellipsis
63
  if($current_page < ($page_count - 3)) {
64
  ?>
65
+ <span class="page-numbers dots">...</span>
66
  <?php
67
  }
68
 
69
  // Display the last page icon
70
  if($current_page == $page_count) {
71
  ?>
72
+ <a class="page-numbers disabled" href="#"><?php echo esc_html($page_count); ?></a>
73
  <?php
74
  }
75
  else {
76
  ?>
77
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $page_count . '&size=' . $curr_size); ?>"><?php echo esc_html($page_count); ?></a>
78
  <?php
79
  }
80
 
81
  // Display the next page icon if there is a next page
82
  if($current_page < $page_count) {
83
  ?>
84
+ <a class="next page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page + 1) . '&size=' . $curr_size); ?>">&raquo;</a>
85
  <?php
86
  }
87
  ?>
88
+ <select class="prli-page-size" data-url="<?php echo esc_url(admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size=")); ?>">
89
  <option value="10" selected="selected">10</option>
90
  <option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
91
  <option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
101
  else {
102
  ?>
103
  <div class="tablenav"<?php echo (isset($navstyle)?" style=\"$navstyle\"":''); ?>>
104
+ <div class="tablenav-pages">
105
+ <span class="displaying-num">
106
+ <?php echo esc_html(sprintf(__('Displaying %1$s&#8211;%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
107
+ </span>
108
+ <select class="prli-page-size" data-url="<?php echo esc_url(admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size=")); ?>">
109
  <option value="10" selected="selected">10</option>
110
  <option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
111
  <option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
app/views/shared/nav.php CHANGED
@@ -3,20 +3,20 @@
3
  global $plp_update;
4
 
5
  if($plp_update->is_installed()) {
6
- $support_link = "&nbsp;|&nbsp;<a href=\"https://prettylinks.com/pl/nav/um\" target=\"_blank\">" . __('Pro Manual', 'pretty-link') . '</a>';
7
  }
8
  else {
9
- $support_link = "&nbsp;|&nbsp;<a href=\"https://prettylinks.com/pl/nav/upgrade\" target=\"_blank\">" . __('Upgrade to Pro', 'pretty-link') . '</a>';
10
  }
11
 
12
  ?>
13
  <p class="prli-shared-header">
14
- <span><?php _e('Connect:', 'pretty-link'); ?></span>
15
  <a href="http://twitter.com/blairwilli"><img src="<?php echo PRLI_IMAGES_URL; ?>/twitter_32.png" class="prli-icon" /></a>
16
  <a href="http://www.facebook.com/pages/Pretty-Link/283252860401"><img src="<?php echo PRLI_IMAGES_URL; ?>/facebook_32.png" class="prli-icon" /></a>
17
  <br/>
18
- <?php _e('Get Help:', 'pretty-link'); ?>
19
- <a href="http://blairwilliams.com/xba" target="_blank"><?php _e('Tutorials', 'pretty-link'); ?></a>
20
  <?php echo $support_link; ?>
21
  </p>
22
 
3
  global $plp_update;
4
 
5
  if($plp_update->is_installed()) {
6
+ $support_link = "&nbsp;|&nbsp;<a href=\"https://prettylinks.com/pl/nav/um\" target=\"_blank\">" . esc_html__('Pro Manual', 'pretty-link') . '</a>';
7
  }
8
  else {
9
+ $support_link = "&nbsp;|&nbsp;<a href=\"https://prettylinks.com/pl/nav/upgrade\" target=\"_blank\">" . esc_html__('Upgrade to Pro', 'pretty-link') . '</a>';
10
  }
11
 
12
  ?>
13
  <p class="prli-shared-header">
14
+ <span><?php esc_html_e('Connect:', 'pretty-link'); ?></span>
15
  <a href="http://twitter.com/blairwilli"><img src="<?php echo PRLI_IMAGES_URL; ?>/twitter_32.png" class="prli-icon" /></a>
16
  <a href="http://www.facebook.com/pages/Pretty-Link/283252860401"><img src="<?php echo PRLI_IMAGES_URL; ?>/facebook_32.png" class="prli-icon" /></a>
17
  <br/>
18
+ <?php esc_html_e('Get Help:', 'pretty-link'); ?>
19
+ <a href="http://blairwilliams.com/xba" target="_blank"><?php esc_html_e('Tutorials', 'pretty-link'); ?></a>
20
  <?php echo $support_link; ?>
21
  </p>
22
 
app/views/shared/public_link.php CHANGED
@@ -1,58 +1,49 @@
1
  <?php if(!defined('ABSPATH')) die('You are not allowed to call this page directly.');
2
 
3
- // Escape all variables used on this page
4
- $pretty_link_id = esc_html( $pretty_link_id );
5
- $target_url_raw = esc_url_raw( $target_url, array('http','https') );
6
- $target_url = esc_url( $target_url, array('http','https') );
7
- $pretty_link_raw = esc_url_raw( $pretty_link, array('http','https') );
8
- $pretty_link = esc_url( $pretty_link, array('http','https') );
9
- $prli_blogurl_raw = esc_url_raw( $prli_blogurl, array('http','https') );
10
- $prli_blogurl = esc_url( $prli_blogurl, array('http','https') );
11
- $target_url_title = esc_html( $target_url_title );
12
-
13
  $target_url_display = substr($target_url,0,50) . ((strlen($target_url)>50)?"...":'');
14
 
15
- global $plp_update;
 
 
 
 
 
16
 
 
 
 
17
  ?>
18
  <!DOCTYPE html>
19
  <html>
20
  <head>
21
  <meta charset="UTF-8">
22
 
23
- <title><?php _e('Here is your Pretty Link', 'pretty-link'); ?></title>
24
 
25
- <link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/tooltipster.bundle.min.css'; ?>" type="text/css" media="all" />
26
- <link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/tooltipster-sideTip-borderless.min.css'; ?>" type="text/css" media="all" />
27
- <link rel="stylesheet" href="<?php echo PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css'; ?>" type="text/css" media="all" />
28
- <link rel="stylesheet" href="<?php echo PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css'; ?>" type="text/css" media="all" />
29
- <link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/social_buttons.css'; ?>" type="text/css" media="all" />
30
- <link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/public_link.css'; ?>" type="text/css" media="all" />
31
-
32
- <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
33
- <script type="text/javascript" src="<?php echo PRLI_JS_URL . '/clipboard.min.js'; ?>"></script>
34
- <script type="text/javascript" src="<?php echo PRLI_JS_URL . '/tooltipster.bundle.min.js'; ?>"></script>
35
- <script type="text/javascript" src="<?php echo PRLI_JS_URL . '/admin_link_list.js'; ?>"></script>
36
  </head>
37
  <body>
38
  <div class="prli-public-logo"><img src="<?php echo PRLI_IMAGES_URL; ?>/pl-logo-horiz-RGB.svg" /></div>
39
 
40
  <div class="prli-public-wrap">
41
- <div class="prli-public-label"><em><?php _e('Here\'s your pretty link for', 'pretty-link'); ?></em></div>
42
- <div class="prli-public-name"><?php echo $target_url_title; ?></div>
43
- <div class="prli-public-target">(<span title="<?php echo $target_url; ?>"><?php echo $target_url_display; ?></span>)</div>
44
 
45
  <div class="prli-public-pretty-link">
46
- <span class="prli-public-pretty-link-display"><a href="<?php echo $pretty_link_raw; ?>"><?php echo $pretty_link; ?></a></span>
47
- <span class="prli-clipboardjs prli-public-pretty-link-copy"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo $pretty_link_raw; ?>"></i></span>
48
  </div>
49
  </div>
50
 
51
  <?php if( $plp_update->is_installed() ): ?>
52
- <div class="prli-public-social"><?php _e('send this link to:', 'pretty-link'); ?></div>
53
  <?php echo PlpSocialButtonsHelper::get_social_buttons_bar($pretty_link_id); ?>
54
  <?php endif; ?>
55
 
56
- <div class="prli-public-back"><a href="<?php echo $target_url_raw; ?>">&laquo; <?php _e('back', 'pretty-link'); ?></a></div>
 
 
57
  </body>
58
  </html>
1
  <?php if(!defined('ABSPATH')) die('You are not allowed to call this page directly.');
2
 
3
+ global $plp_update;
 
 
 
 
 
 
 
 
 
4
  $target_url_display = substr($target_url,0,50) . ((strlen($target_url)>50)?"...":'');
5
 
6
+ wp_register_style('tooltipster', PRLI_CSS_URL . '/tooltipster.bundle.min.css', array(), '4.2.6');
7
+ wp_register_style('tooltipster-sidetip', PRLI_CSS_URL . '/tooltipster-sideTip-borderless.min.css', array('tooltipster'), '4.2.6');
8
+ wp_register_style('prli-animation', PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css', array(), PRLI_VERSION);
9
+ wp_register_style('prli-icons', PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css', array(), PRLI_VERSION);
10
+ wp_register_style('prli-social-buttons', PRLI_CSS_URL . '/social_buttons.css', array(), PRLI_VERSION);
11
+ wp_register_style('prli-public-link', PRLI_CSS_URL . '/public_link.css', array('tooltipster', 'tooltipster-sidetip', 'prli-animation', 'prli-icons', 'prli-social-buttons'), PRLI_VERSION);
12
 
13
+ wp_register_script('clipboard-js', PRLI_JS_URL . '/clipboard.min.js', array(), '2.0.0');
14
+ wp_register_script('tooltipster', PRLI_JS_URL . '/tooltipster.bundle.min.js', array('jquery'), '4.2.6');
15
+ wp_register_script('prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery', 'clipboard-js', 'tooltipster'), PRLI_VERSION);
16
  ?>
17
  <!DOCTYPE html>
18
  <html>
19
  <head>
20
  <meta charset="UTF-8">
21
 
22
+ <title><?php esc_html_e('Here is your Pretty Link', 'pretty-link'); ?></title>
23
 
24
+ <?php wp_print_styles('prli-public-link'); ?>
 
 
 
 
 
 
 
 
 
 
25
  </head>
26
  <body>
27
  <div class="prli-public-logo"><img src="<?php echo PRLI_IMAGES_URL; ?>/pl-logo-horiz-RGB.svg" /></div>
28
 
29
  <div class="prli-public-wrap">
30
+ <div class="prli-public-label"><em><?php esc_html_e('Here\'s your pretty link for', 'pretty-link'); ?></em></div>
31
+ <div class="prli-public-name"><?php echo esc_html($target_url_title); ?></div>
32
+ <div class="prli-public-target">(<span title="<?php echo esc_url($target_url); ?>"><?php echo esc_html($target_url_display); ?></span>)</div>
33
 
34
  <div class="prli-public-pretty-link">
35
+ <span class="prli-public-pretty-link-display"><a href="<?php echo esc_url($pretty_link); ?>"><?php echo esc_url($pretty_link); ?></a></span>
36
+ <span class="prli-clipboardjs prli-public-pretty-link-copy"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo esc_url($pretty_link); ?>"></i></span>
37
  </div>
38
  </div>
39
 
40
  <?php if( $plp_update->is_installed() ): ?>
41
+ <div class="prli-public-social"><?php esc_html_e('send this link to:', 'pretty-link'); ?></div>
42
  <?php echo PlpSocialButtonsHelper::get_social_buttons_bar($pretty_link_id); ?>
43
  <?php endif; ?>
44
 
45
+ <div class="prli-public-back"><a href="<?php echo esc_url($target_url); ?>">&laquo; <?php esc_html_e('back', 'pretty-link'); ?></a></div>
46
+
47
+ <?php wp_print_scripts('prli-admin-link-list'); ?>
48
  </body>
49
  </html>
app/views/shared/table-nav.php CHANGED
@@ -1,22 +1,25 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <?php
3
 
4
- $curr_size = isset($_REQUEST['size']) ? $_REQUEST['size'] : 10;
5
- $curr_url = esc_html($_REQUEST['page'].$page_params);
6
 
7
  // Only show the pager bar if there is more than 1 page
8
  if($page_count > 1)
9
  {
10
  ?>
11
- <div class="tablenav"<?php echo (isset($navstyle)?" style=\"" . esc_html($navstyle) . "\"":''); ?>>
12
- <div class='tablenav-pages'><span class="displaying-num"><?php _e('Displaying', 'pretty-link'); ?> <?php echo esc_html("$page_first_record&#8211;$page_last_record of $record_count"); ?></span>
 
 
 
13
 
14
  <?php
15
  // Only show the prev page button if the current page is not the first page
16
  if($current_page > 1)
17
  {
18
  ?>
19
- <a class='prev page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php print($current_page-1); ?>'>&laquo;</a>
20
  <?php
21
  }
22
 
@@ -24,13 +27,13 @@
24
  if($current_page==1)
25
  {
26
  ?>
27
- <a class='page-numbers disabled' href="#">1</a>
28
  <?php
29
  }
30
  else
31
  {
32
  ?>
33
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=1'>1</a>
34
  <?php
35
  }
36
 
@@ -38,7 +41,7 @@
38
  if($current_page >= 5)
39
  {
40
  ?>
41
- <span class='page-numbers dots'>...</span>
42
  <?php
43
  }
44
 
@@ -50,13 +53,13 @@
50
  if($current_page==$i)
51
  {
52
  ?>
53
- <a class='page-numbers disabled' href="#"><?php echo esc_html($i); ?></a>
54
  <?php
55
  }
56
  else
57
  {
58
  ?>
59
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo esc_html($i); ?>'><?php echo esc_html($i); ?></a>
60
  <?php
61
  }
62
  }
@@ -65,7 +68,7 @@
65
  if($current_page < ($page_count - 3))
66
  {
67
  ?>
68
- <span class='page-numbers dots'>...</span>
69
  <?php
70
  }
71
 
@@ -73,13 +76,13 @@
73
  if($current_page == $page_count)
74
  {
75
  ?>
76
- <a class='page-numbers disabled' href="#"><?php echo esc_html($page_count); ?></a>
77
  <?php
78
  }
79
  else
80
  {
81
  ?>
82
- <a class='page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php echo esc_html($page_count); ?>'><?php echo esc_html($page_count); ?></a>
83
  <?php
84
  }
85
 
@@ -87,7 +90,7 @@
87
  if($current_page < $page_count)
88
  {
89
  ?>
90
- <a class='next page-numbers' href='?page=<?php echo $curr_url; ?>&paged=<?php print($current_page + 1); ?>'>&raquo;</a>
91
  <?php
92
  }
93
  ?>
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <?php
3
 
4
+ $curr_size = isset($_REQUEST['size']) ? (int) $_REQUEST['size'] : 10;
5
+ $curr_url = sanitize_text_field($_REQUEST['page']) . $page_params;
6
 
7
  // Only show the pager bar if there is more than 1 page
8
  if($page_count > 1)
9
  {
10
  ?>
11
+ <div class="tablenav"<?php echo (isset($navstyle)?' style="' . esc_html($navstyle) . '"':''); ?>>
12
+ <div class="tablenav-pages">
13
+ <span class="displaying-num">
14
+ <?php echo esc_html(sprintf(__('Displaying %1$s&#8211;%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
15
+ </span>
16
 
17
  <?php
18
  // Only show the prev page button if the current page is not the first page
19
  if($current_page > 1)
20
  {
21
  ?>
22
+ <a class="prev page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page-1)); ?>">&laquo;</a>
23
  <?php
24
  }
25
 
27
  if($current_page==1)
28
  {
29
  ?>
30
+ <a class="page-numbers disabled" href="#">1</a>
31
  <?php
32
  }
33
  else
34
  {
35
  ?>
36
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=1'); ?>">1</a>
37
  <?php
38
  }
39
 
41
  if($current_page >= 5)
42
  {
43
  ?>
44
+ <span class="page-numbers dots">...</span>
45
  <?php
46
  }
47
 
53
  if($current_page==$i)
54
  {
55
  ?>
56
+ <a class="page-numbers disabled" href="#"><?php echo esc_html($i); ?></a>
57
  <?php
58
  }
59
  else
60
  {
61
  ?>
62
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $i); ?>"><?php echo esc_html($i); ?></a>
63
  <?php
64
  }
65
  }
68
  if($current_page < ($page_count - 3))
69
  {
70
  ?>
71
+ <span class="page-numbers dots">...</span>
72
  <?php
73
  }
74
 
76
  if($current_page == $page_count)
77
  {
78
  ?>
79
+ <a class="page-numbers disabled" href="#"><?php echo esc_html($page_count); ?></a>
80
  <?php
81
  }
82
  else
83
  {
84
  ?>
85
+ <a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $page_count); ?>"><?php echo esc_html($page_count); ?></a>
86
  <?php
87
  }
88
 
90
  if($current_page < $page_count)
91
  {
92
  ?>
93
+ <a class="next page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page + 1)); ?>">&raquo;</a>
94
  <?php
95
  }
96
  ?>
app/views/shared/tinymce_form_popup.php CHANGED
@@ -1,126 +1,97 @@
1
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
  <html xmlns="http://www.w3.org/1999/xhtml">
3
  <head>
4
- <title><?php _e('Insert Pretty Link', 'pretty-link'); ?></title>
5
- <style type="text/css">
6
- .ui-autocomplete-loading {
7
- background: white url("<?php echo admin_url('images/wpspin_light.gif'); ?>") right center no-repeat;
8
- }
9
- .ui-autocomplete {
10
- max-height: 200px;
11
- overflow-y: auto;
12
- overflow-x: hidden;
13
- width: 510px !important;
14
- }
15
- </style>
16
- <link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/tinymce_form_popup.css'; ?>" type="text/css" media="all" />
17
- <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" type="text/css" media="all" />
18
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/jquery.js'); ?>"></script>
19
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/core.min.js'); ?>"></script>
20
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/widget.min.js'); ?>"></script>
21
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/position.min.js'); ?>"></script>
22
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/menu.min.js'); ?>"></script>
23
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/autocomplete.min.js'); ?>"></script>
24
- <script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/accordion.min.js'); ?>"></script>
25
- <script type="text/javascript">
26
- //Setting up some JS variables for the tinymce_form_popup.js file
27
- //Doing this here becuase I have access to PHP
28
- var prli_selected_text = ''; //Updated on PrliPopUpHandler.init
29
- var home_url = '<?php echo $home_url; ?>';
30
- var default_redirect = '<?php echo $default_redirect; ?>';
31
- var default_nofollow = '<?php echo $default_nofollow; ?>';
32
- var default_tracking = '<?php echo $default_tracking; ?>';
33
- var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
34
- </script>
35
- <script language="javascript" type="text/javascript" src="<?php echo PRLI_JS_URL . '/tinymce_form_popup.js'; ?>"></script>
36
  </head>
37
  <body>
38
  <div id="errors"></div>
39
  <div id="prli_accordion">
40
- <h3><?php _e('Create New Pretty Link', 'pretty-link'); ?></h3>
41
  <div class="prlitinymce-options">
42
  <div class="prlitinymce-options-row">
43
- <label><?php _e('Target URL', 'pretty-link'); ?>:</label>
44
  <input type="text" name="prli_insert_link_target" id="prli_insert_link_target" value="" />
45
  </div>
46
  <div class="prlitinymce-options-row">
47
- <label><?php _e('Slug', 'pretty-link'); ?>:</label>
48
- <input type="text" name="prli_insert_link_slug" id="prli_insert_link_slug" value="<?php echo $random_slug; ?>" />
49
- <span id="prlitinymce-thinking" class="prlitinymce-hidden"><img src="<?php echo admin_url('images/wpspin_light.gif'); ?>" /></span>
50
- <span id="prlitinymce-good-slug" class="prlitinymce-hidden"><small><?php _e('valid', 'pretty-link'); ?></small></span>
51
- <span id="prlitinymce-bad-slug" class="prlitinymce-hidden"><small><?php _e('invalid', 'pretty-link'); ?></small></span>
52
  <input type="hidden" name="prli_is_valid_slug" id="prli_is_valid_slug" value="good" />
53
  </div>
54
  <div class="prlitinymce-options-row">
55
- <label><?php _e('Link Text', 'pretty-link'); ?>:</label>
56
  <input type="text" name="prli_insert_link_link_text" id="prli_insert_link_link_text" value="" />
57
  </div>
58
  <div class="prlitinymce-options-row">
59
- <label><?php _e('Redirect Type', 'pretty-link'); ?>:</label>
60
  <select name="prli_insert_link_redirect" id="prli_insert_link_redirect">
61
- <option value="default"><?php _e('Default', 'pretty-link'); ?></option>
62
- <option value="307"><?php _e('307 (Temporary)', 'pretty-link'); ?></option>
63
- <option value="302"><?php _e('302 (Temporary)', 'pretty-link'); ?></option>
64
- <option value="301"><?php _e('301 (Permanent)', 'pretty-link'); ?></option>
65
  <?php global $plp_update; ?>
66
  <?php if($plp_update->is_installed()): ?>
67
- <option value="prettybar"><?php _e('Pretty Bar', 'pretty-link'); ?></option>
68
- <option value="cloak"><?php _e('Cloaked', 'pretty-link'); ?></option>
69
- <option value="pixel"><?php _e('Pixel', 'pretty-link'); ?></option>
70
- <option value="metarefresh"><?php _e('Meta Refresh', 'pretty-link'); ?></option>
71
- <option value="javascript"><?php _e('Javascript', 'pretty-link'); ?></option>
72
  <?php endif; ?>
73
  </select>
74
  </div>
75
  <div class="prlitinymce-options-row">
76
- <label><?php _e('Nofollow', 'pretty-link'); ?>:</label>
77
  <select name="prli_insert_link_nofollow" id="prli_insert_link_nofollow">
78
- <option value="default"><?php _e('Default', 'pretty-link'); ?></option>
79
- <option value="enabled"><?php _e('Enabled', 'pretty-link'); ?></option>
80
- <option value="disabled"><?php _e('Disabled', 'pretty-link'); ?></option>
81
  </select>
82
  </div>
83
  <div class="prlitinymce-options-row">
84
- <label><?php _e('Tracking', 'pretty-link'); ?>:</label>
85
  <select name="prli_insert_link_tracking" id="prli_insert_link_tracking">
86
- <option value="default"><?php _e('Default', 'pretty-link'); ?></option>
87
- <option value="enabled"><?php _e('Enabled', 'pretty-link'); ?></option>
88
- <option value="disabled"><?php _e('Disabled', 'pretty-link'); ?></option>
89
  </select>
90
  </div>
91
  <div class="prlitinymce-options-row">
92
  <label>&nbsp;</label>
93
- <input type="checkbox" name="prli_insert_link_new_tab" id="prli_insert_link_new_tab" /> <?php _e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
94
  </div>
95
  <div class="prlitinymce-options-row" id="prlitinymce-insert">
96
- <a href="javascript:PrliPopUpHandler.insert_new()" class="prli_button"><?php _e('Insert New Pretty Link', 'pretty-link'); ?></a>
97
- <span id="insert_loading" class="prlitinymce-hidden"><img src="<?php echo includes_url('/js/thickbox/loadingAnimation.gif'); ?>" width="150" /></span>
98
  </div>
99
  </div>
100
- <h3><?php _e("Use Existing Pretty Link", 'pretty-link'); ?></h3>
101
  <div id="prlitinymce-search-area" class="prlitinymce-options">
102
- <input type="text" name="prli_search_box" id="prli_search_box" value="" placeholder="<?php _e('Search by Slug, Title, or Target URL...', 'pretty-link'); ?>" />
103
  <div class="prlitinymce-options-row">
104
- <label class="lefty"><?php _e('Target URL', 'pretty-link'); ?>:</label>
105
- <small id="existing_link_target" class="righty"><?php _e('None', 'pretty-link'); ?></small>
106
  </div>
107
  <div class="prlitinymce-options-row">
108
- <label class="lefty"><?php _e('Pretty Link', 'pretty-link'); ?>:</label>
109
- <small id="existing_link_slug" class="righty"><?php _e('None', 'pretty-link'); ?></small>
110
  </div>
111
  <div class="prlitinymce-options-row">
112
- <label><?php _e('Link Text', 'pretty-link'); ?>:</label>
113
  <input type="text" name="existing_link_link_text" id="existing_link_link_text" value="" />
114
  </div>
115
  <div class="prlitinymce-options-row">
116
  <label>&nbsp;</label>
117
- <input type="checkbox" name="existing_link_new_tab" id="existing_link_new_tab" /> <?php _e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
118
  </div>
119
  <div class="prlitinymce-options-row" id="existing_link_insert">
120
  <input type="hidden" name="existing_link_nofollow" id="existing_link_nofollow" value="0" />
121
- <a href="javascript:PrliPopUpHandler.insert_existing()" class="prli_button"><?php _e('Insert Existing Pretty Link', 'pretty-link'); ?></a>
122
  </div>
123
  </div>
124
  </div>
 
125
  </body>
126
  </html>
1
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
  <html xmlns="http://www.w3.org/1999/xhtml">
3
  <head>
4
+ <title><?php esc_html_e('Insert Pretty Link', 'pretty-link'); ?></title>
5
+ <?php wp_print_styles('prli-tinymce-popup-form'); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  </head>
7
  <body>
8
  <div id="errors"></div>
9
  <div id="prli_accordion">
10
+ <h3><?php esc_html_e('Create New Pretty Link', 'pretty-link'); ?></h3>
11
  <div class="prlitinymce-options">
12
  <div class="prlitinymce-options-row">
13
+ <label><?php esc_html_e('Target URL', 'pretty-link'); ?>:</label>
14
  <input type="text" name="prli_insert_link_target" id="prli_insert_link_target" value="" />
15
  </div>
16
  <div class="prlitinymce-options-row">
17
+ <label><?php esc_html_e('Slug', 'pretty-link'); ?>:</label>
18
+ <input type="text" name="prli_insert_link_slug" id="prli_insert_link_slug" value="<?php echo esc_attr($random_slug); ?>" />
19
+ <span id="prlitinymce-thinking" class="prlitinymce-hidden"><img src="<?php echo esc_url(admin_url('images/wpspin_light.gif')); ?>" /></span>
20
+ <span id="prlitinymce-good-slug" class="prlitinymce-hidden"><small><?php esc_html_e('valid', 'pretty-link'); ?></small></span>
21
+ <span id="prlitinymce-bad-slug" class="prlitinymce-hidden"><small><?php esc_html_e('invalid', 'pretty-link'); ?></small></span>
22
  <input type="hidden" name="prli_is_valid_slug" id="prli_is_valid_slug" value="good" />
23
  </div>
24
  <div class="prlitinymce-options-row">
25
+ <label><?php esc_html_e('Link Text', 'pretty-link'); ?>:</label>
26
  <input type="text" name="prli_insert_link_link_text" id="prli_insert_link_link_text" value="" />
27
  </div>
28
  <div class="prlitinymce-options-row">
29
+ <label><?php esc_html_e('Redirect Type', 'pretty-link'); ?>:</label>
30
  <select name="prli_insert_link_redirect" id="prli_insert_link_redirect">
31
+ <option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
32
+ <option value="307"><?php esc_html_e('307 (Temporary)', 'pretty-link'); ?></option>
33
+ <option value="302"><?php esc_html_e('302 (Temporary)', 'pretty-link'); ?></option>
34
+ <option value="301"><?php esc_html_e('301 (Permanent)', 'pretty-link'); ?></option>
35
  <?php global $plp_update; ?>
36
  <?php if($plp_update->is_installed()): ?>
37
+ <option value="prettybar"><?php esc_html_e('Pretty Bar', 'pretty-link'); ?></option>
38
+ <option value="cloak"><?php esc_html_e('Cloaked', 'pretty-link'); ?></option>
39
+ <option value="pixel"><?php esc_html_e('Pixel', 'pretty-link'); ?></option>
40
+ <option value="metarefresh"><?php esc_html_e('Meta Refresh', 'pretty-link'); ?></option>
41
+ <option value="javascript"><?php esc_html_e('Javascript', 'pretty-link'); ?></option>
42
  <?php endif; ?>
43
  </select>
44
  </div>
45
  <div class="prlitinymce-options-row">
46
+ <label><?php esc_html_e('Nofollow', 'pretty-link'); ?>:</label>
47
  <select name="prli_insert_link_nofollow" id="prli_insert_link_nofollow">
48
+ <option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
49
+ <option value="enabled"><?php esc_html_e('Enabled', 'pretty-link'); ?></option>
50
+ <option value="disabled"><?php esc_html_e('Disabled', 'pretty-link'); ?></option>
51
  </select>
52
  </div>
53
  <div class="prlitinymce-options-row">
54
+ <label><?php esc_html_e('Tracking', 'pretty-link'); ?>:</label>
55
  <select name="prli_insert_link_tracking" id="prli_insert_link_tracking">
56
+ <option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
57
+ <option value="enabled"><?php esc_html_e('Enabled', 'pretty-link'); ?></option>
58
+ <option value="disabled"><?php esc_html_e('Disabled', 'pretty-link'); ?></option>
59
  </select>
60
  </div>
61
  <div class="prlitinymce-options-row">
62
  <label>&nbsp;</label>
63
+ <input type="checkbox" name="prli_insert_link_new_tab" id="prli_insert_link_new_tab" /> <?php esc_html_e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
64
  </div>
65
  <div class="prlitinymce-options-row" id="prlitinymce-insert">
66
+ <a href="javascript:PrliPopUpHandler.insert_new()" class="prli_button"><?php esc_html_e('Insert New Pretty Link', 'pretty-link'); ?></a>
67
+ <span id="insert_loading" class="prlitinymce-hidden"><img src="<?php echo esc_url(includes_url('/js/thickbox/loadingAnimation.gif')); ?>" width="150" /></span>
68
  </div>
69
  </div>
70
+ <h3><?php esc_html_e("Use Existing Pretty Link", 'pretty-link'); ?></h3>
71
  <div id="prlitinymce-search-area" class="prlitinymce-options">
72
+ <input type="text" name="prli_search_box" id="prli_search_box" value="" placeholder="<?php esc_attr_e('Search by Slug, Title, or Target URL...', 'pretty-link'); ?>" />
73
  <div class="prlitinymce-options-row">
74
+ <label class="lefty"><?php esc_html_e('Target URL', 'pretty-link'); ?>:</label>
75
+ <small id="existing_link_target" class="righty"><?php esc_html_e('None', 'pretty-link'); ?></small>
76
  </div>
77
  <div class="prlitinymce-options-row">
78
+ <label class="lefty"><?php esc_html_e('Pretty Link', 'pretty-link'); ?>:</label>
79
+ <small id="existing_link_slug" class="righty"><?php esc_html_e('None', 'pretty-link'); ?></small>
80
  </div>
81
  <div class="prlitinymce-options-row">
82
+ <label><?php esc_html_e('Link Text', 'pretty-link'); ?>:</label>
83
  <input type="text" name="existing_link_link_text" id="existing_link_link_text" value="" />
84
  </div>
85
  <div class="prlitinymce-options-row">
86
  <label>&nbsp;</label>
87
+ <input type="checkbox" name="existing_link_new_tab" id="existing_link_new_tab" /> <?php esc_html_e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
88
  </div>
89
  <div class="prlitinymce-options-row" id="existing_link_insert">
90
  <input type="hidden" name="existing_link_nofollow" id="existing_link_nofollow" value="0" />
91
+ <a href="javascript:PrliPopUpHandler.insert_existing()" class="prli_button"><?php esc_html_e('Insert Existing Pretty Link', 'pretty-link'); ?></a>
92
  </div>
93
  </div>
94
  </div>
95
+ <?php wp_print_scripts('prli-tinymce-popup-form'); ?>
96
  </body>
97
  </html>
app/views/shared/title_text.php CHANGED
@@ -1,3 +1,2 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
- <div class="prli_admin_branding"></div>
3
- <h1 class="wp-heading-inline" style="margin-bottom:15px;"><?php echo esc_html($page_title); ?></h1>
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
+ <h1 class="wp-heading-inline" style="margin-bottom:15px;"><?php echo esc_html($page_title); ?></h1>
 
app/views/tools/form.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <div class="wrap">
3
- <?php echo PrliAppHelper::page_title(__('Tools', 'pretty-link')); ?>
4
 
5
  <?php if($update_message): ?>
6
  <div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
@@ -15,57 +15,79 @@
15
  <tr>
16
  <td class="prli-settings-table-nav">
17
  <ul class="prli-sidebar-nav">
18
- <li><a data-id="bookmarklet"><?php _e('Bookmarklet', 'pretty-link'); ?></a></li>
19
- <li><a data-id="trim"><?php _e('Trim Clicks', 'pretty-link'); ?></a></li>
20
  <?php do_action('prli_admin_tools_nav'); ?>
21
  </ul>
22
  </td>
23
  <td class="prli-settings-table-pages">
24
  <div class="prli-page" id="bookmarklet">
25
- <div class="prli-page-title"><?php _e('Bookmarklet', 'pretty-link'); ?></div>
26
- <strong><a class="button button-primary" href="<?php echo PrliLink::bookmarklet_link(); ?>" style="vertical-align:middle;"><?php _e('Get Pretty Link', 'pretty-link'); ?></a></strong>&nbsp;&nbsp;
27
  <?php PrliAppHelper::info_tooltip( 'prli-bookmarklet-instructions',
28
- __('Install Pretty Link Bookmarklet', 'pretty-link'),
29
- __('Just drag this "Get PrettyLink" link to your toolbar to install the bookmarklet. As you browse the web, you can just click this bookmarklet to create a pretty link from the current url you\'re looking at. <a href="http://blairwilliams.com/pretty-link-bookmarklet/">(more help)</a>', 'pretty-link') );
 
 
 
 
 
30
  ?>
31
- <br/><br/><a href="javascript:toggle_iphone_instructions()"><strong><?php _e('Show iPhone Bookmarklet Instructions', 'pretty-link'); ?></strong></a>
32
  <br/><br/>
33
  <div class="prli-sub-box iphone_instructions" style="display: none">
34
  <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
35
- <?php _e('<strong>Note:</strong> iPhone users can install this bookmarklet in their Safari to create Pretty Links with the following steps:', 'pretty-link'); ?><br/>
 
 
 
 
 
 
 
36
  <ol>
37
- <li><?php _e('Copy this text:', 'pretty-link'); ?><br/><input type="text" value="<?php echo PrliLink::bookmarklet_link(); ?>" /></li>
38
- <li><?php _e('Tap the + button at the bottom of the screen', 'pretty-link'); ?></li>
39
- <li><?php _e('Choose to share the page, then click on "Bookmark". We recommend saving it in your Favorites folder. Rename your bookmark to "Get PrettyLink" (or whatever you want) and then "Save"', 'pretty-link'); ?></li>
40
- <li><?php _e('Navigate through your Bookmarks until you find the new bookmark and click "Edit"', 'pretty-link'); ?></li>
41
- <li><?php _e('Delete all the text from the address', 'pretty-link'); ?></li>
42
- <li><?php _e('Paste the text you copied in Step 1 into the address field', 'pretty-link'); ?></li>
43
- <li><?php _e('To save the changes hit "Bookmarks" and <strong>you\'re done!', 'pretty-link'); ?></strong> <?php _e('Now when you find a page you want to save off as a Pretty Link, just click the "Bookmarks" icon at the bottom of the screen and select your "Get PrettyLink" bookmarklet.', 'pretty-link'); ?></li>
 
 
 
 
 
 
 
 
 
 
44
  </ol>
45
  </div>
46
  </div>
47
  <div class="prli-page" id="trim">
48
- <div class="prli-page-title"><?php _e('Trim Clicks', 'pretty-link'); ?></div>
49
  <?php if($prli_options->auto_trim_clicks): ?>
50
- <p><em><?php _e('Pretty Link is already automatically trimming Clicks older than 90 days. Although not necessary, you can still use the buttons below to force click trimming.', 'pretty-link'); ?></em></p>
51
  <?php endif; ?>
52
  <?php if($prli_options->extended_tracking != 'count'): ?>
53
- <a class="button" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_30day_clicks'); ?>" onclick="return confirm('<?php _e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 30 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php _e('Delete Clicks older than 30 days', 'pretty-link'); ?></a>&nbsp;&nbsp;
54
  <?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-30',
55
- __('Clear clicks 30 days or older', 'pretty-link'),
56
- __('This will clear all clicks in your database that are older than 30 days.', 'pretty-link') ); ?>
57
  <div>&nbsp;</div>
58
- <a class="button" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_90day_clicks'); ?>" onclick="return confirm('<?php _e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 90 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php _e('Delete Clicks older than 90 days', 'pretty-link'); ?></a>&nbsp;&nbsp;
59
  <?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-90',
60
- __('Clear clicks 90 days or older', 'pretty-link'),
61
- __('This will clear all clicks in your database that are older than 90 days.', 'pretty-link') ); ?>
62
  <div>&nbsp;</div>
63
  <?php endif; ?>
64
 
65
- <a class="button button-primary" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_all_clicks'); ?>" onclick="return confirm('<?php _e('***WARNING*** If you click OK you will delete ALL of the Click data in your Database. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete all your data because there is no going back!', 'pretty-link'); ?>');"><?php _e('Delete All Clicks', 'pretty-link'); ?></a>&nbsp;&nbsp;
66
  <?php PrliAppHelper::info_tooltip( 'prli-clear-all-clicks',
67
- __('Clear all clicks', 'pretty-link'),
68
- __('Seriously, only click this link if you want to delete all the Click data in your database.', 'pretty-link') ); ?>
69
  </div>
70
 
71
  <?php do_action('prli_admin_tools_pages'); ?>
1
  <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
2
  <div class="wrap">
3
+ <?php PrliAppHelper::page_title(__('Tools', 'pretty-link')); ?>
4
 
5
  <?php if($update_message): ?>
6
  <div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
15
  <tr>
16
  <td class="prli-settings-table-nav">
17
  <ul class="prli-sidebar-nav">
18
+ <li><a data-id="bookmarklet"><?php esc_html_e('Bookmarklet', 'pretty-link'); ?></a></li>
19
+ <li><a data-id="trim"><?php esc_html_e('Trim Clicks', 'pretty-link'); ?></a></li>
20
  <?php do_action('prli_admin_tools_nav'); ?>
21
  </ul>
22
  </td>
23
  <td class="prli-settings-table-pages">
24
  <div class="prli-page" id="bookmarklet">
25
+ <div class="prli-page-title"><?php esc_html_e('Bookmarklet', 'pretty-link'); ?></div>
26
+ <strong><a class="button button-primary" href="<?php echo PrliLink::bookmarklet_link(); ?>" style="vertical-align:middle;"><?php esc_html_e('Get Pretty Link', 'pretty-link'); ?></a></strong>&nbsp;&nbsp;
27
  <?php PrliAppHelper::info_tooltip( 'prli-bookmarklet-instructions',
28
+ esc_html__('Install Pretty Link Bookmarklet', 'pretty-link'),
29
+ sprintf(
30
+ // translators: %1$s: open link tag, %2$s close link tag
31
+ esc_html__('Just drag this "Get PrettyLink" link to your toolbar to install the bookmarklet. As you browse the web, you can just click this bookmarklet to create a pretty link from the current url you\'re looking at. %1$s(more help)%2$s', 'pretty-link'),
32
+ '<a href="http://blairwilliams.com/pretty-link-bookmarklet/">',
33
+ '</a>'
34
+ ));
35
  ?>
36
+ <br/><br/><a href="javascript:toggle_iphone_instructions()"><strong><?php esc_html_e('Show iPhone Bookmarklet Instructions', 'pretty-link'); ?></strong></a>
37
  <br/><br/>
38
  <div class="prli-sub-box iphone_instructions" style="display: none">
39
  <div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
40
+ <?php
41
+ printf(
42
+ // translators: %1$s: open strong tag, %2$s close strong tag
43
+ esc_html__('%1$sNote:%2$s iPhone users can install this bookmarklet in their Safari to create Pretty Links with the following steps:', 'pretty-link'),
44
+ '<strong>',
45
+ '</strong>'
46
+ );
47
+ ?><br/>
48
  <ol>
49
+ <li><?php esc_html_e('Copy this text:', 'pretty-link'); ?><br/><input type="text" value="<?php echo esc_attr(PrliLink::bookmarklet_link()); ?>" /></li>
50
+ <li><?php esc_html_e('Tap the + button at the bottom of the screen', 'pretty-link'); ?></li>
51
+ <li><?php esc_html_e('Choose to share the page, then click on "Bookmark". We recommend saving it in your Favorites folder. Rename your bookmark to "Get PrettyLink" (or whatever you want) and then "Save"', 'pretty-link'); ?></li>
52
+ <li><?php esc_html_e('Navigate through your Bookmarks until you find the new bookmark and click "Edit"', 'pretty-link'); ?></li>
53
+ <li><?php esc_html_e('Delete all the text from the address', 'pretty-link'); ?></li>
54
+ <li><?php esc_html_e('Paste the text you copied in Step 1 into the address field', 'pretty-link'); ?></li>
55
+ <li>
56
+ <?php
57
+ printf(
58
+ // translators: %1$s: open strong tag, %2$s close strong tag
59
+ esc_html__('To save the changes hit "Bookmarks" and %1$syou\'re done!%2$s', 'pretty-link'),
60
+ '<strong>',
61
+ '</strong>'
62
+ );
63
+ ?>
64
+ <?php esc_html_e('Now when you find a page you want to save off as a Pretty Link, just click the "Bookmarks" icon at the bottom of the screen and select your "Get PrettyLink" bookmarklet.', 'pretty-link'); ?>
65
+ </li>
66
  </ol>
67
  </div>
68
  </div>
69
  <div class="prli-page" id="trim">
70
+ <div class="prli-page-title"><?php esc_html_e('Trim Clicks', 'pretty-link'); ?></div>
71
  <?php if($prli_options->auto_trim_clicks): ?>
72
+ <p><em><?php esc_html_e('Pretty Link is already automatically trimming Clicks older than 90 days. Although not necessary, you can still use the buttons below to force click trimming.', 'pretty-link'); ?></em></p>
73
  <?php endif; ?>
74
  <?php if($prli_options->extended_tracking != 'count'): ?>
75
+ <a class="button" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_30day_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 30 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete Clicks older than 30 days', 'pretty-link'); ?></a>&nbsp;&nbsp;
76
  <?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-30',
77
+ esc_html__('Clear clicks 30 days or older', 'pretty-link'),
78
+ esc_html__('This will clear all clicks in your database that are older than 30 days.', 'pretty-link') ); ?>
79
  <div>&nbsp;</div>
80
+ <a class="button" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_90day_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 90 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete Clicks older than 90 days', 'pretty-link'); ?></a>&nbsp;&nbsp;
81
  <?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-90',
82
+ esc_html__('Clear clicks 90 days or older', 'pretty-link'),
83
+ esc_html__('This will clear all clicks in your database that are older than 90 days.', 'pretty-link') ); ?>
84
  <div>&nbsp;</div>
85
  <?php endif; ?>
86
 
87
+ <a class="button button-primary" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_all_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data in your Database. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete all your data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete All Clicks', 'pretty-link'); ?></a>&nbsp;&nbsp;
88
  <?php PrliAppHelper::info_tooltip( 'prli-clear-all-clicks',
89
+ esc_html__('Clear all clicks', 'pretty-link'),
90
+ esc_html__('Seriously, only click this link if you want to delete all the Click data in your database.', 'pretty-link') ); ?>
91
  </div>
92
 
93
  <?php do_action('prli_admin_tools_pages'); ?>
app/views/widgets/widget.php CHANGED
@@ -1,26 +1,25 @@
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
  <p style="text-align: left;">
4
- <a href="https://prettylinks.com/pl/widget/buy"><img style="border: 0px;" src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="75%" /></a>
5
  </p>
6
 
7
- <form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link"); ?>">
8
- <input type="hidden" name="action" value="quick-create">
9
- <?php wp_nonce_field('update-options'); ?>
 
 
 
 
 
 
 
 
 
10
 
11
- <table class="form-table">
12
- <tr class="form-field">
13
- <td valign="top"><?php _e("Target URL", 'pretty-link'); ?></td>
14
- <td><input type="text" name="url" value="" size="75">
15
- </tr>
16
- <tr>
17
- <td valign="top"><?php _e("Pretty Link", 'pretty-link'); ?></td>
18
- <td><strong><?php echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" value="<?php echo $prli_link->generateValidSlug(); ?>">
19
- </tr>
20
- </table>
21
-
22
- <p class="submit">
23
- <input type="submit" name="Submit" value="Create" class="button button-primary" />
24
- </p>
25
  </form>
26
  </div>
1
  <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
  <div class="wrap">
3
  <p style="text-align: left;">
4
+ <a href="https://prettylinks.com/pl/widget/buy"><img style="border: 0px;" src="<?php echo esc_url(PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'); ?>" width="75%" /></a>
5
  </p>
6
 
7
+ <form id="prli-quick-create" method="post">
8
+ <div id="prli-quick-create-error" class="hidden"></div>
9
+ <table class="form-table">
10
+ <tr class="form-field">
11
+ <td valign="top"><?php esc_html_e("Target URL", 'pretty-link'); ?></td>
12
+ <td><input type="text" id="prli-quick-create-url" name="url" value="" size="75">
13
+ </tr>
14
+ <tr>
15
+ <td valign="top"><?php esc_html_e("Pretty Link", 'pretty-link'); ?></td>
16
+ <td><strong><?php echo esc_html($prli_blogurl); ?></strong>/<input type="text" id="prli-quick-create-slug" name="slug" value="<?php echo esc_attr($prli_link->generateValidSlug()); ?>">
17
+ </tr>
18
+ </table>
19
 
20
+ <p class="submit">
21
+ <input type="submit" name="Submit" value="<?php esc_attr_e('Create', 'pretty-link'); ?>" class="button button-primary" />
22
+ <span id="prli-quick-create-loading" class="hidden"><img src="<?php echo PRLI_IMAGES_URL . '/square-loader.gif'; ?>" alt="<?php esc_attr_e('Loading...', 'pretty-link'); ?>"></span>
23
+ </p>
 
 
 
 
 
 
 
 
 
 
24
  </form>
25
  </div>
css/admin_shared.css CHANGED
@@ -92,7 +92,7 @@ a i.pl-icon:hover {
92
  color: #aeaeae;
93
  }
94
 
95
- .prli-hidden {
96
  display: none;
97
  }
98
 
@@ -113,7 +113,6 @@ img.prli_loader {
113
  }
114
 
115
  .prli_admin_branding {
116
- /* background: url(../images/pl-logo-horiz-RGB.png) no-repeat; */
117
  float: right !important;
118
  padding-right: 25px !important;
119
  height:32px !important;
@@ -122,6 +121,7 @@ img.prli_loader {
122
  background-size: 200px 32px !important;
123
  }
124
 
 
125
  .tablenav .tablenav-pages a.disabled ,
126
  .tablenav .tablenav-pages a.disabled:hover {
127
  cursor:default;
@@ -129,6 +129,7 @@ img.prli_loader {
129
  border-color:#ccc;
130
  color:#fff;
131
  }
 
132
 
133
  .prli-red {
134
  color: red !important;
@@ -138,3 +139,187 @@ img.prli_loader {
138
  color: green !important;
139
  }
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  color: #aeaeae;
93
  }
94
 
95
+ .prli-hidden, .prli_hidden {
96
  display: none;
97
  }
98
 
113
  }
114
 
115
  .prli_admin_branding {
 
116
  float: right !important;
117
  padding-right: 25px !important;
118
  height:32px !important;
121
  background-size: 200px 32px !important;
122
  }
123
 
124
+ /*
125
  .tablenav .tablenav-pages a.disabled ,
126
  .tablenav .tablenav-pages a.disabled:hover {
127
  cursor:default;
129
  border-color:#ccc;
130
  color:#fff;
131
  }
132
+ */
133
 
134
  .prli-red {
135
  color: red !important;
139
  color: green !important;
140
  }
141
 
142
+ #wpcontent #pl-admin-header {
143
+ margin-left: -20px;
144
+ padding: 15px;
145
+ padding-left: 22px;
146
+ background-image: url("../images/pretty-links-plugin-header.jpg");
147
+ background-repeat: repeat;
148
+ background-size: 1200px 75px;
149
+ min-height: 36px;
150
+ /* border-bottom: 2px solid #00cee6; */
151
+ }
152
+ #wpcontent #pl-admin-header img.pl-logo {
153
+ height: 36px;
154
+ }
155
+
156
+ .mfp-bg.mfp-prli {
157
+ z-index: 100002;
158
+ }
159
+ .mfp-wrap.mfp-prli {
160
+ z-index: 100003;
161
+ }
162
+ .mfp-wrap.mfp-prli .mfp-preloader {
163
+ z-index: 100004;
164
+ }
165
+ .mfp-wrap.mfp-prli .mfp-content {
166
+ z-index: 100005;
167
+ }
168
+ .prli-bullet-list {
169
+ list-style: disc;
170
+ margin-left: 2em;
171
+ }
172
+ .prli-welcome,
173
+ .prli-update {
174
+ position: relative;
175
+ max-width: 1200px;
176
+ margin: 25px 40px 0 20px;
177
+ font-size: 15px;
178
+ }
179
+ .prli-update {
180
+ max-width: 890px;
181
+ }
182
+ .prli-welcome h1,
183
+ .prli-update h1 {
184
+ margin: .2em 0 0 0;
185
+ padding: 0;
186
+ color: #32373c;
187
+ line-height: 1.2;
188
+ font-size: 2.8em;
189
+ font-weight: 400;
190
+ }
191
+ .prli-welcome h1 {
192
+ margin-right: 280px;
193
+ }
194
+ .prli-update h1 {
195
+ margin-bottom: 0.6em;
196
+ }
197
+ .prli-welcome p,
198
+ .prli-update p {
199
+ font-size: 16px;
200
+ line-height: 1.5;
201
+ }
202
+ .prli-welcome .prli-welcome-about {
203
+ font-size: 19px;
204
+ line-height: 1.6;
205
+ margin: 1em 0 1em 0;
206
+ }
207
+ .prli-welcome-badge {
208
+ /*
209
+ * position: absolute;
210
+ * top: 0;
211
+ * right: 0;
212
+ */
213
+ width: 230px;
214
+ padding: 15px 15px 15px 0;
215
+ float: left;
216
+ }
217
+ .prli-welcome img,
218
+ .prli-update img {
219
+ max-width: 100%;
220
+ }
221
+ .prli-welcome hr {
222
+ border: 0;
223
+ height: 0;
224
+ margin: 5em 0 0;
225
+ border-top: 1px solid rgba(0, 0, 0, .1);
226
+ }
227
+ /*
228
+ .prli-center-section {
229
+ max-width: 890px;
230
+ margin: 40px auto 0 auto;
231
+ }
232
+ */
233
+ p.prli-welcome-step {
234
+ display: block;
235
+ height: 160px;
236
+ font-weight: 900;
237
+ font-size: 18px;
238
+ margin-left: 25px;
239
+ }
240
+ p.prli-welcome-step img {
241
+ width: 160px !important;
242
+ height: 160px !important;
243
+ padding: 5px !important;
244
+ margin-right: 15px !important;
245
+ float: left;
246
+ border: 1px solid #444444;
247
+ }
248
+ .prli-row {
249
+ display: -ms-grid;
250
+ display: grid;
251
+ }
252
+ .prli-row.prli-2-columns {
253
+ -ms-grid-columns: 1fr 1fr;
254
+ grid-template-columns: 1fr 1fr;
255
+ }
256
+ .prli-row.prli-2-columns.prli-is-wider-left {
257
+ -ms-grid-columns: 2fr 1fr;
258
+ grid-template-columns: 2fr 1fr;
259
+ }
260
+ .prli-row.prli-2-columns.prli-is-wider-right {
261
+ -ms-grid-columns: 1fr 2fr;
262
+ grid-template-columns: 1fr 2fr;
263
+ }
264
+ .prli-column {
265
+ margin-right: 20px;
266
+ margin-left: 20px;
267
+ }
268
+ .prli-column :first-child {
269
+ margin-top: 0;
270
+ }
271
+ .prli-column.prli-align-vertically {
272
+ align-self: center;
273
+ }
274
+ .prli-welcome .prli-column img {
275
+ padding: 20px;
276
+ }
277
+ .prli-welcome h2,
278
+ .prli-update h2 {
279
+ margin: 0 0 .6em;
280
+ font-size: 1.6em;
281
+ line-height: 1.5;
282
+ }
283
+ .prli-welcome h3 {
284
+ margin: 1.25em 0 .6em;
285
+ font-size: 1.4em;
286
+ line-height: 1.5;
287
+ }
288
+ .prli-welcome ol li img {
289
+ display: block;
290
+ margin: 30px 0;
291
+ }
292
+ .prli-welcome ol li:last-child img {
293
+ margin-bottom: 0;
294
+ }
295
+ .prli-button-section {
296
+ text-align: center;
297
+ }
298
+ .prli-welcome .prli-button-section a {
299
+ padding: 15px 40px;
300
+ height: auto;
301
+ font-size: 17px;
302
+ line-height: 1.5;
303
+ }
304
+ .prli-update .prli-image-popup {
305
+ display: block;
306
+ }
307
+ @media screen and (max-width: 782px) {
308
+ .prli-welcome,
309
+ .prli-update {
310
+ margin-right: 30px;
311
+ }
312
+ .prli-welcome-badge {
313
+ position: relative;
314
+ width: 100%;
315
+ margin-bottom: 1.5em;
316
+ }
317
+ .prli-welcome h1,
318
+ .prli-welcome .prli-welcome-about {
319
+ margin-right: 0;
320
+ }
321
+ }
322
+
323
+ .prli-position-relative {
324
+ position: relative;
325
+ }
css/cloaked-redirect.css ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Make this shnizzle full screen and responsive */
2
+ body {
3
+ margin: 0;
4
+ }
5
+ /* fix for older browsers */
6
+ iframe, object, embed {
7
+ height: 100%;
8
+ width: 100%;
9
+ }
10
+ iframe, object, embed {
11
+ display: block;
12
+ background: #000;
13
+ border: none;
14
+ height: 100vh;
15
+ width: 100vw;
16
+ }
css/menu-styles.css CHANGED
@@ -5,11 +5,11 @@
5
  content: "\e844";
6
  }
7
 
8
- #toplevel_page_pretty-link div.wp-menu-image img {
9
  display: none;
10
  }
11
 
12
- #toplevel_page_pretty-link div.wp-menu-image:before {
13
  /* content: "\e843"; */
14
  content: "\e844";
15
  font-family: "pretty-link";
5
  content: "\e844";
6
  }
7
 
8
+ .menu-icon-pretty-link div.wp-menu-image img {
9
  display: none;
10
  }
11
 
12
+ .menu-icon-pretty-link div.wp-menu-image:before {
13
  /* content: "\e843"; */
14
  content: "\e844";
15
  font-family: "pretty-link";
css/prli-admin-links.css CHANGED
@@ -1,8 +1,6 @@
1
  #options-table {
2
  width: 100%;
3
- margin-top: 10px;
4
- }
5
-
6
  #pro-options-table {
7
  width: 100%;
8
  margin-top: 10px;
@@ -22,15 +20,6 @@
22
  font-style: italic;
23
  }
24
 
25
- .link_row {
26
- min-height: 75px;
27
- height: 75px;
28
- }
29
-
30
- .link_actions {
31
- display: none;
32
- }
33
-
34
  #add_group_message {
35
  padding-left: 5px;
36
  display: inline;
@@ -56,28 +45,128 @@
56
  display: inline;
57
  }
58
 
59
- .bacheck-title {
60
- display: inline-block;
61
- width: 100px !important;
 
 
 
 
62
  }
63
 
64
- .inline-edit-col-left, .inline-edit-col-center, .inline-edit-col-right {
65
- width: 33% !important;
 
 
 
 
 
66
  }
67
 
68
- /*
69
- .keyword-replacements {
70
- width: 45%;
71
- clear: none !important;
72
  }
73
- */
74
 
75
- .advanced-link-options {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  width: 100%;
77
- clear: none !important;
78
  }
79
 
80
- .pl-list-icon {
81
- font-size: 18px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
 
1
  #options-table {
2
  width: 100%;
3
+ margin-top: 10px; }
 
 
4
  #pro-options-table {
5
  width: 100%;
6
  margin-top: 10px;
20
  font-style: italic;
21
  }
22
 
 
 
 
 
 
 
 
 
 
23
  #add_group_message {
24
  padding-left: 5px;
25
  display: inline;
45
  display: inline;
46
  }
47
 
48
+ .advanced-link-options {
49
+ width: 100%;
50
+ clear: none !important;
51
+ }
52
+
53
+ .pl-list-icon {
54
+ font-size: 18px;
55
  }
56
 
57
+ .post-type-pretty-link #pretty_link_errors {
58
+ background: #fff;
59
+ border: 1px solid rgba(0,0,0,.125);
60
+ border-left: 4px solid #dc3232;
61
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
62
+ margin: 5px 0 15px;
63
+ padding: 5px 12px;
64
  }
65
 
66
+ .post-type-pretty-link #submitdiv #misc-publishing-actions,
67
+ .post-type-pretty-link #submitdiv #minor-publishing-actions {
68
+ display: none;
 
69
  }
 
70
 
71
+ .column-settings {
72
+ width: 10% !important;
73
+ }
74
+
75
+ .column-title {
76
+ width: 25% !important;
77
+ }
78
+
79
+ .column-taxonomy-pretty-link-category,
80
+ .column-pro-pretty-link-category {
81
+ width: 10% !important;
82
+ }
83
+
84
+ .column-taxonomy-pretty-link-tag,
85
+ .column-pro-pretty-link-tag {
86
+ width: 10% !important;
87
+ }
88
+
89
+ .column-keywords {
90
+ width: 15% !important;
91
+ }
92
+
93
+ .column-clicks {
94
+ width: 5% !important;
95
+ }
96
+
97
+ .column-date {
98
+ width: 10% !important;
99
+ }
100
+
101
+ .column-links {
102
+ width: 25% !important;
103
+ }
104
+
105
+ .column-slug {
106
+ width: 15% !important;
107
+ }
108
+
109
+ .column-target {
110
+ width: 15% !important;
111
+ }
112
+
113
+ #pretty-link-settings.postbox .inside,
114
+ #pretty-link-settings.postbox .prli-settings-table {
115
+ padding: 0;
116
+ margin: 0;
117
+ }
118
+
119
+ #pretty-link-settings.postbox .prli-settings-table {
120
  width: 100%;
 
121
  }
122
 
123
+ #pretty-link-settings.postbox .prli-settings-table-pages {
124
+ padding-top: 0;
125
+ }
126
+
127
+ #pretty-link-settings.postbox h2.hndle {
128
+ color: white;
129
+ background-color: #444;
130
+ border-bottom: none;
131
+ }
132
+
133
+ #pretty-link-settings.postbox button.handlediv {
134
+ height: 35px;
135
+ }
136
+
137
+ table.wp-list-table .prli-pro-only-indicator a {
138
+ /* position: absolute; */
139
+ /* right: 10px; */
140
+ /* top: 20px; */
141
+ color: #fff;
142
+ background: #0074a2;
143
+ font-size: 10px;
144
+ line-height: 1.3;
145
+ text-transform: uppercase;
146
+ padding: 2px 3px;
147
+ -webkit-border-radius: 3px;
148
+ -moz-border-radius: 3px;
149
+ border-radius: 3px;
150
+ text-decoration: none;
151
+ }
152
+
153
+ table.wp-list-table .prli-pro-only-indicator a:hover {
154
+ background: #3390b5;
155
+ }
156
+
157
+ @media screen and (max-width: 782px) {
158
+ .wp-list-table .type-pretty-link .column-settings,
159
+ .wp-list-table .type-pretty-link.is-expanded .column-settings {
160
+ display: table-cell !important;
161
+ }
162
+ .wp-list-table .type-pretty-link .column-settings:before {
163
+ content: "" !important;
164
+ }
165
+ .wp-list-table .type-pretty-link .column-links {
166
+ text-align: inherit;
167
+ }
168
+ .wp-list-table .type-pretty-link .column-links input {
169
+ width: calc(100% - 30px) !important;
170
+ }
171
  }
172
 
css/settings_table.css CHANGED
@@ -61,6 +61,10 @@ table.prli-settings-table input[type=number] {
61
  width: 50px !important;
62
  }
63
 
 
 
 
 
64
  table.prli-settings-table td.prli-settings-table-pages {
65
  width: 100%;
66
  background-color: white;
@@ -85,6 +89,43 @@ table.prli-settings-table td.prli-settings-table-pages .prli-page .prli-page-tit
85
  margin-bottom: 15px;
86
  }
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  .prli-sub-box {
89
  background-color: #f1f1f1;
90
  padding: 15px;
@@ -100,7 +141,7 @@ table.prli-settings-table td.prli-settings-table-pages .prli-page input.prli-aut
100
  }
101
 
102
  label.prli-label {
103
- font-weight: bold;
104
  font-size: 14px;
105
  color: #222;
106
  }
@@ -184,5 +225,8 @@ table.prli-settings-table tr.prli-mobile-nav {
184
  line-height: 50px;
185
  padding: 0 15px;
186
  }
 
 
 
187
  }
188
 
61
  width: 50px !important;
62
  }
63
 
64
+ table.prli-settings-table .form-table th {
65
+ width: 225px;
66
+ }
67
+
68
  table.prli-settings-table td.prli-settings-table-pages {
69
  width: 100%;
70
  background-color: white;
89
  margin-bottom: 15px;
90
  }
91
 
92
+ table.prli-settings-table tr.prli-pro-only th,
93
+ table.prli-settings-table label.prli-pro-only {
94
+ position: relative;
95
+ padding-right: 40px;
96
+ }
97
+
98
+ table.prli-settings-table tr.prli-pro-only input[type=checkbox]:disabled {
99
+ opacity: 1;
100
+ }
101
+
102
+ table.prli-settings-table .prli-pro-only-indicator {
103
+ position: absolute;
104
+ right: 10px;
105
+ top: 20px;
106
+ }
107
+
108
+ table.prli-settings-table .prli-pro-only-indicator a {
109
+ color: #fff;
110
+ background: #0074a2;
111
+ font-size: 10px;
112
+ line-height: 1.3;
113
+ text-transform: uppercase;
114
+ padding: 2px 3px;
115
+ -webkit-border-radius: 3px;
116
+ -moz-border-radius: 3px;
117
+ border-radius: 3px;
118
+ text-decoration: none;
119
+ }
120
+
121
+ table.prli-settings-table .prli-pro-only-indicator a:hover {
122
+ background: #3390b5;
123
+ }
124
+
125
+ table.prli-settings-table label.prli-pro-only .prli-pro-only-indicator {
126
+ top: 0;
127
+ }
128
+
129
  .prli-sub-box {
130
  background-color: #f1f1f1;
131
  padding: 15px;
141
  }
142
 
143
  label.prli-label {
144
+ font-weight: 600;
145
  font-size: 14px;
146
  color: #222;
147
  }
225
  line-height: 50px;
226
  padding: 0 15px;
227
  }
228
+ table.prli-settings-table .prli-pro-only-indicator {
229
+ top: 10px;
230
+ }
231
  }
232
 
i18n/pretty-link.pot CHANGED
@@ -1,1872 +1,2033 @@
1
- # Copyright (C) 2019 Pretty Links
2
- # This file is distributed under the same license as the Pretty Links package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Pretty Links 2.1.10\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
7
- "POT-Creation-Date: 2019-06-18 23:07:00+00:00\n"
 
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n"
12
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
- "Language-Team: LANGUAGE <LL@li.org>\n"
 
 
 
 
 
 
 
 
14
 
15
- #: app/controllers/PrliAppController.php:36
16
- #: app/controllers/PrliAppController.php:45
17
- msgid "Pretty Links | Manage Pretty Links"
18
  msgstr ""
19
 
20
- #. #-#-#-#-# pretty-link.pot (Pretty Links 2.1.10) #-#-#-#-#
21
- #. Plugin Name of the plugin/theme
22
- #: app/controllers/PrliAppController.php:37
23
- #: app/controllers/PrliAppController.php:46 app/views/links/list.php:12
24
- msgid "Pretty Links"
25
  msgstr ""
26
 
27
- #: app/controllers/PrliAppController.php:53
28
- msgid "Pretty Links | Add New Link"
29
  msgstr ""
30
 
31
- #: app/controllers/PrliAppController.php:54
32
- msgid "Add New Link"
33
  msgstr ""
34
 
35
- #: app/controllers/PrliAppController.php:62
36
- msgid "Pretty Links | Groups"
 
37
  msgstr ""
38
 
39
- #: app/controllers/PrliAppController.php:63 app/views/groups/list.php:6
40
- msgid "Groups"
41
  msgstr ""
42
 
43
- #: app/controllers/PrliAppController.php:72
44
- msgid "Pretty Links | Clicks"
45
  msgstr ""
46
 
47
- #: app/controllers/PrliAppController.php:73 app/models/PrliClick.php:259
48
- #: app/views/clicks/list.php:4 app/views/groups/list.php:69
49
- #: pro/app/helpers/PlpPostsHelper.php:61 pro/app/views/links/form.php:36
50
- #: pro/app/views/links/form.php:48 pro/app/views/reports/custom-report.php:31
51
- #: pro/app/views/reports/custom-report.php:64
 
 
52
  #: pro/app/views/reports/split-test-report.php:28
53
  #: pro/app/views/reports/split-test-report.php:60
 
 
 
 
 
 
 
54
  msgid "Clicks"
55
  msgstr ""
56
 
57
- #: app/controllers/PrliAppController.php:82
58
- msgid "Pretty Links | Tools"
 
 
 
 
59
  msgstr ""
60
 
61
- #: app/controllers/PrliAppController.php:83 app/views/tools/form.php:3
62
- msgid "Tools"
 
63
  msgstr ""
64
 
65
- #: app/controllers/PrliAppController.php:91
66
- msgid "Pretty Links | Options"
67
  msgstr ""
68
 
69
- #: app/controllers/PrliAppController.php:92 app/views/options/form.php:3
70
- msgid "Options"
71
  msgstr ""
72
 
73
- #: app/controllers/PrliAppController.php:99
74
- #: app/controllers/PrliAppController.php:102
75
- msgid "Activate Pro"
76
  msgstr ""
77
 
78
- #: app/controllers/PrliAppController.php:105
79
- #: app/controllers/PrliAppController.php:125
80
- #: app/views/admin/update/license.php:27 app/views/shared/nav.php:9
81
- msgid "Upgrade to Pro"
82
  msgstr ""
83
 
84
- #: app/controllers/PrliAppController.php:116
85
- #: app/controllers/PrliAppController.php:122
86
- #: app/controllers/PrliAppController.php:127
87
- msgid "Docs"
88
  msgstr ""
89
 
90
- #: app/controllers/PrliAppController.php:117
91
- msgid "Activate"
 
92
  msgstr ""
93
 
94
- #: app/controllers/PrliAppController.php:120
95
- #: app/controllers/PrliAppController.php:126
96
- msgid "Activate Pro License"
 
97
  msgstr ""
98
 
99
- #: app/controllers/PrliAppController.php:121
100
- msgid "Buy"
101
  msgstr ""
102
 
103
- #: app/controllers/PrliAppController.php:284
104
- msgid ""
105
- "You're almost done!<br/>%1$sFinish your Re-Install of Pretty Links Pro%2$s"
106
  msgstr ""
107
 
108
- #: app/controllers/PrliAppController.php:291
109
- msgid "Pretty Links Pro Successfully Uninstalled."
 
 
110
  msgstr ""
111
 
112
- #: app/controllers/PrliAppController.php:352
113
- msgid "Pretty Link Quick Add"
114
  msgstr ""
115
 
116
- #: app/controllers/PrliAppController.php:391
117
- msgid ""
118
- "Your Pretty Links Pro installation isn't quite complete yet. "
119
- "%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
120
  msgstr ""
121
 
122
- #: app/controllers/PrliAppController.php:412
123
- msgid ""
124
- "Your Pretty Links Pro installation isn't quite complete yet.<br/>"
125
- "%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
126
  msgstr ""
127
 
128
- #: app/controllers/PrliClicksController.php:89
129
- msgid "IP Address: "
130
  msgstr ""
131
 
132
- #: app/controllers/PrliClicksController.php:94
133
- msgid "Visitor: "
134
  msgstr ""
135
 
136
- #: app/controllers/PrliClicksController.php:100
137
- msgid "Group: "
138
  msgstr ""
139
 
140
- #: app/controllers/PrliClicksController.php:105
141
- msgid "All Links"
142
  msgstr ""
143
 
144
- #: app/controllers/PrliGroupsController.php:40
145
- msgid "Cannot add group because current user is not authorized."
146
  msgstr ""
147
 
148
- #: app/controllers/PrliGroupsController.php:45
149
- msgid "An unknown error occurred when creating your group."
 
150
  msgstr ""
151
 
152
- #: app/controllers/PrliGroupsController.php:54
153
- msgid "Group Created"
154
  msgstr ""
155
 
156
- #: app/controllers/PrliGroupsController.php:61
157
- msgid "A name must be specified for your new group name"
158
  msgstr ""
159
 
160
- #: app/controllers/PrliGroupsController.php:66
161
- msgid "Cannot add group because security nonce failed"
162
  msgstr ""
163
 
164
- #: app/controllers/PrliGroupsController.php:76
165
- msgid "Create a group and use it to organize your Pretty Links."
166
  msgstr ""
167
 
168
- #: app/controllers/PrliGroupsController.php:100
169
- msgid "Your Pretty Link Group was Successfully Created"
170
  msgstr ""
171
 
172
- #: app/controllers/PrliGroupsController.php:130
173
- msgid "Your Pretty Link Group was Successfully Updated"
174
  msgstr ""
175
 
176
- #: app/controllers/PrliGroupsController.php:139
177
- msgid "Your Pretty Link Group was Successfully Deleted"
 
 
178
  msgstr ""
179
 
180
- #: app/controllers/PrliLinksController.php:53
181
- msgid "Links in Group: "
 
 
 
182
  msgstr ""
183
 
184
- #: app/controllers/PrliLinksController.php:98
185
- #: app/controllers/PrliLinksController.php:124
186
- msgid "Your Pretty Link was Successfully Created"
 
 
 
187
  msgstr ""
188
 
189
- #: app/controllers/PrliLinksController.php:163
190
- msgid "Your Pretty Link was Successfully Updated"
 
 
 
 
191
  msgstr ""
192
 
193
- #: app/controllers/PrliLinksController.php:178
194
- msgid "Your links were updated successfully"
 
 
 
 
 
195
  msgstr ""
196
 
197
- #: app/controllers/PrliLinksController.php:195
198
- #: app/controllers/PrliLinksController.php:245
199
- msgid "You are unauthorized to view this page."
200
  msgstr ""
201
 
202
- #: app/controllers/PrliLinksController.php:207
203
- msgid "Your Pretty Link was Successfully Reset"
 
204
  msgstr ""
205
 
206
- #: app/controllers/PrliLinksController.php:219
207
- msgid "Your Pretty Link was Successfully Destroyed"
 
 
 
208
  msgstr ""
209
 
210
- #: app/controllers/PrliLinksController.php:232
211
- msgid "Your links were deleted successfully"
 
 
 
212
  msgstr ""
213
 
214
- #: app/controllers/PrliLinksController.php:523
215
- msgid "Pretty Link Cleanup Visitor Locks"
 
 
216
  msgstr ""
217
 
218
- #: app/controllers/PrliLocalApiController.php:101
219
- #: app/controllers/PrliLocalApiController.php:160
220
- msgid "An error prevented your Pretty Link from being created"
 
 
221
  msgstr ""
222
 
223
- #: app/controllers/PrliLocalApiController.php:125
224
- msgid "Pretty Link ID must be set for successful update."
 
225
  msgstr ""
226
 
227
- #: app/controllers/PrliOptionsController.php:61
228
- msgid "Options saved."
 
 
 
229
  msgstr ""
230
 
231
- #: app/controllers/PrliOptionsController.php:75
232
- msgid ""
233
- "Excluded IP Addresses must be a comma separated list of IPv4 or IPv6 "
234
- "addresses or ranges."
235
  msgstr ""
236
 
237
- #: app/controllers/PrliOptionsController.php:79
238
- msgid ""
239
- "Whitlist IP Addresses must be a comma separated list of IPv4 or IPv6 "
240
- "addresses or ranges."
241
  msgstr ""
242
 
243
- #: app/controllers/PrliPopupController.php:62
244
- msgid "An unknown error occurred."
 
245
  msgstr ""
246
 
247
- #: app/controllers/PrliPopupController.php:89
248
- msgid "Forbidden"
 
249
  msgstr ""
250
 
251
- #: app/controllers/PrliPopupController.php:93
252
- msgid "Must specify a popup"
 
 
 
253
  msgstr ""
254
 
255
- #: app/controllers/PrliPopupController.php:99
256
- msgid "Invalid popup"
 
 
257
  msgstr ""
258
 
259
- #: app/controllers/PrliPopupController.php:104
260
- msgid "The popup was successfully delayed"
 
261
  msgstr ""
262
 
263
- #: app/controllers/PrliPopupController.php:108
264
- msgid "The popup was successfully stopped"
 
265
  msgstr ""
266
 
267
- #: app/controllers/PrliToolsController.php:89
268
- msgid "Click Database was Cleared."
 
269
  msgstr ""
270
 
271
- #: app/controllers/PrliToolsController.php:95
272
- msgid "Clicks older than %1$d days (%2$d Clicks) were deleted"
273
  msgstr ""
274
 
275
- #: app/controllers/PrliToolsController.php:98
276
- msgid "No clicks older than %1$d days were found, so nothing was deleted"
277
  msgstr ""
278
 
279
- #: app/controllers/PrliUpdateController.php:72
280
- msgid "Why you creepin'?"
 
281
  msgstr ""
282
 
283
- #: app/controllers/PrliUpdateController.php:306
284
- msgid "Check for Update"
 
 
 
285
  msgstr ""
286
 
287
- #: app/controllers/PrliUpdateController.php:375
288
- msgid "You had an HTTP error connecting to Caseproof's Mothership API"
289
  msgstr ""
290
 
291
- #: app/controllers/PrliUpdateController.php:387
292
- msgid "Your License Key was invalid"
 
293
  msgstr ""
294
 
295
- #: app/controllers/PrliUpdateController.php:413
296
- msgid "You do not have access."
297
  msgstr ""
298
 
299
- #: app/controllers/PrliUpdateController.php:417
300
- msgid "Edge updates couldn't be updated."
301
  msgstr ""
302
 
303
- #: app/controllers/PrliXmlRpcController.php:36
304
- #: app/controllers/PrliXmlRpcController.php:98
305
- #: app/controllers/PrliXmlRpcController.php:145
306
- #: app/controllers/PrliXmlRpcController.php:200
307
- #: app/controllers/PrliXmlRpcController.php:229
308
- #: app/controllers/PrliXmlRpcController.php:257
309
- #: app/controllers/PrliXmlRpcController.php:290
310
- #: app/controllers/PrliXmlRpcController.php:322
311
- msgid "Sorry, XML-RPC Not enabled for this website"
312
  msgstr ""
313
 
314
- #: app/controllers/PrliXmlRpcController.php:39
315
- #: app/controllers/PrliXmlRpcController.php:101
316
- #: app/controllers/PrliXmlRpcController.php:148
317
- #: app/controllers/PrliXmlRpcController.php:203
318
- #: app/controllers/PrliXmlRpcController.php:232
319
- #: app/controllers/PrliXmlRpcController.php:260
320
- #: app/controllers/PrliXmlRpcController.php:293
321
- #: app/controllers/PrliXmlRpcController.php:325
322
- msgid "Sorry, Login failed"
323
  msgstr ""
324
 
325
- #: app/controllers/PrliXmlRpcController.php:45
326
- #: app/controllers/PrliXmlRpcController.php:107
327
- #: app/controllers/PrliXmlRpcController.php:154
328
- #: app/controllers/PrliXmlRpcController.php:209
329
- #: app/controllers/PrliXmlRpcController.php:238
330
- #: app/controllers/PrliXmlRpcController.php:266
331
- #: app/controllers/PrliXmlRpcController.php:299
332
- #: app/controllers/PrliXmlRpcController.php:331
333
- msgid "Sorry, you must be an administrator to access this resource"
334
  msgstr ""
335
 
336
- #: app/controllers/PrliXmlRpcController.php:111
337
- msgid "You must provide a target URL"
 
338
  msgstr ""
339
 
340
- #: app/controllers/PrliXmlRpcController.php:137
341
- #: app/controllers/PrliXmlRpcController.php:185
342
- msgid "There was an error creating your Pretty Link"
343
  msgstr ""
344
 
345
- #: app/controllers/PrliXmlRpcController.php:158
346
- msgid "You must provide the id of the link you want to update"
347
  msgstr ""
348
 
349
- #: app/controllers/PrliXmlRpcController.php:214
350
- msgid "There was an error fetching the Pretty Link Groups"
 
 
351
  msgstr ""
352
 
353
- #: app/controllers/PrliXmlRpcController.php:243
354
- msgid "There was an error fetching the Pretty Links"
 
355
  msgstr ""
356
 
357
- #: app/controllers/PrliXmlRpcController.php:269
358
- msgid "Sorry, you must provide a slug to lookup"
359
  msgstr ""
360
 
361
- #: app/controllers/PrliXmlRpcController.php:276
362
- #: app/controllers/PrliXmlRpcController.php:309
363
- msgid "There was an error fetching your Pretty Link"
364
  msgstr ""
365
 
366
- #: app/controllers/PrliXmlRpcController.php:302
367
- #: app/controllers/PrliXmlRpcController.php:334
368
- msgid "Sorry, you must provide an id to lookup"
369
  msgstr ""
370
 
371
- #: app/controllers/PrliXmlRpcController.php:341
372
- msgid "There was an error fetching your Pretty Link URL"
 
373
  msgstr ""
374
 
375
- #: app/helpers/PrliAppHelper.php:23 app/helpers/PrliLinksHelper.php:14
376
- #: app/views/links/form.php:100 app/views/shared/tinymce_form_popup.php:105
377
- #: app/views/shared/tinymce_form_popup.php:109 pro/app/views/links/form.php:185
378
- #: pro/app/views/options/form.php:703 pro/app/views/tools/generator.php:35
379
- #: pro/app/widgets/PlpPublicLinksWidget.php:80
380
- msgid "None"
381
  msgstr ""
382
 
383
- #: app/helpers/PrliLinksHelper.php:37 app/views/links/form.php:15
384
- #: app/views/shared/tinymce_form_popup.php:62
385
- msgid "307 (Temporary)"
 
386
  msgstr ""
387
 
388
- #: app/helpers/PrliLinksHelper.php:38 app/views/links/form.php:16
389
- #: app/views/shared/tinymce_form_popup.php:63
390
- msgid "302 (Temporary)"
391
  msgstr ""
392
 
393
- #: app/helpers/PrliLinksHelper.php:39 app/views/links/form.php:17
394
- #: app/views/shared/tinymce_form_popup.php:64
395
- msgid "301 (Permanent)"
396
  msgstr ""
397
 
398
- #: app/helpers/PrliLinksHelper.php:49
399
- msgid "Bulk Actions"
 
400
  msgstr ""
401
 
402
- #: app/helpers/PrliLinksHelper.php:50 app/views/groups/list.php:66
403
- #: pro/app/views/reports/list.php:55
404
- msgid "Edit"
 
 
 
 
 
 
 
405
  msgstr ""
406
 
407
- #: app/helpers/PrliLinksHelper.php:51 app/views/groups/list.php:67
408
- #: pro/app/views/reports/list.php:56
409
- msgid "Delete"
410
  msgstr ""
411
 
412
- #: app/helpers/PrliLinksHelper.php:53
413
- msgid "Are you sure you want to delete the selected links?"
 
414
  msgstr ""
415
 
416
- #: app/helpers/PrliLinksHelper.php:53
417
- msgid "Apply"
 
418
  msgstr ""
419
 
420
- #: app/helpers/PrliLinksHelper.php:63 app/views/links/list.php:77
421
- #: app/views/links/list.php:80
422
- msgid "- No Change -"
423
  msgstr ""
424
 
425
- #: app/helpers/PrliLinksHelper.php:64
426
- msgid "Off"
 
427
  msgstr ""
428
 
429
- #: app/helpers/PrliLinksHelper.php:65
430
- msgid "On"
431
  msgstr ""
432
 
433
- #: app/helpers/PrliLinksHelper.php:75
434
- msgid "PrettyBar Redirection"
435
  msgstr ""
436
 
437
- #: app/helpers/PrliLinksHelper.php:78
438
- msgid "Cloaked Redirection"
439
  msgstr ""
440
 
441
- #: app/helpers/PrliLinksHelper.php:81
442
- msgid "Pixel Tracking Redirection"
443
  msgstr ""
444
 
445
- #: app/helpers/PrliLinksHelper.php:84
446
- msgid "Meta Refresh Redirection"
447
  msgstr ""
448
 
449
- #: app/helpers/PrliLinksHelper.php:87
450
- msgid "Javascript Redirection"
 
 
451
  msgstr ""
452
 
453
- #: app/helpers/PrliLinksHelper.php:90
454
- msgid "Temporary (307) Redirection"
455
  msgstr ""
456
 
457
- #: app/helpers/PrliLinksHelper.php:93
458
- msgid "Temporary (302) Redirection"
459
  msgstr ""
460
 
461
- #: app/helpers/PrliLinksHelper.php:96
462
- msgid "Permanent (301) Redirection"
463
  msgstr ""
464
 
465
- #: app/helpers/PrliLinksHelper.php:100
466
- msgid "Nofollow Enabled"
 
467
  msgstr ""
468
 
469
- #: app/helpers/PrliLinksHelper.php:104
470
- msgid "Parameter Forwarding Enabled"
471
  msgstr ""
472
 
473
- #: app/helpers/PrliLinksHelper.php:115 app/views/groups/list.php:63
474
- #: app/views/groups/list.php:66
475
- msgid "Edit %s"
 
476
  msgstr ""
477
 
478
- #: app/helpers/PrliLinksHelper.php:116
479
- msgid ""
480
- "Are you sure you want to delete your %s Pretty Link? This will delete the "
481
- "Pretty Link and all of the statistical data about it in your database."
482
  msgstr ""
483
 
484
- #: app/helpers/PrliLinksHelper.php:116
485
- msgid "Delete %s"
486
  msgstr ""
487
 
488
- #: app/helpers/PrliLinksHelper.php:117
489
- msgid ""
490
- "Are you sure you want to reset your %s Pretty Link? This will delete all of "
491
- "the statistical data about this Pretty Link in your database."
492
  msgstr ""
493
 
494
- #: app/helpers/PrliLinksHelper.php:117
495
- msgid "Reset %s"
 
496
  msgstr ""
497
 
498
- #: app/helpers/PrliLinksHelper.php:120 app/views/clicks/list.php:163
499
- msgid "View clicks for %s"
500
  msgstr ""
501
 
502
- #: app/helpers/PrliLinksHelper.php:125
503
- msgid "Post %s to Twitter"
504
  msgstr ""
505
 
506
- #: app/helpers/PrliLinksHelper.php:126
507
- msgid "Send %s in an Email"
508
  msgstr ""
509
 
510
- #: app/models/PrliClick.php:237
511
- msgid "group: '%s'"
512
  msgstr ""
513
 
514
- #: app/models/PrliClick.php:240
515
- msgid "all links"
516
  msgstr ""
517
 
518
- #: app/models/PrliClick.php:247
519
- msgid "All clicks"
520
  msgstr ""
521
 
522
- #: app/models/PrliClick.php:250
523
- msgid "Unique hits"
524
  msgstr ""
525
 
526
- #: app/models/PrliClick.php:254 pro/app/helpers/PlpPostsHelper.php:66
527
- msgid "Pretty Link:"
528
  msgstr ""
529
 
530
- #: app/models/PrliClick.php:254
531
- msgid "on"
532
  msgstr ""
533
 
534
- #: app/models/PrliClick.php:254 pro/app/models/PlpReport.php:385
535
- msgid "between"
536
  msgstr ""
537
 
538
- #: app/models/PrliClick.php:254 pro/app/models/PlpReport.php:244
539
- #: pro/app/models/PlpReport.php:385
540
- msgid "and"
 
541
  msgstr ""
542
 
543
- #: app/models/PrliClick.php:259 pro/app/views/links/form.php:35
544
- #: pro/app/views/links/form.php:68
545
- msgid "Date"
546
  msgstr ""
547
 
548
- #: app/models/PrliLink.php:559
549
- msgid "Target URL can't be blank"
550
  msgstr ""
551
 
552
- #: app/models/PrliLink.php:563
553
- msgid "Pretty Link can't be blank"
 
 
554
  msgstr ""
555
 
556
- #: app/models/PrliLink.php:567
557
- msgid "Target URL must be different than the Pretty Link"
558
  msgstr ""
559
 
560
- #: app/models/PrliLink.php:571
561
- msgid "Link URL must be a correctly formatted url"
562
  msgstr ""
563
 
564
- #: app/models/PrliLink.php:575
565
- msgid ""
566
- "Pretty Link slugs must not contain question marks, ampersands or number "
567
- "signs."
568
  msgstr ""
569
 
570
- #: app/models/PrliLink.php:579
571
- msgid "Pretty Link slugs must not end with a slash (\"/\")"
 
 
572
  msgstr ""
573
 
574
- #: app/models/PrliLink.php:584
575
- msgid ""
576
- "This Pretty Link Slug is already taken. Check to make sure it isn't being "
577
- "used by another pretty link, post, page, category or tag slug. If none of "
578
- "these are true then check to see that this slug isn't the name of a file in "
579
- "the root folder of your wordpress install."
580
  msgstr ""
581
 
582
- #: app/models/PrliUtils.php:93
583
- msgid "*** Pretty Links Debug: %s"
584
  msgstr ""
585
 
586
- #: app/views/admin/errors.php:7 app/views/shared/errors.php:12
587
- msgid "ERROR"
588
  msgstr ""
589
 
590
- #: app/views/admin/popups/rating.php:6
591
- msgid "Rate Pretty Link"
592
  msgstr ""
593
 
594
- #: app/views/admin/popups/rating.php:7
595
- msgid ""
596
- "If you enjoy using Pretty Link would you mind taking a moment to rate it on "
597
- "WordPress.org? It won't take more than a minute."
598
  msgstr ""
599
 
600
- #: app/views/admin/popups/rating.php:8
601
- msgid "Thanks for your support!"
602
  msgstr ""
603
 
604
- #: app/views/admin/popups/rating.php:13 app/views/admin/popups/upgrade.php:23
605
- msgid "Remind Me Later"
606
  msgstr ""
607
 
608
- #: app/views/admin/popups/rating.php:14
609
- msgid "Review Pretty Link"
 
610
  msgstr ""
611
 
612
- #: app/views/admin/popups/rating.php:16 app/views/admin/popups/upgrade.php:26
613
- msgid "Never Remind Me Again"
614
  msgstr ""
615
 
616
- #: app/views/admin/popups/upgrade.php:6
617
- msgid "Upgrade Pretty Link PRO"
618
  msgstr ""
619
 
620
- #: app/views/admin/popups/upgrade.php:7
621
- msgid "Upgrading will enable you to:"
622
  msgstr ""
623
 
624
- #: app/views/admin/popups/upgrade.php:9 app/views/admin/update/license.php:36
625
- #: app/views/links/form.php:225
626
- msgid "Auto-replace keywords throughout your site with Pretty Links"
627
  msgstr ""
628
 
629
- #: app/views/admin/popups/upgrade.php:10 app/views/admin/update/license.php:37
630
- #: app/views/links/form.php:226
631
- msgid "Protect your affiliate links by using Cloaked Redirects"
632
  msgstr ""
633
 
634
- #: app/views/admin/popups/upgrade.php:11 app/views/admin/update/license.php:38
635
- #: app/views/links/form.php:227
636
- msgid "Redirect based on a visitor's location"
637
  msgstr ""
638
 
639
- #: app/views/admin/popups/upgrade.php:12 app/views/admin/update/license.php:39
640
- #: app/views/links/form.php:228
641
- msgid "Auto-prettylink your Pages &amp; Posts"
642
  msgstr ""
643
 
644
- #: app/views/admin/popups/upgrade.php:13 app/views/admin/update/license.php:40
645
- #: app/views/links/form.php:229
646
- msgid "Find out what works and what doesn't by split testing your links"
647
  msgstr ""
648
 
649
- #: app/views/admin/popups/upgrade.php:14 app/views/admin/update/license.php:41
650
- #: app/views/links/form.php:230
651
- msgid "And much, much more!"
652
  msgstr ""
653
 
654
- #: app/views/admin/popups/upgrade.php:17 app/views/admin/update/license.php:45
655
- #: app/views/links/form.php:233
656
- msgid ""
657
- "Plus, upgrading is fast, easy and won't disrupt any of your existing links "
658
- "or data. And there's even a 14 day money back guarantee."
659
  msgstr ""
660
 
661
- #: app/views/admin/popups/upgrade.php:18 app/views/admin/update/license.php:47
662
- #: app/views/links/form.php:235
663
- msgid "We think you'll love it!"
664
  msgstr ""
665
 
666
- #: app/views/admin/popups/upgrade.php:24
667
- msgid "Upgrade to Pretty Links Pro"
668
  msgstr ""
669
 
670
- #: app/views/admin/update/activation_warning.php:4
671
- msgid "Error with PRETTYLINK_LICENSE_KEY: %s"
672
  msgstr ""
673
 
674
- #: app/views/admin/update/activation_warning.php:7
675
- #: app/views/admin/update/activation_warning.php:14
676
- msgid "Pretty Links Pro isn't able to get critical automatic updates"
677
  msgstr ""
678
 
679
- #: app/views/admin/update/activation_warning.php:8
680
- msgid ""
681
- "It looks like you used to have Pretty Links Pro activated with a username "
682
- "and password but now you need a license key to activate it."
683
  msgstr ""
684
 
685
- #: app/views/admin/update/activation_warning.php:9
686
- msgid ""
687
- "You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s"
688
  msgstr ""
689
 
690
- #: app/views/admin/update/activation_warning.php:10
691
- msgid ""
692
- "After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro"
693
- "\" admin page,%2$s you'll start getting updates again."
694
  msgstr ""
695
 
696
- #: app/views/admin/update/activation_warning.php:15
697
- msgid ""
698
- "You can retrieve or purchase a license key at %1$sPrettyLinkPro.com%2$s to "
699
- "enable automatic updates today."
700
  msgstr ""
701
 
702
- #: app/views/admin/update/activation_warning.php:16
703
- msgid ""
704
- "After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro"
705
- "\" admin page,%2$s you'll start getting automatic updates."
706
  msgstr ""
707
 
708
- #: app/views/admin/update/addon_popup.php:4
709
- msgid "ACTION REQUIRED"
710
  msgstr ""
711
 
712
- #: app/views/admin/update/addon_popup.php:5
713
- msgid ""
714
- "The %s features in your Pretty Link options have been moved from Pretty Link "
715
- "into a separate plugin."
716
  msgstr ""
717
 
718
- #: app/views/admin/update/addon_popup.php:6
719
- msgid ""
720
- "Why you ask? Well, it's to streamline and increase the performance of Pretty "
721
- "Link for you."
722
  msgstr ""
723
 
724
- #: app/views/admin/update/addon_popup.php:9
725
- msgid ""
726
- "And good for you, it looks like you've already got the %1$s Add-on "
727
- "installed. Just click the \"Activate %2$s Add-on\" button below and you'll "
728
- "get all these features back now."
729
  msgstr ""
730
 
731
- #: app/views/admin/update/addon_popup.php:11
732
- msgid ""
733
- "Luckily it's easy to get these features back now. Just click the \"Install "
734
- "%s Add-on\" button below."
735
  msgstr ""
736
 
737
- #: app/views/admin/update/addon_popup.php:12
738
- msgid ""
739
- "If you have problems with the auto-install please refer to %1$sthe user "
740
- "manual%2$s for manual install instructions."
741
  msgstr ""
742
 
743
- #: app/views/admin/update/addon_popup.php:18
744
- msgid "Activate %s Add-on"
745
  msgstr ""
746
 
747
- #: app/views/admin/update/addon_popup.php:20
748
- msgid "Install %s Add-on"
749
  msgstr ""
750
 
751
- #: app/views/admin/update/addon_popup.php:22
752
- msgid "Don't Show This Message Again"
753
  msgstr ""
754
 
755
- #: app/views/admin/update/addons.php:3
756
- msgid "Pretty Link Add-ons"
757
  msgstr ""
758
 
759
- #: app/views/admin/update/addons.php:8
760
- msgid "There were no Add-ons found for your license or lack thereof..."
761
  msgstr ""
762
 
763
- #: app/views/admin/update/addons.php:14
764
- msgid "Add-on"
 
765
  msgstr ""
766
 
767
- #: app/views/admin/update/addons.php:15
768
- msgid "Description"
 
769
  msgstr ""
770
 
771
- #: app/views/admin/update/addons.php:16 app/views/admin/update/addons.php:54
772
- msgid "Install"
 
773
  msgstr ""
774
 
775
- #: app/views/admin/update/addons.php:42
776
- msgid "(Update Available)"
 
777
  msgstr ""
778
 
779
- #: app/views/admin/update/addons.php:50
780
- msgid "Installed & Active"
 
781
  msgstr ""
782
 
783
- #: app/views/admin/update/addons.php:52
784
- msgid "Installed & Inactive"
 
 
 
 
 
 
 
785
  msgstr ""
786
 
787
- #: app/views/admin/update/edge_updates.php:4
788
- msgid ""
789
- "Include Pretty Links Pro edge (development) releases in automatic updates "
790
- "(not recommended for production websites)"
791
  msgstr ""
792
 
793
- #: app/views/admin/update/edge_updates.php:4
794
- msgid "Loading..."
 
 
 
795
  msgstr ""
796
 
797
- #: app/views/admin/update/license.php:4
798
- msgid "Pretty Links Pro License"
 
 
 
 
 
 
799
  msgstr ""
800
 
801
- #: app/views/admin/update/license.php:7
802
- msgid ""
803
- "You must have a License Key to enable automatic updates for Pretty Links "
804
- "Pro. If you don't have a License please go to %1$s to get one. If you do "
805
- "have a license you can login at %2$s to manage your licenses and site "
806
- "activations."
807
  msgstr ""
808
 
809
- #: app/views/admin/update/license.php:13
810
- msgid "Enter Your Pretty Links Pro License Key:"
811
  msgstr ""
812
 
813
- #: app/views/admin/update/license.php:20
814
- msgid "Activate License Key on %s"
 
815
  msgstr ""
816
 
817
- #: app/views/admin/update/license.php:30 app/views/links/form.php:221
818
- msgid ""
819
- "It looks like you haven't %1$supgraded to Pretty Links Pro%2$s yet. Here are "
820
- "just a few things you could be doing with pro:"
 
821
  msgstr ""
822
 
823
- #: app/views/admin/update/license.php:49 app/views/links/form.php:237
824
- msgid "Upgrade to Pro today!"
 
 
 
 
 
825
  msgstr ""
826
 
827
- #: app/views/admin/update/license.php:53
828
- msgid "Active License Key Information:"
 
 
 
829
  msgstr ""
830
 
831
- #: app/views/admin/update/license.php:56
832
- msgid "License Key:"
833
  msgstr ""
834
 
835
- #: app/views/admin/update/license.php:60
836
- msgid "Status:"
 
 
 
 
837
  msgstr ""
838
 
839
- #: app/views/admin/update/license.php:61
840
- msgid "<b>Active on %s</b>"
 
841
  msgstr ""
842
 
843
- #: app/views/admin/update/license.php:64
844
- msgid "Product:"
845
  msgstr ""
846
 
847
- #: app/views/admin/update/license.php:68
848
- msgid "Activations:"
 
 
849
  msgstr ""
850
 
851
- #: app/views/admin/update/license.php:72
852
- msgid ""
853
- "Are you sure? Pretty Links Pro will not be functional on %s if this License "
854
- "Key is deactivated."
855
  msgstr ""
856
 
857
- #: app/views/admin/update/license.php:72
858
- msgid "Deactivate License Key on %s"
859
  msgstr ""
860
 
861
- #: app/views/admin/update/license.php:75
862
- msgid "Upgrade plugin to Pro"
863
  msgstr ""
864
 
865
- #: app/views/admin/update/license.php:80
866
- msgid "You're currently running version %s of Pretty Links Pro"
867
  msgstr ""
868
 
869
- #: app/views/admin/update/ui.php:3
870
- msgid "Activate Pretty Links Pro"
871
  msgstr ""
872
 
873
- #: app/views/admin/update/ui.php:16
874
- msgid "License"
875
  msgstr ""
876
 
877
- #: app/views/admin/update/ui.php:17
878
- msgid "Add-Ons"
 
879
  msgstr ""
880
 
881
- #: app/views/clicks/csv_download.php:3
882
- msgid "Download Clicks"
 
 
883
  msgstr ""
884
 
885
- #: app/views/clicks/csv_download.php:6
886
- msgid "Click Reports:"
 
 
887
  msgstr ""
888
 
889
- #: app/views/clicks/csv_download.php:7
890
- msgid "All clicks on %s"
 
 
891
  msgstr ""
892
 
893
- #: app/views/clicks/csv_download.php:24
894
- msgid "Clicks %d-%d (%d Records)"
895
  msgstr ""
896
 
897
- #: app/views/clicks/list.php:6
898
- msgid "For"
 
 
 
899
  msgstr ""
900
 
901
- #: app/views/clicks/list.php:11 pro/app/views/reports/custom-report.php:12
902
- #: pro/app/views/reports/split-test-report.php:9
903
- msgid "Customize Report"
904
  msgstr ""
905
 
906
- #: app/views/clicks/list.php:18 pro/app/views/reports/split-test-report.php:9
907
- msgid "Back to Links"
908
  msgstr ""
909
 
910
- #: app/views/clicks/list.php:21
911
- msgid "Back to Clicks"
912
  msgstr ""
913
 
914
- #: app/views/clicks/list.php:30
915
- msgid "Type:"
916
  msgstr ""
917
 
918
- #: app/views/clicks/list.php:32 pro/app/models/PlpReport.php:251
919
- #: pro/app/models/PlpReport.php:260 pro/app/models/PlpReport.php:397
920
- #: pro/app/models/PlpReport.php:404
921
- msgid "All Clicks"
922
  msgstr ""
923
 
924
- #: app/views/clicks/list.php:33 pro/app/models/PlpReport.php:251
925
- #: pro/app/models/PlpReport.php:260 pro/app/models/PlpReport.php:397
926
- #: pro/app/models/PlpReport.php:404
927
- msgid "Unique Clicks"
928
  msgstr ""
929
 
930
- #: app/views/clicks/list.php:37 pro/app/views/reports/custom-report.php:16
931
- #: pro/app/views/reports/split-test-report.php:13
932
- msgid "Date Range:"
933
  msgstr ""
934
 
935
- #: app/views/clicks/list.php:39
936
- msgid "to"
 
937
  msgstr ""
938
 
939
- #: app/views/clicks/list.php:43 app/views/groups/edit.php:54
940
- #: app/views/groups/new.php:58 app/views/links/edit.php:16
941
- #: app/views/links/list.php:93 app/views/links/new.php:15
942
- #: pro/app/views/reports/custom-report.php:22
943
- #: pro/app/views/reports/edit.php:109 pro/app/views/reports/new.php:109
944
- msgid "Cancel"
945
  msgstr ""
946
 
947
- #: app/views/clicks/list.php:64 app/views/groups/list.php:24
948
- #: app/views/links/list.php:36 pro/app/views/reports/list.php:20
949
- msgid "Reset"
950
  msgstr ""
951
 
952
- #: app/views/clicks/list.php:73 app/views/clicks/list.php:173
953
- msgid "Browser"
 
954
  msgstr ""
955
 
956
- #: app/views/clicks/list.php:75 app/views/clicks/list.php:174
957
- msgid "OS"
 
958
  msgstr ""
959
 
960
- #: app/views/clicks/list.php:79 app/views/clicks/list.php:176
961
- msgid "IP"
 
962
  msgstr ""
963
 
964
- #: app/views/clicks/list.php:83 app/views/clicks/list.php:178
965
- msgid "Visitor"
 
966
  msgstr ""
967
 
968
- #: app/views/clicks/list.php:87 app/views/clicks/list.php:180
969
- msgid "Timestamp"
 
970
  msgstr ""
971
 
972
- #: app/views/clicks/list.php:91 app/views/clicks/list.php:182
973
- msgid "Host"
 
974
  msgstr ""
975
 
976
- #: app/views/clicks/list.php:95 app/views/clicks/list.php:184
977
- msgid "URI"
978
  msgstr ""
979
 
980
- #: app/views/clicks/list.php:98 app/views/clicks/list.php:185
981
- msgid "Referrer"
982
  msgstr ""
983
 
984
- #: app/views/clicks/list.php:101 app/views/clicks/list.php:186
985
- #: pro/app/models/PlpReport.php:251 pro/app/models/PlpReport.php:260
986
- msgid "Link"
987
  msgstr ""
988
 
989
- #: app/views/clicks/list.php:111
990
- msgid "No Clicks have been recorded yet"
991
  msgstr ""
992
 
993
- #: app/views/clicks/list.php:149
994
- msgid "View All Activity for IP Address: %s"
995
  msgstr ""
996
 
997
- #: app/views/clicks/list.php:152
998
- msgid "View All Activity for Visitor: %s"
999
  msgstr ""
1000
 
1001
- #: app/views/clicks/list.php:192
1002
- msgid "Download CSV"
 
1003
  msgstr ""
1004
 
1005
- #: app/views/groups/edit.php:4
1006
- msgid "Edit Group"
 
1007
  msgstr ""
1008
 
1009
- #: app/views/groups/edit.php:15 pro/app/views/reports/edit.php:15
1010
- msgid "Name:"
 
 
1011
  msgstr ""
1012
 
1013
- #: app/views/groups/edit.php:17 app/views/groups/new.php:23
1014
- msgid "This is how you'll identify your Group."
 
1015
  msgstr ""
1016
 
1017
- #: app/views/groups/edit.php:20 app/views/groups/new.php:26
1018
- msgid "Description:"
 
1019
  msgstr ""
1020
 
1021
- #: app/views/groups/edit.php:22 app/views/groups/new.php:28
1022
- msgid "A Description of this group."
 
 
1023
  msgstr ""
1024
 
1025
- #: app/views/groups/edit.php:25 app/views/groups/new.php:31
1026
- msgid "Links:"
 
1027
  msgstr ""
1028
 
1029
- #: app/views/groups/edit.php:30 app/views/groups/list.php:39
1030
- #: app/views/groups/list.php:81 app/views/groups/new.php:36
1031
- #: app/views/links/list.php:52 app/views/links/list.php:153
1032
- #: pro/app/views/reports/edit.php:85 pro/app/views/reports/list.php:30
1033
- #: pro/app/views/reports/list.php:70 pro/app/views/reports/new.php:85
1034
- msgid "Name"
1035
  msgstr ""
1036
 
1037
- #: app/views/groups/edit.php:31 app/views/groups/new.php:37
1038
- msgid "Current Group"
 
 
1039
  msgstr ""
1040
 
1041
- #: app/views/groups/edit.php:48 app/views/groups/new.php:52
1042
- msgid ""
1043
- "Select some links for this group. <strong>Note: each link can only be in one "
1044
- "group at a time.</strong>"
1045
  msgstr ""
1046
 
1047
- #: app/views/groups/edit.php:54 app/views/links/edit.php:16
1048
- #: app/views/links/list.php:94 app/views/options/form.php:194
1049
- #: pro/app/views/reports/edit.php:109
1050
- msgid "Update"
1051
  msgstr ""
1052
 
1053
- #: app/views/groups/list.php:7
1054
- msgid "Add Group"
 
 
1055
  msgstr ""
1056
 
1057
- #: app/views/groups/list.php:40 app/views/groups/list.php:68
1058
- #: app/views/groups/list.php:82 app/views/links/list.php:57
1059
- #: app/views/links/list.php:158 app/views/options/form.php:39
1060
- #: pro/app/views/reports/list.php:32 pro/app/views/reports/list.php:72
1061
- msgid "Links"
1062
  msgstr ""
1063
 
1064
- #: app/views/groups/list.php:41 app/views/groups/list.php:83
1065
- #: app/views/links/list.php:56 app/views/links/list.php:157
1066
- #: pro/app/views/reports/list.php:33 pro/app/views/reports/list.php:73
1067
- msgid "Created"
1068
  msgstr ""
1069
 
1070
- #: app/views/groups/list.php:50
1071
- msgid "No Pretty Link Groups were found"
 
1072
  msgstr ""
1073
 
1074
- #: app/views/groups/list.php:67
1075
- msgid "Are you sure you want to delete your %s Pretty Link Group?"
1076
  msgstr ""
1077
 
1078
- #: app/views/groups/list.php:69
1079
- msgid "View hits in %s"
1080
  msgstr ""
1081
 
1082
- #: app/views/groups/new.php:9
1083
- msgid "New Group"
1084
  msgstr ""
1085
 
1086
- #: app/views/groups/new.php:21 pro/app/views/reports/new.php:14
1087
- msgid "Name*:"
1088
  msgstr ""
1089
 
1090
- #: app/views/groups/new.php:58 app/views/links/new.php:15
1091
- msgid "Create"
1092
  msgstr ""
1093
 
1094
- #: app/views/links/edit.php:4
1095
- msgid "Edit Link"
1096
  msgstr ""
1097
 
1098
- #: app/views/links/form.php:6
1099
- msgid "Redirection*"
1100
  msgstr ""
1101
 
1102
- #: app/views/links/form.php:9 app/views/options/form.php:58
1103
- #: app/views/options/form.php:60
1104
- msgid "Redirection Type"
1105
  msgstr ""
1106
 
1107
- #: app/views/links/form.php:10
1108
- msgid "This is the method of redirection for your link."
 
 
1109
  msgstr ""
1110
 
1111
- #: app/views/links/form.php:24
1112
- msgid ""
1113
- "Make your life easier by upgrading to %1$sPretty Links Pro%2$s -- get more "
1114
- "redirection types, speed, automations and <b>results from your links</b> by "
1115
- "%1$sgoing pro today!%2$s"
1116
  msgstr ""
1117
 
1118
- #: app/views/links/form.php:31
1119
- msgid "Target URL*"
 
 
1120
  msgstr ""
1121
 
1122
- #: app/views/links/form.php:34 app/views/shared/tinymce_form_popup.php:43
1123
- #: app/views/shared/tinymce_form_popup.php:104 app/views/widgets/widget.php:13
1124
- msgid "Target URL"
1125
  msgstr ""
1126
 
1127
- #: app/views/links/form.php:35
1128
- msgid "This is the URL that your Pretty Link will redirect to."
 
1129
  msgstr ""
1130
 
1131
- #: app/views/links/form.php:44
1132
- msgid "Pretty Link*"
 
 
1133
  msgstr ""
1134
 
1135
- #: app/views/links/form.php:47 app/views/shared/tinymce_form_popup.php:108
1136
- #: app/views/widgets/widget.php:17 pro/app/views/links/prettybar.php:191
1137
- msgid "Pretty Link"
1138
  msgstr ""
1139
 
1140
- #: app/views/links/form.php:48
1141
- msgid ""
1142
- "This is how your pretty link will appear. You can edit the Pretty Link slug "
1143
- "here."
1144
  msgstr ""
1145
 
1146
- #: app/views/links/form.php:57 app/views/links/form.php:60
1147
- msgid "Title"
1148
  msgstr ""
1149
 
1150
- #: app/views/links/form.php:61
1151
- msgid ""
1152
- "Leave this blank and Pretty Link will attempt to detect the title from the "
1153
- "target url. Alternatively you can enter a custom title here."
1154
  msgstr ""
1155
 
1156
- #: app/views/links/form.php:70 app/views/links/form.php:73
1157
- msgid "Notes"
 
1158
  msgstr ""
1159
 
1160
- #: app/views/links/form.php:74
1161
- msgid ""
1162
- "This is a field where you can enter notes about a particular link. This "
1163
- "notes field is mainly for your own link management needs. It isn't currently "
1164
- "used anywhere on the front end."
1165
  msgstr ""
1166
 
1167
- #: app/views/links/form.php:84
1168
- msgid "Advanced Options"
1169
  msgstr ""
1170
 
1171
- #: app/views/links/form.php:91 app/views/links/list.php:55
1172
- #: app/views/links/list.php:79 app/views/links/list.php:156
1173
- #: pro/app/views/options/autocreate.php:30 pro/app/views/reports/edit.php:86
1174
- #: pro/app/views/reports/new.php:86
1175
- msgid "Group"
1176
  msgstr ""
1177
 
1178
- #: app/views/links/form.php:94
1179
- msgid "Link Group"
 
1180
  msgstr ""
1181
 
1182
- #: app/views/links/form.php:95
1183
- msgid "Select a Group for this Link"
 
1184
  msgstr ""
1185
 
1186
- #: app/views/links/form.php:109 pro/app/views/options/autocreate.php:41
1187
- msgid "Add a New Group"
 
1188
  msgstr ""
1189
 
1190
- #: app/views/links/form.php:114
1191
- msgid "No Follow"
 
1192
  msgstr ""
1193
 
1194
- #: app/views/links/form.php:117
1195
- msgid "Nofollow Link"
 
1196
  msgstr ""
1197
 
1198
- #: app/views/links/form.php:118
1199
- msgid "Add a nofollow and noindex to this link's http redirect header"
 
1200
  msgstr ""
1201
 
1202
- #: app/views/links/form.php:127 app/views/links/form.php:130
1203
- msgid "Delay Redirect"
 
 
1204
  msgstr ""
1205
 
1206
- #: app/views/links/form.php:131
1207
- msgid "Time in seconds to wait before redirecting"
 
 
 
1208
  msgstr ""
1209
 
1210
- #: app/views/links/form.php:140 app/views/links/form.php:143
1211
- msgid "Parameter Forwarding"
 
 
1212
  msgstr ""
1213
 
1214
- #: app/views/links/form.php:144
1215
- msgid "Forward parameters passed to this link onto the Target URL"
 
1216
  msgstr ""
1217
 
1218
- #: app/views/links/form.php:153 app/views/links/form.php:156
1219
- #: app/views/shared/tinymce_form_popup.php:84
1220
- msgid "Tracking"
1221
  msgstr ""
1222
 
1223
- #: app/views/links/form.php:157
1224
- msgid "Enable Pretty Link's built-in hit (click) tracking"
 
1225
  msgstr ""
1226
 
1227
- #: app/views/links/form.php:166 pro/app/models/PlpUtils.php:42
1228
- #: pro/app/views/links/bulk-edit.php:10
1229
- msgid "Google Analytics"
1230
  msgstr ""
1231
 
1232
- #: app/views/links/form.php:169
1233
- msgid "Google Analytics Tracking"
1234
  msgstr ""
1235
 
1236
- #: app/views/links/form.php:170
1237
- msgid ""
1238
- "Requires the Google Analyticator, Google Analytics by MonsterInsights "
1239
- "(formerly Yoast) or Google Analytics Plugin installed and configured for "
1240
- "this to work."
1241
  msgstr ""
1242
 
1243
- #: app/views/links/form.php:180
1244
- msgid ""
1245
- "It appears that <strong>%s</strong> is currently installed. Pretty Link will "
1246
- "attempt to use its settings to track this link."
1247
  msgstr ""
1248
 
1249
- #: app/views/links/form.php:185
1250
- msgid ""
1251
- "No Google Analytics Plugin is currently installed. Pretty Link cannot track "
1252
- "links using Google Analytics until one is."
1253
  msgstr ""
1254
 
1255
- #: app/views/links/form.php:198
1256
- msgid "Pro Options"
 
1257
  msgstr ""
1258
 
1259
- #: app/views/links/form.php:218
1260
- msgid "Oops!"
 
1261
  msgstr ""
1262
 
1263
- #: app/views/links/list.php:13 app/views/links/new.php:4
1264
- msgid "Add Pretty Link"
 
1265
  msgstr ""
1266
 
1267
- #: app/views/links/list.php:19
1268
- msgid ""
1269
- "WordPress Must be Configured:</strong> Pretty Link won't work until you "
1270
- "select a Permalink Structure other than 'Default'"
1271
  msgstr ""
1272
 
1273
- #: app/views/links/list.php:19 app/views/options/form.php:12
1274
- msgid "Permalink Settings"
 
1275
  msgstr ""
1276
 
1277
- #: app/views/links/list.php:45
1278
- msgid "Back to Groups"
 
1279
  msgstr ""
1280
 
1281
- #: app/views/links/list.php:54 app/views/links/list.php:155
1282
- msgid "Clicks / Uniq"
 
1283
  msgstr ""
1284
 
1285
- #: app/views/links/list.php:68
1286
- msgid "Bulk Edit"
 
1287
  msgstr ""
1288
 
1289
- #: app/views/links/list.php:75
1290
- msgid "Basic Link Options"
 
1291
  msgstr ""
1292
 
1293
- #: app/views/links/list.php:76 app/views/shared/tinymce_form_popup.php:59
1294
- msgid "Redirect Type"
 
1295
  msgstr ""
1296
 
1297
- #: app/views/links/list.php:82
1298
- msgid "Track"
 
1299
  msgstr ""
1300
 
1301
- #: app/views/links/list.php:84 app/views/shared/tinymce_form_popup.php:76
1302
- msgid "Nofollow"
 
1303
  msgstr ""
1304
 
1305
- #: app/views/links/list.php:86
1306
- msgid "Forward Params"
 
 
1307
  msgstr ""
1308
 
1309
- #: app/views/links/list.php:94
1310
- msgid "Bulk Update"
 
1311
  msgstr ""
1312
 
1313
- #: app/views/links/list.php:104
1314
- msgid "No Pretty Links were found, %sCreate One%s"
 
1315
  msgstr ""
1316
 
1317
- #: app/views/links/list.php:143
1318
- msgid "Target URL:"
 
 
1319
  msgstr ""
1320
 
1321
- #: app/views/options/form.php:4
1322
- msgid "User Manual"
 
1323
  msgstr ""
1324
 
1325
- #: app/views/options/form.php:12
1326
- msgid "WordPress Must be Configured:"
 
1327
  msgstr ""
1328
 
1329
- #: app/views/options/form.php:12
1330
- msgid ""
1331
- "Pretty Link won't work until you select a Permalink Structure other than "
1332
- "'Default'"
1333
  msgstr ""
1334
 
1335
- #: app/views/options/form.php:37
1336
- msgid "General"
 
1337
  msgstr ""
1338
 
1339
- #: app/views/options/form.php:40
1340
- msgid "Reporting"
 
1341
  msgstr ""
1342
 
1343
- #: app/views/options/form.php:47
1344
- msgid "General Options"
 
 
1345
  msgstr ""
1346
 
1347
- #: app/views/options/form.php:53
1348
- msgid "Default Link Options"
 
1349
  msgstr ""
1350
 
1351
- #: app/views/options/form.php:61
1352
- msgid ""
1353
- "Select the type of redirection you want your newly created links to have."
1354
  msgstr ""
1355
 
1356
- #: app/views/options/form.php:70 app/views/options/form.php:72
1357
- msgid "Enable Tracking"
 
 
1358
  msgstr ""
1359
 
1360
- #: app/views/options/form.php:73
1361
- msgid "Default all new links to be tracked."
 
1362
  msgstr ""
1363
 
1364
- #: app/views/options/form.php:82
1365
- msgid "Enable No Follow"
 
1366
  msgstr ""
1367
 
1368
- #: app/views/options/form.php:84
1369
- msgid "Add No Follow"
 
 
1370
  msgstr ""
1371
 
1372
- #: app/views/options/form.php:85
1373
- msgid "Add the 'nofollow' attribute by default to new links."
 
1374
  msgstr ""
1375
 
1376
- #: app/views/options/form.php:94
1377
- msgid "Enable Permalink Fix"
 
1378
  msgstr ""
1379
 
1380
- #: app/views/options/form.php:96
1381
- msgid "Use fix for index.php Permalink Structure"
 
 
1382
  msgstr ""
1383
 
1384
- #: app/views/options/form.php:97
1385
- msgid ""
1386
- "This option should ONLY be checked if you have elements in your permalink "
1387
- "structure that must be present in any link on your site. For example, some "
1388
- "WordPress installs don't have the benefit of full rewrite capabilities and "
1389
- "in this case you'd need an index.php included in each link (http://example."
1390
- "com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this "
1391
- "is the case for you then check this option but the vast majority of users "
1392
- "will want to keep this unchecked."
1393
  msgstr ""
1394
 
1395
- #: app/views/options/form.php:110
1396
- msgid "Reporting Options"
 
1397
  msgstr ""
1398
 
1399
- #: app/views/options/form.php:115 app/views/options/form.php:117
1400
- msgid "Tracking Style"
 
1401
  msgstr ""
1402
 
1403
- #: app/views/options/form.php:118
1404
- msgid ""
1405
- "Changing your tracking style can affect the accuracy of your existing "
1406
- "statistics. Extended mode must be used for Conversion reporting."
1407
  msgstr ""
1408
 
1409
- #: app/views/options/form.php:122
1410
- msgid "Normal Tracking"
 
1411
  msgstr ""
1412
 
1413
- #: app/views/options/form.php:123
1414
- msgid "Extended Tracking (more stats / slower performance)"
 
1415
  msgstr ""
1416
 
1417
- #: app/views/options/form.php:124
1418
- msgid "Simple Click Count Tracking (less stats / faster performance)"
 
1419
  msgstr ""
1420
 
1421
- #: app/views/options/form.php:130
1422
- msgid "Excluded IP Addresses:"
 
1423
  msgstr ""
1424
 
1425
- #: app/views/options/form.php:132
1426
- msgid "Excluded IP Addresses"
 
1427
  msgstr ""
1428
 
1429
- #: app/views/options/form.php:133
1430
- msgid ""
1431
- "Enter IP Addresses or IP Ranges you want to exclude from your Click data and "
1432
- "Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, "
1433
- "192.168.2.1, 192.168.3.4 or 192.168.*.*<br/><br/><strong>FYI, your current "
1434
- "IP address is %s."
1435
  msgstr ""
1436
 
1437
- #: app/views/options/form.php:143
1438
- msgid "Auto-Trim Clicks"
 
1439
  msgstr ""
1440
 
1441
- #: app/views/options/form.php:145
1442
- msgid "Automatically Trim Clicks"
 
1443
  msgstr ""
1444
 
1445
- #: app/views/options/form.php:146
1446
- msgid ""
1447
- "Will automatically delete all hits older than 90 days. We strongly recommend "
1448
- "doing this to keep your database performance up. This will permanently "
1449
- "delete this click data, and is not undo-able. "
1450
  msgstr ""
1451
 
1452
- #: app/views/options/form.php:155 app/views/options/form.php:157
1453
- msgid "Filter Robots"
 
 
1454
  msgstr ""
1455
 
1456
- #: app/views/options/form.php:158
1457
- msgid ""
1458
- "Filter known Robots and unidentifiable browser clients from your click data, "
1459
- "stats and reports. Works best if Tracking Style above is set to 'Extended "
1460
- "Tracking'."
1461
  msgstr ""
1462
 
1463
- #: app/views/options/form.php:174
1464
- msgid "Whitelist IP Addresses"
 
1465
  msgstr ""
1466
 
1467
- #: app/views/options/form.php:176
1468
- msgid "Whiltelist IP Addresses"
 
 
1469
  msgstr ""
1470
 
1471
- #: app/views/options/form.php:177
1472
- msgid ""
1473
- "Enter IP Addresses or IP Ranges you want to always include in your Click "
1474
- "data and Stats even if they are flagged as robots. Each IP Address should be "
1475
- "separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or "
1476
- "192.168.*.*"
1477
  msgstr ""
1478
 
1479
- #: app/views/shared/link-table-nav.php:17
1480
- #: app/views/shared/link-table-nav.php:108 app/views/shared/table-nav.php:12
1481
- msgid "Displaying"
1482
  msgstr ""
1483
 
1484
- #: app/views/shared/nav.php:6
1485
- msgid "Pro Manual"
 
1486
  msgstr ""
1487
 
1488
- #: app/views/shared/nav.php:14
1489
- msgid "Connect:"
 
 
1490
  msgstr ""
1491
 
1492
- #: app/views/shared/nav.php:18
1493
- msgid "Get Help:"
 
1494
  msgstr ""
1495
 
1496
- #: app/views/shared/nav.php:19
1497
- msgid "Tutorials"
 
1498
  msgstr ""
1499
 
1500
- #: app/views/shared/public_link.php:23
1501
- msgid "Here is your Pretty Link"
 
 
1502
  msgstr ""
1503
 
1504
- #: app/views/shared/public_link.php:41
1505
- msgid "Here's your pretty link for"
 
1506
  msgstr ""
1507
 
1508
- #: app/views/shared/public_link.php:52
1509
- msgid "send this link to:"
 
 
1510
  msgstr ""
1511
 
1512
- #: app/views/shared/public_link.php:56
1513
- msgid "back"
 
1514
  msgstr ""
1515
 
1516
- #: app/views/shared/tinymce_form_popup.php:4
1517
- msgid "Insert Pretty Link"
 
1518
  msgstr ""
1519
 
1520
- #: app/views/shared/tinymce_form_popup.php:40
1521
- msgid "Create New Pretty Link"
 
1522
  msgstr ""
1523
 
1524
- #: app/views/shared/tinymce_form_popup.php:47
1525
- msgid "Slug"
 
1526
  msgstr ""
1527
 
1528
- #: app/views/shared/tinymce_form_popup.php:50
1529
- msgid "valid"
1530
  msgstr ""
1531
 
1532
- #: app/views/shared/tinymce_form_popup.php:51
1533
- msgid "invalid"
1534
  msgstr ""
1535
 
1536
- #: app/views/shared/tinymce_form_popup.php:55
1537
- #: app/views/shared/tinymce_form_popup.php:112
1538
- msgid "Link Text"
1539
  msgstr ""
1540
 
1541
- #: app/views/shared/tinymce_form_popup.php:61
1542
- #: app/views/shared/tinymce_form_popup.php:78
1543
- #: app/views/shared/tinymce_form_popup.php:86
1544
- #: pro/app/views/tools/generator.php:22 pro/app/views/tools/generator.php:27
1545
- #: pro/app/widgets/PlpPublicLinksWidget.php:59
1546
- #: pro/app/widgets/PlpPublicLinksWidget.php:71
1547
- msgid "Default"
1548
  msgstr ""
1549
 
1550
- #: app/views/shared/tinymce_form_popup.php:67
1551
- #: pro/app/controllers/PlpLinksController.php:628
1552
- #: pro/app/controllers/PlpLinksController.php:667
1553
- #: pro/app/views/options/nav.php:5
1554
- msgid "Pretty Bar"
1555
  msgstr ""
1556
 
1557
- #: app/views/shared/tinymce_form_popup.php:68
1558
- #: pro/app/controllers/PlpLinksController.php:629
1559
- msgid "Cloaked"
1560
  msgstr ""
1561
 
1562
- #: app/views/shared/tinymce_form_popup.php:69
1563
- #: pro/app/controllers/PlpLinksController.php:630
1564
- #: pro/app/controllers/PlpLinksController.php:669
1565
- msgid "Pixel"
1566
  msgstr ""
1567
 
1568
- #: app/views/shared/tinymce_form_popup.php:70
1569
- #: pro/app/controllers/PlpLinksController.php:631
1570
- #: pro/app/controllers/PlpLinksController.php:670
1571
- msgid "Meta Refresh"
1572
  msgstr ""
1573
 
1574
- #: app/views/shared/tinymce_form_popup.php:71
1575
- #: pro/app/controllers/PlpLinksController.php:632
1576
- #: pro/app/controllers/PlpLinksController.php:671
1577
- msgid "Javascript"
1578
  msgstr ""
1579
 
1580
- #: app/views/shared/tinymce_form_popup.php:79
1581
- #: app/views/shared/tinymce_form_popup.php:87
1582
- msgid "Enabled"
1583
  msgstr ""
1584
 
1585
- #: app/views/shared/tinymce_form_popup.php:80
1586
- #: app/views/shared/tinymce_form_popup.php:88
1587
- msgid "Disabled"
1588
  msgstr ""
1589
 
1590
- #: app/views/shared/tinymce_form_popup.php:93
1591
- #: app/views/shared/tinymce_form_popup.php:117
1592
- msgid "Open this Pretty Link in a new window/tab"
1593
  msgstr ""
1594
 
1595
- #: app/views/shared/tinymce_form_popup.php:96
1596
- msgid "Insert New Pretty Link"
1597
  msgstr ""
1598
 
1599
- #: app/views/shared/tinymce_form_popup.php:100
1600
- msgid "Use Existing Pretty Link"
1601
  msgstr ""
1602
 
1603
- #: app/views/shared/tinymce_form_popup.php:102
1604
- msgid "Search by Slug, Title, or Target URL..."
1605
  msgstr ""
1606
 
1607
- #: app/views/shared/tinymce_form_popup.php:121
1608
- msgid "Insert Existing Pretty Link"
1609
  msgstr ""
1610
 
1611
- #: app/views/tools/form.php:18 app/views/tools/form.php:25
1612
- msgid "Bookmarklet"
1613
  msgstr ""
1614
 
1615
- #: app/views/tools/form.php:19 app/views/tools/form.php:48
1616
- msgid "Trim Clicks"
1617
  msgstr ""
1618
 
1619
- #: app/views/tools/form.php:26 pro/app/views/tools/generator.php:7
1620
- #: pro/app/views/tools/generator.php:17
1621
- msgid "Get Pretty Link"
1622
  msgstr ""
1623
 
1624
- #: app/views/tools/form.php:28
1625
- msgid "Install Pretty Link Bookmarklet"
 
1626
  msgstr ""
1627
 
1628
- #: app/views/tools/form.php:29
1629
- msgid ""
1630
- "Just drag this \"Get PrettyLink\" link to your toolbar to install the "
1631
- "bookmarklet. As you browse the web, you can just click this bookmarklet to "
1632
- "create a pretty link from the current url you're looking at. <a href="
1633
- "\"http://blairwilliams.com/pretty-link-bookmarklet/\">(more help)</a>"
1634
  msgstr ""
1635
 
1636
- #: app/views/tools/form.php:31
1637
- msgid "Show iPhone Bookmarklet Instructions"
1638
  msgstr ""
1639
 
1640
- #: app/views/tools/form.php:35
1641
- msgid ""
1642
- "<strong>Note:</strong> iPhone users can install this bookmarklet in their "
1643
- "Safari to create Pretty Links with the following steps:"
1644
  msgstr ""
1645
 
1646
- #: app/views/tools/form.php:37
1647
- msgid "Copy this text:"
1648
  msgstr ""
1649
 
1650
- #: app/views/tools/form.php:38
1651
- msgid "Tap the + button at the bottom of the screen"
1652
  msgstr ""
1653
 
1654
- #: app/views/tools/form.php:39
1655
- msgid ""
1656
- "Choose to share the page, then click on \"Bookmark\". We recommend saving it "
1657
- "in your Favorites folder. Rename your bookmark to \"Get PrettyLink\" (or "
1658
- "whatever you want) and then \"Save\""
1659
  msgstr ""
1660
 
1661
- #: app/views/tools/form.php:40
1662
- msgid ""
1663
- "Navigate through your Bookmarks until you find the new bookmark and click "
1664
- "\"Edit\""
1665
  msgstr ""
1666
 
1667
- #: app/views/tools/form.php:41
1668
- msgid "Delete all the text from the address"
1669
  msgstr ""
1670
 
1671
- #: app/views/tools/form.php:42
1672
- msgid "Paste the text you copied in Step 1 into the address field"
1673
  msgstr ""
1674
 
1675
- #: app/views/tools/form.php:43
1676
- msgid "To save the changes hit \"Bookmarks\" and <strong>you're done!"
1677
  msgstr ""
1678
 
1679
- #: app/views/tools/form.php:43
1680
- msgid ""
1681
- "Now when you find a page you want to save off as a Pretty Link, just click "
1682
- "the \"Bookmarks\" icon at the bottom of the screen and select your \"Get "
1683
- "PrettyLink\" bookmarklet."
1684
  msgstr ""
1685
 
1686
- #: app/views/tools/form.php:50
1687
- msgid ""
1688
- "Pretty Link is already automatically trimming Clicks older than 90 days. "
1689
- "Although not necessary, you can still use the buttons below to force click "
1690
- "trimming."
1691
  msgstr ""
1692
 
1693
- #: app/views/tools/form.php:53
1694
- msgid ""
1695
- "***WARNING*** If you click OK you will delete ALL of the Click data that is "
1696
- "older than 30 days. Your data will be gone forever -- no way to retreive it. "
1697
- "Do not click OK unless you are absolutely sure you want to delete this data "
1698
- "because there is no going back!"
1699
  msgstr ""
1700
 
1701
- #: app/views/tools/form.php:53
1702
- msgid "Delete Clicks older than 30 days"
1703
  msgstr ""
1704
 
1705
- #: app/views/tools/form.php:55
1706
- msgid "Clear clicks 30 days or older"
 
1707
  msgstr ""
1708
 
1709
- #: app/views/tools/form.php:56
1710
- msgid ""
1711
- "This will clear all clicks in your database that are older than 30 days."
1712
  msgstr ""
1713
 
1714
- #: app/views/tools/form.php:58
1715
- msgid ""
1716
- "***WARNING*** If you click OK you will delete ALL of the Click data that is "
1717
- "older than 90 days. Your data will be gone forever -- no way to retreive it. "
1718
- "Do not click OK unless you are absolutely sure you want to delete this data "
1719
- "because there is no going back!"
1720
  msgstr ""
1721
 
1722
- #: app/views/tools/form.php:58
1723
- msgid "Delete Clicks older than 90 days"
 
 
 
 
 
 
1724
  msgstr ""
1725
 
1726
- #: app/views/tools/form.php:60
1727
- msgid "Clear clicks 90 days or older"
1728
  msgstr ""
1729
 
1730
- #: app/views/tools/form.php:61
1731
- msgid ""
1732
- "This will clear all clicks in your database that are older than 90 days."
 
1733
  msgstr ""
1734
 
1735
- #: app/views/tools/form.php:65
1736
- msgid ""
1737
- "***WARNING*** If you click OK you will delete ALL of the Click data in your "
1738
- "Database. Your data will be gone forever -- no way to retreive it. Do not "
1739
- "click OK unless you are absolutely sure you want to delete all your data "
1740
- "because there is no going back!"
1741
  msgstr ""
1742
 
1743
- #: app/views/tools/form.php:65
1744
- msgid "Delete All Clicks"
 
1745
  msgstr ""
1746
 
1747
- #: app/views/tools/form.php:67
1748
- msgid "Clear all clicks"
1749
  msgstr ""
1750
 
1751
- #: app/views/tools/form.php:68
1752
- msgid ""
1753
- "Seriously, only click this link if you want to delete all the Click data in "
1754
- "your database."
1755
  msgstr ""
1756
 
1757
- #: pro/app/controllers/PlpAppController.php:165
1758
- msgid "ERROR: Your Pretty Link was unable to be created"
1759
  msgstr ""
1760
 
1761
- #: pro/app/controllers/PlpAppController.php:169
1762
- msgid "Unauthorized"
1763
  msgstr ""
1764
 
1765
- #: pro/app/controllers/PlpImportExportController.php:12
1766
- msgid "Pretty Links Pro | Import/Export"
 
1767
  msgstr ""
1768
 
1769
- #: pro/app/controllers/PlpImportExportController.php:13
1770
- msgid "Pro Import/Export"
1771
  msgstr ""
1772
 
1773
- #: pro/app/controllers/PlpKeywordsController.php:70
1774
- msgid "Pretty Link Post Build Index"
1775
  msgstr ""
1776
 
1777
- #: pro/app/controllers/PlpKeywordsController.php:485
1778
- #: pro/app/views/links/form.php:128
1779
- msgid "Keywords"
1780
  msgstr ""
1781
 
1782
- #: pro/app/controllers/PlpLinksController.php:213
1783
- msgid ""
1784
- "Your URL Replacements must be formatted as a comma separated list of "
1785
- "properly formatted URLs (http[s]://example.com/whatever)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1786
  msgstr ""
1787
 
1788
- #: pro/app/controllers/PlpLinksController.php:224
 
 
 
 
1789
  msgid "Date must be valid and formatted YYYY-MM-DD."
1790
  msgstr ""
1791
 
1792
- #: pro/app/controllers/PlpLinksController.php:236
1793
  msgid "Expire Clicks must be a number greater than zero."
1794
  msgstr ""
1795
 
1796
- #: pro/app/controllers/PlpLinksController.php:243
1797
  msgid "Expired URL must be a valid URL."
1798
  msgstr ""
1799
 
1800
- #: pro/app/controllers/PlpLinksController.php:255
1801
  msgid "Your URL Rotations must all be properly formatted URLs."
1802
  msgstr ""
1803
 
1804
- #: pro/app/controllers/PlpLinksController.php:264
1805
  msgid "Your Link Rotation Weights must add up to 100%."
1806
  msgstr ""
1807
 
1808
- #: pro/app/controllers/PlpLinksController.php:274
1809
  msgid "Your Geographic Redirect URLs must all be properly formatted."
1810
  msgstr ""
1811
 
1812
- #: pro/app/controllers/PlpLinksController.php:278
1813
  msgid "Your Geographic Redirects URLs must not be empty."
1814
  msgstr ""
1815
 
1816
- #: pro/app/controllers/PlpLinksController.php:282
1817
  msgid "Your Geographic Redirect Countries must not be empty."
1818
  msgstr ""
1819
 
1820
- #: pro/app/controllers/PlpLinksController.php:293
1821
  msgid "Your Technology Redirect URLs must all be properly formatted."
1822
  msgstr ""
1823
 
1824
- #: pro/app/controllers/PlpLinksController.php:297
1825
  msgid "Your Technology Redirects URLs must not be empty."
1826
  msgstr ""
1827
 
1828
- #: pro/app/controllers/PlpLinksController.php:308
1829
  msgid "Your Time Period Redirect URLs must all be properly formatted."
1830
  msgstr ""
1831
 
1832
- #: pro/app/controllers/PlpLinksController.php:312
1833
  msgid "Your Time Period Redirects URLs must not be empty."
1834
  msgstr ""
1835
 
1836
- #: pro/app/controllers/PlpLinksController.php:317
1837
  msgid "Your Time Period Redirect start time must not be empty."
1838
  msgstr ""
1839
 
1840
- #: pro/app/controllers/PlpLinksController.php:320
1841
  msgid "Your Time Period Redirect start time must be a properly formatted date."
1842
  msgstr ""
1843
 
1844
- #: pro/app/controllers/PlpLinksController.php:326
1845
  msgid "Your Time Period Redirect end time must not be empty."
1846
  msgstr ""
1847
 
1848
- #: pro/app/controllers/PlpLinksController.php:329
1849
  msgid "Your Time Period Redirect end time must be a properly formatted date."
1850
  msgstr ""
1851
 
1852
- #: pro/app/controllers/PlpLinksController.php:337
1853
  msgid "Your Time Period Redirect start time must come before the end time."
1854
  msgstr ""
1855
 
1856
- #: pro/app/controllers/PlpLinksController.php:345
1857
  msgid "Delay Redirect must be a number"
1858
  msgstr ""
1859
 
 
1860
  #: pro/app/controllers/PlpLinksController.php:668
1861
- #: pro/app/widgets/PlpPublicLinksWidget.php:64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1862
  msgid "Cloak"
1863
  msgstr ""
1864
 
1865
- #: pro/app/controllers/PlpLinksController.php:736
1866
  msgid "View QR Code for this link: %s"
1867
  msgstr ""
1868
 
1869
- #: pro/app/controllers/PlpLinksController.php:740
 
 
 
 
 
1870
  msgid "Download QR Code for this link: %s"
1871
  msgstr ""
1872
 
@@ -1883,8 +2044,7 @@ msgid "This link is set to expire after the date %s"
1883
  msgstr ""
1884
 
1885
  #: pro/app/controllers/PlpLinksController.php:829
1886
- msgid ""
1887
- "This link expired after %d clicks and will now cause a 404 error when visited"
1888
  msgstr ""
1889
 
1890
  #: pro/app/controllers/PlpLinksController.php:832
@@ -1908,48 +2068,62 @@ msgid "This link has additional Technology Dependent Conditional Target URLs"
1908
  msgstr ""
1909
 
1910
  #: pro/app/controllers/PlpLinksController.php:855
1911
- msgid ""
1912
- "A Time Period Redirect is currently active for this link. When visited it "
1913
- "will currently redirect to %s rather than the Target URL unless the link is "
1914
- "expired."
1915
  msgstr ""
1916
 
1917
  #: pro/app/controllers/PlpLinksController.php:859
1918
- msgid ""
1919
- "Time Period Redirects have been setup for this link but the current time is "
1920
- "not within any of them currently."
1921
  msgstr ""
1922
 
1923
- #: pro/app/controllers/PlpOptionsController.php:102
1924
- msgid "Keywords Per Page is required"
1925
  msgstr ""
1926
 
1927
- #: pro/app/controllers/PlpOptionsController.php:106
1928
- msgid "Keyword Links Per Page is required"
 
1929
  msgstr ""
1930
 
1931
- #: pro/app/controllers/PlpOptionsController.php:111
1932
- msgid ""
1933
- "You need to enter a valid Pretty Link Base URL now that you have selected "
1934
- "\"Use an alternate base url for your Pretty Links\""
1935
  msgstr ""
1936
 
1937
- #: pro/app/controllers/PlpOptionsController.php:116
1938
- msgid ""
1939
- "You need to enter a valid Public Link Display URL now that you have selected "
1940
- "\"Use a custom public link display page\""
1941
  msgstr ""
1942
 
1943
- #: pro/app/controllers/PlpOptionsController.php:122
1944
- msgid "Pretty Bar Attribution URL must be a correctly formatted URL"
1945
  msgstr ""
1946
 
1947
- #: pro/app/controllers/PlpPostsController.php:50
1948
- msgid "Pretty Links Pro"
1949
  msgstr ""
1950
 
1951
- #: pro/app/controllers/PlpPostsController.php:54
1952
- msgid "Pretty Links Pro Options"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1953
  msgstr ""
1954
 
1955
  #: pro/app/controllers/PlpPrettyBarController.php:50
@@ -2001,2757 +2175,2976 @@ msgstr ""
2001
  msgid "PrettyBar Link Character Limit must be a number"
2002
  msgstr ""
2003
 
2004
- #: pro/app/controllers/PlpPublicLinksController.php:98
2005
- #: pro/app/helpers/PlpPublicLinksHelper.php:6
2006
- msgid "Enter a URL:"
2007
  msgstr ""
2008
 
2009
- #: pro/app/controllers/PlpPublicLinksController.php:99
2010
- #: pro/app/helpers/PlpPublicLinksHelper.php:7
2011
- msgid "Shrink"
2012
  msgstr ""
2013
 
2014
- #: pro/app/controllers/PlpReportsController.php:12
2015
- msgid "Pretty Links Pro | Reports"
 
 
 
2016
  msgstr ""
2017
 
2018
- #: pro/app/controllers/PlpReportsController.php:13
2019
- msgid "Pro Reports"
2020
  msgstr ""
2021
 
2022
- #: pro/app/controllers/PlpReportsController.php:49
2023
  msgid "Create a custom link report and analyze your data."
2024
  msgstr ""
2025
 
2026
- #: pro/app/controllers/PlpReportsController.php:60
2027
- msgid "View the Split Test Report for %s"
2028
- msgstr ""
2029
-
2030
- #: pro/app/controllers/PlpReportsController.php:86
2031
  msgid "Your Pretty Link Report was Successfully Created"
2032
  msgstr ""
2033
 
2034
- #: pro/app/controllers/PlpReportsController.php:116
2035
  msgid "Your Pretty Link Report was Successfully Updated"
2036
  msgstr ""
2037
 
2038
- #: pro/app/controllers/PlpReportsController.php:125
2039
  msgid "Your Pretty Link Report was Successfully Deleted"
2040
  msgstr ""
2041
 
2042
- #: pro/app/helpers/PlpLinksHelper.php:18 pro/app/views/links/form.php:209
2043
- msgid "weight:"
2044
  msgstr ""
2045
 
2046
- #: pro/app/helpers/PlpPostsHelper.php:19
2047
- msgid "Hide Social Buttons on this post."
2048
  msgstr ""
2049
 
2050
- #: pro/app/helpers/PlpPostsHelper.php:26
2051
- msgid "Disable Keyword Replacements on this post."
 
2052
  msgstr ""
2053
 
2054
- #: pro/app/helpers/PlpPostsHelper.php:44
2055
- msgid "A Pretty Link will be created on Publish"
 
2056
  msgstr ""
2057
 
2058
- #: pro/app/helpers/PlpPostsHelper.php:63
2059
- #: pro/app/views/reports/custom-report.php:32
2060
- #: pro/app/views/reports/custom-report.php:65
2061
- #: pro/app/views/reports/split-test-report.php:29
2062
- #: pro/app/views/reports/split-test-report.php:61
2063
- msgid "Uniques"
2064
  msgstr ""
2065
 
2066
- #: pro/app/helpers/PlpPostsHelper.php:68
2067
- msgid "edit"
2068
  msgstr ""
2069
 
2070
- #: pro/app/helpers/PlpPostsHelper.php:70
2071
- msgid "Visit Pretty Link:"
2072
  msgstr ""
2073
 
2074
- #: pro/app/helpers/PlpPostsHelper.php:70
2075
- msgid "in a New Window"
2076
  msgstr ""
2077
 
2078
- #: pro/app/helpers/PlpPostsHelper.php:70
2079
- msgid "visit"
2080
  msgstr ""
2081
 
2082
- #: pro/app/helpers/PlpPostsHelper.php:76
2083
- msgid ""
2084
- "A Pretty Link hasn't been generated for this entry yet. Click \"Update Post"
2085
- "\" to generate."
2086
  msgstr ""
2087
 
2088
- #: pro/app/models/PlpOptions.php:99
2089
- msgid "Facebook"
2090
  msgstr ""
2091
 
2092
- #: pro/app/models/PlpOptions.php:106
2093
- msgid "Twitter"
2094
  msgstr ""
2095
 
2096
- #: pro/app/models/PlpOptions.php:113
2097
- msgid "Google+"
2098
  msgstr ""
2099
 
2100
- #: pro/app/models/PlpOptions.php:120
2101
- msgid "Pinterest"
2102
  msgstr ""
2103
 
2104
- #: pro/app/models/PlpOptions.php:127
2105
- msgid "LinkedIn"
2106
  msgstr ""
2107
 
2108
- #: pro/app/models/PlpOptions.php:134
2109
- msgid "Reddit"
 
2110
  msgstr ""
2111
 
2112
- #: pro/app/models/PlpOptions.php:141
2113
- msgid "StumbleUpon"
2114
  msgstr ""
2115
 
2116
- #: pro/app/models/PlpOptions.php:148
2117
- msgid "Digg"
2118
  msgstr ""
2119
 
2120
- #: pro/app/models/PlpOptions.php:155
2121
- msgid "Email"
2122
  msgstr ""
2123
 
2124
- #: pro/app/models/PlpOptions.php:238
2125
- msgid "Affiliate Link Disclosures"
2126
  msgstr ""
2127
 
2128
- #: pro/app/models/PlpOptions.php:247
2129
- msgid "(aff)"
2130
  msgstr ""
2131
 
2132
- #: pro/app/models/PlpPostOptions.php:33
2133
- msgid "This pretty link slug is already taken, please choose a different one"
2134
  msgstr ""
2135
 
2136
- #: pro/app/models/PlpReport.php:149
2137
- msgid "Report must have a name."
2138
  msgstr ""
2139
 
2140
- #: pro/app/models/PlpReport.php:153
2141
- msgid "At least one link must be selected for analysis."
2142
  msgstr ""
2143
 
2144
- #: pro/app/models/PlpReport.php:244
2145
- msgid "Pretty Links Pro: Clicks for"
2146
  msgstr ""
2147
 
2148
- #: pro/app/models/PlpReport.php:244
2149
- msgid "report between"
2150
  msgstr ""
2151
 
2152
- #: pro/app/models/PlpReport.php:251 pro/app/models/PlpReport.php:397
2153
- #: pro/app/views/reports/custom-report.php:34
2154
- #: pro/app/views/reports/custom-report.php:67
2155
- #: pro/app/views/reports/split-test-report.php:31
2156
- #: pro/app/views/reports/split-test-report.php:63
2157
- msgid "Conversions"
2158
  msgstr ""
2159
 
2160
- #: pro/app/models/PlpReport.php:385
2161
- msgid "Pretty Links Pro: Split Report for"
2162
  msgstr ""
2163
 
2164
- #: pro/app/models/PlpReport.php:397 pro/app/models/PlpReport.php:404
2165
- #: pro/app/views/links/form.php:186
2166
- msgid "Rotation"
2167
  msgstr ""
2168
 
2169
- #: pro/app/models/PlpUtils.php:36
2170
- msgid "Google Analyticator"
2171
  msgstr ""
2172
 
2173
- #: pro/app/models/PlpUtils.php:39
2174
- msgid "Google Analytics by MonsterInsights"
2175
  msgstr ""
2176
 
2177
- #: pro/app/views/import-export/form.php:4
2178
- msgid "Import / Export Links"
2179
  msgstr ""
2180
 
2181
- #: pro/app/views/import-export/form.php:9
2182
- #: pro/app/views/import-export/form.php:12
2183
- msgid "Export Pretty Links"
2184
  msgstr ""
2185
 
2186
- #: pro/app/views/import-export/form.php:13
2187
- msgid "Export Links to a CSV File"
2188
  msgstr ""
2189
 
2190
- #: pro/app/views/import-export/form.php:17
2191
- msgid "Export"
2192
  msgstr ""
2193
 
2194
- #: pro/app/views/import-export/form.php:22
2195
- #: pro/app/views/import-export/form.php:25
2196
- msgid "Import Pretty Links"
2197
  msgstr ""
2198
 
2199
- #: pro/app/views/import-export/form.php:26
2200
- msgid ""
2201
- "There are two ways to import a file.<br/><br/>1) Importing to update "
2202
- "existing links and<br/><br/>2) Importing to generate new links. When "
2203
- "Importing to generate new links, you must delete the \"id\" column from the "
2204
- "CSV before importing. If the \"id\" column is present, Pretty Links Pro will "
2205
- "attempt to update existing links."
2206
  msgstr ""
2207
 
2208
- #: pro/app/views/import-export/form.php:36
2209
- msgid "Import"
2210
  msgstr ""
2211
 
2212
- #: pro/app/views/import-export/form.php:39
2213
- msgid "Links Import File"
2214
  msgstr ""
2215
 
2216
- #: pro/app/views/import-export/form.php:40
2217
- msgid ""
2218
- "Select a file that has been formatted as a Pretty Link CSV import file and "
2219
- "click \"Import\""
2220
  msgstr ""
2221
 
2222
- #: pro/app/views/import-export/form.php:48
2223
- msgid "Import/Export Help"
2224
  msgstr ""
2225
 
2226
- #: pro/app/views/import-export/import.php:4
2227
- msgid "Import Results"
2228
  msgstr ""
2229
 
2230
- #: pro/app/views/import-export/import.php:5
2231
- msgid "Total Rows:"
2232
  msgstr ""
2233
 
2234
- #: pro/app/views/import-export/import.php:7
2235
- msgid "Pretty Links were Successfully Created"
2236
  msgstr ""
2237
 
2238
- #: pro/app/views/import-export/import.php:8
2239
- msgid "Pretty Links were Successfully Updated"
2240
  msgstr ""
2241
 
2242
- #: pro/app/views/import-export/import.php:13
2243
- msgid "Pretty Links were unable to be Created:"
2244
  msgstr ""
2245
 
2246
- #: pro/app/views/import-export/import.php:17
2247
- msgid "Error(s) for Pretty Link with Slug:"
2248
  msgstr ""
2249
 
2250
- #: pro/app/views/import-export/import.php:32
2251
- msgid "Pretty Links were unable to be Updated:"
2252
  msgstr ""
2253
 
2254
- #: pro/app/views/import-export/import.php:36
2255
- msgid "Error(s) for Pretty Link with id:"
2256
  msgstr ""
2257
 
2258
- #: pro/app/views/links/bulk-edit.php:6
2259
- msgid "Advanced Link Options"
2260
  msgstr ""
2261
 
2262
- #: pro/app/views/links/cloaked-redirect.php:36
2263
- msgid "Your browser does not support frames."
2264
  msgstr ""
2265
 
2266
- #: pro/app/views/links/form.php:7
2267
- msgid "Expire"
2268
  msgstr ""
2269
 
2270
- #: pro/app/views/links/form.php:10
2271
- msgid "Expire Link"
2272
  msgstr ""
2273
 
2274
- #: pro/app/views/links/form.php:11
2275
- msgid "Set this link to expire after a specific date or number of clicks."
2276
  msgstr ""
2277
 
2278
- #: pro/app/views/links/form.php:26
2279
- msgid "Expire After"
2280
  msgstr ""
2281
 
2282
- #: pro/app/views/links/form.php:29
2283
- msgid "Expiration Type"
2284
  msgstr ""
2285
 
2286
- #: pro/app/views/links/form.php:30
2287
- msgid ""
2288
- "Select the type of expiration you want for this link.<br/><br/><b>Date</b> "
2289
- "Select this option if you'd like to expire your link after a certain date."
2290
- "<br/><br/><b>Clicks</b>: Select this option to expire this link after it has "
2291
- "been clicked a specific number of times."
2292
  msgstr ""
2293
 
2294
- #: pro/app/views/links/form.php:51
2295
- msgid "Number of Clicks"
2296
  msgstr ""
2297
 
2298
- #: pro/app/views/links/form.php:52
2299
- msgid ""
2300
- "Enter the number of times this link can be clicked before it expires.<br/"
2301
- "><br/><b>Note: Expirations based on clicks wouldn't work properly if you had "
2302
- "tracking turned off for this link so as long as this is set to Clicks, "
2303
- "Pretty Link will ensure tracking is turned on for this link as well.</b>"
2304
  msgstr ""
2305
 
2306
- #: pro/app/views/links/form.php:71
2307
- msgid "Expiration Date"
2308
  msgstr ""
2309
 
2310
- #: pro/app/views/links/form.php:72
2311
- msgid ""
2312
- "Enter a date here in the format YYYY-MM-DD to set when this link should "
2313
- "expire."
2314
  msgstr ""
2315
 
2316
- #: pro/app/views/links/form.php:88
2317
- msgid "Expired Redirect"
2318
  msgstr ""
2319
 
2320
- #: pro/app/views/links/form.php:91
2321
- msgid "Redirect to URL when Expired"
2322
  msgstr ""
2323
 
2324
- #: pro/app/views/links/form.php:92
2325
- msgid ""
2326
- "When this link expires, do you want to redirect to a specific URL. You can "
2327
- "use this to redirect to a page you've setup to indicate that the link is "
2328
- "expired.<br/><br/><b>Note: If this is not set the link will throw a 404 "
2329
- "error when expired</b>."
2330
  msgstr ""
2331
 
2332
- #: pro/app/views/links/form.php:107 pro/app/views/options/form.php:165
2333
- msgid "URL"
2334
  msgstr ""
2335
 
2336
- #: pro/app/views/links/form.php:110
2337
- msgid "Expired URL"
2338
  msgstr ""
2339
 
2340
- #: pro/app/views/links/form.php:111
2341
- msgid ""
2342
- "This is the URL that this link will redirect to after the expiration date "
2343
- "above."
2344
  msgstr ""
2345
 
2346
- #: pro/app/views/links/form.php:131
2347
- msgid "Auto-Replace Keywords"
2348
  msgstr ""
2349
 
2350
- #: pro/app/views/links/form.php:132
2351
- msgid ""
2352
- "Enter a comma separated list of keywords / keyword phrases that you'd like "
2353
- "to replace with this link in your Posts &amp; Pages."
2354
  msgstr ""
2355
 
2356
- #: pro/app/views/links/form.php:140
2357
- msgid "URL Replacements"
2358
  msgstr ""
2359
 
2360
- #: pro/app/views/links/form.php:143
2361
- msgid "Auto-Replace URLs"
2362
  msgstr ""
2363
 
2364
- #: pro/app/views/links/form.php:144
2365
- msgid ""
2366
- "Enter a comma separated list of the URLs that you'd like to replace with "
2367
- "this Pretty Link in your Posts &amp; Pages. These must be formatted as URLs "
2368
- "for example: <code>http://example.com</code> or <code>http://example.com?"
2369
- "product_id=53</code>"
2370
  msgstr ""
2371
 
2372
- #: pro/app/views/links/form.php:159 pro/app/views/links/form.php:162
2373
- msgid "Head Scripts"
2374
  msgstr ""
2375
 
2376
- #: pro/app/views/links/form.php:163
2377
- msgid ""
2378
- "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or "
2379
- "any other kind of tracking script to the HTML head for this pretty link.<br/"
2380
- "><br/>These scripts will be in addition to any global one's you've defined "
2381
- "in the options.<br/><br/><b>NOTE:</b> This does NOT work with 301, 302 and "
2382
- "307 type redirects."
2383
  msgstr ""
2384
 
2385
- #: pro/app/views/links/form.php:176
2386
- msgid "Dynamic Redirection"
2387
  msgstr ""
2388
 
2389
- #: pro/app/views/links/form.php:179
2390
- msgid "Dynamic Redirection Options"
2391
  msgstr ""
2392
 
2393
- #: pro/app/views/links/form.php:180
2394
- msgid ""
2395
- "These powerful options are available to give you dynamic control over "
2396
- "redirection for this pretty link."
2397
  msgstr ""
2398
 
2399
- #: pro/app/views/links/form.php:187
2400
- msgid "Geographic"
2401
  msgstr ""
2402
 
2403
- #: pro/app/views/links/form.php:188
2404
- msgid "Technology"
2405
  msgstr ""
2406
 
2407
- #: pro/app/views/links/form.php:189
2408
- msgid "Time"
2409
  msgstr ""
2410
 
2411
- #: pro/app/views/links/form.php:199 pro/app/views/links/form.php:202
2412
- msgid "Target URL Rotations"
2413
  msgstr ""
2414
 
2415
- #: pro/app/views/links/form.php:203
2416
- msgid ""
2417
- "Enter the Target URLs that you'd like to rotate through when this Pretty "
2418
- "Link is Clicked. These must be formatted as URLs example: <code>http://"
2419
- "example.com</code> or <code>http://example.com?product_id=53</code>"
2420
  msgstr ""
2421
 
2422
- #: pro/app/views/links/form.php:208
2423
- msgid "Target URL (above)"
2424
  msgstr ""
2425
 
2426
- #: pro/app/views/links/form.php:220
2427
- msgid "Add Link Rotation"
2428
  msgstr ""
2429
 
2430
- #: pro/app/views/links/form.php:226
2431
- msgid "Split Test"
2432
  msgstr ""
2433
 
2434
- #: pro/app/views/links/form.php:229
2435
- msgid "Split Test This Link"
2436
  msgstr ""
2437
 
2438
- #: pro/app/views/links/form.php:230
2439
- msgid ""
2440
- "Split testing will enable you to track the effectiveness of several links "
2441
- "against each other. This works best when you have multiple link rotation "
2442
- "URLs entered."
2443
  msgstr ""
2444
 
2445
- #: pro/app/views/links/form.php:246 pro/app/views/reports/list.php:31
2446
- #: pro/app/views/reports/list.php:71
2447
- msgid "Goal Link"
2448
  msgstr ""
2449
 
2450
- #: pro/app/views/links/form.php:249
2451
- msgid "Goal Link for Split Test"
2452
  msgstr ""
2453
 
2454
- #: pro/app/views/links/form.php:250
2455
- msgid "This is the goal link for your split test."
2456
- msgstr ""
2457
 
2458
- #: pro/app/views/links/form.php:261
2459
- msgid "id: %1$s | slug: %3$s | name: %2$s%4$s"
2460
  msgstr ""
2461
 
2462
- #: pro/app/views/links/form.php:281 pro/app/views/links/form.php:284
2463
- msgid "Geographic Redirects"
2464
  msgstr ""
2465
 
2466
- #: pro/app/views/links/form.php:285
2467
- msgid ""
2468
- "This will enable you to setup specific target urls that this pretty link "
2469
- "will redirect to based on the country of the person visiting the url."
2470
  msgstr ""
2471
 
2472
- #: pro/app/views/links/form.php:290 pro/app/views/links/form.php:304
2473
- #: pro/app/views/links/form.php:318
2474
- msgid "Add"
2475
  msgstr ""
2476
 
2477
- #: pro/app/views/links/form.php:295 pro/app/views/links/form.php:298
2478
- msgid "Technology Redirects"
2479
  msgstr ""
2480
 
2481
- #: pro/app/views/links/form.php:299
2482
- msgid ""
2483
- "This will allow you to redirect based on your visitor's device, operating "
2484
- "system and/or browser"
2485
  msgstr ""
2486
 
2487
- #: pro/app/views/links/form.php:309 pro/app/views/links/form.php:312
2488
- msgid "Time Period Redirects"
2489
  msgstr ""
2490
 
2491
- #: pro/app/views/links/form.php:313
2492
- msgid ""
2493
- "This will allow you to redirect based on the time period in which your "
2494
- "visitor visits this link.<br/><br/><b>Note: If your visitor doesn't visit "
2495
- "the link during any of the specified time periods set here, they'll simply "
2496
- "be redirected to the main target url.</b>"
2497
  msgstr ""
2498
 
2499
- #: pro/app/views/links/geo_row.php:12
2500
- msgid "Countries:"
2501
  msgstr ""
2502
 
2503
- #: pro/app/views/links/geo_row.php:15
2504
- msgid "Technology Redirection Countries"
2505
  msgstr ""
2506
 
2507
- #: pro/app/views/links/geo_row.php:16
2508
- msgid ""
2509
- "This is a comma-separated list of countries that this redirect will match "
2510
- "on. Just start typing a country's name and an autocomplete dropdown will "
2511
- "appear to select from. Once a country is selected, feel free to start typing "
2512
- "the name of another country. You can add as many as you'd like this redirect "
2513
- "to match on"
2514
  msgstr ""
2515
 
2516
- #: pro/app/views/links/geo_row.php:25 pro/app/views/links/tech_row.php:79
2517
- #: pro/app/views/links/time_row.php:39
2518
- msgid "URL:"
2519
  msgstr ""
2520
 
2521
- #: pro/app/views/links/geo_row.php:28
2522
- msgid "Geographic Redirection URL"
2523
  msgstr ""
2524
 
2525
- #: pro/app/views/links/geo_row.php:29
2526
- msgid ""
2527
- "This is the URL that this Pretty Link will redirect to if the visitor's "
2528
- "country match the settings here."
2529
  msgstr ""
2530
 
2531
- #: pro/app/views/links/geo_row.php:38 pro/app/views/links/tech_row.php:92
2532
- #: pro/app/views/links/time_row.php:52
2533
- msgid "Remove"
2534
  msgstr ""
2535
 
2536
- #: pro/app/views/links/link-has-expired.php:9
2537
- msgid "Link Not Found"
2538
  msgstr ""
2539
 
2540
- #: pro/app/views/links/link-has-expired.php:33
2541
- msgid "Sorry, this link has expired"
2542
  msgstr ""
2543
 
2544
- #: pro/app/views/links/link-options.php:3
2545
- #: pro/app/views/links/link-options.php:5
2546
- msgid "Base Slug Prefix"
2547
  msgstr ""
2548
 
2549
- #: pro/app/views/links/link-options.php:6
2550
- msgid ""
2551
- "Use this to prefix all newly generated pretty links with a directory of your "
2552
- "choice. For example set to <b>out</b> to make your pretty links look like "
2553
- "http://site.com/<b>out</b>/xyz. Changing this option will NOT affect "
2554
- "existing pretty links. If you do not wish to use a directory prefix, leave "
2555
- "this text field blank. Whatever you type here will be sanitized and modified "
2556
- "to ensure it is URL-safe. So <b>Hello World</b> might get changed to "
2557
- "something like <b>hello-world</b> instead. Lowercase letters, numbers, "
2558
- "dashes, and underscores are allowed."
2559
- msgstr ""
2560
-
2561
- #: pro/app/views/links/link-options.php:16
2562
- #: pro/app/views/links/link-options.php:18
2563
- msgid "Slug Character Count"
2564
  msgstr ""
2565
 
2566
- #: pro/app/views/links/link-options.php:19
2567
- msgid ""
2568
- "The number of characters to use when auto-generating a random slug for "
2569
- "pretty links. The default is 4. You cannot use less than 2."
2570
  msgstr ""
2571
 
2572
- #: pro/app/views/links/link-options.php:29
2573
- #: pro/app/views/links/link-options.php:30
2574
- msgid "Enable Google Analytics"
2575
  msgstr ""
2576
 
2577
- #: pro/app/views/links/link-options.php:31
2578
- msgid ""
2579
- "Requires Google Analyticator, Google Analytics by MonsterInsights (formerly "
2580
- "Yoast), or the Google Analytics Plugin to be installed and configured on "
2581
- "your site."
2582
  msgstr ""
2583
 
2584
- #: pro/app/views/links/link-options.php:41
2585
- msgid "Enable %sQR Codes%s"
2586
  msgstr ""
2587
 
2588
- #: pro/app/views/links/link-options.php:43
2589
- msgid "Generate QR Codes"
2590
  msgstr ""
2591
 
2592
- #: pro/app/views/links/link-options.php:44
2593
- msgid ""
2594
- "This will enable a link in your pretty link admin that will allow you to "
2595
- "automatically download a QR Code for each individual Pretty Link."
2596
  msgstr ""
2597
 
2598
- #: pro/app/views/links/link-options.php:54
2599
- #: pro/app/views/links/link-options.php:56
2600
- msgid "Global Head Scripts"
2601
  msgstr ""
2602
 
2603
- #: pro/app/views/links/link-options.php:57
2604
- msgid ""
2605
- "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or "
2606
- "any other kind of tracking script to the HTML head.<br/><br/>What you enter "
2607
- "in this box will be applied to all supported pretty links.<br/><br/><b>NOTE:"
2608
- "</b> This does NOT work with 301, 302 and 307 type redirects."
2609
  msgstr ""
2610
 
2611
- #: pro/app/views/links/prettybar.php:174
2612
- msgid "Share on Twitter"
2613
  msgstr ""
2614
 
2615
- #: pro/app/views/links/prettybar.php:191
2616
- msgid "Powered by"
2617
  msgstr ""
2618
 
2619
- #: pro/app/views/links/tech_row.php:14
2620
- msgid "Device:"
2621
  msgstr ""
2622
 
2623
- #: pro/app/views/links/tech_row.php:17
2624
- msgid "Technology Redirection Device"
2625
  msgstr ""
2626
 
2627
- #: pro/app/views/links/tech_row.php:18
2628
- msgid ""
2629
- "<b>Desktop</b> will match on any conventional laptop or desktop computer.<br/"
2630
- "><br/><b>Mobile</b> will match on any phone, tablet or other portable device."
2631
- "<br/><br/><b>Phone</b> will match on any phone or similarly small device.<br/"
2632
- "><br/><b>Tablet</b> will match on any tablet sized device."
2633
  msgstr ""
2634
 
2635
- #: pro/app/views/links/tech_row.php:23 pro/app/views/links/tech_row.php:42
2636
- #: pro/app/views/links/tech_row.php:62
2637
- msgid "Any"
2638
  msgstr ""
2639
 
2640
- #: pro/app/views/links/tech_row.php:24
2641
- msgid "Desktop"
2642
  msgstr ""
2643
 
2644
- #: pro/app/views/links/tech_row.php:25
2645
- msgid "Mobile"
2646
  msgstr ""
2647
 
2648
- #: pro/app/views/links/tech_row.php:26
2649
- msgid "Phone"
2650
  msgstr ""
2651
 
2652
- #: pro/app/views/links/tech_row.php:27
2653
- msgid "Tablet"
2654
  msgstr ""
2655
 
2656
- #: pro/app/views/links/tech_row.php:33
2657
- msgid "Operating System:"
2658
  msgstr ""
2659
 
2660
- #: pro/app/views/links/tech_row.php:36
2661
- msgid "Technology Redirection OS"
2662
  msgstr ""
2663
 
2664
- #: pro/app/views/links/tech_row.php:37
2665
- msgid ""
2666
- "Use this dropdown to select which Operating System this redirect will match "
2667
- "on."
2668
  msgstr ""
2669
 
2670
- #: pro/app/views/links/tech_row.php:43 pro/app/views/links/tech_row.php:64
2671
- msgid "Android"
2672
  msgstr ""
2673
 
2674
- #: pro/app/views/links/tech_row.php:44
2675
- msgid "iOS"
2676
  msgstr ""
2677
 
2678
- #: pro/app/views/links/tech_row.php:45
2679
- msgid "Linux"
2680
  msgstr ""
2681
 
2682
- #: pro/app/views/links/tech_row.php:46
2683
- msgid "Mac"
2684
  msgstr ""
2685
 
2686
- #: pro/app/views/links/tech_row.php:47
2687
- msgid "Windows"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2688
  msgstr ""
2689
 
2690
- #: pro/app/views/links/tech_row.php:53
2691
- msgid "Browser:"
2692
  msgstr ""
2693
 
2694
- #: pro/app/views/links/tech_row.php:56
2695
- msgid "Technology Redirection Browser"
2696
  msgstr ""
2697
 
2698
- #: pro/app/views/links/tech_row.php:57
2699
- msgid "Use this dropdown to select which Browser this redirect will match on."
2700
  msgstr ""
2701
 
2702
- #: pro/app/views/links/tech_row.php:63
2703
- msgid "Amazon Silk"
2704
  msgstr ""
2705
 
2706
- #: pro/app/views/links/tech_row.php:65
2707
- msgid "Chrome"
2708
  msgstr ""
2709
 
2710
- #: pro/app/views/links/tech_row.php:66
2711
- msgid "Chromium"
2712
  msgstr ""
2713
 
2714
- #: pro/app/views/links/tech_row.php:67
2715
- msgid "Edge"
2716
  msgstr ""
2717
 
2718
- #: pro/app/views/links/tech_row.php:68
2719
- msgid "Firefox"
2720
  msgstr ""
2721
 
2722
- #: pro/app/views/links/tech_row.php:69
2723
- msgid "Internet Explorer"
2724
  msgstr ""
2725
 
2726
- #: pro/app/views/links/tech_row.php:70
2727
- msgid "Kindle"
2728
  msgstr ""
2729
 
2730
- #: pro/app/views/links/tech_row.php:71
2731
- msgid "Opera"
2732
  msgstr ""
2733
 
2734
- #: pro/app/views/links/tech_row.php:72
2735
- msgid "Opera Coast"
2736
  msgstr ""
2737
 
2738
- #: pro/app/views/links/tech_row.php:73
2739
- msgid "Safari"
2740
  msgstr ""
2741
 
2742
- #: pro/app/views/links/tech_row.php:82
2743
- msgid "Technology Redirection URL"
2744
  msgstr ""
2745
 
2746
- #: pro/app/views/links/tech_row.php:83
2747
- msgid ""
2748
- "This is the URL that this Pretty Link will redirect to if the visitor's "
2749
- "device, os and browser match the settings here."
2750
  msgstr ""
2751
 
2752
- #: pro/app/views/links/time_row.php:13
2753
- msgid "Start Time:"
2754
  msgstr ""
2755
 
2756
- #: pro/app/views/links/time_row.php:16
2757
- msgid "Start of Time Period"
2758
  msgstr ""
2759
 
2760
- #: pro/app/views/links/time_row.php:17
2761
- msgid ""
2762
- "This is where you'll enter the beginning of the time period for this redirect"
2763
  msgstr ""
2764
 
2765
- #: pro/app/views/links/time_row.php:26
2766
- msgid "End Time:"
2767
  msgstr ""
2768
 
2769
- #: pro/app/views/links/time_row.php:29
2770
- msgid "End of Time Period"
2771
  msgstr ""
2772
 
2773
- #: pro/app/views/links/time_row.php:30
2774
- msgid "This is where you'll enter the end of the time period for this redirect"
2775
  msgstr ""
2776
 
2777
- #: pro/app/views/links/time_row.php:42
2778
- msgid "Time Period Redirect URL"
2779
  msgstr ""
2780
 
2781
- #: pro/app/views/links/time_row.php:43
2782
- msgid ""
2783
- "This is the URL that this Pretty Link will redirect to when the visitor "
2784
- "visits the link in the associated time period."
2785
  msgstr ""
2786
 
2787
- #: pro/app/views/options/autocreate.php:7
2788
- msgid "%s Shortlinks"
2789
  msgstr ""
2790
 
2791
- #: pro/app/views/options/autocreate.php:10
2792
- msgid "Create Pretty Links for %s"
2793
  msgstr ""
2794
 
2795
- #: pro/app/views/options/autocreate.php:11
2796
- msgid "Automatically Create a Pretty Link for each of your published %s"
2797
  msgstr ""
2798
 
2799
- #: pro/app/views/options/autocreate.php:33
2800
- msgid "%s Auto Link Group"
2801
  msgstr ""
2802
 
2803
- #: pro/app/views/options/autocreate.php:34
2804
- msgid "Group that Pretty Links for %s will be automatically added to."
2805
  msgstr ""
2806
 
2807
- #: pro/app/views/options/autocreate.php:47
2808
- msgid "Show Social Buttons"
2809
  msgstr ""
2810
 
2811
- #: pro/app/views/options/autocreate.php:50
2812
- msgid "Show Social Buttons on %s"
2813
  msgstr ""
2814
 
2815
- #: pro/app/views/options/autocreate.php:51
2816
- msgid ""
2817
- "If this button is checked then you'll have the ability to include a social "
2818
- "buttons bar on your %s."
2819
  msgstr ""
2820
 
2821
- #: pro/app/views/options/form.php:4
2822
- msgid "Keyword &amp; URL Auto Replacements Options"
2823
  msgstr ""
2824
 
2825
- #: pro/app/views/options/form.php:13
2826
- msgid "Enable Replacements"
2827
  msgstr ""
2828
 
2829
- #: pro/app/views/options/form.php:15
2830
- msgid "Enable Keyword and URL Auto Replacement"
2831
  msgstr ""
2832
 
2833
- #: pro/app/views/options/form.php:16
2834
- msgid ""
2835
- "If checked, this will enable you to automatically replace keywords and/or "
2836
- "URLs on your blog with pretty links. You will specify the specific keywords "
2837
- "and urls from your Pretty Link edit page."
2838
  msgstr ""
2839
 
2840
- #: pro/app/views/options/form.php:34
2841
- msgid "Thresholds"
2842
  msgstr ""
2843
 
2844
- #: pro/app/views/options/form.php:36
2845
- msgid "Set Keyword Replacement Thresholds"
2846
  msgstr ""
2847
 
2848
- #: pro/app/views/options/form.php:37
2849
- msgid ""
2850
- "Don't want to have too many keyword replacements per page? Select to set "
2851
- "some reasonable keyword replacement thresholds."
2852
  msgstr ""
2853
 
2854
- #: pro/app/views/options/form.php:54
2855
- msgid "Max Keywords"
2856
  msgstr ""
2857
 
2858
- #: pro/app/views/options/form.php:56
2859
- msgid "Set Maximum Keywords per Page"
2860
  msgstr ""
2861
 
2862
- #: pro/app/views/options/form.php:57
2863
- msgid ""
2864
- "Maximum number of unique keyword / keyphrases you can replace with Pretty "
2865
- "Links per page."
2866
  msgstr ""
2867
 
2868
- #: pro/app/views/options/form.php:68
2869
- msgid "Max Replacements"
2870
  msgstr ""
2871
 
2872
- #: pro/app/views/options/form.php:70
2873
- msgid "Set Maximum Replacements per Keyword"
2874
  msgstr ""
2875
 
2876
- #: pro/app/views/options/form.php:71
2877
- msgid "Maximum number of Pretty Link replacements per Keyword / Keyphrase."
2878
  msgstr ""
2879
 
2880
- #: pro/app/views/options/form.php:87
2881
- msgid "Open in New Window"
2882
  msgstr ""
2883
 
2884
- #: pro/app/views/options/form.php:89
2885
- msgid "Open Keyword Replacement Links in New Window"
2886
  msgstr ""
2887
 
2888
- #: pro/app/views/options/form.php:90
2889
- msgid ""
2890
- "Ensure that these keyword replacement links are opened in a separate window. "
2891
- "<strong>Note:</strong> This does not apply to url replacements--only keyword "
2892
- "replacements."
2893
  msgstr ""
2894
 
2895
- #: pro/app/views/options/form.php:101
2896
- msgid "Add No Follows"
2897
  msgstr ""
2898
 
2899
- #: pro/app/views/options/form.php:103
2900
- msgid "Add 'nofollow' attribute to all Keyword Pretty Links"
2901
  msgstr ""
2902
 
2903
- #: pro/app/views/options/form.php:104
2904
- msgid ""
2905
- "This adds the html <code>NOFOLLOW</code> attribute to all keyword "
2906
- "replacement links. <strong>Note:</strong> This does not apply to url "
2907
- "replacements--only keyword replacements."
2908
  msgstr ""
2909
 
2910
- #: pro/app/views/options/form.php:115
2911
- msgid "Custom CSS"
2912
  msgstr ""
2913
 
2914
- #: pro/app/views/options/form.php:117
2915
- msgid "Add custom CSS to your keyword replacement links"
2916
  msgstr ""
2917
 
2918
- #: pro/app/views/options/form.php:118
2919
- msgid ""
2920
- "Add some custom formatting to your keyword pretty link replacements. "
2921
- "<strong>Note:</strong> This does not apply to url replacements--only keyword "
2922
- "replacements."
2923
  msgstr ""
2924
 
2925
- #: pro/app/views/options/form.php:129
2926
- msgid "Custom Hover CSS"
2927
  msgstr ""
2928
 
2929
- #: pro/app/views/options/form.php:131
2930
- msgid "Add custom hover CSS to your keyword replacement links"
2931
  msgstr ""
2932
 
2933
- #: pro/app/views/options/form.php:132
2934
- msgid ""
2935
- "Add some custom formatting to the hover attribute of your keyword pretty "
2936
- "links. <strong>Note:</strong> This does not apply to url replacements--only "
2937
- "keyword replacements."
2938
  msgstr ""
2939
 
2940
- #: pro/app/views/options/form.php:143
2941
- msgid "Link to Disclosures"
2942
  msgstr ""
2943
 
2944
- #: pro/app/views/options/form.php:146
2945
- msgid "Automatically Add a Link to Disclosures"
2946
  msgstr ""
2947
 
2948
- #: pro/app/views/options/form.php:147
2949
- msgid ""
2950
- "When enabled, this will add a link to your official affiliate link "
2951
- "disclosure page to any page, post or custom post type that have any keyword "
2952
- "or URL replacements. You'll also be able to customize the URL and position "
2953
- "of the disclosure link."
2954
  msgstr ""
2955
 
2956
- #: pro/app/views/options/form.php:168
2957
- msgid "Disclosures Link URL"
2958
  msgstr ""
2959
 
2960
- #: pro/app/views/options/form.php:169
2961
- msgid ""
2962
- "This is the URL of the page that contains your official affiliate link "
2963
- "disclosures. This URL will be used in the link that will be generated."
2964
  msgstr ""
2965
 
2966
- #: pro/app/views/options/form.php:180
2967
- msgid "Text"
 
 
2968
  msgstr ""
2969
 
2970
- #: pro/app/views/options/form.php:183
2971
- msgid "Disclosures Link Text"
 
 
2972
  msgstr ""
2973
 
2974
- #: pro/app/views/options/form.php:184
2975
- msgid ""
2976
- "This is the text of the link to your disclosures. This text will be visible "
2977
- "to your visitors when the link is displayed."
2978
  msgstr ""
2979
 
2980
- #: pro/app/views/options/form.php:195
2981
- msgid "Position"
2982
  msgstr ""
2983
 
2984
- #: pro/app/views/options/form.php:198
2985
- msgid "Disclosures Link Position"
2986
  msgstr ""
2987
 
2988
- #: pro/app/views/options/form.php:199
2989
- msgid ""
2990
- "This is the position of the link to your disclosures in relation to your "
2991
- "post content."
2992
  msgstr ""
2993
 
2994
- #: pro/app/views/options/form.php:205 pro/app/views/options/form.php:701
2995
- msgid "Bottom"
2996
  msgstr ""
2997
 
2998
- #: pro/app/views/options/form.php:206 pro/app/views/options/form.php:700
2999
- msgid "Top"
3000
  msgstr ""
3001
 
3002
- #: pro/app/views/options/form.php:207 pro/app/views/options/form.php:702
3003
- msgid "Top and Bottom"
3004
  msgstr ""
3005
 
3006
- #: pro/app/views/options/form.php:219
3007
- msgid "Keyword Disclosures"
3008
  msgstr ""
3009
 
3010
- #: pro/app/views/options/form.php:222
3011
- msgid "Automatically Add Affiliate Link Disclosures to Keyword Replacements"
3012
  msgstr ""
3013
 
3014
- #: pro/app/views/options/form.php:223
3015
- msgid ""
3016
- "When enabled, this will add an affiliate link disclosure next to each one of "
3017
- "your keyword replacements. <b>Note:</b> This does not apply to url "
3018
- "replacements--only keyword replacements."
3019
  msgstr ""
3020
 
3021
- #: pro/app/views/options/form.php:241
3022
- msgid "Disclosure Text"
3023
  msgstr ""
3024
 
3025
- #: pro/app/views/options/form.php:244
3026
- msgid "Keyword Link Disclosure Text"
3027
  msgstr ""
3028
 
3029
- #: pro/app/views/options/form.php:245
3030
- msgid ""
3031
- "This is the text that will be added after each keyword replacement to "
3032
- "indicate that the link is an affiliate link."
3033
  msgstr ""
3034
 
3035
- #: pro/app/views/options/form.php:261
3036
- msgid "Replace All URLs"
 
3037
  msgstr ""
3038
 
3039
- #: pro/app/views/options/form.php:263
3040
- msgid "Replace All non-Pretty Link URLs With Pretty Link URLs"
 
3041
  msgstr ""
3042
 
3043
- #: pro/app/views/options/form.php:264
3044
- msgid ""
3045
- "This feature will take each url it finds and create or use an existing "
3046
- "pretty link pointing to the url and replace it with the pretty link."
3047
  msgstr ""
3048
 
3049
- #: pro/app/views/options/form.php:281
3050
- msgid "Domain Blacklist"
 
3051
  msgstr ""
3052
 
3053
- #: pro/app/views/options/form.php:283
3054
- msgid "Do not replace links from these domains"
 
3055
  msgstr ""
3056
 
3057
- #: pro/app/views/options/form.php:284
3058
- msgid ""
3059
- "Any links on your site which point to domains you define here will not be "
3060
- "replaced automatically with Pretty Links. Place one domain per line.<br/><br/"
3061
- ">You MUST enter http:// or https:// in front of the domain names and do NOT "
3062
- "include any /'s or other text after the domain name.<br/><br/>Proper entry "
3063
- "example:<br/><b>https://www.google.com</b><br/><b>http://mysite.org</b><br/"
3064
- "><br/>Improperly entered domains will be removed upon saving the Options."
3065
  msgstr ""
3066
 
3067
- #: pro/app/views/options/form.php:300
3068
- msgid "Replace in Comments"
3069
  msgstr ""
3070
 
3071
- #: pro/app/views/options/form.php:302
3072
- msgid "Replace Keywords and URLs in Comments"
3073
  msgstr ""
3074
 
3075
- #: pro/app/views/options/form.php:303
3076
- msgid ""
3077
- "This option will enable the keyword / URL replacement routine to run in "
3078
- "Comments."
 
 
3079
  msgstr ""
3080
 
3081
- #: pro/app/views/options/form.php:314
3082
- msgid "Replace in Feeds"
3083
  msgstr ""
3084
 
3085
- #: pro/app/views/options/form.php:316
3086
- msgid "Replace Keywords and URLs in Feeds"
3087
  msgstr ""
3088
 
3089
- #: pro/app/views/options/form.php:317
3090
- msgid ""
3091
- "This option will enable the keyword / URL replacement routine to run in RSS "
3092
- "Feeds.<br/><strong>Note:</strong> This option can slow the load speed of "
3093
- "your RSS feed -- unless used in conjunction with a caching plugin like W3 "
3094
- "Total Cache or WP Super Cache.<br/><strong>Note #2</strong> This option will "
3095
- "only work if you have \"Full Text\" selected in your General WordPress "
3096
- "Reading settings.<br/><strong>Note #3:</strong> If this option is used along "
3097
- "with \"Replace Keywords and URLs in Comments\" then your post comment feeds "
3098
- "will have keywords replaced in them as well."
3099
  msgstr ""
3100
 
3101
- #: pro/app/views/options/form.php:328 pro/app/views/options/form.php:330
3102
- msgid "Index Replacements"
3103
  msgstr ""
3104
 
3105
- #: pro/app/views/options/form.php:331
3106
- msgid ""
3107
- "This feature will index all of your keyword & URL replacements to "
3108
- "dramatically improve performance.<br/><br/>If your site has a large number "
3109
- "of replacements and/or posts then this feature may increase the load on your "
3110
- "server temporarily and your replacements may not show up on your posts for a "
3111
- "day or two initially (until all posts are indexed).<br/><br/><strong>Note:</"
3112
- "strong> this feature requires the use of wp-cron."
3113
  msgstr ""
3114
 
3115
- #: pro/app/views/options/form.php:348 pro/app/views/options/form.php:350
3116
- msgid "Keyword Index Status"
3117
  msgstr ""
3118
 
3119
- #: pro/app/views/options/form.php:351
3120
- msgid ""
3121
- "This shows how many posts have keywords indexed for and are ready for "
3122
- "replacement."
3123
  msgstr ""
3124
 
3125
- #: pro/app/views/options/form.php:359 pro/app/views/options/form.php:382
3126
- msgid "%1$s out of %2$s Posts Indexed"
3127
  msgstr ""
3128
 
3129
- #: pro/app/views/options/form.php:363 pro/app/views/options/form.php:386
3130
- msgid "%1$s out of %2$s Comments Indexed"
3131
  msgstr ""
3132
 
3133
- #: pro/app/views/options/form.php:371
3134
- msgid "URL Index Status"
3135
  msgstr ""
3136
 
3137
- #: pro/app/views/options/form.php:373
3138
- msgid "URL Replacements Index Status"
3139
  msgstr ""
3140
 
3141
- #: pro/app/views/options/form.php:374
3142
- msgid ""
3143
- "This shows how many posts have url replacements indexed for and are ready "
3144
- "for replacement."
3145
  msgstr ""
3146
 
3147
- #: pro/app/views/options/form.php:402
3148
- msgid "Auto-Create Shortlink Options"
3149
  msgstr ""
3150
 
3151
- #: pro/app/views/options/form.php:423
3152
- msgid "Pretty Bar Options"
3153
  msgstr ""
3154
 
3155
- #: pro/app/views/options/form.php:429
3156
- msgid "Image URL"
3157
  msgstr ""
3158
 
3159
- #: pro/app/views/options/form.php:431
3160
- msgid "Pretty Bar Image URL"
3161
  msgstr ""
3162
 
3163
- #: pro/app/views/options/form.php:432
3164
- msgid ""
3165
- "If set, this will replace the logo image on the Pretty Bar. The image that "
3166
- "this URL references should be 48x48 Pixels to fit."
3167
  msgstr ""
3168
 
3169
- #: pro/app/views/options/form.php:443
3170
- msgid "Background Image URL"
3171
  msgstr ""
3172
 
3173
- #: pro/app/views/options/form.php:445
3174
- msgid "Pretty Bar Background Image URL"
3175
  msgstr ""
3176
 
3177
- #: pro/app/views/options/form.php:446
3178
- msgid ""
3179
- "If set, this will replace the background image on Pretty Bar. The image that "
3180
- "this URL references should be 65px tall - this image will be repeated "
3181
- "horizontally across the bar."
3182
  msgstr ""
3183
 
3184
- #: pro/app/views/options/form.php:457
3185
- msgid "Background Color"
 
3186
  msgstr ""
3187
 
3188
- #: pro/app/views/options/form.php:459
3189
- msgid "Pretty Bar Background Color"
3190
  msgstr ""
3191
 
3192
- #: pro/app/views/options/form.php:460
3193
- msgid ""
3194
- "This will alter the background color of the Pretty Bar if you haven't "
3195
- "specified a Pretty Bar background image."
3196
  msgstr ""
3197
 
3198
- #: pro/app/views/options/form.php:471
3199
- msgid "Text Color"
3200
  msgstr ""
3201
 
3202
- #: pro/app/views/options/form.php:473
3203
- msgid "Pretty Bar Text Color"
 
 
3204
  msgstr ""
3205
 
3206
- #: pro/app/views/options/form.php:474
3207
- msgid ""
3208
- "If not set, this defaults to black (RGB value <code>#000000</code>) but you "
3209
- "can change it to whatever color you like."
3210
  msgstr ""
3211
 
3212
- #: pro/app/views/options/form.php:485
3213
- msgid "Link Color"
3214
  msgstr ""
3215
 
3216
- #: pro/app/views/options/form.php:487
3217
- msgid "Pretty Bar Link Color"
3218
  msgstr ""
3219
 
3220
- #: pro/app/views/options/form.php:488
3221
- msgid ""
3222
- "If not set, this defaults to blue (RGB value <code>#0000ee</code>) but you "
3223
- "can change it to whatever color you like."
3224
  msgstr ""
3225
 
3226
- #: pro/app/views/options/form.php:499
3227
- msgid "Link Hover Color"
3228
  msgstr ""
3229
 
3230
- #: pro/app/views/options/form.php:501
3231
- msgid "Pretty Bar Link Hover Color"
3232
  msgstr ""
3233
 
3234
- #: pro/app/views/options/form.php:502
3235
- msgid ""
3236
- "If not set, this defaults to RGB value <code>#ababab</code> but you can "
3237
- "change it to whatever color you like."
3238
  msgstr ""
3239
 
3240
- #: pro/app/views/options/form.php:513
3241
- msgid "Visited Link Color"
3242
  msgstr ""
3243
 
3244
- #: pro/app/views/options/form.php:515
3245
- msgid "Pretty Bar Visited Link Color"
 
3246
  msgstr ""
3247
 
3248
- #: pro/app/views/options/form.php:516
3249
- msgid ""
3250
- "If not set, this defaults to RGB value <code>#551a8b</code> but you can "
3251
- "change it to whatever color you like."
3252
  msgstr ""
3253
 
3254
- #: pro/app/views/options/form.php:527
3255
- msgid "Title Char Limit"
 
3256
  msgstr ""
3257
 
3258
- #: pro/app/views/options/form.php:529
3259
- msgid "Pretty Bar Title Char Limit"
3260
  msgstr ""
3261
 
3262
- #: pro/app/views/options/form.php:530
3263
- msgid ""
3264
- "If your Website has a long title then you may need to adjust this value so "
3265
- "that it will all fit on the Pretty Bar. It is recommended that you keep this "
3266
- "value to <code>30</code> characters or less so the Pretty Bar's format looks "
3267
- "good across different browsers and screen resolutions."
3268
  msgstr ""
3269
 
3270
- #: pro/app/views/options/form.php:541
3271
- msgid "Description Char Limit"
3272
  msgstr ""
3273
 
3274
- #: pro/app/views/options/form.php:543
3275
- msgid "Pretty Bar Description Char Limit"
3276
  msgstr ""
3277
 
3278
- #: pro/app/views/options/form.php:544
3279
- msgid ""
3280
- "If your Website has a long Description (tagline) then you may need to adjust "
3281
- "this value so that it will all fit on the Pretty Bar. It is recommended that "
3282
- "you keep this value to <code>40</code> characters or less so the Pretty "
3283
- "Bar's format looks good across different browsers and screen resolutions."
3284
  msgstr ""
3285
 
3286
- #: pro/app/views/options/form.php:555
3287
- msgid "Target URL Char Limit"
 
3288
  msgstr ""
3289
 
3290
- #: pro/app/views/options/form.php:557
3291
- msgid "Pretty Bar Target URL Char Limit"
3292
  msgstr ""
3293
 
3294
- #: pro/app/views/options/form.php:558
3295
- msgid ""
3296
- "If you link to a lot of large Target URLs you may want to adjust this value. "
3297
- "It is recommended that you keep this value to <code>40</code> or below so "
3298
- "the Pretty Bar's format looks good across different browsers and URL sizes"
3299
  msgstr ""
3300
 
3301
- #: pro/app/views/options/form.php:569
3302
- msgid "Show Title"
 
3303
  msgstr ""
3304
 
3305
- #: pro/app/views/options/form.php:571
3306
- msgid "Pretty Bar Show Title"
3307
  msgstr ""
3308
 
3309
- #: pro/app/views/options/form.php:572
3310
- msgid ""
3311
- "Make sure this is checked if you want the title of your blog (and link) to "
3312
- "show up on the Pretty Bar."
 
3313
  msgstr ""
3314
 
3315
- #: pro/app/views/options/form.php:583
3316
- msgid "Show Description"
3317
  msgstr ""
3318
 
3319
- #: pro/app/views/options/form.php:585
3320
- msgid "Pretty Bar Show Description"
3321
  msgstr ""
3322
 
3323
- #: pro/app/views/options/form.php:586
3324
- msgid ""
3325
- "Make sure this is checked if you want your site description to show up on "
3326
- "the Pretty Bar."
3327
  msgstr ""
3328
 
3329
- #: pro/app/views/options/form.php:597
3330
- msgid "Show Share Links"
3331
  msgstr ""
3332
 
3333
- #: pro/app/views/options/form.php:599
3334
- msgid "Pretty Bar Show Share Links"
3335
  msgstr ""
3336
 
3337
- #: pro/app/views/options/form.php:600
3338
- msgid ""
3339
- "Make sure this is checked if you want \"share links\" to show up on the "
3340
- "Pretty Bar."
3341
  msgstr ""
3342
 
3343
- #: pro/app/views/options/form.php:611
3344
- msgid "Show Target URL"
3345
  msgstr ""
3346
 
3347
- #: pro/app/views/options/form.php:613
3348
- msgid "Pretty Bar Show Target URL Links"
 
 
3349
  msgstr ""
3350
 
3351
- #: pro/app/views/options/form.php:614
3352
- msgid ""
3353
- "Make sure this is checked if you want a link displaying the Target URL to "
3354
- "show up on the Pretty Bar."
3355
  msgstr ""
3356
 
3357
- #: pro/app/views/options/form.php:625 pro/app/views/options/form.php:627
3358
- msgid "Hide Attribution Link"
 
 
3359
  msgstr ""
3360
 
3361
- #: pro/app/views/options/form.php:628
3362
- msgid ""
3363
- "Check this to hide the pretty link attribution link on the pretty bar.<br/"
3364
- "><br/><strong>Wait, before you do this, you might want to leave this un-"
3365
- "checked and set the alternate URL of this link to your <em>Pretty Links Pro</"
3366
- "em> <a href=\"https://prettylinks.com/plp/options/aff-attribution"
3367
- "\">Affiliate URL</a> to earn a few bucks while you are at it."
3368
  msgstr ""
3369
 
3370
- #: pro/app/views/options/form.php:646
3371
- msgid "Attribution URL"
3372
  msgstr ""
3373
 
3374
- #: pro/app/views/options/form.php:648
3375
- msgid "Alternate Pretty Bar Attribution URL"
3376
  msgstr ""
3377
 
3378
- #: pro/app/views/options/form.php:649
3379
- msgid ""
3380
- "If set, this will replace the Pretty Bars attribution URL. This is a very "
3381
- "good place to put your <em>Pretty Links Pro</em> <a href=\"https://"
3382
- "prettylinks.com/plp/options/aff-attribution-2\">Affiliate Link</a>."
3383
  msgstr ""
3384
 
3385
- #: pro/app/views/options/form.php:663
3386
- msgid "Social Buttons Options"
3387
  msgstr ""
3388
 
3389
- #: pro/app/views/options/form.php:666
3390
- msgid "Buttons"
3391
  msgstr ""
3392
 
3393
- #: pro/app/views/options/form.php:668
3394
- msgid "Social Buttons"
 
3395
  msgstr ""
3396
 
3397
- #: pro/app/views/options/form.php:669
3398
- msgid ""
3399
- "Select which buttons you want to be visible on the Social Buttons Bar.<br/"
3400
- "><br/><code>Note:</code> In order for the Social Buttons Bar to be visible "
3401
- "on Pages and or Posts, you must first enable it in the \"Page &amp; Post "
3402
- "Options\" section above."
3403
  msgstr ""
3404
 
3405
- #: pro/app/views/options/form.php:692
3406
- msgid "Buttons Placement"
 
3407
  msgstr ""
3408
 
3409
- #: pro/app/views/options/form.php:694
3410
- msgid "Social Buttons Placement"
3411
  msgstr ""
3412
 
3413
- #: pro/app/views/options/form.php:695
3414
- msgid ""
3415
- "This determines where your Social Buttons Placement should appear in "
3416
- "relation to content on Pages and/or Posts.<br/><br/><code>Note:</code> If "
3417
- "you want this bar to appear then you must enable it in the \"Page and Post "
3418
- "Options\" above."
3419
  msgstr ""
3420
 
3421
- #: pro/app/views/options/form.php:705
3422
- msgid "Social Buttons Manual Placement"
3423
  msgstr ""
3424
 
3425
- #: pro/app/views/options/form.php:706
3426
- msgid ""
3427
- "If you select none, you can still show your Social Buttons by manually "
3428
- "adding the <code>[social_buttons_bar]</code> shortcode to your blog posts or "
3429
- "<code>&lt;?php the_social_buttons_bar(); ?&gt;</code> template tag to your "
3430
- "WordPress Theme."
3431
  msgstr ""
3432
 
3433
- #: pro/app/views/options/form.php:731
3434
- msgid "Public Links Creation Options"
 
3435
  msgstr ""
3436
 
3437
- #: pro/app/views/options/form.php:737
3438
- msgid "Enable Public Links"
3439
  msgstr ""
3440
 
3441
- #: pro/app/views/options/form.php:739
3442
- msgid "Enable Public Link Creation on this Site"
3443
  msgstr ""
3444
 
3445
- #: pro/app/views/options/form.php:740
3446
- msgid ""
3447
- "This option will give you the ability to turn your website into a link "
3448
- "shortening service for your users. Once selected, you can enable the Pretty "
3449
- "Links Pro Sidebar Widget or just display the link creation form with the "
3450
- "<code>[prli_create_form]</code> shortcode in any post or page on your "
3451
- "website."
3452
  msgstr ""
3453
 
3454
- #: pro/app/views/options/form.php:757
3455
- msgid "Use Display Page"
3456
  msgstr ""
3457
 
3458
- #: pro/app/views/options/form.php:759
3459
- msgid "Use Public Link Display Page"
3460
  msgstr ""
3461
 
3462
- #: pro/app/views/options/form.php:760
3463
- msgid ""
3464
- "When a link is created using the public form, the user is typically "
3465
- "redirected to a simple page displaying their new pretty link. But, you can "
3466
- "specify a page that you want them to be redirected to on your website, using "
3467
- "your branding instead by selecting this box and entering the url of the page "
3468
- "you want them to go to."
3469
  msgstr ""
3470
 
3471
- #: pro/app/views/options/form.php:777
3472
- msgid "Display Page"
3473
  msgstr ""
3474
 
3475
- #: pro/app/views/options/form.php:779
3476
- msgid "Public Pretty Link Creation Display URL"
 
3477
  msgstr ""
3478
 
3479
- #: pro/app/views/options/form.php:780
3480
- msgid ""
3481
- "To set this up, create a new page on your WordPress site and make sure the "
3482
- "<code>[prli_create_display]</code> appears somewhere on this page -- "
3483
- "otherwise the link will never get created. Once this page is created, just "
3484
- "enter the full URL to it here. Make sure this URL does npt end with a slash "
3485
- "(/)."
3486
  msgstr ""
3487
 
3488
- #: pro/app/views/options/general.php:8
3489
- msgid "Use Shortlink URL"
 
3490
  msgstr ""
3491
 
3492
- #: pro/app/views/options/general.php:10
3493
- msgid "Use an Alternate Shortlink URL"
3494
  msgstr ""
3495
 
3496
- #: pro/app/views/options/general.php:11
3497
- msgid ""
3498
- "Use this option if you want to substitute your actual blog's url with "
3499
- "another URL. You must have another valid domain name pointing to this "
3500
- "WordPress install before you enable this option. If you are using this "
3501
- "option to just get rid of the www in the beginning of your url that is fine "
3502
- "-- just make sure your domain works without the www before enabling this "
3503
- "option."
3504
  msgstr ""
3505
 
3506
- #: pro/app/views/options/general.php:28 pro/app/views/options/general.php:30
3507
- msgid "Shortlink URL"
3508
  msgstr ""
3509
 
3510
- #: pro/app/views/options/general.php:31
3511
- msgid ""
3512
- "Enter a valid base url that points at this WordPress install. Make sure this "
3513
- "URL does not end with a slash (/)."
3514
  msgstr ""
3515
 
3516
- #: pro/app/views/options/general.php:47
3517
- msgid "Minimum Admin Role"
3518
  msgstr ""
3519
 
3520
- #: pro/app/views/options/general.php:49
3521
- msgid "Set Minimum Role Required To Access Pretty Link"
 
3522
  msgstr ""
3523
 
3524
- #: pro/app/views/options/general.php:50
3525
- msgid ""
3526
- "Use this option to set the minimum role of users who can access the Admin "
3527
- "interface for Pretty Link."
3528
  msgstr ""
3529
 
3530
- #: pro/app/views/options/general.php:56
3531
- msgid "Administrator"
3532
  msgstr ""
3533
 
3534
- #: pro/app/views/options/general.php:57
3535
- msgid "Editor"
 
3536
  msgstr ""
3537
 
3538
- #: pro/app/views/options/general.php:58
3539
- msgid "Author"
3540
  msgstr ""
3541
 
3542
- #: pro/app/views/options/general.php:59
3543
- msgid "Contributor"
3544
  msgstr ""
3545
 
3546
- #: pro/app/views/options/general.php:60
3547
- msgid "Subscriber"
3548
  msgstr ""
3549
 
3550
- #: pro/app/views/options/nav.php:3
3551
- msgid "Replacements"
3552
  msgstr ""
3553
 
3554
- #: pro/app/views/options/nav.php:4
3555
- msgid "Auto-Create Links"
3556
  msgstr ""
3557
 
3558
- #: pro/app/views/options/nav.php:6
3559
- msgid "Social"
3560
  msgstr ""
3561
 
3562
- #: pro/app/views/options/nav.php:7
3563
- msgid "Public"
 
3564
  msgstr ""
3565
 
3566
- #: pro/app/views/public/form.php:30
3567
- msgid "ERROR:"
3568
  msgstr ""
3569
 
3570
- #: pro/app/views/reports/custom-report.php:7
3571
- msgid "Link Report"
3572
  msgstr ""
3573
 
3574
- #: pro/app/views/reports/custom-report.php:8
3575
- msgid "Report:"
3576
  msgstr ""
3577
 
3578
- #: pro/app/views/reports/custom-report.php:10
3579
- msgid "For Goal Link:"
3580
  msgstr ""
3581
 
3582
- #: pro/app/views/reports/custom-report.php:30
3583
- #: pro/app/views/reports/custom-report.php:63
3584
- msgid "Link Name"
3585
  msgstr ""
3586
 
3587
- #: pro/app/views/reports/custom-report.php:35
3588
- #: pro/app/views/reports/custom-report.php:68
3589
- #: pro/app/views/reports/split-test-report.php:32
3590
- #: pro/app/views/reports/split-test-report.php:64
3591
- msgid "Conv Rate"
3592
  msgstr ""
3593
 
3594
- #: pro/app/views/reports/edit.php:4
3595
- msgid "Edit Link Report"
3596
  msgstr ""
3597
 
3598
- #: pro/app/views/reports/edit.php:17 pro/app/views/reports/new.php:16
3599
- msgid "This is how you'll identify your Report."
 
3600
  msgstr ""
3601
 
3602
- #: pro/app/views/reports/edit.php:23 pro/app/views/reports/new.php:23
3603
- msgid "Select Links to Analyze in this Report:"
3604
  msgstr ""
3605
 
3606
- #: pro/app/views/reports/edit.php:77 pro/app/views/reports/new.php:77
3607
- msgid "Select some links to be analyzed in this report."
3608
  msgstr ""
3609
 
3610
- #: pro/app/views/reports/edit.php:80 pro/app/views/reports/new.php:80
3611
- msgid "Select Your Goal Link (optional):"
3612
  msgstr ""
3613
 
3614
- #: pro/app/views/reports/edit.php:103 pro/app/views/reports/new.php:103
3615
- msgid ""
3616
- "If you want to enable conversion tracking in this report then select a goal "
3617
- "link."
3618
  msgstr ""
3619
 
3620
- #: pro/app/views/reports/list.php:4 pro/app/views/reports/reports.php:7
3621
- msgid "Link Reports"
3622
  msgstr ""
3623
 
3624
- #: pro/app/views/reports/list.php:5
3625
- msgid "Add Report"
3626
  msgstr ""
3627
 
3628
- #: pro/app/views/reports/list.php:41
3629
- msgid "No Pretty Link Reports were found"
3630
  msgstr ""
3631
 
3632
- #: pro/app/views/reports/list.php:57
3633
- msgid "View"
3634
  msgstr ""
3635
 
3636
- #: pro/app/views/reports/new.php:4
3637
- msgid "Add Link Report"
3638
  msgstr ""
3639
 
3640
- #: pro/app/views/reports/reports.php:4
3641
- msgid "Reports"
3642
  msgstr ""
3643
 
3644
- #: pro/app/views/reports/split-test-report.php:4
3645
- msgid "Link Split-Test Report"
3646
  msgstr ""
3647
 
3648
- #: pro/app/views/reports/split-test-report.php:5
3649
- msgid "For Link:"
3650
  msgstr ""
3651
 
3652
- #: pro/app/views/reports/split-test-report.php:7
3653
- msgid "Goal Link:"
3654
  msgstr ""
3655
 
3656
- #: pro/app/views/reports/split-test-report.php:27
3657
- msgid "Link Rotation URL"
 
3658
  msgstr ""
3659
 
3660
- #: pro/app/views/reports/split-test-report.php:59
3661
- msgid "Rotation URL"
3662
  msgstr ""
3663
 
3664
- #: pro/app/views/tools/generator.php:6
3665
- msgid "Custom Bookmarklet:"
3666
  msgstr ""
3667
 
3668
- #: pro/app/views/tools/generator.php:9
3669
- msgid "Customize Pretty Link Bookmarklet"
3670
  msgstr ""
3671
 
3672
- #: pro/app/views/tools/generator.php:10
3673
- msgid ""
3674
- "Alter the options below to customize this Bookmarklet. As you modify the "
3675
- "label, redirect type, tracking and group, you will see this bookmarklet "
3676
- "update -- when the settings are how you want them, drag the bookmarklet into "
3677
- "your toolbar. You can create as many bookmarklets as you want each with "
3678
- "different settings."
3679
  msgstr ""
3680
 
3681
- #: pro/app/views/tools/generator.php:13
3682
- #: pro/app/widgets/PlpPublicLinksWidget.php:55
3683
- msgid "Pretty Link Options"
3684
  msgstr ""
3685
 
3686
- #: pro/app/views/tools/generator.php:16
3687
- msgid "Label:"
3688
  msgstr ""
3689
 
3690
- #: pro/app/views/tools/generator.php:21
3691
- #: pro/app/widgets/PlpPublicLinksWidget.php:57
3692
- msgid "Redirection:"
3693
  msgstr ""
3694
 
3695
- #: pro/app/views/tools/generator.php:25
3696
- msgid "Tracking:"
3697
  msgstr ""
3698
 
3699
- #: pro/app/views/tools/generator.php:28
3700
- #: pro/app/widgets/PlpPublicLinksWidget.php:72
3701
- msgid "Yes"
3702
  msgstr ""
3703
 
3704
- #: pro/app/views/tools/generator.php:29
3705
- #: pro/app/widgets/PlpPublicLinksWidget.php:73
3706
- msgid "No"
3707
  msgstr ""
3708
 
3709
- #: pro/app/views/tools/generator.php:33
3710
- #: pro/app/widgets/PlpPublicLinksWidget.php:78
3711
- msgid "Group:"
3712
  msgstr ""
3713
 
3714
- #: pro/app/views/tools/nav.php:3
3715
- msgid "Custom Bookmarklet"
3716
  msgstr ""
3717
 
3718
- #: pro/app/widgets/PlpPublicLinksWidget.php:7
3719
- msgid "Create a Short URL"
3720
  msgstr ""
3721
 
3722
- #: pro/app/widgets/PlpPublicLinksWidget.php:53
3723
- msgid "Label Text:"
3724
  msgstr ""
3725
 
3726
- #: pro/app/widgets/PlpPublicLinksWidget.php:54
3727
- msgid "Button Text:"
3728
  msgstr ""
3729
 
3730
- #: pro/app/widgets/PlpPublicLinksWidget.php:54
3731
- msgid "if left blank, no button will display"
3732
  msgstr ""
3733
 
3734
- #: pro/app/widgets/PlpPublicLinksWidget.php:60
3735
- msgid "Permanent/301"
3736
  msgstr ""
3737
 
3738
- #: pro/app/widgets/PlpPublicLinksWidget.php:61
3739
- msgid "Temporary/302"
 
3740
  msgstr ""
3741
 
3742
- #: pro/app/widgets/PlpPublicLinksWidget.php:62
3743
- msgid "Temporary/307"
3744
  msgstr ""
3745
 
3746
- #: pro/app/widgets/PlpPublicLinksWidget.php:63
3747
- msgid "PrettyBar"
 
3748
  msgstr ""
3749
 
3750
- #: pro/app/widgets/PlpPublicLinksWidget.php:69
3751
- msgid "Tracking Enabled:"
3752
  msgstr ""
3753
 
3754
- #: pro/i18n/countries.php:5
3755
- msgid "Afghanistan"
 
3756
  msgstr ""
3757
 
3758
- #: pro/i18n/countries.php:6
3759
- msgid "&#197;land Islands"
 
3760
  msgstr ""
3761
 
3762
- #: pro/i18n/countries.php:7
3763
- msgid "Albania"
 
3764
  msgstr ""
3765
 
3766
- #: pro/i18n/countries.php:8
3767
- msgid "Algeria"
 
3768
  msgstr ""
3769
 
3770
- #: pro/i18n/countries.php:9
3771
- msgid "Andorra"
 
3772
  msgstr ""
3773
 
3774
- #: pro/i18n/countries.php:10
3775
- msgid "Angola"
3776
  msgstr ""
3777
 
3778
- #: pro/i18n/countries.php:11
3779
- msgid "Anguilla"
3780
  msgstr ""
3781
 
3782
- #: pro/i18n/countries.php:12
3783
- msgid "Antarctica"
3784
  msgstr ""
3785
 
3786
- #: pro/i18n/countries.php:13
3787
- msgid "Antigua and Barbuda"
3788
  msgstr ""
3789
 
3790
- #: pro/i18n/countries.php:14
3791
- msgid "Argentina"
3792
  msgstr ""
3793
 
3794
- #: pro/i18n/countries.php:15
3795
- msgid "Armenia"
3796
  msgstr ""
3797
 
3798
- #: pro/i18n/countries.php:16
3799
- msgid "Aruba"
3800
  msgstr ""
3801
 
3802
- #: pro/i18n/countries.php:17
3803
- msgid "Australia"
3804
  msgstr ""
3805
 
3806
- #: pro/i18n/countries.php:18
3807
- msgid "Austria"
3808
  msgstr ""
3809
 
3810
- #: pro/i18n/countries.php:19
3811
- msgid "Azerbaijan"
3812
  msgstr ""
3813
 
3814
- #: pro/i18n/countries.php:20
3815
- msgid "Bahamas"
3816
  msgstr ""
3817
 
3818
- #: pro/i18n/countries.php:21
3819
- msgid "Bahrain"
3820
  msgstr ""
3821
 
3822
- #: pro/i18n/countries.php:22
3823
- msgid "Bangladesh"
3824
  msgstr ""
3825
 
3826
- #: pro/i18n/countries.php:23
3827
- msgid "Barbados"
3828
  msgstr ""
3829
 
3830
- #: pro/i18n/countries.php:24
3831
- msgid "Belarus"
3832
  msgstr ""
3833
 
3834
- #: pro/i18n/countries.php:25
3835
- msgid "Belgium"
3836
  msgstr ""
3837
 
3838
- #: pro/i18n/countries.php:26
3839
- msgid "Belau"
3840
  msgstr ""
3841
 
3842
- #: pro/i18n/countries.php:27
3843
- msgid "Belize"
 
3844
  msgstr ""
3845
 
3846
- #: pro/i18n/countries.php:28
3847
- msgid "Benin"
3848
  msgstr ""
3849
 
3850
- #: pro/i18n/countries.php:29
3851
- msgid "Bermuda"
3852
  msgstr ""
3853
 
3854
- #: pro/i18n/countries.php:30
3855
- msgid "Bhutan"
 
3856
  msgstr ""
3857
 
3858
- #: pro/i18n/countries.php:31
3859
- msgid "Bolivia"
3860
  msgstr ""
3861
 
3862
- #: pro/i18n/countries.php:32
3863
- msgid "Bonaire, Saint Eustatius and Saba"
 
3864
  msgstr ""
3865
 
3866
- #: pro/i18n/countries.php:33
3867
- msgid "Bosnia and Herzegovina"
3868
  msgstr ""
3869
 
3870
- #: pro/i18n/countries.php:34
3871
- msgid "Botswana"
3872
  msgstr ""
3873
 
3874
- #: pro/i18n/countries.php:35
3875
- msgid "Bouvet Island"
 
3876
  msgstr ""
3877
 
3878
- #: pro/i18n/countries.php:36
3879
- msgid "Brazil"
3880
  msgstr ""
3881
 
3882
- #: pro/i18n/countries.php:37
3883
- msgid "British Indian Ocean Territory"
3884
  msgstr ""
3885
 
3886
- #: pro/i18n/countries.php:38
3887
- msgid "British Virgin Islands"
 
3888
  msgstr ""
3889
 
3890
- #: pro/i18n/countries.php:39
3891
- msgid "Brunei"
3892
  msgstr ""
3893
 
3894
- #: pro/i18n/countries.php:40
3895
- msgid "Bulgaria"
3896
  msgstr ""
3897
 
3898
- #: pro/i18n/countries.php:41
3899
- msgid "Burkina Faso"
3900
  msgstr ""
3901
 
3902
- #: pro/i18n/countries.php:42
3903
- msgid "Burundi"
3904
  msgstr ""
3905
 
3906
- #: pro/i18n/countries.php:43
3907
- msgid "Cambodia"
 
3908
  msgstr ""
3909
 
3910
- #: pro/i18n/countries.php:44
3911
- msgid "Cameroon"
 
3912
  msgstr ""
3913
 
3914
- #: pro/i18n/countries.php:45
3915
- msgid "Canada"
 
3916
  msgstr ""
3917
 
3918
- #: pro/i18n/countries.php:46
3919
- msgid "Cape Verde"
 
3920
  msgstr ""
3921
 
3922
- #: pro/i18n/countries.php:47
3923
- msgid "Cayman Islands"
3924
  msgstr ""
3925
 
3926
- #: pro/i18n/countries.php:48
3927
- msgid "Central African Republic"
3928
  msgstr ""
3929
 
3930
- #: pro/i18n/countries.php:49
3931
- msgid "Chad"
 
3932
  msgstr ""
3933
 
3934
- #: pro/i18n/countries.php:50
3935
- msgid "Chile"
 
 
 
3936
  msgstr ""
3937
 
3938
- #: pro/i18n/countries.php:51
3939
- msgid "China"
 
3940
  msgstr ""
3941
 
3942
- #: pro/i18n/countries.php:52
3943
- msgid "Christmas Island"
 
3944
  msgstr ""
3945
 
3946
- #: pro/i18n/countries.php:53
3947
- msgid "Cocos/Keeling Islands"
 
3948
  msgstr ""
3949
 
3950
- #: pro/i18n/countries.php:54
3951
- msgid "Colombia"
 
3952
  msgstr ""
3953
 
3954
- #: pro/i18n/countries.php:55
3955
- msgid "Comoros"
 
3956
  msgstr ""
3957
 
3958
- #: pro/i18n/countries.php:56
3959
- msgid "Congo (Brazzaville)"
 
3960
  msgstr ""
3961
 
3962
- #: pro/i18n/countries.php:57
3963
- msgid "Congo (Kinshasa)"
3964
  msgstr ""
3965
 
3966
- #: pro/i18n/countries.php:58
3967
- msgid "Cook Islands"
3968
  msgstr ""
3969
 
3970
- #: pro/i18n/countries.php:59
3971
- msgid "Costa Rica"
 
3972
  msgstr ""
3973
 
3974
- #: pro/i18n/countries.php:60
3975
- msgid "Croatia"
 
3976
  msgstr ""
3977
 
3978
- #: pro/i18n/countries.php:61
3979
- msgid "Cuba"
3980
  msgstr ""
3981
 
3982
- #: pro/i18n/countries.php:62
3983
- msgid "Cura&Ccedil;ao"
 
3984
  msgstr ""
3985
 
3986
- #: pro/i18n/countries.php:63
3987
- msgid "Cyprus"
3988
  msgstr ""
3989
 
3990
- #: pro/i18n/countries.php:64
3991
- msgid "Czech Republic"
3992
  msgstr ""
3993
 
3994
- #: pro/i18n/countries.php:65
3995
- msgid "Denmark"
3996
  msgstr ""
3997
 
3998
- #: pro/i18n/countries.php:66
3999
- msgid "Djibouti"
4000
  msgstr ""
4001
 
4002
- #: pro/i18n/countries.php:67
4003
- msgid "Dominica"
4004
  msgstr ""
4005
 
4006
- #: pro/i18n/countries.php:68
4007
- msgid "Dominican Republic"
4008
  msgstr ""
4009
 
4010
- #: pro/i18n/countries.php:69
4011
- msgid "Ecuador"
4012
  msgstr ""
4013
 
4014
- #: pro/i18n/countries.php:70
4015
- msgid "Egypt"
4016
  msgstr ""
4017
 
4018
- #: pro/i18n/countries.php:71
4019
- msgid "El Salvador"
4020
  msgstr ""
4021
 
4022
- #: pro/i18n/countries.php:72
4023
- msgid "Equatorial Guinea"
4024
  msgstr ""
4025
 
4026
- #: pro/i18n/countries.php:73
4027
- msgid "Eritrea"
4028
  msgstr ""
4029
 
4030
- #: pro/i18n/countries.php:74
4031
- msgid "Estonia"
 
4032
  msgstr ""
4033
 
4034
- #: pro/i18n/countries.php:75
4035
- msgid "Ethiopia"
4036
  msgstr ""
4037
 
4038
- #: pro/i18n/countries.php:76
4039
- msgid "Falkland Islands"
4040
  msgstr ""
4041
 
4042
- #: pro/i18n/countries.php:77
4043
- msgid "Faroe Islands"
4044
  msgstr ""
4045
 
4046
- #: pro/i18n/countries.php:78
4047
- msgid "Fiji"
 
 
 
 
4048
  msgstr ""
4049
 
4050
- #: pro/i18n/countries.php:79
4051
- msgid "Finland"
4052
  msgstr ""
4053
 
4054
- #: pro/i18n/countries.php:80
4055
- msgid "France"
4056
  msgstr ""
4057
 
4058
- #: pro/i18n/countries.php:81
4059
- msgid "French Guiana"
4060
  msgstr ""
4061
 
4062
- #: pro/i18n/countries.php:82
4063
- msgid "French Polynesia"
4064
  msgstr ""
4065
 
4066
- #: pro/i18n/countries.php:83
4067
- msgid "French Southern Territories"
 
4068
  msgstr ""
4069
 
4070
- #: pro/i18n/countries.php:84
4071
- msgid "Gabon"
4072
  msgstr ""
4073
 
4074
- #: pro/i18n/countries.php:85
4075
- msgid "Gambia"
4076
  msgstr ""
4077
 
4078
- #: pro/i18n/countries.php:86
4079
- msgid "Georgia"
4080
  msgstr ""
4081
 
4082
- #: pro/i18n/countries.php:87
4083
- msgid "Germany"
4084
  msgstr ""
4085
 
4086
- #: pro/i18n/countries.php:88
4087
- msgid "Ghana"
4088
  msgstr ""
4089
 
4090
- #: pro/i18n/countries.php:89
4091
- msgid "Gibraltar"
4092
  msgstr ""
4093
 
4094
- #: pro/i18n/countries.php:90
4095
- msgid "Greece"
4096
  msgstr ""
4097
 
4098
- #: pro/i18n/countries.php:91
4099
- msgid "Greenland"
4100
  msgstr ""
4101
 
4102
- #: pro/i18n/countries.php:92
4103
- msgid "Grenada"
4104
  msgstr ""
4105
 
4106
- #: pro/i18n/countries.php:93
4107
- msgid "Guadeloupe"
4108
  msgstr ""
4109
 
4110
- #: pro/i18n/countries.php:94
4111
- msgid "Guatemala"
4112
  msgstr ""
4113
 
4114
- #: pro/i18n/countries.php:95
4115
- msgid "Guernsey"
 
4116
  msgstr ""
4117
 
4118
- #: pro/i18n/countries.php:96
4119
- msgid "Guinea"
4120
  msgstr ""
4121
 
4122
- #: pro/i18n/countries.php:97
4123
- msgid "Guinea-Bissau"
 
4124
  msgstr ""
4125
 
4126
- #: pro/i18n/countries.php:98
4127
- msgid "Guyana"
4128
  msgstr ""
4129
 
4130
- #: pro/i18n/countries.php:99
4131
- msgid "Haiti"
4132
  msgstr ""
4133
 
4134
- #: pro/i18n/countries.php:100
4135
- msgid "Heard Island and McDonald Islands"
4136
  msgstr ""
4137
 
4138
- #: pro/i18n/countries.php:101
4139
- msgid "Honduras"
4140
  msgstr ""
4141
 
4142
- #: pro/i18n/countries.php:102
4143
- msgid "Hong Kong"
4144
  msgstr ""
4145
 
4146
- #: pro/i18n/countries.php:103
4147
- msgid "Hungary"
4148
  msgstr ""
4149
 
4150
- #: pro/i18n/countries.php:104
4151
- msgid "Iceland"
4152
  msgstr ""
4153
 
4154
- #: pro/i18n/countries.php:105
4155
- msgid "India"
4156
  msgstr ""
4157
 
4158
- #: pro/i18n/countries.php:106
4159
- msgid "Indonesia"
 
4160
  msgstr ""
4161
 
4162
- #: pro/i18n/countries.php:107
4163
- msgid "Iran"
 
4164
  msgstr ""
4165
 
4166
- #: pro/i18n/countries.php:108
4167
- msgid "Iraq"
 
4168
  msgstr ""
4169
 
4170
- #: pro/i18n/countries.php:109
4171
- msgid "Republic of Ireland"
 
4172
  msgstr ""
4173
 
4174
- #: pro/i18n/countries.php:110
4175
- msgid "Isle of Man"
 
4176
  msgstr ""
4177
 
4178
- #: pro/i18n/countries.php:111
4179
- msgid "Israel"
 
 
4180
  msgstr ""
4181
 
4182
- #: pro/i18n/countries.php:112
4183
- msgid "Italy"
4184
  msgstr ""
4185
 
4186
- #: pro/i18n/countries.php:113
4187
- msgid "Ivory Coast"
4188
  msgstr ""
4189
 
4190
- #: pro/i18n/countries.php:114
4191
- msgid "Jamaica"
4192
  msgstr ""
4193
 
4194
- #: pro/i18n/countries.php:115
4195
- msgid "Japan"
4196
  msgstr ""
4197
 
4198
- #: pro/i18n/countries.php:116
4199
- msgid "Jersey"
 
4200
  msgstr ""
4201
 
4202
- #: pro/i18n/countries.php:117
4203
- msgid "Jordan"
4204
  msgstr ""
4205
 
4206
- #: pro/i18n/countries.php:118
4207
- msgid "Kazakhstan"
4208
  msgstr ""
4209
 
4210
- #: pro/i18n/countries.php:119
4211
- msgid "Kenya"
 
4212
  msgstr ""
4213
 
4214
- #: pro/i18n/countries.php:120
4215
- msgid "Kiribati"
 
4216
  msgstr ""
4217
 
4218
- #: pro/i18n/countries.php:121
4219
- msgid "Kuwait"
 
4220
  msgstr ""
4221
 
4222
- #: pro/i18n/countries.php:122
4223
- msgid "Kyrgyzstan"
4224
  msgstr ""
4225
 
4226
- #: pro/i18n/countries.php:123
4227
- msgid "Laos"
 
4228
  msgstr ""
4229
 
4230
- #: pro/i18n/countries.php:124
4231
- msgid "Latvia"
4232
  msgstr ""
4233
 
4234
- #: pro/i18n/countries.php:125
4235
- msgid "Lebanon"
 
4236
  msgstr ""
4237
 
4238
- #: pro/i18n/countries.php:126
4239
- msgid "Lesotho"
4240
  msgstr ""
4241
 
4242
- #: pro/i18n/countries.php:127
4243
- msgid "Liberia"
4244
  msgstr ""
4245
 
4246
- #: pro/i18n/countries.php:128
4247
- msgid "Libya"
4248
  msgstr ""
4249
 
4250
- #: pro/i18n/countries.php:129
4251
- msgid "Liechtenstein"
4252
  msgstr ""
4253
 
4254
- #: pro/i18n/countries.php:130
4255
- msgid "Lithuania"
4256
  msgstr ""
4257
 
4258
- #: pro/i18n/countries.php:131
4259
- msgid "Luxembourg"
4260
  msgstr ""
4261
 
4262
- #: pro/i18n/countries.php:132
4263
- msgid "Macao S.A.R., China"
 
4264
  msgstr ""
4265
 
4266
- #: pro/i18n/countries.php:133
4267
- msgid "Macedonia"
4268
  msgstr ""
4269
 
4270
- #: pro/i18n/countries.php:134
4271
- msgid "Madagascar"
4272
  msgstr ""
4273
 
4274
- #: pro/i18n/countries.php:135
4275
- msgid "Malawi"
4276
  msgstr ""
4277
 
4278
- #: pro/i18n/countries.php:136
4279
- msgid "Malaysia"
4280
  msgstr ""
4281
 
4282
- #: pro/i18n/countries.php:137
4283
- msgid "Maldives"
4284
  msgstr ""
4285
 
4286
- #: pro/i18n/countries.php:138
4287
- msgid "Mali"
4288
  msgstr ""
4289
 
4290
- #: pro/i18n/countries.php:139
4291
- msgid "Malta"
4292
  msgstr ""
4293
 
4294
- #: pro/i18n/countries.php:140
4295
- msgid "Marshall Islands"
4296
  msgstr ""
4297
 
4298
- #: pro/i18n/countries.php:141
4299
- msgid "Martinique"
4300
  msgstr ""
4301
 
4302
- #: pro/i18n/countries.php:142
4303
- msgid "Mauritania"
4304
  msgstr ""
4305
 
4306
- #: pro/i18n/countries.php:143
4307
- msgid "Mauritius"
4308
  msgstr ""
4309
 
4310
- #: pro/i18n/countries.php:144
4311
- msgid "Mayotte"
4312
  msgstr ""
4313
 
4314
- #: pro/i18n/countries.php:145
4315
- msgid "Mexico"
4316
  msgstr ""
4317
 
4318
- #: pro/i18n/countries.php:146
4319
- msgid "Micronesia"
4320
  msgstr ""
4321
 
4322
- #: pro/i18n/countries.php:147
4323
- msgid "Moldova"
 
4324
  msgstr ""
4325
 
4326
- #: pro/i18n/countries.php:148
4327
- msgid "Monaco"
4328
  msgstr ""
4329
 
4330
- #: pro/i18n/countries.php:149
4331
- msgid "Mongolia"
4332
  msgstr ""
4333
 
4334
- #: pro/i18n/countries.php:150
4335
- msgid "Montenegro"
4336
  msgstr ""
4337
 
4338
- #: pro/i18n/countries.php:151
4339
- msgid "Montserrat"
4340
  msgstr ""
4341
 
4342
- #: pro/i18n/countries.php:152
4343
- msgid "Morocco"
 
4344
  msgstr ""
4345
 
4346
- #: pro/i18n/countries.php:153
4347
- msgid "Mozambique"
 
4348
  msgstr ""
4349
 
4350
- #: pro/i18n/countries.php:154
4351
- msgid "Myanmar"
 
4352
  msgstr ""
4353
 
4354
- #: pro/i18n/countries.php:155
4355
- msgid "Namibia"
 
4356
  msgstr ""
4357
 
4358
- #: pro/i18n/countries.php:156
4359
- msgid "Nauru"
 
4360
  msgstr ""
4361
 
4362
- #: pro/i18n/countries.php:157
4363
- msgid "Nepal"
 
4364
  msgstr ""
4365
 
4366
- #: pro/i18n/countries.php:158
4367
- msgid "Netherlands"
 
4368
  msgstr ""
4369
 
4370
- #: pro/i18n/countries.php:159
4371
- msgid "Netherlands Antilles"
 
4372
  msgstr ""
4373
 
4374
- #: pro/i18n/countries.php:160
4375
- msgid "New Caledonia"
4376
  msgstr ""
4377
 
4378
- #: pro/i18n/countries.php:161
4379
- msgid "New Zealand"
4380
  msgstr ""
4381
 
4382
- #: pro/i18n/countries.php:162
4383
- msgid "Nicaragua"
4384
  msgstr ""
4385
 
4386
- #: pro/i18n/countries.php:163
4387
- msgid "Niger"
4388
  msgstr ""
4389
 
4390
- #: pro/i18n/countries.php:164
4391
- msgid "Nigeria"
4392
  msgstr ""
4393
 
4394
- #: pro/i18n/countries.php:165
4395
- msgid "Niue"
4396
  msgstr ""
4397
 
4398
- #: pro/i18n/countries.php:166
4399
- msgid "Norfolk Island"
4400
  msgstr ""
4401
 
4402
- #: pro/i18n/countries.php:167
4403
- msgid "North Korea"
4404
  msgstr ""
4405
 
4406
- #: pro/i18n/countries.php:168
4407
- msgid "Norway"
4408
  msgstr ""
4409
 
4410
- #: pro/i18n/countries.php:169
4411
- msgid "Oman"
4412
  msgstr ""
4413
 
4414
- #: pro/i18n/countries.php:170
4415
- msgid "Pakistan"
4416
  msgstr ""
4417
 
4418
- #: pro/i18n/countries.php:171
4419
- msgid "Palestinian Territory"
4420
  msgstr ""
4421
 
4422
- #: pro/i18n/countries.php:172
4423
- msgid "Panama"
4424
  msgstr ""
4425
 
4426
- #: pro/i18n/countries.php:173
4427
- msgid "Papua New Guinea"
4428
  msgstr ""
4429
 
4430
- #: pro/i18n/countries.php:174
4431
- msgid "Paraguay"
4432
  msgstr ""
4433
 
4434
- #: pro/i18n/countries.php:175
4435
- msgid "Peru"
4436
  msgstr ""
4437
 
4438
- #: pro/i18n/countries.php:176
4439
- msgid "Philippines"
4440
  msgstr ""
4441
 
4442
- #: pro/i18n/countries.php:177
4443
- msgid "Pitcairn"
4444
  msgstr ""
4445
 
4446
- #: pro/i18n/countries.php:178
4447
- msgid "Poland"
4448
  msgstr ""
4449
 
4450
- #: pro/i18n/countries.php:179
4451
- msgid "Portugal"
4452
  msgstr ""
4453
 
4454
- #: pro/i18n/countries.php:180
4455
- msgid "Qatar"
 
 
 
 
 
 
 
4456
  msgstr ""
4457
 
4458
- #: pro/i18n/countries.php:181
4459
- msgid "Reunion"
 
 
 
 
 
 
 
4460
  msgstr ""
4461
 
4462
- #: pro/i18n/countries.php:182
4463
- msgid "Romania"
 
 
 
 
 
 
 
4464
  msgstr ""
4465
 
4466
- #: pro/i18n/countries.php:183
4467
- msgid "Russia"
4468
  msgstr ""
4469
 
4470
- #: pro/i18n/countries.php:184
4471
- msgid "Rwanda"
 
4472
  msgstr ""
4473
 
4474
- #: pro/i18n/countries.php:185
4475
- msgid "Saint Barth&eacute;lemy"
4476
  msgstr ""
4477
 
4478
- #: pro/i18n/countries.php:186
4479
- msgid "Saint Helena"
4480
  msgstr ""
4481
 
4482
- #: pro/i18n/countries.php:187
4483
- msgid "Saint Kitts and Nevis"
4484
  msgstr ""
4485
 
4486
- #: pro/i18n/countries.php:188
4487
- msgid "Saint Lucia"
4488
  msgstr ""
4489
 
4490
- #: pro/i18n/countries.php:189
4491
- msgid "Saint Martin (French part)"
 
4492
  msgstr ""
4493
 
4494
- #: pro/i18n/countries.php:190
4495
- msgid "Saint Martin (Dutch part)"
 
4496
  msgstr ""
4497
 
4498
- #: pro/i18n/countries.php:191
4499
- msgid "Saint Pierre and Miquelon"
4500
  msgstr ""
4501
 
4502
- #: pro/i18n/countries.php:192
4503
- msgid "Saint Vincent and the Grenadines"
4504
  msgstr ""
4505
 
4506
- #: pro/i18n/countries.php:193
4507
- msgid "San Marino"
4508
  msgstr ""
4509
 
4510
- #: pro/i18n/countries.php:194
4511
- msgid "S&atilde;o Tom&eacute; and Pr&iacute;ncipe"
4512
  msgstr ""
4513
 
4514
- #: pro/i18n/countries.php:195
4515
- msgid "Saudi Arabia"
4516
  msgstr ""
4517
 
4518
- #: pro/i18n/countries.php:196
4519
- msgid "Senegal"
 
 
4520
  msgstr ""
4521
 
4522
- #: pro/i18n/countries.php:197
4523
- msgid "Serbia"
4524
  msgstr ""
4525
 
4526
- #: pro/i18n/countries.php:198
4527
- msgid "Seychelles"
4528
  msgstr ""
4529
 
4530
- #: pro/i18n/countries.php:199
4531
- msgid "Sierra Leone"
4532
  msgstr ""
4533
 
4534
- #: pro/i18n/countries.php:200
4535
- msgid "Singapore"
4536
  msgstr ""
4537
 
4538
- #: pro/i18n/countries.php:201
4539
- msgid "Slovakia"
 
4540
  msgstr ""
4541
 
4542
- #: pro/i18n/countries.php:202
4543
- msgid "Slovenia"
4544
  msgstr ""
4545
 
4546
- #: pro/i18n/countries.php:203
4547
- msgid "Solomon Islands"
4548
  msgstr ""
4549
 
4550
- #: pro/i18n/countries.php:204
4551
- msgid "Somalia"
4552
  msgstr ""
4553
 
4554
- #: pro/i18n/countries.php:205
4555
- msgid "South Africa"
 
 
4556
  msgstr ""
4557
 
4558
- #: pro/i18n/countries.php:206
4559
- msgid "South Georgia/Sandwich Islands"
4560
  msgstr ""
4561
 
4562
- #: pro/i18n/countries.php:207
4563
- msgid "South Korea"
4564
  msgstr ""
4565
 
4566
- #: pro/i18n/countries.php:208
4567
- msgid "South Sudan"
4568
  msgstr ""
4569
 
4570
- #: pro/i18n/countries.php:209
4571
- msgid "Spain"
4572
  msgstr ""
4573
 
4574
- #: pro/i18n/countries.php:210
4575
- msgid "Sri Lanka"
4576
  msgstr ""
4577
 
4578
- #: pro/i18n/countries.php:211
4579
- msgid "Sudan"
4580
  msgstr ""
4581
 
4582
- #: pro/i18n/countries.php:212
4583
- msgid "Suriname"
4584
  msgstr ""
4585
 
4586
- #: pro/i18n/countries.php:213
4587
- msgid "Svalbard and Jan Mayen"
4588
  msgstr ""
4589
 
4590
- #: pro/i18n/countries.php:214
4591
- msgid "Swaziland"
4592
  msgstr ""
4593
 
4594
- #: pro/i18n/countries.php:215
4595
- msgid "Sweden"
4596
  msgstr ""
4597
 
4598
- #: pro/i18n/countries.php:216
4599
- msgid "Switzerland"
4600
  msgstr ""
4601
 
4602
- #: pro/i18n/countries.php:217
4603
- msgid "Syria"
4604
  msgstr ""
4605
 
4606
- #: pro/i18n/countries.php:218
4607
- msgid "Taiwan"
4608
  msgstr ""
4609
 
4610
- #: pro/i18n/countries.php:219
4611
- msgid "Tajikistan"
4612
  msgstr ""
4613
 
4614
- #: pro/i18n/countries.php:220
4615
- msgid "Tanzania"
4616
  msgstr ""
4617
 
4618
- #: pro/i18n/countries.php:221
4619
- msgid "Thailand"
4620
  msgstr ""
4621
 
4622
- #: pro/i18n/countries.php:222
4623
- msgid "Timor-Leste"
4624
  msgstr ""
4625
 
4626
- #: pro/i18n/countries.php:223
4627
- msgid "Togo"
 
4628
  msgstr ""
4629
 
4630
- #: pro/i18n/countries.php:224
4631
- msgid "Tokelau"
4632
  msgstr ""
4633
 
4634
- #: pro/i18n/countries.php:225
4635
- msgid "Tonga"
4636
  msgstr ""
4637
 
4638
- #: pro/i18n/countries.php:226
4639
- msgid "Trinidad and Tobago"
4640
  msgstr ""
4641
 
4642
- #: pro/i18n/countries.php:227
4643
- msgid "Tunisia"
4644
  msgstr ""
4645
 
4646
- #: pro/i18n/countries.php:228
4647
- msgid "Turkey"
4648
  msgstr ""
4649
 
4650
- #: pro/i18n/countries.php:229
4651
- msgid "Turkmenistan"
4652
  msgstr ""
4653
 
4654
- #: pro/i18n/countries.php:230
4655
- msgid "Turks and Caicos Islands"
4656
  msgstr ""
4657
 
4658
- #: pro/i18n/countries.php:231
4659
- msgid "Tuvalu"
4660
  msgstr ""
4661
 
4662
- #: pro/i18n/countries.php:232
4663
- msgid "Uganda"
4664
  msgstr ""
4665
 
4666
- #: pro/i18n/countries.php:233
4667
- msgid "Ukraine"
4668
  msgstr ""
4669
 
4670
- #: pro/i18n/countries.php:234
4671
- msgid "United Arab Emirates"
4672
  msgstr ""
4673
 
4674
- #: pro/i18n/countries.php:235
4675
- msgid "United Kingdom (UK)"
4676
  msgstr ""
4677
 
4678
- #: pro/i18n/countries.php:236
4679
- msgid "United States"
4680
  msgstr ""
4681
 
4682
- #: pro/i18n/countries.php:237
4683
- msgid "Uruguay"
4684
  msgstr ""
4685
 
4686
- #: pro/i18n/countries.php:238
4687
- msgid "Uzbekistan"
4688
  msgstr ""
4689
 
4690
- #: pro/i18n/countries.php:239
4691
- msgid "Vanuatu"
4692
  msgstr ""
4693
 
4694
- #: pro/i18n/countries.php:240
4695
- msgid "Vatican"
 
 
4696
  msgstr ""
4697
 
4698
- #: pro/i18n/countries.php:241
4699
- msgid "Venezuela"
4700
  msgstr ""
4701
 
4702
- #: pro/i18n/countries.php:242
4703
- msgid "Vietnam"
4704
  msgstr ""
4705
 
4706
- #: pro/i18n/countries.php:243
4707
- msgid "Wallis and Futuna"
4708
  msgstr ""
4709
 
4710
- #: pro/i18n/countries.php:244
4711
- msgid "Western Sahara"
 
 
4712
  msgstr ""
4713
 
4714
- #: pro/i18n/countries.php:245
4715
- msgid "Western Samoa"
 
4716
  msgstr ""
4717
 
4718
- #: pro/i18n/countries.php:246
4719
- msgid "Yemen"
4720
  msgstr ""
4721
 
4722
- #: pro/i18n/countries.php:247
4723
- msgid "Zambia"
4724
  msgstr ""
4725
 
4726
- #: pro/i18n/countries.php:248
4727
- msgid "Zimbabwe"
 
4728
  msgstr ""
4729
 
4730
- #: script/i18n/pomo/sample/app.php:56
4731
- msgid "Welcome %s!"
4732
  msgstr ""
4733
 
4734
- #: script/i18n/pomo/sample/app.php:60
4735
- msgid "A string with low priority!"
4736
  msgstr ""
4737
 
4738
- #: script/i18n/pomo/sample/app.php:62
4739
- msgid "Bye\n"
4740
  msgstr ""
4741
 
4742
- #. Plugin URI of the plugin/theme
4743
- msgid "https://prettylinks.com/pl/plugin-uri"
4744
  msgstr ""
4745
 
4746
- #. Description of the plugin/theme
4747
- msgid ""
4748
- "Shrink, track and share any URL on the Internet from your WordPress website!"
4749
  msgstr ""
4750
 
4751
- #. Author of the plugin/theme
4752
- msgid "Blair Williams"
4753
  msgstr ""
4754
 
4755
- #. Author URI of the plugin/theme
4756
- msgid "http://blairwilliams.com"
 
4757
  msgstr ""
1
+ # Copyright (C) 2019 Blair Williams
2
+ # This file is distributed under the same license as the Pretty Links plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Pretty Links 3.0.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
7
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
+ "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2019-07-16T13:21:15-06:00\n"
13
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.2.0\n"
15
+ "X-Domain: pretty-link\n"
16
+
17
+ #. Plugin Name of the plugin
18
+ #: pro/app/views/links/prettybar.php:68
19
+ #: app/controllers/PrliLinksController.php:43
20
+ #: app/controllers/PrliLinksController.php:411
21
+ msgid "Pretty Links"
22
+ msgstr ""
23
 
24
+ #. Plugin URI of the plugin
25
+ msgid "https://prettylinks.com/pl/plugin-uri"
 
26
  msgstr ""
27
 
28
+ #. Description of the plugin
29
+ msgid "Shrink, track and share any URL on the Internet from your WordPress website!"
 
 
 
30
  msgstr ""
31
 
32
+ #. Author of the plugin
33
+ msgid "Blair Williams"
34
  msgstr ""
35
 
36
+ #. Author URI of the plugin
37
+ msgid "http://blairwilliams.com"
38
  msgstr ""
39
 
40
+ #: pro/app/helpers/PlpLinksHelper.php:18
41
+ #: pro/app/views/links/form.php:226
42
+ msgid "weight:"
43
  msgstr ""
44
 
45
+ #: pro/app/helpers/PlpPostsHelper.php:19
46
+ msgid "Hide Social Buttons on this post."
47
  msgstr ""
48
 
49
+ #: pro/app/helpers/PlpPostsHelper.php:26
50
+ msgid "Disable Keyword Replacements on this post."
51
  msgstr ""
52
 
53
+ #: pro/app/helpers/PlpPostsHelper.php:44
54
+ msgid "A Pretty Link will be created on Publish"
55
+ msgstr ""
56
+
57
+ #: pro/app/helpers/PlpPostsHelper.php:61
58
+ #: pro/app/views/links/form.php:39
59
+ #: pro/app/views/links/form.php:49
60
  #: pro/app/views/reports/split-test-report.php:28
61
  #: pro/app/views/reports/split-test-report.php:60
62
+ #: pro/app/views/reports/custom-report.php:31
63
+ #: pro/app/views/reports/custom-report.php:64
64
+ #: app/models/PrliClick.php:256
65
+ #: app/views/groups/list.php:81
66
+ #: app/views/clicks/list.php:4
67
+ #: app/controllers/PrliLinksController.php:409
68
+ #: app/controllers/PrliAppController.php:118
69
  msgid "Clicks"
70
  msgstr ""
71
 
72
+ #: pro/app/helpers/PlpPostsHelper.php:63
73
+ #: pro/app/views/reports/split-test-report.php:29
74
+ #: pro/app/views/reports/split-test-report.php:61
75
+ #: pro/app/views/reports/custom-report.php:32
76
+ #: pro/app/views/reports/custom-report.php:65
77
+ msgid "Uniques"
78
  msgstr ""
79
 
80
+ #: pro/app/helpers/PlpPostsHelper.php:66
81
+ #: app/models/PrliClick.php:251
82
+ msgid "Pretty Link:"
83
  msgstr ""
84
 
85
+ #: pro/app/helpers/PlpPostsHelper.php:68
86
+ msgid "edit"
87
  msgstr ""
88
 
89
+ #: pro/app/helpers/PlpPostsHelper.php:70
90
+ msgid "Visit Pretty Link:"
91
  msgstr ""
92
 
93
+ #: pro/app/helpers/PlpPostsHelper.php:70
94
+ msgid "in a New Window"
 
95
  msgstr ""
96
 
97
+ #: pro/app/helpers/PlpPostsHelper.php:70
98
+ msgid "visit"
 
 
99
  msgstr ""
100
 
101
+ #: pro/app/helpers/PlpPostsHelper.php:76
102
+ msgid "A Pretty Link hasn't been generated for this entry yet. Click \"Update Post\" to generate."
 
 
103
  msgstr ""
104
 
105
+ #: pro/app/helpers/PlpPublicLinksHelper.php:6
106
+ #: pro/app/controllers/PlpPublicLinksController.php:106
107
+ msgid "Enter a URL:"
108
  msgstr ""
109
 
110
+ #: pro/app/helpers/PlpPublicLinksHelper.php:7
111
+ #: pro/app/controllers/PlpPublicLinksController.php:107
112
+ #: pro/app/widgets/PlpPublicLinksWidget.php:61
113
+ msgid "Shrink"
114
  msgstr ""
115
 
116
+ #: pro/app/models/PlpUtils.php:36
117
+ msgid "Google Analyticator"
118
  msgstr ""
119
 
120
+ #: pro/app/models/PlpUtils.php:39
121
+ msgid "Google Analytics by MonsterInsights"
 
122
  msgstr ""
123
 
124
+ #: pro/app/models/PlpUtils.php:42
125
+ #: pro/app/views/links/bulk-edit.php:10
126
+ #: app/views/links/form_advanced.php:58
127
+ msgid "Google Analytics"
128
  msgstr ""
129
 
130
+ #: pro/app/models/PlpOptions.php:99
131
+ msgid "Facebook"
132
  msgstr ""
133
 
134
+ #: pro/app/models/PlpOptions.php:106
135
+ msgid "Twitter"
 
 
136
  msgstr ""
137
 
138
+ #: pro/app/models/PlpOptions.php:113
139
+ msgid "Google+"
 
 
140
  msgstr ""
141
 
142
+ #: pro/app/models/PlpOptions.php:120
143
+ msgid "Pinterest"
144
  msgstr ""
145
 
146
+ #: pro/app/models/PlpOptions.php:127
147
+ msgid "LinkedIn"
148
  msgstr ""
149
 
150
+ #: pro/app/models/PlpOptions.php:134
151
+ msgid "Reddit"
152
  msgstr ""
153
 
154
+ #: pro/app/models/PlpOptions.php:141
155
+ msgid "StumbleUpon"
156
  msgstr ""
157
 
158
+ #: pro/app/models/PlpOptions.php:148
159
+ msgid "Digg"
160
  msgstr ""
161
 
162
+ #: pro/app/models/PlpOptions.php:155
163
+ #: app/controllers/PrliLinksController.php:506
164
+ msgid "Email"
165
  msgstr ""
166
 
167
+ #: pro/app/models/PlpOptions.php:238
168
+ msgid "Affiliate Link Disclosures"
169
  msgstr ""
170
 
171
+ #: pro/app/models/PlpOptions.php:247
172
+ msgid "(aff)"
173
  msgstr ""
174
 
175
+ #: pro/app/models/PlpReport.php:150
176
+ msgid "Report must have a name."
177
  msgstr ""
178
 
179
+ #: pro/app/models/PlpReport.php:154
180
+ msgid "At least one link must be selected for analysis."
181
  msgstr ""
182
 
183
+ #: pro/app/models/PlpReport.php:259
184
+ msgid "Pretty Links Pro: Clicks for"
185
  msgstr ""
186
 
187
+ #: pro/app/models/PlpReport.php:259
188
+ msgid "report between"
189
  msgstr ""
190
 
191
+ #: pro/app/models/PlpReport.php:259
192
+ #: pro/app/models/PlpReport.php:400
193
+ #: app/models/PrliClick.php:251
194
+ msgid "and"
195
  msgstr ""
196
 
197
+ #: pro/app/models/PlpReport.php:266
198
+ #: pro/app/models/PlpReport.php:275
199
+ #: app/views/clicks/list.php:101
200
+ #: app/views/clicks/list.php:184
201
+ msgid "Link"
202
  msgstr ""
203
 
204
+ #: pro/app/models/PlpReport.php:266
205
+ #: pro/app/models/PlpReport.php:275
206
+ #: pro/app/models/PlpReport.php:412
207
+ #: pro/app/models/PlpReport.php:419
208
+ #: app/views/clicks/list.php:32
209
+ msgid "All Clicks"
210
  msgstr ""
211
 
212
+ #: pro/app/models/PlpReport.php:266
213
+ #: pro/app/models/PlpReport.php:275
214
+ #: pro/app/models/PlpReport.php:412
215
+ #: pro/app/models/PlpReport.php:419
216
+ #: app/views/clicks/list.php:33
217
+ msgid "Unique Clicks"
218
  msgstr ""
219
 
220
+ #: pro/app/models/PlpReport.php:266
221
+ #: pro/app/models/PlpReport.php:412
222
+ #: pro/app/views/reports/split-test-report.php:31
223
+ #: pro/app/views/reports/split-test-report.php:63
224
+ #: pro/app/views/reports/custom-report.php:34
225
+ #: pro/app/views/reports/custom-report.php:67
226
+ msgid "Conversions"
227
  msgstr ""
228
 
229
+ #: pro/app/models/PlpReport.php:400
230
+ msgid "Pretty Links Pro: Split Report for"
 
231
  msgstr ""
232
 
233
+ #: pro/app/models/PlpReport.php:400
234
+ #: app/models/PrliClick.php:251
235
+ msgid "between"
236
  msgstr ""
237
 
238
+ #: pro/app/models/PlpReport.php:412
239
+ #: pro/app/models/PlpReport.php:419
240
+ #: pro/app/views/links/form.php:199
241
+ #: app/views/links/form_pro.php:95
242
+ msgid "Rotation"
243
  msgstr ""
244
 
245
+ #: pro/app/views/links/link-options.php:3
246
+ #: pro/app/views/links/link-options.php:5
247
+ #: app/views/options/form.php:134
248
+ #: app/views/options/form.php:136
249
+ msgid "Base Slug Prefix"
250
  msgstr ""
251
 
252
+ #. translators: %1$s: open b tag, %2$s close b tag
253
+ #: pro/app/views/links/link-options.php:8
254
+ #: app/views/options/form.php:139
255
+ msgid "Use this to prefix all newly generated pretty links with a directory of your choice. For example set to %1$sout%2$s to make your pretty links look like http://site.com/%1$sout%2$s/xyz. Changing this option will NOT affect existing pretty links. If you do not wish to use a directory prefix, leave this text field blank. Whatever you type here will be sanitized and modified to ensure it is URL-safe. So %1$sHello World%2$s might get changed to something like %1$shello-world%2$s instead. Lowercase letters, numbers, dashes, and underscores are allowed."
256
  msgstr ""
257
 
258
+ #: pro/app/views/links/link-options.php:21
259
+ #: pro/app/views/links/link-options.php:23
260
+ #: app/views/options/form.php:153
261
+ #: app/views/options/form.php:155
262
+ msgid "Slug Character Count"
263
  msgstr ""
264
 
265
+ #: pro/app/views/links/link-options.php:24
266
+ #: app/views/options/form.php:156
267
+ msgid "The number of characters to use when auto-generating a random slug for pretty links. The default is 4. You cannot use less than 2."
268
  msgstr ""
269
 
270
+ #: pro/app/views/links/link-options.php:34
271
+ #: pro/app/views/links/link-options.php:35
272
+ #: app/views/options/form.php:167
273
+ #: app/views/options/form.php:168
274
+ msgid "Enable Google Analytics"
275
  msgstr ""
276
 
277
+ #: pro/app/views/links/link-options.php:36
278
+ #: app/views/options/form.php:169
279
+ msgid "Requires Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast), or the Google Analytics Plugin to be installed and configured on your site."
 
280
  msgstr ""
281
 
282
+ #. translators: %1s: open link tag, %2$s: close link tag
283
+ #: pro/app/views/links/link-options.php:50
284
+ msgid "Enable %1sQR Codes%2$s"
 
285
  msgstr ""
286
 
287
+ #: pro/app/views/links/link-options.php:57
288
+ #: app/views/options/form.php:182
289
+ msgid "Generate QR Codes"
290
  msgstr ""
291
 
292
+ #: pro/app/views/links/link-options.php:58
293
+ #: app/views/options/form.php:183
294
+ msgid "This will enable a link in your pretty link admin that will allow you to automatically download a QR Code for each individual Pretty Link."
295
  msgstr ""
296
 
297
+ #: pro/app/views/links/link-options.php:68
298
+ #: pro/app/views/links/link-options.php:70
299
+ #: app/views/options/form.php:194
300
+ #: app/views/options/form.php:196
301
+ msgid "Global Head Scripts"
302
  msgstr ""
303
 
304
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
305
+ #: pro/app/views/links/link-options.php:73
306
+ #: app/views/options/form.php:199
307
+ msgid "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head.%1$s%1$sWhat you enter in this box will be applied to all supported pretty links.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects."
308
  msgstr ""
309
 
310
+ #: pro/app/views/links/form.php:6
311
+ #: app/views/links/form_pro.php:15
312
+ msgid "Expire"
313
  msgstr ""
314
 
315
+ #: pro/app/views/links/form.php:9
316
+ #: app/views/links/form_pro.php:18
317
+ msgid "Expire Link"
318
  msgstr ""
319
 
320
+ #: pro/app/views/links/form.php:10
321
+ #: app/views/links/form_pro.php:19
322
+ msgid "Set this link to expire after a specific date or number of clicks."
323
  msgstr ""
324
 
325
+ #: pro/app/views/links/form.php:23
326
+ msgid "Expire After"
327
  msgstr ""
328
 
329
+ #: pro/app/views/links/form.php:26
330
+ msgid "Expiration Type"
331
  msgstr ""
332
 
333
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
334
+ #: pro/app/views/links/form.php:29
335
+ msgid "Select the type of expiration you want for this link.%1$s%1$s%2$sDate%3$s Select this option if you'd like to expire your link after a certain date.%1%s%1$s%2$sClicks%3$s: Select this option to expire this link after it has been clicked a specific number of times."
336
  msgstr ""
337
 
338
+ #: pro/app/views/links/form.php:38
339
+ #: pro/app/views/links/form.php:73
340
+ #: app/models/PrliClick.php:256
341
+ #: app/controllers/PrliLinksController.php:410
342
+ msgid "Date"
343
  msgstr ""
344
 
345
+ #: pro/app/views/links/form.php:52
346
+ msgid "Number of Clicks"
347
  msgstr ""
348
 
349
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
350
+ #: pro/app/views/links/form.php:55
351
+ msgid "Enter the number of times this link can be clicked before it expires.%1$s%1$s%2$sNote: Expirations based on clicks wouldn't work properly if you had tracking turned off for this link so as long as this is set to Clicks, Pretty Link will ensure tracking is turned on for this link as well.%3$s"
352
  msgstr ""
353
 
354
+ #: pro/app/views/links/form.php:76
355
+ msgid "Expiration Date"
356
  msgstr ""
357
 
358
+ #: pro/app/views/links/form.php:77
359
+ msgid "Enter a date here in the format YYYY-MM-DD to set when this link should expire."
360
  msgstr ""
361
 
362
+ #: pro/app/views/links/form.php:91
363
+ msgid "Expired Redirect"
 
 
 
 
 
 
 
364
  msgstr ""
365
 
366
+ #: pro/app/views/links/form.php:94
367
+ msgid "Redirect to URL when Expired"
 
 
 
 
 
 
 
368
  msgstr ""
369
 
370
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
371
+ #: pro/app/views/links/form.php:97
372
+ msgid "When this link expires, do you want to redirect to a specific URL. You can use this to redirect to a page you've setup to indicate that the link is expired.%1$s%1$s%2$sNote: If this is not set the link will throw a 404 error when expired%3$s."
 
 
 
 
 
 
373
  msgstr ""
374
 
375
+ #: pro/app/views/links/form.php:114
376
+ #: pro/app/views/options/form.php:187
377
+ msgid "URL"
378
  msgstr ""
379
 
380
+ #: pro/app/views/links/form.php:117
381
+ msgid "Expired URL"
 
382
  msgstr ""
383
 
384
+ #: pro/app/views/links/form.php:118
385
+ msgid "This is the URL that this link will redirect to after the expiration date above."
386
  msgstr ""
387
 
388
+ #: pro/app/views/links/form.php:133
389
+ #: app/views/links/form_pro.php:30
390
+ #: app/controllers/PrliLinksController.php:372
391
+ msgid "Keywords"
392
  msgstr ""
393
 
394
+ #: pro/app/views/links/form.php:136
395
+ #: app/views/links/form_pro.php:33
396
+ msgid "Auto-Replace Keywords"
397
  msgstr ""
398
 
399
+ #: pro/app/views/links/form.php:137
400
+ msgid "Enter a comma separated list of keywords / keyword phrases that you'd like to replace with this link in your Posts &amp; Pages."
401
  msgstr ""
402
 
403
+ #: pro/app/views/links/form.php:145
404
+ #: app/views/links/form_pro.php:44
405
+ msgid "URL Replacements"
406
  msgstr ""
407
 
408
+ #: pro/app/views/links/form.php:148
409
+ #: app/views/links/form_pro.php:47
410
+ msgid "Auto-Replace URLs"
411
  msgstr ""
412
 
413
+ #. translators: %1$s: open code tag, %2$s: close code tag
414
+ #: pro/app/views/links/form.php:151
415
+ msgid "Enter a comma separated list of the URLs that you'd like to replace with this Pretty Link in your Posts &amp; Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
416
  msgstr ""
417
 
418
+ #: pro/app/views/links/form.php:167
419
+ #: pro/app/views/links/form.php:170
420
+ #: app/views/links/form_pro.php:64
421
+ #: app/views/links/form_pro.php:67
422
+ msgid "Head Scripts"
 
423
  msgstr ""
424
 
425
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
426
+ #: pro/app/views/links/form.php:173
427
+ #: app/views/links/form_pro.php:70
428
+ msgid "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head for this pretty link.%1$s%1$sThese scripts will be in addition to any global one's you've defined in the options.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects."
429
  msgstr ""
430
 
431
+ #: pro/app/views/links/form.php:189
432
+ #: app/views/links/form_pro.php:84
433
+ msgid "Dynamic Redirection"
434
  msgstr ""
435
 
436
+ #: pro/app/views/links/form.php:192
437
+ #: app/views/links/form_pro.php:87
438
+ msgid "Dynamic Redirection Options"
439
  msgstr ""
440
 
441
+ #: pro/app/views/links/form.php:193
442
+ #: app/views/links/form_pro.php:88
443
+ msgid "These powerful options are available to give you dynamic control over redirection for this pretty link."
444
  msgstr ""
445
 
446
+ #: pro/app/views/links/form.php:198
447
+ #: pro/app/views/options/form.php:812
448
+ #: pro/app/views/options/autocreate.php:44
449
+ #: pro/app/views/tools/generator.php:37
450
+ #: pro/app/widgets/PlpPublicLinksWidget.php:94
451
+ #: app/views/links/form_pro.php:94
452
+ #: app/views/shared/tinymce_form_popup.php:75
453
+ #: app/views/shared/tinymce_form_popup.php:79
454
+ #: app/views/options/form.php:948
455
+ msgid "None"
456
  msgstr ""
457
 
458
+ #: pro/app/views/links/form.php:200
459
+ #: app/views/links/form_pro.php:96
460
+ msgid "Geographic"
461
  msgstr ""
462
 
463
+ #: pro/app/views/links/form.php:201
464
+ #: app/views/links/form_pro.php:97
465
+ msgid "Technology"
466
  msgstr ""
467
 
468
+ #: pro/app/views/links/form.php:202
469
+ #: app/views/links/form_pro.php:98
470
+ msgid "Time"
471
  msgstr ""
472
 
473
+ #: pro/app/views/links/form.php:211
474
+ #: pro/app/views/links/form.php:214
475
+ msgid "Target URL Rotations"
476
  msgstr ""
477
 
478
+ #. translators: %1$s: open code tag, %2$s: close code tag
479
+ #: pro/app/views/links/form.php:217
480
+ msgid "Enter the Target URLs that you'd like to rotate through when this Pretty Link is Clicked. These must be formatted as URLs example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
481
  msgstr ""
482
 
483
+ #: pro/app/views/links/form.php:225
484
+ msgid "Target URL (above)"
485
  msgstr ""
486
 
487
+ #: pro/app/views/links/form.php:237
488
+ msgid "Add Link Rotation"
489
  msgstr ""
490
 
491
+ #: pro/app/views/links/form.php:242
492
+ msgid "Split Test"
493
  msgstr ""
494
 
495
+ #: pro/app/views/links/form.php:245
496
+ msgid "Split Test This Link"
497
  msgstr ""
498
 
499
+ #: pro/app/views/links/form.php:246
500
+ msgid "Split testing will enable you to track the effectiveness of several links against each other. This works best when you have multiple link rotation URLs entered."
501
  msgstr ""
502
 
503
+ #: pro/app/views/links/form.php:260
504
+ #: pro/app/views/reports/list.php:37
505
+ #: pro/app/views/reports/list.php:87
506
+ msgid "Goal Link"
507
  msgstr ""
508
 
509
+ #: pro/app/views/links/form.php:263
510
+ msgid "Goal Link for Split Test"
511
  msgstr ""
512
 
513
+ #: pro/app/views/links/form.php:264
514
+ msgid "This is the goal link for your split test."
515
  msgstr ""
516
 
517
+ #: pro/app/views/links/form.php:275
518
+ msgid "id: %1$s | slug: %3$s | name: %2$s"
519
  msgstr ""
520
 
521
+ #: pro/app/views/links/form.php:293
522
+ #: pro/app/views/links/form.php:296
523
+ msgid "Geographic Redirects"
524
  msgstr ""
525
 
526
+ #: pro/app/views/links/form.php:297
527
+ msgid "This will enable you to setup specific target urls that this pretty link will redirect to based on the country of the person visiting the url."
528
  msgstr ""
529
 
530
+ #: pro/app/views/links/form.php:302
531
+ #: pro/app/views/links/form.php:316
532
+ #: pro/app/views/links/form.php:336
533
+ msgid "Add"
534
  msgstr ""
535
 
536
+ #: pro/app/views/links/form.php:307
537
+ #: pro/app/views/links/form.php:310
538
+ msgid "Technology Redirects"
 
539
  msgstr ""
540
 
541
+ #: pro/app/views/links/form.php:311
542
+ msgid "This will allow you to redirect based on your visitor's device, operating system and/or browser"
543
  msgstr ""
544
 
545
+ #: pro/app/views/links/form.php:321
546
+ #: pro/app/views/links/form.php:324
547
+ msgid "Time Period Redirects"
 
548
  msgstr ""
549
 
550
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
551
+ #: pro/app/views/links/form.php:327
552
+ msgid "This will allow you to redirect based on the time period in which your visitor visits this link.%1$s%1$s%2$sNote: If your visitor doesn't visit the link during any of the specified time periods set here, they'll simply be redirected to the main target url.%3$s"
553
  msgstr ""
554
 
555
+ #: pro/app/views/links/bulk-edit.php:6
556
+ msgid "Advanced Link Options"
557
  msgstr ""
558
 
559
+ #: pro/app/views/links/cloaked-redirect.php:19
560
+ msgid "Your browser does not support frames."
561
  msgstr ""
562
 
563
+ #: pro/app/views/links/link-has-expired.php:9
564
+ msgid "Link Not Found"
565
  msgstr ""
566
 
567
+ #: pro/app/views/links/link-has-expired.php:23
568
+ msgid "Sorry, this link has expired"
569
  msgstr ""
570
 
571
+ #: pro/app/views/links/time_row.php:13
572
+ msgid "Start Time:"
573
  msgstr ""
574
 
575
+ #: pro/app/views/links/time_row.php:16
576
+ msgid "Start of Time Period"
577
  msgstr ""
578
 
579
+ #: pro/app/views/links/time_row.php:17
580
+ msgid "This is where you'll enter the beginning of the time period for this redirect"
581
  msgstr ""
582
 
583
+ #: pro/app/views/links/time_row.php:26
584
+ msgid "End Time:"
585
  msgstr ""
586
 
587
+ #: pro/app/views/links/time_row.php:29
588
+ msgid "End of Time Period"
589
  msgstr ""
590
 
591
+ #: pro/app/views/links/time_row.php:30
592
+ msgid "This is where you'll enter the end of the time period for this redirect"
593
  msgstr ""
594
 
595
+ #: pro/app/views/links/time_row.php:39
596
+ #: pro/app/views/links/tech_row.php:85
597
+ #: pro/app/views/links/geo_row.php:25
598
+ msgid "URL:"
599
  msgstr ""
600
 
601
+ #: pro/app/views/links/time_row.php:42
602
+ msgid "Time Period Redirect URL"
 
603
  msgstr ""
604
 
605
+ #: pro/app/views/links/time_row.php:43
606
+ msgid "This is the URL that this Pretty Link will redirect to when the visitor visits the link in the associated time period."
607
  msgstr ""
608
 
609
+ #: pro/app/views/links/time_row.php:52
610
+ #: pro/app/views/links/tech_row.php:98
611
+ #: pro/app/views/links/geo_row.php:38
612
+ msgid "Remove"
613
  msgstr ""
614
 
615
+ #: pro/app/views/links/tech_row.php:14
616
+ msgid "Device:"
617
  msgstr ""
618
 
619
+ #: pro/app/views/links/tech_row.php:17
620
+ msgid "Technology Redirection Device"
621
  msgstr ""
622
 
623
+ #. translators: %1$s: open b tag, %2$s: close b tag, %3$s: br tag
624
+ #: pro/app/views/links/tech_row.php:20
625
+ msgid "%1$sDesktop%2$s will match on any conventional laptop or desktop computer.%3$s%3$s%1$sMobile%2$s will match on any phone, tablet or other portable device.%3$s%3$s%1$sPhone%2$s will match on any phone or similarly small device.%3$s%3$s%1$sTablet%2$s will match on any tablet sized device."
 
626
  msgstr ""
627
 
628
+ #: pro/app/views/links/tech_row.php:29
629
+ #: pro/app/views/links/tech_row.php:48
630
+ #: pro/app/views/links/tech_row.php:68
631
+ msgid "Any"
632
  msgstr ""
633
 
634
+ #: pro/app/views/links/tech_row.php:30
635
+ msgid "Desktop"
 
 
 
 
636
  msgstr ""
637
 
638
+ #: pro/app/views/links/tech_row.php:31
639
+ msgid "Mobile"
640
  msgstr ""
641
 
642
+ #: pro/app/views/links/tech_row.php:32
643
+ msgid "Phone"
644
  msgstr ""
645
 
646
+ #: pro/app/views/links/tech_row.php:33
647
+ msgid "Tablet"
648
  msgstr ""
649
 
650
+ #: pro/app/views/links/tech_row.php:39
651
+ msgid "Operating System:"
 
 
652
  msgstr ""
653
 
654
+ #: pro/app/views/links/tech_row.php:42
655
+ msgid "Technology Redirection OS"
656
  msgstr ""
657
 
658
+ #: pro/app/views/links/tech_row.php:43
659
+ msgid "Use this dropdown to select which Operating System this redirect will match on."
660
  msgstr ""
661
 
662
+ #: pro/app/views/links/tech_row.php:49
663
+ #: pro/app/views/links/tech_row.php:70
664
+ msgid "Android"
665
  msgstr ""
666
 
667
+ #: pro/app/views/links/tech_row.php:50
668
+ msgid "iOS"
669
  msgstr ""
670
 
671
+ #: pro/app/views/links/tech_row.php:51
672
+ msgid "Linux"
673
  msgstr ""
674
 
675
+ #: pro/app/views/links/tech_row.php:52
676
+ msgid "Mac"
677
  msgstr ""
678
 
679
+ #: pro/app/views/links/tech_row.php:53
680
+ msgid "Windows"
 
681
  msgstr ""
682
 
683
+ #: pro/app/views/links/tech_row.php:59
684
+ msgid "Browser:"
 
685
  msgstr ""
686
 
687
+ #: pro/app/views/links/tech_row.php:62
688
+ msgid "Technology Redirection Browser"
 
689
  msgstr ""
690
 
691
+ #: pro/app/views/links/tech_row.php:63
692
+ msgid "Use this dropdown to select which Browser this redirect will match on."
 
693
  msgstr ""
694
 
695
+ #: pro/app/views/links/tech_row.php:69
696
+ msgid "Amazon Silk"
 
697
  msgstr ""
698
 
699
+ #: pro/app/views/links/tech_row.php:71
700
+ msgid "Chrome"
 
701
  msgstr ""
702
 
703
+ #: pro/app/views/links/tech_row.php:72
704
+ msgid "Chromium"
 
 
 
705
  msgstr ""
706
 
707
+ #: pro/app/views/links/tech_row.php:73
708
+ msgid "Edge"
 
709
  msgstr ""
710
 
711
+ #: pro/app/views/links/tech_row.php:74
712
+ msgid "Firefox"
713
  msgstr ""
714
 
715
+ #: pro/app/views/links/tech_row.php:75
716
+ msgid "Internet Explorer"
717
  msgstr ""
718
 
719
+ #: pro/app/views/links/tech_row.php:76
720
+ msgid "Kindle"
 
721
  msgstr ""
722
 
723
+ #: pro/app/views/links/tech_row.php:77
724
+ msgid "Opera"
 
 
725
  msgstr ""
726
 
727
+ #: pro/app/views/links/tech_row.php:78
728
+ msgid "Opera Coast"
 
729
  msgstr ""
730
 
731
+ #: pro/app/views/links/tech_row.php:79
732
+ msgid "Safari"
 
 
733
  msgstr ""
734
 
735
+ #: pro/app/views/links/tech_row.php:88
736
+ msgid "Technology Redirection URL"
 
 
737
  msgstr ""
738
 
739
+ #: pro/app/views/links/tech_row.php:89
740
+ msgid "This is the URL that this Pretty Link will redirect to if the visitor's device, os and browser match the settings here."
 
 
741
  msgstr ""
742
 
743
+ #: pro/app/views/links/prettybar.php:46
744
+ msgid "You're viewing: %s"
745
  msgstr ""
746
 
747
+ #: pro/app/views/links/prettybar.php:46
748
+ msgid "Viewing: %s"
 
 
749
  msgstr ""
750
 
751
+ #: pro/app/views/links/prettybar.php:51
752
+ msgid "Share on Twitter"
 
 
753
  msgstr ""
754
 
755
+ #: pro/app/views/links/prettybar.php:68
756
+ msgid "Powered by"
 
 
 
757
  msgstr ""
758
 
759
+ #: pro/app/views/links/geo_row.php:12
760
+ msgid "Countries:"
 
 
761
  msgstr ""
762
 
763
+ #: pro/app/views/links/geo_row.php:15
764
+ msgid "Technology Redirection Countries"
 
 
765
  msgstr ""
766
 
767
+ #: pro/app/views/links/geo_row.php:16
768
+ msgid "This is a comma-separated list of countries that this redirect will match on. Just start typing a country's name and an autocomplete dropdown will appear to select from. Once a country is selected, feel free to start typing the name of another country. You can add as many as you'd like this redirect to match on"
769
  msgstr ""
770
 
771
+ #: pro/app/views/links/geo_row.php:28
772
+ msgid "Geographic Redirection URL"
773
  msgstr ""
774
 
775
+ #: pro/app/views/links/geo_row.php:29
776
+ msgid "This is the URL that this Pretty Link will redirect to if the visitor's country match the settings here."
777
  msgstr ""
778
 
779
+ #: pro/app/views/public/form.php:28
780
+ msgid "ERROR:"
781
  msgstr ""
782
 
783
+ #: pro/app/views/reports/edit.php:7
784
+ msgid "Edit Link Report"
785
  msgstr ""
786
 
787
+ #: pro/app/views/reports/edit.php:18
788
+ #: app/views/groups/edit.php:21
789
+ msgid "Name:"
790
  msgstr ""
791
 
792
+ #: pro/app/views/reports/edit.php:20
793
+ #: pro/app/views/reports/new.php:19
794
+ msgid "This is how you'll identify your Report."
795
  msgstr ""
796
 
797
+ #: pro/app/views/reports/edit.php:26
798
+ #: pro/app/views/reports/new.php:26
799
+ msgid "Select Links to Analyze in this Report:"
800
  msgstr ""
801
 
802
+ #: pro/app/views/reports/edit.php:36
803
+ #: pro/app/views/reports/new.php:36
804
+ msgid "Select some links to be analyzed in this report."
805
  msgstr ""
806
 
807
+ #: pro/app/views/reports/edit.php:39
808
+ #: pro/app/views/reports/new.php:39
809
+ msgid "Select Your Goal Link (optional):"
810
  msgstr ""
811
 
812
+ #: pro/app/views/reports/edit.php:44
813
+ #: pro/app/views/reports/list.php:32
814
+ #: pro/app/views/reports/list.php:86
815
+ #: pro/app/views/reports/new.php:44
816
+ #: app/views/groups/edit.php:36
817
+ #: app/views/groups/list.php:41
818
+ #: app/views/groups/list.php:93
819
+ #: app/views/groups/new.php:37
820
+ msgid "Name"
821
  msgstr ""
822
 
823
+ #: pro/app/views/reports/edit.php:60
824
+ #: pro/app/views/reports/new.php:60
825
+ msgid "If you want to enable conversion tracking in this report then select a goal link."
 
826
  msgstr ""
827
 
828
+ #: pro/app/views/reports/edit.php:66
829
+ #: app/views/options/form.php:999
830
+ #: app/views/groups/edit.php:72
831
+ #: app/controllers/PrliAppController.php:377
832
+ msgid "Update"
833
  msgstr ""
834
 
835
+ #: pro/app/views/reports/edit.php:66
836
+ #: pro/app/views/reports/split-test-report.php:19
837
+ #: pro/app/views/reports/custom-report.php:22
838
+ #: pro/app/views/reports/new.php:66
839
+ #: app/views/groups/edit.php:72
840
+ #: app/views/groups/new.php:71
841
+ #: app/views/clicks/list.php:43
842
+ msgid "Cancel"
843
  msgstr ""
844
 
845
+ #: pro/app/views/reports/list.php:4
846
+ #: pro/app/views/reports/reports.php:7
847
+ msgid "Link Reports"
 
 
 
848
  msgstr ""
849
 
850
+ #: pro/app/views/reports/list.php:5
851
+ msgid "Add Report"
852
  msgstr ""
853
 
854
+ #: pro/app/views/reports/list.php:18
855
+ #: app/views/groups/list.php:20
856
+ msgid "Search"
857
  msgstr ""
858
 
859
+ #: pro/app/views/reports/list.php:20
860
+ #: app/views/groups/list.php:24
861
+ #: app/views/clicks/list.php:64
862
+ #: app/controllers/PrliLinksController.php:502
863
+ msgid "Reset"
864
  msgstr ""
865
 
866
+ #: pro/app/views/reports/list.php:42
867
+ #: pro/app/views/reports/list.php:88
868
+ #: app/views/options/form.php:51
869
+ #: app/views/groups/list.php:46
870
+ #: app/views/groups/list.php:80
871
+ #: app/views/groups/list.php:94
872
+ msgid "Links"
873
  msgstr ""
874
 
875
+ #: pro/app/views/reports/list.php:47
876
+ #: pro/app/views/reports/list.php:89
877
+ #: app/views/groups/list.php:51
878
+ #: app/views/groups/list.php:95
879
+ msgid "Created"
880
  msgstr ""
881
 
882
+ #: pro/app/views/reports/list.php:57
883
+ msgid "No Pretty Link Reports were found"
884
  msgstr ""
885
 
886
+ #: pro/app/views/reports/list.php:68
887
+ #: pro/app/views/reports/list.php:71
888
+ #: app/helpers/PrliLinksHelper.php:67
889
+ #: app/views/groups/list.php:75
890
+ #: app/views/groups/list.php:78
891
+ msgid "Edit %s"
892
  msgstr ""
893
 
894
+ #: pro/app/views/reports/list.php:71
895
+ #: app/views/groups/list.php:78
896
+ msgid "Edit"
897
  msgstr ""
898
 
899
+ #: pro/app/views/reports/list.php:72
900
+ msgid "Are you sure you want to delete your %s Pretty Link Report?"
901
  msgstr ""
902
 
903
+ #: pro/app/views/reports/list.php:72
904
+ #: app/helpers/PrliLinksHelper.php:68
905
+ #: app/views/groups/list.php:79
906
+ msgid "Delete %s"
907
  msgstr ""
908
 
909
+ #: pro/app/views/reports/list.php:72
910
+ #: app/views/groups/list.php:79
911
+ msgid "Delete"
 
912
  msgstr ""
913
 
914
+ #: pro/app/views/reports/list.php:73
915
+ msgid "View report for %s"
916
  msgstr ""
917
 
918
+ #: pro/app/views/reports/list.php:73
919
+ msgid "View"
920
  msgstr ""
921
 
922
+ #: pro/app/views/reports/split-test-report.php:4
923
+ msgid "Link Split-Test Report"
924
  msgstr ""
925
 
926
+ #: pro/app/views/reports/split-test-report.php:5
927
+ msgid "For Link:"
928
  msgstr ""
929
 
930
+ #: pro/app/views/reports/split-test-report.php:7
931
+ msgid "Goal Link:"
932
  msgstr ""
933
 
934
+ #: pro/app/views/reports/split-test-report.php:9
935
+ #: app/views/clicks/list.php:18
936
+ msgid "Back to Links"
937
  msgstr ""
938
 
939
+ #: pro/app/views/reports/split-test-report.php:9
940
+ #: pro/app/views/reports/custom-report.php:12
941
+ #: app/views/clicks/list.php:11
942
+ msgid "Customize Report"
943
  msgstr ""
944
 
945
+ #: pro/app/views/reports/split-test-report.php:13
946
+ #: pro/app/views/reports/custom-report.php:16
947
+ #: app/views/clicks/list.php:37
948
+ msgid "Date Range:"
949
  msgstr ""
950
 
951
+ #: pro/app/views/reports/split-test-report.php:19
952
+ #: pro/app/views/reports/custom-report.php:22
953
+ #: app/views/clicks/list.php:43
954
+ msgid "Customize"
955
  msgstr ""
956
 
957
+ #: pro/app/views/reports/split-test-report.php:27
958
+ msgid "Link Rotation URL"
959
  msgstr ""
960
 
961
+ #: pro/app/views/reports/split-test-report.php:32
962
+ #: pro/app/views/reports/split-test-report.php:64
963
+ #: pro/app/views/reports/custom-report.php:35
964
+ #: pro/app/views/reports/custom-report.php:68
965
+ msgid "Conv Rate"
966
  msgstr ""
967
 
968
+ #: pro/app/views/reports/split-test-report.php:59
969
+ msgid "Rotation URL"
 
970
  msgstr ""
971
 
972
+ #: pro/app/views/reports/custom-report.php:7
973
+ msgid "Link Report"
974
  msgstr ""
975
 
976
+ #: pro/app/views/reports/custom-report.php:8
977
+ msgid "Report:"
978
  msgstr ""
979
 
980
+ #: pro/app/views/reports/custom-report.php:10
981
+ msgid "For Goal Link:"
982
  msgstr ""
983
 
984
+ #: pro/app/views/reports/custom-report.php:30
985
+ #: pro/app/views/reports/custom-report.php:63
986
+ msgid "Link Name"
 
987
  msgstr ""
988
 
989
+ #: pro/app/views/reports/reports.php:4
990
+ #: pro/app/controllers/PlpReportsController.php:15
991
+ msgid "Reports"
 
992
  msgstr ""
993
 
994
+ #: pro/app/views/reports/new.php:7
995
+ msgid "Add Link Report"
 
996
  msgstr ""
997
 
998
+ #: pro/app/views/reports/new.php:17
999
+ #: app/views/groups/new.php:22
1000
+ msgid "Name*:"
1001
  msgstr ""
1002
 
1003
+ #: pro/app/views/reports/new.php:66
1004
+ #: app/views/groups/new.php:71
1005
+ #: app/views/widgets/widget.php:21
1006
+ msgid "Create"
 
 
1007
  msgstr ""
1008
 
1009
+ #: pro/app/views/options/form.php:4
1010
+ #: app/views/options/form.php:305
1011
+ msgid "Keyword &amp; URL Auto Replacements Options"
1012
  msgstr ""
1013
 
1014
+ #: pro/app/views/options/form.php:13
1015
+ #: app/views/options/form.php:312
1016
+ msgid "Enable Replacements"
1017
  msgstr ""
1018
 
1019
+ #: pro/app/views/options/form.php:15
1020
+ #: app/views/options/form.php:314
1021
+ msgid "Enable Keyword and URL Auto Replacement"
1022
  msgstr ""
1023
 
1024
+ #: pro/app/views/options/form.php:16
1025
+ #: app/views/options/form.php:315
1026
+ msgid "If checked, this will enable you to automatically replace keywords and/or URLs on your blog with pretty links. You will specify the specific keywords and urls from your Pretty Link edit page."
1027
  msgstr ""
1028
 
1029
+ #: pro/app/views/options/form.php:34
1030
+ #: app/views/options/form.php:334
1031
+ msgid "Thresholds"
1032
  msgstr ""
1033
 
1034
+ #: pro/app/views/options/form.php:36
1035
+ #: app/views/options/form.php:336
1036
+ msgid "Set Keyword Replacement Thresholds"
1037
  msgstr ""
1038
 
1039
+ #: pro/app/views/options/form.php:37
1040
+ #: app/views/options/form.php:337
1041
+ msgid "Don't want to have too many keyword replacements per page? Select to set some reasonable keyword replacement thresholds."
1042
  msgstr ""
1043
 
1044
+ #: pro/app/views/options/form.php:54
1045
+ msgid "Max Keywords"
1046
  msgstr ""
1047
 
1048
+ #: pro/app/views/options/form.php:56
1049
+ msgid "Set Maximum Keywords per Page"
1050
  msgstr ""
1051
 
1052
+ #: pro/app/views/options/form.php:57
1053
+ msgid "Maximum number of unique keyword / keyphrases you can replace with Pretty Links per page."
 
1054
  msgstr ""
1055
 
1056
+ #: pro/app/views/options/form.php:68
1057
+ msgid "Max Replacements"
1058
  msgstr ""
1059
 
1060
+ #: pro/app/views/options/form.php:70
1061
+ msgid "Set Maximum Replacements per Keyword"
1062
  msgstr ""
1063
 
1064
+ #: pro/app/views/options/form.php:71
1065
+ msgid "Maximum number of Pretty Link replacements per Keyword / Keyphrase."
1066
  msgstr ""
1067
 
1068
+ #: pro/app/views/options/form.php:87
1069
+ #: app/views/options/form.php:353
1070
+ msgid "Open in New Window"
1071
  msgstr ""
1072
 
1073
+ #: pro/app/views/options/form.php:89
1074
+ #: app/views/options/form.php:355
1075
+ msgid "Open Keyword Replacement Links in New Window"
1076
  msgstr ""
1077
 
1078
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
1079
+ #: pro/app/views/options/form.php:92
1080
+ #: app/views/options/form.php:358
1081
+ msgid "Ensure that these keyword replacement links are opened in a separate window. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
1082
  msgstr ""
1083
 
1084
+ #: pro/app/views/options/form.php:106
1085
+ #: app/views/options/form.php:373
1086
+ msgid "Add No Follows"
1087
  msgstr ""
1088
 
1089
+ #: pro/app/views/options/form.php:108
1090
+ #: app/views/options/form.php:375
1091
+ msgid "Add 'nofollow' attribute to all Keyword Pretty Links"
1092
  msgstr ""
1093
 
1094
+ #. translators: %1$s: open code tag, %2$s: close code tag, %3$s: open strong tag, %4$s close strong tag
1095
+ #: pro/app/views/options/form.php:111
1096
+ #: app/views/options/form.php:378
1097
+ msgid "This adds the html %1$sNOFOLLOW%2$s attribute to all keyword replacement links. %3$sNote:%4$s This does not apply to url replacements--only keyword replacements."
1098
  msgstr ""
1099
 
1100
+ #: pro/app/views/options/form.php:127
1101
+ #: app/views/options/form.php:395
1102
+ msgid "Custom CSS"
1103
  msgstr ""
1104
 
1105
+ #: pro/app/views/options/form.php:129
1106
+ #: app/views/options/form.php:397
1107
+ msgid "Add custom CSS to your keyword replacement links"
 
 
 
1108
  msgstr ""
1109
 
1110
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
1111
+ #: pro/app/views/options/form.php:132
1112
+ #: app/views/options/form.php:400
1113
+ msgid "Add some custom formatting to your keyword pretty link replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
1114
  msgstr ""
1115
 
1116
+ #: pro/app/views/options/form.php:146
1117
+ #: app/views/options/form.php:415
1118
+ msgid "Custom Hover CSS"
 
1119
  msgstr ""
1120
 
1121
+ #: pro/app/views/options/form.php:148
1122
+ #: app/views/options/form.php:417
1123
+ msgid "Add custom hover CSS to your keyword replacement links"
 
1124
  msgstr ""
1125
 
1126
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
1127
+ #: pro/app/views/options/form.php:151
1128
+ #: app/views/options/form.php:420
1129
+ msgid "Add some custom formatting to the hover attribute of your keyword pretty links. %1$sNote%2$s: This does not apply to url replacements--only keyword replacements."
1130
  msgstr ""
1131
 
1132
+ #: pro/app/views/options/form.php:165
1133
+ #: app/views/options/form.php:435
1134
+ msgid "Link to Disclosures"
 
 
1135
  msgstr ""
1136
 
1137
+ #: pro/app/views/options/form.php:168
1138
+ #: app/views/options/form.php:438
1139
+ msgid "Automatically Add a Link to Disclosures"
 
1140
  msgstr ""
1141
 
1142
+ #: pro/app/views/options/form.php:169
1143
+ #: app/views/options/form.php:439
1144
+ msgid "When enabled, this will add a link to your official affiliate link disclosure page to any page, post or custom post type that have any keyword or URL replacements. You'll also be able to customize the URL and position of the disclosure link."
1145
  msgstr ""
1146
 
1147
+ #: pro/app/views/options/form.php:190
1148
+ msgid "Disclosures Link URL"
1149
  msgstr ""
1150
 
1151
+ #: pro/app/views/options/form.php:191
1152
+ msgid "This is the URL of the page that contains your official affiliate link disclosures. This URL will be used in the link that will be generated."
1153
  msgstr ""
1154
 
1155
+ #: pro/app/views/options/form.php:202
1156
+ msgid "Text"
1157
  msgstr ""
1158
 
1159
+ #: pro/app/views/options/form.php:205
1160
+ msgid "Disclosures Link Text"
1161
  msgstr ""
1162
 
1163
+ #: pro/app/views/options/form.php:206
1164
+ msgid "This is the text of the link to your disclosures. This text will be visible to your visitors when the link is displayed."
1165
  msgstr ""
1166
 
1167
+ #: pro/app/views/options/form.php:217
1168
+ msgid "Position"
1169
  msgstr ""
1170
 
1171
+ #: pro/app/views/options/form.php:220
1172
+ msgid "Disclosures Link Position"
1173
  msgstr ""
1174
 
1175
+ #: pro/app/views/options/form.php:221
1176
+ msgid "This is the position of the link to your disclosures in relation to your post content."
 
1177
  msgstr ""
1178
 
1179
+ #: pro/app/views/options/form.php:227
1180
+ #: pro/app/views/options/form.php:810
1181
+ #: app/views/options/form.php:946
1182
+ msgid "Bottom"
1183
  msgstr ""
1184
 
1185
+ #: pro/app/views/options/form.php:228
1186
+ #: pro/app/views/options/form.php:809
1187
+ #: app/views/options/form.php:945
1188
+ msgid "Top"
 
1189
  msgstr ""
1190
 
1191
+ #: pro/app/views/options/form.php:229
1192
+ #: pro/app/views/options/form.php:811
1193
+ #: app/views/options/form.php:947
1194
+ msgid "Top and Bottom"
1195
  msgstr ""
1196
 
1197
+ #: pro/app/views/options/form.php:241
1198
+ #: app/views/options/form.php:452
1199
+ msgid "Keyword Disclosures"
1200
  msgstr ""
1201
 
1202
+ #: pro/app/views/options/form.php:244
1203
+ #: app/views/options/form.php:455
1204
+ msgid "Automatically Add Affiliate Link Disclosures to Keyword Replacements"
1205
  msgstr ""
1206
 
1207
+ #. translators: %1$s: open b tag, %2$s close b tag
1208
+ #: pro/app/views/options/form.php:247
1209
+ #: app/views/options/form.php:458
1210
+ msgid "When enabled, this will add an affiliate link disclosure next to each one of your keyword replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
1211
  msgstr ""
1212
 
1213
+ #: pro/app/views/options/form.php:268
1214
+ msgid "Disclosure Text"
 
1215
  msgstr ""
1216
 
1217
+ #: pro/app/views/options/form.php:271
1218
+ msgid "Keyword Link Disclosure Text"
 
 
1219
  msgstr ""
1220
 
1221
+ #: pro/app/views/options/form.php:272
1222
+ msgid "This is the text that will be added after each keyword replacement to indicate that the link is an affiliate link."
1223
  msgstr ""
1224
 
1225
+ #: pro/app/views/options/form.php:288
1226
+ #: app/views/options/form.php:474
1227
+ msgid "Replace All URLs"
 
1228
  msgstr ""
1229
 
1230
+ #: pro/app/views/options/form.php:290
1231
+ #: app/views/options/form.php:476
1232
+ msgid "Replace All non-Pretty Link URLs With Pretty Link URLs"
1233
  msgstr ""
1234
 
1235
+ #: pro/app/views/options/form.php:291
1236
+ #: app/views/options/form.php:477
1237
+ msgid "This feature will take each url it finds and create or use an existing pretty link pointing to the url and replace it with the pretty link."
 
 
1238
  msgstr ""
1239
 
1240
+ #: pro/app/views/options/form.php:308
1241
+ msgid "Domain Blacklist"
1242
  msgstr ""
1243
 
1244
+ #: pro/app/views/options/form.php:310
1245
+ msgid "Do not replace links from these domains"
 
 
 
1246
  msgstr ""
1247
 
1248
+ #. translators: %1$s: br tag, %2$s: open b tag, %3$s: close b tag
1249
+ #: pro/app/views/options/form.php:313
1250
+ msgid "Any links on your site which point to domains you define here will not be replaced automatically with Pretty Links. Place one domain per line.%1$s%1$sYou MUST enter http:// or https:// in front of the domain names and do NOT include any /'s or other text after the domain name.%1$s%1$sProper entry example:%1$s%2$shttps://www.google.com%3$s%1$s%2$shttp://mysite.org%3$s%1$s%1$sImproperly entered domains will be removed upon saving the Options."
1251
  msgstr ""
1252
 
1253
+ #: pro/app/views/options/form.php:333
1254
+ #: app/views/options/form.php:489
1255
+ msgid "Replace in Comments"
1256
  msgstr ""
1257
 
1258
+ #: pro/app/views/options/form.php:335
1259
+ #: app/views/options/form.php:491
1260
+ msgid "Replace Keywords and URLs in Comments"
1261
  msgstr ""
1262
 
1263
+ #: pro/app/views/options/form.php:336
1264
+ #: app/views/options/form.php:492
1265
+ msgid "This option will enable the keyword / URL replacement routine to run in Comments."
1266
  msgstr ""
1267
 
1268
+ #: pro/app/views/options/form.php:347
1269
+ #: app/views/options/form.php:504
1270
+ msgid "Replace in Feeds"
1271
  msgstr ""
1272
 
1273
+ #: pro/app/views/options/form.php:349
1274
+ #: app/views/options/form.php:506
1275
+ msgid "Replace Keywords and URLs in Feeds"
1276
  msgstr ""
1277
 
1278
+ #. translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
1279
+ #: pro/app/views/options/form.php:352
1280
+ #: app/views/options/form.php:509
1281
+ msgid "This option will enable the keyword / URL replacement routine to run in RSS Feeds.%1$s%2$sNote:%3$s This option can slow the load speed of your RSS feed -- unless used in conjunction with a caching plugin like W3 Total Cache or WP Super Cache.%1$s%2$sNote #2%3$s This option will only work if you have \"Full Text\" selected in your General WordPress Reading settings.%1$s%2$sNote #3:%3$s If this option is used along with \"Replace Keywords and URLs in Comments\" then your post comment feeds will have keywords replaced in them as well."
1282
  msgstr ""
1283
 
1284
+ #: pro/app/views/options/form.php:367
1285
+ #: pro/app/views/options/form.php:369
1286
+ #: app/views/options/form.php:525
1287
+ #: app/views/options/form.php:527
1288
+ msgid "Index Replacements"
1289
  msgstr ""
1290
 
1291
+ #. translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
1292
+ #: pro/app/views/options/form.php:372
1293
+ #: app/views/options/form.php:530
1294
+ msgid "This feature will index all of your keyword & URL replacements to dramatically improve performance.%1$s%1$sIf your site has a large number of replacements and/or posts then this feature may increase the load on your server temporarily and your replacements may not show up on your posts for a day or two initially (until all posts are indexed).%1$s%1$s%2$sNote:%3$s this feature requires the use of wp-cron."
1295
  msgstr ""
1296
 
1297
+ #: pro/app/views/options/form.php:393
1298
+ #: pro/app/views/options/form.php:395
1299
+ msgid "Keyword Index Status"
1300
  msgstr ""
1301
 
1302
+ #: pro/app/views/options/form.php:396
1303
+ msgid "This shows how many posts have keywords indexed for and are ready for replacement."
 
1304
  msgstr ""
1305
 
1306
+ #: pro/app/views/options/form.php:404
1307
+ #: pro/app/views/options/form.php:427
1308
+ msgid "%1$s out of %2$s Posts Indexed"
1309
  msgstr ""
1310
 
1311
+ #: pro/app/views/options/form.php:408
1312
+ #: pro/app/views/options/form.php:431
1313
+ msgid "%1$s out of %2$s Comments Indexed"
1314
  msgstr ""
1315
 
1316
+ #: pro/app/views/options/form.php:416
1317
+ msgid "URL Index Status"
1318
  msgstr ""
1319
 
1320
+ #: pro/app/views/options/form.php:418
1321
+ msgid "URL Replacements Index Status"
 
 
 
1322
  msgstr ""
1323
 
1324
+ #: pro/app/views/options/form.php:419
1325
+ msgid "This shows how many posts have url replacements indexed for and are ready for replacement."
 
 
1326
  msgstr ""
1327
 
1328
+ #: pro/app/views/options/form.php:447
1329
+ #: app/views/options/form.php:549
1330
+ msgid "Auto-Create Shortlink Options"
 
1331
  msgstr ""
1332
 
1333
+ #: pro/app/views/options/form.php:468
1334
+ #: app/views/options/form.php:593
1335
+ msgid "Pretty Bar Options"
1336
  msgstr ""
1337
 
1338
+ #: pro/app/views/options/form.php:474
1339
+ #: app/views/options/form.php:599
1340
+ msgid "Image URL"
1341
  msgstr ""
1342
 
1343
+ #: pro/app/views/options/form.php:476
1344
+ #: app/views/options/form.php:601
1345
+ msgid "Pretty Bar Image URL"
1346
  msgstr ""
1347
 
1348
+ #: pro/app/views/options/form.php:477
1349
+ #: app/views/options/form.php:602
1350
+ msgid "If set, this will replace the logo image on the Pretty Bar. The image that this URL references should be 48x48 Pixels to fit."
 
1351
  msgstr ""
1352
 
1353
+ #: pro/app/views/options/form.php:488
1354
+ #: app/views/options/form.php:614
1355
+ msgid "Background Image URL"
1356
  msgstr ""
1357
 
1358
+ #: pro/app/views/options/form.php:490
1359
+ #: app/views/options/form.php:616
1360
+ msgid "Pretty Bar Background Image URL"
1361
  msgstr ""
1362
 
1363
+ #: pro/app/views/options/form.php:491
1364
+ #: app/views/options/form.php:617
1365
+ msgid "If set, this will replace the background image on Pretty Bar. The image that this URL references should be 65px tall - this image will be repeated horizontally across the bar."
1366
  msgstr ""
1367
 
1368
+ #: pro/app/views/options/form.php:502
1369
+ #: app/views/options/form.php:629
1370
+ msgid "Background Color"
1371
  msgstr ""
1372
 
1373
+ #: pro/app/views/options/form.php:504
1374
+ #: app/views/options/form.php:631
1375
+ msgid "Pretty Bar Background Color"
1376
  msgstr ""
1377
 
1378
+ #: pro/app/views/options/form.php:505
1379
+ #: app/views/options/form.php:632
1380
+ msgid "This will alter the background color of the Pretty Bar if you haven't specified a Pretty Bar background image."
1381
  msgstr ""
1382
 
1383
+ #: pro/app/views/options/form.php:516
1384
+ #: app/views/options/form.php:644
1385
+ msgid "Text Color"
1386
  msgstr ""
1387
 
1388
+ #: pro/app/views/options/form.php:518
1389
+ #: app/views/options/form.php:646
1390
+ msgid "Pretty Bar Text Color"
1391
  msgstr ""
1392
 
1393
+ #. translators: %1$s: open code tag, %2$s: close code tag
1394
+ #: pro/app/views/options/form.php:521
1395
+ #: app/views/options/form.php:649
1396
+ msgid "If not set, this defaults to black (RGB value %1$s#000000%2$s) but you can change it to whatever color you like."
1397
  msgstr ""
1398
 
1399
+ #: pro/app/views/options/form.php:535
1400
+ #: app/views/options/form.php:664
1401
+ msgid "Link Color"
1402
  msgstr ""
1403
 
1404
+ #: pro/app/views/options/form.php:537
1405
+ #: app/views/options/form.php:666
1406
+ msgid "Pretty Bar Link Color"
1407
  msgstr ""
1408
 
1409
+ #. translators: %1$s: open code tag, %2$s: close code tag
1410
+ #: pro/app/views/options/form.php:540
1411
+ #: app/views/options/form.php:669
1412
+ msgid "If not set, this defaults to blue (RGB value %1$s#0000ee%2$s) but you can change it to whatever color you like."
1413
  msgstr ""
1414
 
1415
+ #: pro/app/views/options/form.php:554
1416
+ #: app/views/options/form.php:684
1417
+ msgid "Link Hover Color"
1418
  msgstr ""
1419
 
1420
+ #: pro/app/views/options/form.php:556
1421
+ #: app/views/options/form.php:686
1422
+ msgid "Pretty Bar Link Hover Color"
1423
  msgstr ""
1424
 
1425
+ #. translators: %1$s: open code tag, %2$s: close code tag
1426
+ #: pro/app/views/options/form.php:559
1427
+ #: app/views/options/form.php:689
1428
+ msgid "If not set, this defaults to RGB value %1$s#ababab%2$s but you can change it to whatever color you like."
1429
  msgstr ""
1430
 
1431
+ #: pro/app/views/options/form.php:573
1432
+ #: app/views/options/form.php:704
1433
+ msgid "Visited Link Color"
1434
  msgstr ""
1435
 
1436
+ #: pro/app/views/options/form.php:575
1437
+ #: app/views/options/form.php:706
1438
+ msgid "Pretty Bar Visited Link Color"
1439
  msgstr ""
1440
 
1441
+ #. translators: %1$s: open code tag, %2$s: close code tag
1442
+ #: pro/app/views/options/form.php:578
1443
+ #: app/views/options/form.php:709
1444
+ msgid "If not set, this defaults to RGB value %1$s#551a8b%2$s but you can change it to whatever color you like."
1445
  msgstr ""
1446
 
1447
+ #: pro/app/views/options/form.php:592
1448
+ #: app/views/options/form.php:724
1449
+ msgid "Title Char Limit"
1450
  msgstr ""
1451
 
1452
+ #: pro/app/views/options/form.php:594
1453
+ #: app/views/options/form.php:726
1454
+ msgid "Pretty Bar Title Char Limit"
1455
  msgstr ""
1456
 
1457
+ #. translators: %1$s: open code tag, %2$s: close code tag
1458
+ #: pro/app/views/options/form.php:597
1459
+ #: app/views/options/form.php:729
1460
+ msgid "If your Website has a long title then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s30%2$s characters or less so the Pretty Bar's format looks good across different browsers and screen resolutions."
1461
  msgstr ""
1462
 
1463
+ #: pro/app/views/options/form.php:611
1464
+ #: app/views/options/form.php:744
1465
+ msgid "Description Char Limit"
1466
  msgstr ""
1467
 
1468
+ #: pro/app/views/options/form.php:613
1469
+ #: app/views/options/form.php:746
1470
+ msgid "Pretty Bar Description Char Limit"
1471
  msgstr ""
1472
 
1473
+ #. translators: %1$s: open code tag, %2$s: close code tag
1474
+ #: pro/app/views/options/form.php:616
1475
+ #: app/views/options/form.php:749
1476
+ msgid "If your Website has a long Description (tagline) then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s40%2$s characters or less so the Pretty Bar's format looks good across different browsers and screen resolutions."
1477
  msgstr ""
1478
 
1479
+ #: pro/app/views/options/form.php:630
1480
+ #: app/views/options/form.php:764
1481
+ msgid "Target URL Char Limit"
1482
  msgstr ""
1483
 
1484
+ #: pro/app/views/options/form.php:632
1485
+ #: app/views/options/form.php:766
1486
+ msgid "Pretty Bar Target URL Char Limit"
1487
  msgstr ""
1488
 
1489
+ #. translators: %1$s: open code tag, %2$s: close code tag
1490
+ #: pro/app/views/options/form.php:635
1491
+ #: app/views/options/form.php:769
1492
+ msgid "If you link to a lot of large Target URLs you may want to adjust this value. It is recommended that you keep this value to %1$s40%2$s or below so the Pretty Bar's format looks good across different browsers and URL sizes"
1493
  msgstr ""
1494
 
1495
+ #: pro/app/views/options/form.php:649
1496
+ #: app/views/options/form.php:784
1497
+ msgid "Show Title"
 
 
 
 
 
 
1498
  msgstr ""
1499
 
1500
+ #: pro/app/views/options/form.php:651
1501
+ #: app/views/options/form.php:786
1502
+ msgid "Pretty Bar Show Title"
1503
  msgstr ""
1504
 
1505
+ #: pro/app/views/options/form.php:652
1506
+ #: app/views/options/form.php:787
1507
+ msgid "Make sure this is checked if you want the title of your blog (and link) to show up on the Pretty Bar."
1508
  msgstr ""
1509
 
1510
+ #: pro/app/views/options/form.php:663
1511
+ #: app/views/options/form.php:799
1512
+ msgid "Show Description"
 
1513
  msgstr ""
1514
 
1515
+ #: pro/app/views/options/form.php:665
1516
+ #: app/views/options/form.php:801
1517
+ msgid "Pretty Bar Show Description"
1518
  msgstr ""
1519
 
1520
+ #: pro/app/views/options/form.php:666
1521
+ #: app/views/options/form.php:802
1522
+ msgid "Make sure this is checked if you want your site description to show up on the Pretty Bar."
1523
  msgstr ""
1524
 
1525
+ #: pro/app/views/options/form.php:677
1526
+ #: app/views/options/form.php:814
1527
+ msgid "Show Share Links"
1528
  msgstr ""
1529
 
1530
+ #: pro/app/views/options/form.php:679
1531
+ #: app/views/options/form.php:816
1532
+ msgid "Pretty Bar Show Share Links"
1533
  msgstr ""
1534
 
1535
+ #: pro/app/views/options/form.php:680
1536
+ #: app/views/options/form.php:817
1537
+ msgid "Make sure this is checked if you want \"share links\" to show up on the Pretty Bar."
1538
  msgstr ""
1539
 
1540
+ #: pro/app/views/options/form.php:691
1541
+ #: app/views/options/form.php:829
1542
+ msgid "Show Target URL"
 
 
 
1543
  msgstr ""
1544
 
1545
+ #: pro/app/views/options/form.php:693
1546
+ #: app/views/options/form.php:831
1547
+ msgid "Pretty Bar Show Target URL Links"
1548
  msgstr ""
1549
 
1550
+ #: pro/app/views/options/form.php:694
1551
+ #: app/views/options/form.php:832
1552
+ msgid "Make sure this is checked if you want a link displaying the Target URL to show up on the Pretty Bar."
1553
  msgstr ""
1554
 
1555
+ #: pro/app/views/options/form.php:705
1556
+ #: pro/app/views/options/form.php:707
1557
+ #: app/views/options/form.php:844
1558
+ #: app/views/options/form.php:846
1559
+ msgid "Hide Attribution Link"
1560
  msgstr ""
1561
 
1562
+ #. translators: %1$s: br tag, %2$s: open strong tag, %3$s close strong tag, %4$s open em tag, %5$s close em tag, %6$s open link tag, %7$s close link tag
1563
+ #: pro/app/views/options/form.php:710
1564
+ #: app/views/options/form.php:849
1565
+ msgid "Check this to hide the pretty link attribution link on the pretty bar.%1$s%1$s%2$sWait, before you do this, you might want to leave this un-checked and set the alternate URL of this link to your %4$sPretty Links Pro%5$s %6$sAffiliate URL%7$s to earn a few bucks while you are at it.%3$s"
1566
  msgstr ""
1567
 
1568
+ #: pro/app/views/options/form.php:736
1569
+ #: app/views/options/form.php:876
1570
+ msgid "Attribution URL"
 
 
1571
  msgstr ""
1572
 
1573
+ #: pro/app/views/options/form.php:738
1574
+ #: app/views/options/form.php:878
1575
+ msgid "Alternate Pretty Bar Attribution URL"
1576
  msgstr ""
1577
 
1578
+ #. translators: %1$s open em tag, %2$s close em tag, %3$s open link tag, %4$s close link tag
1579
+ #: pro/app/views/options/form.php:741
1580
+ #: app/views/options/form.php:881
1581
+ msgid "If set, this will replace the Pretty Bars attribution URL. This is a very good place to put your %1$sPretty Links Pro%2$s %3$sAffiliate Link%4$s."
1582
  msgstr ""
1583
 
1584
+ #: pro/app/views/options/form.php:760
1585
+ #: app/views/options/form.php:901
1586
+ msgid "Social Buttons Options"
 
 
 
1587
  msgstr ""
1588
 
1589
+ #: pro/app/views/options/form.php:763
1590
+ #: app/views/options/form.php:903
1591
+ msgid "Buttons"
1592
  msgstr ""
1593
 
1594
+ #: pro/app/views/options/form.php:765
1595
+ #: app/views/options/form.php:905
1596
+ msgid "Social Buttons"
1597
  msgstr ""
1598
 
1599
+ #. translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
1600
+ #: pro/app/views/options/form.php:768
1601
+ #: app/views/options/form.php:908
1602
+ msgid "Select which buttons you want to be visible on the Social Buttons Bar.%1$s%1$s%2$sNote:%3$s In order for the Social Buttons Bar to be visible on Pages and or Posts, you must first enable it in the \"Page &amp; Post Options\" section above."
1603
  msgstr ""
1604
 
1605
+ #: pro/app/views/options/form.php:795
1606
+ #: app/views/options/form.php:930
1607
+ msgid "Buttons Placement"
1608
  msgstr ""
1609
 
1610
+ #: pro/app/views/options/form.php:797
1611
+ #: app/views/options/form.php:932
1612
+ msgid "Social Buttons Placement"
1613
  msgstr ""
1614
 
1615
+ #. translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
1616
+ #: pro/app/views/options/form.php:800
1617
+ #: app/views/options/form.php:935
1618
+ msgid "This determines where your Social Buttons Placement should appear in relation to content on Pages and/or Posts.%1$s%1$s%2$sNote:%3$s If you want this bar to appear then you must enable it in the \"Auto-Create Links\" section above."
1619
  msgstr ""
1620
 
1621
+ #: pro/app/views/options/form.php:814
1622
+ #: app/views/options/form.php:950
1623
+ msgid "Social Buttons Manual Placement"
1624
  msgstr ""
1625
 
1626
+ #. translators: %1$s: example shortcode, %2$s: example template tag
1627
+ #: pro/app/views/options/form.php:817
1628
+ #: app/views/options/form.php:953
1629
+ msgid "If you select none, you can still show your Social Buttons by manually adding the %1$s shortcode to your blog posts or %2$s template tag to your WordPress Theme."
1630
  msgstr ""
1631
 
1632
+ #: pro/app/views/options/form.php:845
1633
+ #: app/views/options/form.php:966
1634
+ msgid "Public Links Creation Options"
1635
  msgstr ""
1636
 
1637
+ #: pro/app/views/options/form.php:851
1638
+ #: app/views/options/form.php:972
1639
+ msgid "Enable Public Links"
1640
  msgstr ""
1641
 
1642
+ #: pro/app/views/options/form.php:853
1643
+ #: app/views/options/form.php:974
1644
+ msgid "Enable Public Link Creation on this Site"
1645
  msgstr ""
1646
 
1647
+ #: pro/app/views/options/form.php:855
1648
+ #: app/views/options/form.php:976
1649
+ msgid "This option will give you the ability to turn your website into a link shortening service for your users. Once selected, you can enable the Pretty Links Pro Sidebar Widget or just display the link creation form with the %s shortcode in any post or page on your website."
1650
  msgstr ""
1651
 
1652
+ #: pro/app/views/options/form.php:874
1653
+ msgid "Use Display Page"
1654
  msgstr ""
1655
 
1656
+ #: pro/app/views/options/form.php:876
1657
+ msgid "Use Public Link Display Page"
1658
  msgstr ""
1659
 
1660
+ #: pro/app/views/options/form.php:877
1661
+ msgid "When a link is created using the public form, the user is typically redirected to a simple page displaying their new pretty link. But, you can specify a page that you want them to be redirected to on your website, using your branding instead by selecting this box and entering the url of the page you want them to go to."
 
1662
  msgstr ""
1663
 
1664
+ #: pro/app/views/options/form.php:894
1665
+ msgid "Display Page"
 
 
 
 
 
1666
  msgstr ""
1667
 
1668
+ #: pro/app/views/options/form.php:896
1669
+ msgid "Public Pretty Link Creation Display URL"
 
 
 
1670
  msgstr ""
1671
 
1672
+ #: pro/app/views/options/form.php:898
1673
+ msgid "To set this up, create a new page on your WordPress site and make sure the %s appears somewhere on this page -- otherwise the link will never get created. Once this page is created, just enter the full URL to it here. Make sure this URL does not end with a slash (/)."
 
1674
  msgstr ""
1675
 
1676
+ #: pro/app/views/options/autocreate.php:7
1677
+ msgid "%s Shortlinks"
 
 
1678
  msgstr ""
1679
 
1680
+ #: pro/app/views/options/autocreate.php:10
1681
+ msgid "Create Pretty Links for %s"
 
 
1682
  msgstr ""
1683
 
1684
+ #: pro/app/views/options/autocreate.php:11
1685
+ msgid "Automatically Create a Pretty Link for each of your published %s"
 
 
1686
  msgstr ""
1687
 
1688
+ #: pro/app/views/options/autocreate.php:30
1689
+ msgid "Category"
 
1690
  msgstr ""
1691
 
1692
+ #: pro/app/views/options/autocreate.php:33
1693
+ msgid "%s Auto Link Category"
 
1694
  msgstr ""
1695
 
1696
+ #: pro/app/views/options/autocreate.php:34
1697
+ msgid "Category that Pretty Links for %s will be automatically added to."
 
1698
  msgstr ""
1699
 
1700
+ #: pro/app/views/options/autocreate.php:51
1701
+ msgid "Add a New Category"
1702
  msgstr ""
1703
 
1704
+ #: pro/app/views/options/autocreate.php:57
1705
+ msgid "Show Social Buttons"
1706
  msgstr ""
1707
 
1708
+ #: pro/app/views/options/autocreate.php:60
1709
+ msgid "Show Social Buttons on %s"
1710
  msgstr ""
1711
 
1712
+ #: pro/app/views/options/autocreate.php:61
1713
+ msgid "If this button is checked then you'll have the ability to include a social buttons bar on your %s."
1714
  msgstr ""
1715
 
1716
+ #: pro/app/views/options/general.php:8
1717
+ msgid "Use Shortlink URL"
1718
  msgstr ""
1719
 
1720
+ #: pro/app/views/options/general.php:10
1721
+ msgid "Use an Alternate Shortlink URL"
1722
  msgstr ""
1723
 
1724
+ #: pro/app/views/options/general.php:11
1725
+ msgid "Use this option if you want to substitute your actual blog's url with another URL. You must have another valid domain name pointing to this WordPress install before you enable this option. If you are using this option to just get rid of the www in the beginning of your url that is fine -- just make sure your domain works without the www before enabling this option."
 
1726
  msgstr ""
1727
 
1728
+ #: pro/app/views/options/general.php:28
1729
+ #: pro/app/views/options/general.php:30
1730
+ msgid "Shortlink URL"
1731
  msgstr ""
1732
 
1733
+ #: pro/app/views/options/general.php:31
1734
+ msgid "Enter a valid base url that points at this WordPress install. Make sure this URL does not end with a slash (/)."
 
 
 
 
1735
  msgstr ""
1736
 
1737
+ #: pro/app/views/options/general.php:47
1738
+ msgid "Minimum Admin Role"
1739
  msgstr ""
1740
 
1741
+ #: pro/app/views/options/general.php:49
1742
+ msgid "Set Minimum Role Required To Access Pretty Link"
 
 
1743
  msgstr ""
1744
 
1745
+ #: pro/app/views/options/general.php:50
1746
+ msgid "Use this option to set the minimum role of users who can access the Admin interface for Pretty Link."
1747
  msgstr ""
1748
 
1749
+ #: pro/app/views/options/general.php:56
1750
+ msgid "Administrator"
1751
  msgstr ""
1752
 
1753
+ #: pro/app/views/options/general.php:57
1754
+ msgid "Editor"
 
 
 
1755
  msgstr ""
1756
 
1757
+ #: pro/app/views/options/general.php:58
1758
+ msgid "Author"
 
 
1759
  msgstr ""
1760
 
1761
+ #: pro/app/views/options/general.php:59
1762
+ msgid "Contributor"
1763
  msgstr ""
1764
 
1765
+ #: pro/app/views/options/general.php:60
1766
+ msgid "Subscriber"
1767
  msgstr ""
1768
 
1769
+ #: pro/app/views/tools/nav.php:3
1770
+ msgid "Custom Bookmarklet"
1771
  msgstr ""
1772
 
1773
+ #: pro/app/views/tools/generator.php:6
1774
+ msgid "Custom Bookmarklet:"
 
 
 
1775
  msgstr ""
1776
 
1777
+ #: pro/app/views/tools/generator.php:7
1778
+ #: pro/app/views/tools/generator.php:17
1779
+ #: app/views/tools/form.php:26
1780
+ msgid "Get Pretty Link"
 
1781
  msgstr ""
1782
 
1783
+ #: pro/app/views/tools/generator.php:9
1784
+ msgid "Customize Pretty Link Bookmarklet"
 
 
 
 
1785
  msgstr ""
1786
 
1787
+ #: pro/app/views/tools/generator.php:10
1788
+ msgid "Alter the options below to customize this Bookmarklet. As you modify the label, redirect type, tracking and category, you will see this bookmarklet update -- when the settings are how you want them, drag the bookmarklet into your toolbar. You can create as many bookmarklets as you want each with different settings."
1789
  msgstr ""
1790
 
1791
+ #: pro/app/views/tools/generator.php:13
1792
+ #: pro/app/widgets/PlpPublicLinksWidget.php:66
1793
+ msgid "Pretty Link Options"
1794
  msgstr ""
1795
 
1796
+ #: pro/app/views/tools/generator.php:16
1797
+ msgid "Label:"
 
1798
  msgstr ""
1799
 
1800
+ #: pro/app/views/tools/generator.php:20
1801
+ #: pro/app/widgets/PlpPublicLinksWidget.php:68
1802
+ msgid "Redirection:"
 
 
 
1803
  msgstr ""
1804
 
1805
+ #: pro/app/views/tools/generator.php:21
1806
+ #: pro/app/views/tools/generator.php:26
1807
+ #: pro/app/widgets/PlpPublicLinksWidget.php:70
1808
+ #: pro/app/widgets/PlpPublicLinksWidget.php:82
1809
+ #: app/views/shared/tinymce_form_popup.php:31
1810
+ #: app/views/shared/tinymce_form_popup.php:48
1811
+ #: app/views/shared/tinymce_form_popup.php:56
1812
+ msgid "Default"
1813
  msgstr ""
1814
 
1815
+ #: pro/app/views/tools/generator.php:24
1816
+ msgid "Tracking:"
1817
  msgstr ""
1818
 
1819
+ #: pro/app/views/tools/generator.php:27
1820
+ #: pro/app/widgets/PlpPublicLinksWidget.php:83
1821
+ #: app/views/admin/popups/rating.php:12
1822
+ msgid "Yes"
1823
  msgstr ""
1824
 
1825
+ #: pro/app/views/tools/generator.php:28
1826
+ #: pro/app/widgets/PlpPublicLinksWidget.php:84
1827
+ #: app/views/admin/popups/rating.php:13
1828
+ msgid "No"
 
 
1829
  msgstr ""
1830
 
1831
+ #: pro/app/views/tools/generator.php:32
1832
+ #: pro/app/widgets/PlpPublicLinksWidget.php:89
1833
+ msgid "Category:"
1834
  msgstr ""
1835
 
1836
+ #: pro/app/views/import-export/form.php:4
1837
+ msgid "Import / Export Links"
1838
  msgstr ""
1839
 
1840
+ #: pro/app/views/import-export/form.php:9
1841
+ #: pro/app/views/import-export/form.php:12
1842
+ msgid "Export Pretty Links"
 
1843
  msgstr ""
1844
 
1845
+ #: pro/app/views/import-export/form.php:13
1846
+ msgid "Export Links to a CSV File"
1847
  msgstr ""
1848
 
1849
+ #: pro/app/views/import-export/form.php:17
1850
+ msgid "Export"
1851
  msgstr ""
1852
 
1853
+ #: pro/app/views/import-export/form.php:22
1854
+ #: pro/app/views/import-export/form.php:25
1855
+ msgid "Import Pretty Links"
1856
  msgstr ""
1857
 
1858
+ #: pro/app/views/import-export/form.php:27
1859
+ msgid "There are two ways to import a file.%1$s%1$s1) Importing to update existing links and%1$s%1$s2) Importing to generate new links. When Importing to generate new links, you must delete the \"id\" column from the CSV before importing. If the \"id\" column is present, Pretty Links Pro will attempt to update existing links."
1860
  msgstr ""
1861
 
1862
+ #: pro/app/views/import-export/form.php:39
1863
+ msgid "Import"
1864
  msgstr ""
1865
 
1866
+ #: pro/app/views/import-export/form.php:42
1867
+ msgid "Links Import File"
 
1868
  msgstr ""
1869
 
1870
+ #: pro/app/views/import-export/form.php:43
1871
+ msgid "Select a file that has been formatted as a Pretty Link CSV import file and click \"Import\""
1872
+ msgstr ""
1873
+
1874
+ #: pro/app/views/import-export/form.php:51
1875
+ msgid "Import/Export Help"
1876
+ msgstr ""
1877
+
1878
+ #: pro/app/views/import-export/import.php:4
1879
+ msgid "Import Results"
1880
+ msgstr ""
1881
+
1882
+ #: pro/app/views/import-export/import.php:5
1883
+ msgid "Total Rows: %s"
1884
+ msgstr ""
1885
+
1886
+ #: pro/app/views/import-export/import.php:7
1887
+ msgid "%s Pretty Links were Successfully Created"
1888
+ msgstr ""
1889
+
1890
+ #: pro/app/views/import-export/import.php:8
1891
+ msgid "%s Pretty Links were Successfully Updated"
1892
+ msgstr ""
1893
+
1894
+ #: pro/app/views/import-export/import.php:13
1895
+ msgid "Pretty Links were unable to be Created: %s"
1896
+ msgstr ""
1897
+
1898
+ #: pro/app/views/import-export/import.php:17
1899
+ msgid "Error(s) for Pretty Link with Slug: %s"
1900
+ msgstr ""
1901
+
1902
+ #: pro/app/views/import-export/import.php:32
1903
+ msgid "Pretty Links were unable to be Updated: %s"
1904
+ msgstr ""
1905
+
1906
+ #: pro/app/views/import-export/import.php:36
1907
+ msgid "Error(s) for Pretty Link with id: %s"
1908
  msgstr ""
1909
 
1910
+ #: pro/app/controllers/PlpLinksController.php:195
1911
+ msgid "Your URL Replacements must be formatted as a comma separated list of properly formatted URLs (http[s]://example.com/whatever)"
1912
+ msgstr ""
1913
+
1914
+ #: pro/app/controllers/PlpLinksController.php:206
1915
  msgid "Date must be valid and formatted YYYY-MM-DD."
1916
  msgstr ""
1917
 
1918
+ #: pro/app/controllers/PlpLinksController.php:218
1919
  msgid "Expire Clicks must be a number greater than zero."
1920
  msgstr ""
1921
 
1922
+ #: pro/app/controllers/PlpLinksController.php:225
1923
  msgid "Expired URL must be a valid URL."
1924
  msgstr ""
1925
 
1926
+ #: pro/app/controllers/PlpLinksController.php:237
1927
  msgid "Your URL Rotations must all be properly formatted URLs."
1928
  msgstr ""
1929
 
1930
+ #: pro/app/controllers/PlpLinksController.php:246
1931
  msgid "Your Link Rotation Weights must add up to 100%."
1932
  msgstr ""
1933
 
1934
+ #: pro/app/controllers/PlpLinksController.php:256
1935
  msgid "Your Geographic Redirect URLs must all be properly formatted."
1936
  msgstr ""
1937
 
1938
+ #: pro/app/controllers/PlpLinksController.php:260
1939
  msgid "Your Geographic Redirects URLs must not be empty."
1940
  msgstr ""
1941
 
1942
+ #: pro/app/controllers/PlpLinksController.php:264
1943
  msgid "Your Geographic Redirect Countries must not be empty."
1944
  msgstr ""
1945
 
1946
+ #: pro/app/controllers/PlpLinksController.php:275
1947
  msgid "Your Technology Redirect URLs must all be properly formatted."
1948
  msgstr ""
1949
 
1950
+ #: pro/app/controllers/PlpLinksController.php:279
1951
  msgid "Your Technology Redirects URLs must not be empty."
1952
  msgstr ""
1953
 
1954
+ #: pro/app/controllers/PlpLinksController.php:290
1955
  msgid "Your Time Period Redirect URLs must all be properly formatted."
1956
  msgstr ""
1957
 
1958
+ #: pro/app/controllers/PlpLinksController.php:294
1959
  msgid "Your Time Period Redirects URLs must not be empty."
1960
  msgstr ""
1961
 
1962
+ #: pro/app/controllers/PlpLinksController.php:299
1963
  msgid "Your Time Period Redirect start time must not be empty."
1964
  msgstr ""
1965
 
1966
+ #: pro/app/controllers/PlpLinksController.php:302
1967
  msgid "Your Time Period Redirect start time must be a properly formatted date."
1968
  msgstr ""
1969
 
1970
+ #: pro/app/controllers/PlpLinksController.php:308
1971
  msgid "Your Time Period Redirect end time must not be empty."
1972
  msgstr ""
1973
 
1974
+ #: pro/app/controllers/PlpLinksController.php:311
1975
  msgid "Your Time Period Redirect end time must be a properly formatted date."
1976
  msgstr ""
1977
 
1978
+ #: pro/app/controllers/PlpLinksController.php:319
1979
  msgid "Your Time Period Redirect start time must come before the end time."
1980
  msgstr ""
1981
 
1982
+ #: pro/app/controllers/PlpLinksController.php:327
1983
  msgid "Delay Redirect must be a number"
1984
  msgstr ""
1985
 
1986
+ #: pro/app/controllers/PlpLinksController.php:623
1987
  #: pro/app/controllers/PlpLinksController.php:668
1988
+ #: app/views/shared/tinymce_form_popup.php:37
1989
+ #: app/views/options/form.php:55
1990
+ msgid "Pretty Bar"
1991
+ msgstr ""
1992
+
1993
+ #: pro/app/controllers/PlpLinksController.php:624
1994
+ #: app/views/shared/tinymce_form_popup.php:38
1995
+ msgid "Cloaked"
1996
+ msgstr ""
1997
+
1998
+ #: pro/app/controllers/PlpLinksController.php:625
1999
+ #: pro/app/controllers/PlpLinksController.php:670
2000
+ #: app/views/shared/tinymce_form_popup.php:39
2001
+ msgid "Pixel"
2002
+ msgstr ""
2003
+
2004
+ #: pro/app/controllers/PlpLinksController.php:626
2005
+ #: pro/app/controllers/PlpLinksController.php:671
2006
+ #: app/views/shared/tinymce_form_popup.php:40
2007
+ msgid "Meta Refresh"
2008
+ msgstr ""
2009
+
2010
+ #: pro/app/controllers/PlpLinksController.php:627
2011
+ #: pro/app/controllers/PlpLinksController.php:672
2012
+ #: app/views/shared/tinymce_form_popup.php:41
2013
+ msgid "Javascript"
2014
+ msgstr ""
2015
+
2016
+ #: pro/app/controllers/PlpLinksController.php:669
2017
+ #: pro/app/widgets/PlpPublicLinksWidget.php:75
2018
  msgid "Cloak"
2019
  msgstr ""
2020
 
2021
+ #: pro/app/controllers/PlpLinksController.php:734
2022
  msgid "View QR Code for this link: %s"
2023
  msgstr ""
2024
 
2025
+ #: pro/app/controllers/PlpLinksController.php:734
2026
+ #: pro/app/controllers/PlpLinksController.php:738
2027
+ msgid "QR Code"
2028
+ msgstr ""
2029
+
2030
+ #: pro/app/controllers/PlpLinksController.php:738
2031
  msgid "Download QR Code for this link: %s"
2032
  msgstr ""
2033
 
2044
  msgstr ""
2045
 
2046
  #: pro/app/controllers/PlpLinksController.php:829
2047
+ msgid "This link expired after %d clicks and will now cause a 404 error when visited"
 
2048
  msgstr ""
2049
 
2050
  #: pro/app/controllers/PlpLinksController.php:832
2068
  msgstr ""
2069
 
2070
  #: pro/app/controllers/PlpLinksController.php:855
2071
+ msgid "A Time Period Redirect is currently active for this link. When visited it will currently redirect to %s rather than the Target URL unless the link is expired."
 
 
 
2072
  msgstr ""
2073
 
2074
  #: pro/app/controllers/PlpLinksController.php:859
2075
+ msgid "Time Period Redirects have been setup for this link but the current time is not within any of them currently."
 
 
2076
  msgstr ""
2077
 
2078
+ #: pro/app/controllers/PlpKeywordsController.php:68
2079
+ msgid "Pretty Link Post Build Index"
2080
  msgstr ""
2081
 
2082
+ #: pro/app/controllers/PlpLinkCategoriesController.php:13
2083
+ msgctxt "taxonomy general name"
2084
+ msgid "Link Categories"
2085
  msgstr ""
2086
 
2087
+ #: pro/app/controllers/PlpLinkCategoriesController.php:14
2088
+ msgctxt "taxonomy singular name"
2089
+ msgid "Link Category"
 
2090
  msgstr ""
2091
 
2092
+ #: pro/app/controllers/PlpLinkCategoriesController.php:15
2093
+ msgid "Search Link Categories"
 
 
2094
  msgstr ""
2095
 
2096
+ #: pro/app/controllers/PlpLinkCategoriesController.php:16
2097
+ msgid "All Link Categories"
2098
  msgstr ""
2099
 
2100
+ #: pro/app/controllers/PlpLinkCategoriesController.php:17
2101
+ msgid "Parent Link Category"
2102
  msgstr ""
2103
 
2104
+ #: pro/app/controllers/PlpLinkCategoriesController.php:18
2105
+ msgid "Parent Link Category:"
2106
+ msgstr ""
2107
+
2108
+ #: pro/app/controllers/PlpLinkCategoriesController.php:19
2109
+ msgid "Edit Link Category"
2110
+ msgstr ""
2111
+
2112
+ #: pro/app/controllers/PlpLinkCategoriesController.php:20
2113
+ msgid "Update Link Category"
2114
+ msgstr ""
2115
+
2116
+ #: pro/app/controllers/PlpLinkCategoriesController.php:21
2117
+ msgid "Add New Link Category"
2118
+ msgstr ""
2119
+
2120
+ #: pro/app/controllers/PlpLinkCategoriesController.php:22
2121
+ msgid "New Link Category Name"
2122
+ msgstr ""
2123
+
2124
+ #: pro/app/controllers/PlpLinkCategoriesController.php:23
2125
+ #: app/controllers/PrliLinksController.php:370
2126
+ msgid "Categories"
2127
  msgstr ""
2128
 
2129
  #: pro/app/controllers/PlpPrettyBarController.php:50
2175
  msgid "PrettyBar Link Character Limit must be a number"
2176
  msgstr ""
2177
 
2178
+ #: pro/app/controllers/PlpPostsController.php:50
2179
+ msgid "Pretty Links Pro"
 
2180
  msgstr ""
2181
 
2182
+ #: pro/app/controllers/PlpPostsController.php:54
2183
+ msgid "Pretty Links Pro Options"
 
2184
  msgstr ""
2185
 
2186
+ #: pro/app/controllers/PlpPostsController.php:139
2187
+ #: pro/app/controllers/PlpPostsController.php:155
2188
+ #: pro/app/controllers/PlpPostsController.php:236
2189
+ #: pro/app/controllers/PlpPostsController.php:249
2190
+ msgid "Untitled"
2191
  msgstr ""
2192
 
2193
+ #: pro/app/controllers/PlpReportsController.php:14
2194
+ msgid "Pretty Links Pro | Reports"
2195
  msgstr ""
2196
 
2197
+ #: pro/app/controllers/PlpReportsController.php:51
2198
  msgid "Create a custom link report and analyze your data."
2199
  msgstr ""
2200
 
2201
+ #: pro/app/controllers/PlpReportsController.php:94
 
 
 
 
2202
  msgid "Your Pretty Link Report was Successfully Created"
2203
  msgstr ""
2204
 
2205
+ #: pro/app/controllers/PlpReportsController.php:130
2206
  msgid "Your Pretty Link Report was Successfully Updated"
2207
  msgstr ""
2208
 
2209
+ #: pro/app/controllers/PlpReportsController.php:139
2210
  msgid "Your Pretty Link Report was Successfully Deleted"
2211
  msgstr ""
2212
 
2213
+ #: pro/app/controllers/PlpAppController.php:169
2214
+ msgid "ERROR: Your Pretty Link was unable to be created"
2215
  msgstr ""
2216
 
2217
+ #: pro/app/controllers/PlpAppController.php:173
2218
+ msgid "Unauthorized"
2219
  msgstr ""
2220
 
2221
+ #: pro/app/controllers/PlpPublicLinksController.php:37
2222
+ #: app/controllers/PrliLinksController.php:572
2223
+ msgid "Security check failed"
2224
  msgstr ""
2225
 
2226
+ #: pro/app/controllers/PlpLinkTagsController.php:13
2227
+ msgctxt "taxonomy general name"
2228
+ msgid "Link Tags"
2229
  msgstr ""
2230
 
2231
+ #: pro/app/controllers/PlpLinkTagsController.php:14
2232
+ msgctxt "taxonomy singular name"
2233
+ msgid "Link Tag"
 
 
 
2234
  msgstr ""
2235
 
2236
+ #: pro/app/controllers/PlpLinkTagsController.php:15
2237
+ msgid "Search Link Tags"
2238
  msgstr ""
2239
 
2240
+ #: pro/app/controllers/PlpLinkTagsController.php:16
2241
+ msgid "All Link Tags"
2242
  msgstr ""
2243
 
2244
+ #: pro/app/controllers/PlpLinkTagsController.php:19
2245
+ msgid "Edit Link Tag"
2246
  msgstr ""
2247
 
2248
+ #: pro/app/controllers/PlpLinkTagsController.php:20
2249
+ msgid "Update Link Tag"
2250
  msgstr ""
2251
 
2252
+ #: pro/app/controllers/PlpLinkTagsController.php:21
2253
+ msgid "Add New Link Tag"
 
 
2254
  msgstr ""
2255
 
2256
+ #: pro/app/controllers/PlpLinkTagsController.php:22
2257
+ msgid "New Link Tag Name"
2258
  msgstr ""
2259
 
2260
+ #: pro/app/controllers/PlpLinkTagsController.php:23
2261
+ msgid "Separate Link Tags with commas"
2262
  msgstr ""
2263
 
2264
+ #: pro/app/controllers/PlpLinkTagsController.php:24
2265
+ msgid "Add or remove Link Tags"
2266
  msgstr ""
2267
 
2268
+ #: pro/app/controllers/PlpLinkTagsController.php:25
2269
+ msgid "Choose from the most used Link Tags"
2270
  msgstr ""
2271
 
2272
+ #: pro/app/controllers/PlpLinkTagsController.php:26
2273
+ msgid "No Link Tags found."
2274
  msgstr ""
2275
 
2276
+ #: pro/app/controllers/PlpLinkTagsController.php:27
2277
+ #: app/controllers/PrliLinksController.php:371
2278
+ msgid "Tags"
2279
  msgstr ""
2280
 
2281
+ #: pro/app/controllers/PlpImportExportController.php:14
2282
+ msgid "Pretty Links Pro | Import / Export"
2283
  msgstr ""
2284
 
2285
+ #: pro/app/controllers/PlpImportExportController.php:15
2286
+ msgid "Import / Export"
2287
  msgstr ""
2288
 
2289
+ #: pro/app/controllers/PlpOptionsController.php:97
2290
+ msgid "Keywords Per Page is required"
2291
  msgstr ""
2292
 
2293
+ #: pro/app/controllers/PlpOptionsController.php:101
2294
+ msgid "Keyword Links Per Page is required"
2295
  msgstr ""
2296
 
2297
+ #: pro/app/controllers/PlpOptionsController.php:106
2298
+ msgid "You need to enter a valid Pretty Link Base URL now that you have selected \"Use an alternate base url for your Pretty Links\""
2299
  msgstr ""
2300
 
2301
+ #: pro/app/controllers/PlpOptionsController.php:111
2302
+ msgid "You need to enter a valid Public Link Display URL now that you have selected \"Use a custom public link display page\""
2303
  msgstr ""
2304
 
2305
+ #: pro/app/controllers/PlpOptionsController.php:117
2306
+ msgid "Pretty Bar Attribution URL must be a correctly formatted URL"
2307
  msgstr ""
2308
 
2309
+ #: pro/app/widgets/PlpPublicLinksWidget.php:11
2310
+ msgid "Create a Short URL"
2311
  msgstr ""
2312
 
2313
+ #: pro/app/widgets/PlpPublicLinksWidget.php:13
2314
+ msgid "Displays a form to create a Pretty Link."
2315
  msgstr ""
2316
 
2317
+ #: pro/app/widgets/PlpPublicLinksWidget.php:60
2318
+ msgid "Enter a URL:&nbsp;"
2319
  msgstr ""
2320
 
2321
+ #: pro/app/widgets/PlpPublicLinksWidget.php:64
2322
+ msgid "Label Text:"
 
 
 
 
2323
  msgstr ""
2324
 
2325
+ #: pro/app/widgets/PlpPublicLinksWidget.php:65
2326
+ msgid "Button Text:"
2327
  msgstr ""
2328
 
2329
+ #: pro/app/widgets/PlpPublicLinksWidget.php:65
2330
+ msgid "if left blank, no button will display"
 
2331
  msgstr ""
2332
 
2333
+ #: pro/app/widgets/PlpPublicLinksWidget.php:71
2334
+ msgid "Permanent/301"
2335
  msgstr ""
2336
 
2337
+ #: pro/app/widgets/PlpPublicLinksWidget.php:72
2338
+ msgid "Temporary/302"
2339
  msgstr ""
2340
 
2341
+ #: pro/app/widgets/PlpPublicLinksWidget.php:73
2342
+ msgid "Temporary/307"
2343
  msgstr ""
2344
 
2345
+ #: pro/app/widgets/PlpPublicLinksWidget.php:74
2346
+ msgid "PrettyBar"
 
2347
  msgstr ""
2348
 
2349
+ #: pro/app/widgets/PlpPublicLinksWidget.php:80
2350
+ msgid "Tracking Enabled:"
2351
  msgstr ""
2352
 
2353
+ #: pro/i18n/countries.php:5
2354
+ msgid "Afghanistan"
2355
  msgstr ""
2356
 
2357
+ #: pro/i18n/countries.php:6
2358
+ msgid "&#197;land Islands"
 
2359
  msgstr ""
2360
 
2361
+ #: pro/i18n/countries.php:7
2362
+ msgid "Albania"
 
 
 
 
 
2363
  msgstr ""
2364
 
2365
+ #: pro/i18n/countries.php:8
2366
+ msgid "Algeria"
2367
  msgstr ""
2368
 
2369
+ #: pro/i18n/countries.php:9
2370
+ msgid "Andorra"
2371
  msgstr ""
2372
 
2373
+ #: pro/i18n/countries.php:10
2374
+ msgid "Angola"
 
 
2375
  msgstr ""
2376
 
2377
+ #: pro/i18n/countries.php:11
2378
+ msgid "Anguilla"
2379
  msgstr ""
2380
 
2381
+ #: pro/i18n/countries.php:12
2382
+ msgid "Antarctica"
2383
  msgstr ""
2384
 
2385
+ #: pro/i18n/countries.php:13
2386
+ msgid "Antigua and Barbuda"
2387
  msgstr ""
2388
 
2389
+ #: pro/i18n/countries.php:14
2390
+ msgid "Argentina"
2391
  msgstr ""
2392
 
2393
+ #: pro/i18n/countries.php:15
2394
+ msgid "Armenia"
2395
  msgstr ""
2396
 
2397
+ #: pro/i18n/countries.php:16
2398
+ msgid "Aruba"
2399
  msgstr ""
2400
 
2401
+ #: pro/i18n/countries.php:17
2402
+ msgid "Australia"
2403
  msgstr ""
2404
 
2405
+ #: pro/i18n/countries.php:18
2406
+ msgid "Austria"
2407
  msgstr ""
2408
 
2409
+ #: pro/i18n/countries.php:19
2410
+ msgid "Azerbaijan"
2411
  msgstr ""
2412
 
2413
+ #: pro/i18n/countries.php:20
2414
+ msgid "Bahamas"
2415
  msgstr ""
2416
 
2417
+ #: pro/i18n/countries.php:21
2418
+ msgid "Bahrain"
2419
  msgstr ""
2420
 
2421
+ #: pro/i18n/countries.php:22
2422
+ msgid "Bangladesh"
2423
  msgstr ""
2424
 
2425
+ #: pro/i18n/countries.php:23
2426
+ msgid "Barbados"
2427
  msgstr ""
2428
 
2429
+ #: pro/i18n/countries.php:24
2430
+ msgid "Belarus"
2431
  msgstr ""
2432
 
2433
+ #: pro/i18n/countries.php:25
2434
+ msgid "Belgium"
2435
  msgstr ""
2436
 
2437
+ #: pro/i18n/countries.php:26
2438
+ msgid "Belau"
2439
  msgstr ""
2440
 
2441
+ #: pro/i18n/countries.php:27
2442
+ msgid "Belize"
 
 
 
 
2443
  msgstr ""
2444
 
2445
+ #: pro/i18n/countries.php:28
2446
+ msgid "Benin"
2447
  msgstr ""
2448
 
2449
+ #: pro/i18n/countries.php:29
2450
+ msgid "Bermuda"
 
 
 
 
2451
  msgstr ""
2452
 
2453
+ #: pro/i18n/countries.php:30
2454
+ msgid "Bhutan"
2455
  msgstr ""
2456
 
2457
+ #: pro/i18n/countries.php:31
2458
+ msgid "Bolivia"
 
 
2459
  msgstr ""
2460
 
2461
+ #: pro/i18n/countries.php:32
2462
+ msgid "Bonaire, Saint Eustatius and Saba"
2463
  msgstr ""
2464
 
2465
+ #: pro/i18n/countries.php:33
2466
+ msgid "Bosnia and Herzegovina"
2467
  msgstr ""
2468
 
2469
+ #: pro/i18n/countries.php:34
2470
+ msgid "Botswana"
 
 
 
 
2471
  msgstr ""
2472
 
2473
+ #: pro/i18n/countries.php:35
2474
+ msgid "Bouvet Island"
2475
  msgstr ""
2476
 
2477
+ #: pro/i18n/countries.php:36
2478
+ msgid "Brazil"
2479
  msgstr ""
2480
 
2481
+ #: pro/i18n/countries.php:37
2482
+ msgid "British Indian Ocean Territory"
 
 
2483
  msgstr ""
2484
 
2485
+ #: pro/i18n/countries.php:38
2486
+ msgid "British Virgin Islands"
2487
  msgstr ""
2488
 
2489
+ #: pro/i18n/countries.php:39
2490
+ msgid "Brunei"
 
 
2491
  msgstr ""
2492
 
2493
+ #: pro/i18n/countries.php:40
2494
+ msgid "Bulgaria"
2495
  msgstr ""
2496
 
2497
+ #: pro/i18n/countries.php:41
2498
+ msgid "Burkina Faso"
2499
  msgstr ""
2500
 
2501
+ #: pro/i18n/countries.php:42
2502
+ msgid "Burundi"
 
 
 
 
2503
  msgstr ""
2504
 
2505
+ #: pro/i18n/countries.php:43
2506
+ msgid "Cambodia"
2507
  msgstr ""
2508
 
2509
+ #: pro/i18n/countries.php:44
2510
+ msgid "Cameroon"
 
 
 
 
 
2511
  msgstr ""
2512
 
2513
+ #: pro/i18n/countries.php:45
2514
+ msgid "Canada"
2515
  msgstr ""
2516
 
2517
+ #: pro/i18n/countries.php:46
2518
+ msgid "Cape Verde"
2519
  msgstr ""
2520
 
2521
+ #: pro/i18n/countries.php:47
2522
+ msgid "Cayman Islands"
 
 
2523
  msgstr ""
2524
 
2525
+ #: pro/i18n/countries.php:48
2526
+ msgid "Central African Republic"
2527
  msgstr ""
2528
 
2529
+ #: pro/i18n/countries.php:49
2530
+ msgid "Chad"
2531
  msgstr ""
2532
 
2533
+ #: pro/i18n/countries.php:50
2534
+ msgid "Chile"
2535
  msgstr ""
2536
 
2537
+ #: pro/i18n/countries.php:51
2538
+ msgid "China"
2539
  msgstr ""
2540
 
2541
+ #: pro/i18n/countries.php:52
2542
+ msgid "Christmas Island"
 
 
 
2543
  msgstr ""
2544
 
2545
+ #: pro/i18n/countries.php:53
2546
+ msgid "Cocos/Keeling Islands"
2547
  msgstr ""
2548
 
2549
+ #: pro/i18n/countries.php:54
2550
+ msgid "Colombia"
2551
  msgstr ""
2552
 
2553
+ #: pro/i18n/countries.php:55
2554
+ msgid "Comoros"
2555
  msgstr ""
2556
 
2557
+ #: pro/i18n/countries.php:56
2558
+ msgid "Congo (Brazzaville)"
2559
  msgstr ""
2560
 
2561
+ #: pro/i18n/countries.php:57
2562
+ msgid "Congo (Kinshasa)"
 
 
 
2563
  msgstr ""
2564
 
2565
+ #: pro/i18n/countries.php:58
2566
+ msgid "Cook Islands"
 
2567
  msgstr ""
2568
 
2569
+ #: pro/i18n/countries.php:59
2570
+ msgid "Costa Rica"
2571
  msgstr ""
2572
 
2573
+ #: pro/i18n/countries.php:60
2574
+ msgid "Croatia"
2575
+ msgstr ""
2576
 
2577
+ #: pro/i18n/countries.php:61
2578
+ msgid "Cuba"
2579
  msgstr ""
2580
 
2581
+ #: pro/i18n/countries.php:62
2582
+ msgid "Cura&Ccedil;ao"
2583
  msgstr ""
2584
 
2585
+ #: pro/i18n/countries.php:63
2586
+ msgid "Cyprus"
 
 
2587
  msgstr ""
2588
 
2589
+ #: pro/i18n/countries.php:64
2590
+ msgid "Czech Republic"
 
2591
  msgstr ""
2592
 
2593
+ #: pro/i18n/countries.php:65
2594
+ msgid "Denmark"
2595
  msgstr ""
2596
 
2597
+ #: pro/i18n/countries.php:66
2598
+ msgid "Djibouti"
 
 
2599
  msgstr ""
2600
 
2601
+ #: pro/i18n/countries.php:67
2602
+ msgid "Dominica"
2603
  msgstr ""
2604
 
2605
+ #: pro/i18n/countries.php:68
2606
+ msgid "Dominican Republic"
 
 
 
 
2607
  msgstr ""
2608
 
2609
+ #: pro/i18n/countries.php:69
2610
+ msgid "Ecuador"
2611
  msgstr ""
2612
 
2613
+ #: pro/i18n/countries.php:70
2614
+ msgid "Egypt"
2615
  msgstr ""
2616
 
2617
+ #: pro/i18n/countries.php:71
2618
+ msgid "El Salvador"
 
 
 
 
 
2619
  msgstr ""
2620
 
2621
+ #: pro/i18n/countries.php:72
2622
+ msgid "Equatorial Guinea"
 
2623
  msgstr ""
2624
 
2625
+ #: pro/i18n/countries.php:73
2626
+ msgid "Eritrea"
2627
  msgstr ""
2628
 
2629
+ #: pro/i18n/countries.php:74
2630
+ msgid "Estonia"
 
 
2631
  msgstr ""
2632
 
2633
+ #: pro/i18n/countries.php:75
2634
+ msgid "Ethiopia"
 
2635
  msgstr ""
2636
 
2637
+ #: pro/i18n/countries.php:76
2638
+ msgid "Falkland Islands"
2639
  msgstr ""
2640
 
2641
+ #: pro/i18n/countries.php:77
2642
+ msgid "Faroe Islands"
2643
  msgstr ""
2644
 
2645
+ #: pro/i18n/countries.php:78
2646
+ msgid "Fiji"
 
2647
  msgstr ""
2648
 
2649
+ #: pro/i18n/countries.php:79
2650
+ msgid "Finland"
 
 
 
 
 
 
 
 
 
 
 
 
 
2651
  msgstr ""
2652
 
2653
+ #: pro/i18n/countries.php:80
2654
+ msgid "France"
 
 
2655
  msgstr ""
2656
 
2657
+ #: pro/i18n/countries.php:81
2658
+ msgid "French Guiana"
 
2659
  msgstr ""
2660
 
2661
+ #: pro/i18n/countries.php:82
2662
+ msgid "French Polynesia"
 
 
 
2663
  msgstr ""
2664
 
2665
+ #: pro/i18n/countries.php:83
2666
+ msgid "French Southern Territories"
2667
  msgstr ""
2668
 
2669
+ #: pro/i18n/countries.php:84
2670
+ msgid "Gabon"
2671
  msgstr ""
2672
 
2673
+ #: pro/i18n/countries.php:85
2674
+ msgid "Gambia"
 
 
2675
  msgstr ""
2676
 
2677
+ #: pro/i18n/countries.php:86
2678
+ msgid "Georgia"
 
2679
  msgstr ""
2680
 
2681
+ #: pro/i18n/countries.php:87
2682
+ msgid "Germany"
 
 
 
 
2683
  msgstr ""
2684
 
2685
+ #: pro/i18n/countries.php:88
2686
+ msgid "Ghana"
2687
  msgstr ""
2688
 
2689
+ #: pro/i18n/countries.php:89
2690
+ msgid "Gibraltar"
2691
  msgstr ""
2692
 
2693
+ #: pro/i18n/countries.php:90
2694
+ msgid "Greece"
2695
  msgstr ""
2696
 
2697
+ #: pro/i18n/countries.php:91
2698
+ msgid "Greenland"
2699
  msgstr ""
2700
 
2701
+ #: pro/i18n/countries.php:92
2702
+ msgid "Grenada"
 
 
 
 
2703
  msgstr ""
2704
 
2705
+ #: pro/i18n/countries.php:93
2706
+ msgid "Guadeloupe"
 
2707
  msgstr ""
2708
 
2709
+ #: pro/i18n/countries.php:94
2710
+ msgid "Guatemala"
2711
  msgstr ""
2712
 
2713
+ #: pro/i18n/countries.php:95
2714
+ msgid "Guernsey"
2715
  msgstr ""
2716
 
2717
+ #: pro/i18n/countries.php:96
2718
+ msgid "Guinea"
2719
  msgstr ""
2720
 
2721
+ #: pro/i18n/countries.php:97
2722
+ msgid "Guinea-Bissau"
2723
  msgstr ""
2724
 
2725
+ #: pro/i18n/countries.php:98
2726
+ msgid "Guyana"
2727
  msgstr ""
2728
 
2729
+ #: pro/i18n/countries.php:99
2730
+ msgid "Haiti"
2731
  msgstr ""
2732
 
2733
+ #: pro/i18n/countries.php:100
2734
+ msgid "Heard Island and McDonald Islands"
 
 
2735
  msgstr ""
2736
 
2737
+ #: pro/i18n/countries.php:101
2738
+ msgid "Honduras"
2739
  msgstr ""
2740
 
2741
+ #: pro/i18n/countries.php:102
2742
+ msgid "Hong Kong"
2743
  msgstr ""
2744
 
2745
+ #: pro/i18n/countries.php:103
2746
+ msgid "Hungary"
2747
  msgstr ""
2748
 
2749
+ #: pro/i18n/countries.php:104
2750
+ msgid "Iceland"
2751
  msgstr ""
2752
 
2753
+ #: pro/i18n/countries.php:105
2754
+ msgid "India"
2755
+ msgstr ""
2756
+
2757
+ #: pro/i18n/countries.php:106
2758
+ msgid "Indonesia"
2759
+ msgstr ""
2760
+
2761
+ #: pro/i18n/countries.php:107
2762
+ msgid "Iran"
2763
+ msgstr ""
2764
+
2765
+ #: pro/i18n/countries.php:108
2766
+ msgid "Iraq"
2767
+ msgstr ""
2768
+
2769
+ #: pro/i18n/countries.php:109
2770
+ msgid "Republic of Ireland"
2771
+ msgstr ""
2772
+
2773
+ #: pro/i18n/countries.php:110
2774
+ msgid "Isle of Man"
2775
+ msgstr ""
2776
+
2777
+ #: pro/i18n/countries.php:111
2778
+ msgid "Israel"
2779
+ msgstr ""
2780
+
2781
+ #: pro/i18n/countries.php:112
2782
+ msgid "Italy"
2783
+ msgstr ""
2784
+
2785
+ #: pro/i18n/countries.php:113
2786
+ msgid "Ivory Coast"
2787
+ msgstr ""
2788
+
2789
+ #: pro/i18n/countries.php:114
2790
+ msgid "Jamaica"
2791
+ msgstr ""
2792
+
2793
+ #: pro/i18n/countries.php:115
2794
+ msgid "Japan"
2795
+ msgstr ""
2796
+
2797
+ #: pro/i18n/countries.php:116
2798
+ msgid "Jersey"
2799
+ msgstr ""
2800
+
2801
+ #: pro/i18n/countries.php:117
2802
+ msgid "Jordan"
2803
+ msgstr ""
2804
+
2805
+ #: pro/i18n/countries.php:118
2806
+ msgid "Kazakhstan"
2807
+ msgstr ""
2808
+
2809
+ #: pro/i18n/countries.php:119
2810
+ msgid "Kenya"
2811
+ msgstr ""
2812
+
2813
+ #: pro/i18n/countries.php:120
2814
+ msgid "Kiribati"
2815
+ msgstr ""
2816
+
2817
+ #: pro/i18n/countries.php:121
2818
+ msgid "Kuwait"
2819
+ msgstr ""
2820
+
2821
+ #: pro/i18n/countries.php:122
2822
+ msgid "Kyrgyzstan"
2823
+ msgstr ""
2824
+
2825
+ #: pro/i18n/countries.php:123
2826
+ msgid "Laos"
2827
+ msgstr ""
2828
+
2829
+ #: pro/i18n/countries.php:124
2830
+ msgid "Latvia"
2831
+ msgstr ""
2832
+
2833
+ #: pro/i18n/countries.php:125
2834
+ msgid "Lebanon"
2835
+ msgstr ""
2836
+
2837
+ #: pro/i18n/countries.php:126
2838
+ msgid "Lesotho"
2839
+ msgstr ""
2840
+
2841
+ #: pro/i18n/countries.php:127
2842
+ msgid "Liberia"
2843
+ msgstr ""
2844
+
2845
+ #: pro/i18n/countries.php:128
2846
+ msgid "Libya"
2847
+ msgstr ""
2848
+
2849
+ #: pro/i18n/countries.php:129
2850
+ msgid "Liechtenstein"
2851
+ msgstr ""
2852
+
2853
+ #: pro/i18n/countries.php:130
2854
+ msgid "Lithuania"
2855
+ msgstr ""
2856
+
2857
+ #: pro/i18n/countries.php:131
2858
+ msgid "Luxembourg"
2859
+ msgstr ""
2860
+
2861
+ #: pro/i18n/countries.php:132
2862
+ msgid "Macao S.A.R., China"
2863
+ msgstr ""
2864
+
2865
+ #: pro/i18n/countries.php:133
2866
+ msgid "Macedonia"
2867
+ msgstr ""
2868
+
2869
+ #: pro/i18n/countries.php:134
2870
+ msgid "Madagascar"
2871
+ msgstr ""
2872
+
2873
+ #: pro/i18n/countries.php:135
2874
+ msgid "Malawi"
2875
+ msgstr ""
2876
+
2877
+ #: pro/i18n/countries.php:136
2878
+ msgid "Malaysia"
2879
+ msgstr ""
2880
+
2881
+ #: pro/i18n/countries.php:137
2882
+ msgid "Maldives"
2883
+ msgstr ""
2884
+
2885
+ #: pro/i18n/countries.php:138
2886
+ msgid "Mali"
2887
+ msgstr ""
2888
+
2889
+ #: pro/i18n/countries.php:139
2890
+ msgid "Malta"
2891
+ msgstr ""
2892
+
2893
+ #: pro/i18n/countries.php:140
2894
+ msgid "Marshall Islands"
2895
+ msgstr ""
2896
+
2897
+ #: pro/i18n/countries.php:141
2898
+ msgid "Martinique"
2899
+ msgstr ""
2900
+
2901
+ #: pro/i18n/countries.php:142
2902
+ msgid "Mauritania"
2903
+ msgstr ""
2904
+
2905
+ #: pro/i18n/countries.php:143
2906
+ msgid "Mauritius"
2907
+ msgstr ""
2908
+
2909
+ #: pro/i18n/countries.php:144
2910
+ msgid "Mayotte"
2911
+ msgstr ""
2912
+
2913
+ #: pro/i18n/countries.php:145
2914
+ msgid "Mexico"
2915
+ msgstr ""
2916
+
2917
+ #: pro/i18n/countries.php:146
2918
+ msgid "Micronesia"
2919
+ msgstr ""
2920
+
2921
+ #: pro/i18n/countries.php:147
2922
+ msgid "Moldova"
2923
+ msgstr ""
2924
+
2925
+ #: pro/i18n/countries.php:148
2926
+ msgid "Monaco"
2927
+ msgstr ""
2928
+
2929
+ #: pro/i18n/countries.php:149
2930
+ msgid "Mongolia"
2931
+ msgstr ""
2932
+
2933
+ #: pro/i18n/countries.php:150
2934
+ msgid "Montenegro"
2935
+ msgstr ""
2936
+
2937
+ #: pro/i18n/countries.php:151
2938
+ msgid "Montserrat"
2939
+ msgstr ""
2940
+
2941
+ #: pro/i18n/countries.php:152
2942
+ msgid "Morocco"
2943
+ msgstr ""
2944
+
2945
+ #: pro/i18n/countries.php:153
2946
+ msgid "Mozambique"
2947
+ msgstr ""
2948
+
2949
+ #: pro/i18n/countries.php:154
2950
+ msgid "Myanmar"
2951
+ msgstr ""
2952
+
2953
+ #: pro/i18n/countries.php:155
2954
+ msgid "Namibia"
2955
+ msgstr ""
2956
+
2957
+ #: pro/i18n/countries.php:156
2958
+ msgid "Nauru"
2959
+ msgstr ""
2960
+
2961
+ #: pro/i18n/countries.php:157
2962
+ msgid "Nepal"
2963
+ msgstr ""
2964
+
2965
+ #: pro/i18n/countries.php:158
2966
+ msgid "Netherlands"
2967
+ msgstr ""
2968
+
2969
+ #: pro/i18n/countries.php:159
2970
+ msgid "Netherlands Antilles"
2971
+ msgstr ""
2972
+
2973
+ #: pro/i18n/countries.php:160
2974
+ msgid "New Caledonia"
2975
+ msgstr ""
2976
+
2977
+ #: pro/i18n/countries.php:161
2978
+ msgid "New Zealand"
2979
+ msgstr ""
2980
+
2981
+ #: pro/i18n/countries.php:162
2982
+ msgid "Nicaragua"
2983
+ msgstr ""
2984
+
2985
+ #: pro/i18n/countries.php:163
2986
+ msgid "Niger"
2987
+ msgstr ""
2988
+
2989
+ #: pro/i18n/countries.php:164
2990
+ msgid "Nigeria"
2991
+ msgstr ""
2992
+
2993
+ #: pro/i18n/countries.php:165
2994
+ msgid "Niue"
2995
+ msgstr ""
2996
+
2997
+ #: pro/i18n/countries.php:166
2998
+ msgid "Norfolk Island"
2999
+ msgstr ""
3000
+
3001
+ #: pro/i18n/countries.php:167
3002
+ msgid "North Korea"
3003
+ msgstr ""
3004
+
3005
+ #: pro/i18n/countries.php:168
3006
+ msgid "Norway"
3007
+ msgstr ""
3008
+
3009
+ #: pro/i18n/countries.php:169
3010
+ msgid "Oman"
3011
+ msgstr ""
3012
+
3013
+ #: pro/i18n/countries.php:170
3014
+ msgid "Pakistan"
3015
+ msgstr ""
3016
+
3017
+ #: pro/i18n/countries.php:171
3018
+ msgid "Palestinian Territory"
3019
+ msgstr ""
3020
+
3021
+ #: pro/i18n/countries.php:172
3022
+ msgid "Panama"
3023
+ msgstr ""
3024
+
3025
+ #: pro/i18n/countries.php:173
3026
+ msgid "Papua New Guinea"
3027
+ msgstr ""
3028
+
3029
+ #: pro/i18n/countries.php:174
3030
+ msgid "Paraguay"
3031
+ msgstr ""
3032
+
3033
+ #: pro/i18n/countries.php:175
3034
+ msgid "Peru"
3035
+ msgstr ""
3036
+
3037
+ #: pro/i18n/countries.php:176
3038
+ msgid "Philippines"
3039
+ msgstr ""
3040
+
3041
+ #: pro/i18n/countries.php:177
3042
+ msgid "Pitcairn"
3043
+ msgstr ""
3044
+
3045
+ #: pro/i18n/countries.php:178
3046
+ msgid "Poland"
3047
+ msgstr ""
3048
+
3049
+ #: pro/i18n/countries.php:179
3050
+ msgid "Portugal"
3051
+ msgstr ""
3052
+
3053
+ #: pro/i18n/countries.php:180
3054
+ msgid "Qatar"
3055
+ msgstr ""
3056
+
3057
+ #: pro/i18n/countries.php:181
3058
+ msgid "Reunion"
3059
+ msgstr ""
3060
+
3061
+ #: pro/i18n/countries.php:182
3062
+ msgid "Romania"
3063
+ msgstr ""
3064
+
3065
+ #: pro/i18n/countries.php:183
3066
+ msgid "Russia"
3067
+ msgstr ""
3068
+
3069
+ #: pro/i18n/countries.php:184
3070
+ msgid "Rwanda"
3071
+ msgstr ""
3072
+
3073
+ #: pro/i18n/countries.php:185
3074
+ msgid "Saint Barth&eacute;lemy"
3075
+ msgstr ""
3076
+
3077
+ #: pro/i18n/countries.php:186
3078
+ msgid "Saint Helena"
3079
+ msgstr ""
3080
+
3081
+ #: pro/i18n/countries.php:187
3082
+ msgid "Saint Kitts and Nevis"
3083
+ msgstr ""
3084
+
3085
+ #: pro/i18n/countries.php:188
3086
+ msgid "Saint Lucia"
3087
+ msgstr ""
3088
+
3089
+ #: pro/i18n/countries.php:189
3090
+ msgid "Saint Martin (French part)"
3091
+ msgstr ""
3092
+
3093
+ #: pro/i18n/countries.php:190
3094
+ msgid "Saint Martin (Dutch part)"
3095
  msgstr ""
3096
 
3097
+ #: pro/i18n/countries.php:191
3098
+ msgid "Saint Pierre and Miquelon"
3099
  msgstr ""
3100
 
3101
+ #: pro/i18n/countries.php:192
3102
+ msgid "Saint Vincent and the Grenadines"
3103
  msgstr ""
3104
 
3105
+ #: pro/i18n/countries.php:193
3106
+ msgid "San Marino"
3107
  msgstr ""
3108
 
3109
+ #: pro/i18n/countries.php:194
3110
+ msgid "S&atilde;o Tom&eacute; and Pr&iacute;ncipe"
3111
  msgstr ""
3112
 
3113
+ #: pro/i18n/countries.php:195
3114
+ msgid "Saudi Arabia"
3115
  msgstr ""
3116
 
3117
+ #: pro/i18n/countries.php:196
3118
+ msgid "Senegal"
3119
  msgstr ""
3120
 
3121
+ #: pro/i18n/countries.php:197
3122
+ msgid "Serbia"
3123
  msgstr ""
3124
 
3125
+ #: pro/i18n/countries.php:198
3126
+ msgid "Seychelles"
3127
  msgstr ""
3128
 
3129
+ #: pro/i18n/countries.php:199
3130
+ msgid "Sierra Leone"
3131
  msgstr ""
3132
 
3133
+ #: pro/i18n/countries.php:200
3134
+ msgid "Singapore"
3135
  msgstr ""
3136
 
3137
+ #: pro/i18n/countries.php:201
3138
+ msgid "Slovakia"
3139
  msgstr ""
3140
 
3141
+ #: pro/i18n/countries.php:202
3142
+ msgid "Slovenia"
3143
  msgstr ""
3144
 
3145
+ #: pro/i18n/countries.php:203
3146
+ msgid "Solomon Islands"
3147
  msgstr ""
3148
 
3149
+ #: pro/i18n/countries.php:204
3150
+ msgid "Somalia"
3151
  msgstr ""
3152
 
3153
+ #: pro/i18n/countries.php:205
3154
+ msgid "South Africa"
 
 
3155
  msgstr ""
3156
 
3157
+ #: pro/i18n/countries.php:206
3158
+ msgid "South Georgia/Sandwich Islands"
3159
  msgstr ""
3160
 
3161
+ #: pro/i18n/countries.php:207
3162
+ msgid "South Korea"
3163
  msgstr ""
3164
 
3165
+ #: pro/i18n/countries.php:208
3166
+ msgid "South Sudan"
 
3167
  msgstr ""
3168
 
3169
+ #: pro/i18n/countries.php:209
3170
+ msgid "Spain"
3171
  msgstr ""
3172
 
3173
+ #: pro/i18n/countries.php:210
3174
+ msgid "Sri Lanka"
3175
  msgstr ""
3176
 
3177
+ #: pro/i18n/countries.php:211
3178
+ msgid "Sudan"
3179
  msgstr ""
3180
 
3181
+ #: pro/i18n/countries.php:212
3182
+ msgid "Suriname"
3183
  msgstr ""
3184
 
3185
+ #: pro/i18n/countries.php:213
3186
+ msgid "Svalbard and Jan Mayen"
 
 
3187
  msgstr ""
3188
 
3189
+ #: pro/i18n/countries.php:214
3190
+ msgid "Swaziland"
3191
  msgstr ""
3192
 
3193
+ #: pro/i18n/countries.php:215
3194
+ msgid "Sweden"
3195
  msgstr ""
3196
 
3197
+ #: pro/i18n/countries.php:216
3198
+ msgid "Switzerland"
3199
  msgstr ""
3200
 
3201
+ #: pro/i18n/countries.php:217
3202
+ msgid "Syria"
3203
  msgstr ""
3204
 
3205
+ #: pro/i18n/countries.php:218
3206
+ msgid "Taiwan"
3207
  msgstr ""
3208
 
3209
+ #: pro/i18n/countries.php:219
3210
+ msgid "Tajikistan"
3211
  msgstr ""
3212
 
3213
+ #: pro/i18n/countries.php:220
3214
+ msgid "Tanzania"
3215
  msgstr ""
3216
 
3217
+ #: pro/i18n/countries.php:221
3218
+ msgid "Thailand"
 
 
3219
  msgstr ""
3220
 
3221
+ #: pro/i18n/countries.php:222
3222
+ msgid "Timor-Leste"
3223
  msgstr ""
3224
 
3225
+ #: pro/i18n/countries.php:223
3226
+ msgid "Togo"
3227
  msgstr ""
3228
 
3229
+ #: pro/i18n/countries.php:224
3230
+ msgid "Tokelau"
3231
  msgstr ""
3232
 
3233
+ #: pro/i18n/countries.php:225
3234
+ msgid "Tonga"
 
 
 
3235
  msgstr ""
3236
 
3237
+ #: pro/i18n/countries.php:226
3238
+ msgid "Trinidad and Tobago"
3239
  msgstr ""
3240
 
3241
+ #: pro/i18n/countries.php:227
3242
+ msgid "Tunisia"
3243
  msgstr ""
3244
 
3245
+ #: pro/i18n/countries.php:228
3246
+ msgid "Turkey"
 
 
3247
  msgstr ""
3248
 
3249
+ #: pro/i18n/countries.php:229
3250
+ msgid "Turkmenistan"
3251
  msgstr ""
3252
 
3253
+ #: pro/i18n/countries.php:230
3254
+ msgid "Turks and Caicos Islands"
3255
  msgstr ""
3256
 
3257
+ #: pro/i18n/countries.php:231
3258
+ msgid "Tuvalu"
 
 
3259
  msgstr ""
3260
 
3261
+ #: pro/i18n/countries.php:232
3262
+ msgid "Uganda"
3263
  msgstr ""
3264
 
3265
+ #: pro/i18n/countries.php:233
3266
+ msgid "Ukraine"
3267
  msgstr ""
3268
 
3269
+ #: pro/i18n/countries.php:234
3270
+ msgid "United Arab Emirates"
3271
  msgstr ""
3272
 
3273
+ #: pro/i18n/countries.php:235
3274
+ msgid "United Kingdom (UK)"
3275
  msgstr ""
3276
 
3277
+ #: pro/i18n/countries.php:236
3278
+ msgid "United States"
3279
  msgstr ""
3280
 
3281
+ #: pro/i18n/countries.php:237
3282
+ msgid "Uruguay"
 
 
 
3283
  msgstr ""
3284
 
3285
+ #: pro/i18n/countries.php:238
3286
+ msgid "Uzbekistan"
3287
  msgstr ""
3288
 
3289
+ #: pro/i18n/countries.php:239
3290
+ msgid "Vanuatu"
3291
  msgstr ""
3292
 
3293
+ #: pro/i18n/countries.php:240
3294
+ msgid "Vatican"
 
 
 
3295
  msgstr ""
3296
 
3297
+ #: pro/i18n/countries.php:241
3298
+ msgid "Venezuela"
3299
  msgstr ""
3300
 
3301
+ #: pro/i18n/countries.php:242
3302
+ msgid "Vietnam"
3303
  msgstr ""
3304
 
3305
+ #: pro/i18n/countries.php:243
3306
+ msgid "Wallis and Futuna"
 
 
 
3307
  msgstr ""
3308
 
3309
+ #: pro/i18n/countries.php:244
3310
+ msgid "Western Sahara"
3311
  msgstr ""
3312
 
3313
+ #: pro/i18n/countries.php:245
3314
+ msgid "Western Samoa"
3315
  msgstr ""
3316
 
3317
+ #: pro/i18n/countries.php:246
3318
+ msgid "Yemen"
 
 
 
3319
  msgstr ""
3320
 
3321
+ #: pro/i18n/countries.php:247
3322
+ msgid "Zambia"
3323
  msgstr ""
3324
 
3325
+ #: pro/i18n/countries.php:248
3326
+ msgid "Zimbabwe"
3327
  msgstr ""
3328
 
3329
+ #: app/helpers/PrliAppHelper.php:20
3330
+ #: app/views/links/form.php:30
3331
+ #: app/controllers/PrliLinksController.php:383
3332
+ #: app/controllers/PrliLinksController.php:389
3333
+ #: app/controllers/PrliLinksController.php:395
3334
+ msgid "Pro"
3335
  msgstr ""
3336
 
3337
+ #: app/helpers/PrliAppHelper.php:21
3338
+ msgid "Upgrade to Pro to unlock this feature"
3339
  msgstr ""
3340
 
3341
+ #: app/helpers/PrliLinksHelper.php:14
3342
+ #: app/views/links/form_basic.php:15
3343
+ #: app/views/shared/tinymce_form_popup.php:32
3344
+ msgid "307 (Temporary)"
3345
  msgstr ""
3346
 
3347
+ #: app/helpers/PrliLinksHelper.php:15
3348
+ #: app/views/links/form_basic.php:16
3349
+ #: app/views/shared/tinymce_form_popup.php:33
3350
+ msgid "302 (Temporary)"
3351
  msgstr ""
3352
 
3353
+ #: app/helpers/PrliLinksHelper.php:16
3354
+ #: app/views/links/form_basic.php:17
3355
+ #: app/views/shared/tinymce_form_popup.php:34
3356
+ msgid "301 (Permanent)"
3357
  msgstr ""
3358
 
3359
+ #: app/helpers/PrliLinksHelper.php:27
3360
+ msgid "PrettyBar Redirection"
 
 
3361
  msgstr ""
3362
 
3363
+ #: app/helpers/PrliLinksHelper.php:30
3364
+ msgid "Cloaked Redirection"
3365
  msgstr ""
3366
 
3367
+ #: app/helpers/PrliLinksHelper.php:33
3368
+ msgid "Pixel Tracking Redirection"
3369
  msgstr ""
3370
 
3371
+ #: app/helpers/PrliLinksHelper.php:36
3372
+ msgid "Meta Refresh Redirection"
 
 
3373
  msgstr ""
3374
 
3375
+ #: app/helpers/PrliLinksHelper.php:39
3376
+ msgid "Javascript Redirection"
3377
  msgstr ""
3378
 
3379
+ #: app/helpers/PrliLinksHelper.php:42
3380
+ msgid "Temporary (307) Redirection"
3381
  msgstr ""
3382
 
3383
+ #: app/helpers/PrliLinksHelper.php:45
3384
+ msgid "Temporary (302) Redirection"
3385
  msgstr ""
3386
 
3387
+ #: app/helpers/PrliLinksHelper.php:48
3388
+ msgid "Permanent (301) Redirection"
3389
  msgstr ""
3390
 
3391
+ #: app/helpers/PrliLinksHelper.php:52
3392
+ msgid "Nofollow Enabled"
3393
  msgstr ""
3394
 
3395
+ #: app/helpers/PrliLinksHelper.php:56
3396
+ msgid "Parameter Forwarding Enabled"
 
 
 
3397
  msgstr ""
3398
 
3399
+ #: app/helpers/PrliLinksHelper.php:68
3400
+ msgid "Are you sure you want to delete your %s Pretty Link? This will delete the Pretty Link and all of the statistical data about it in your database."
3401
  msgstr ""
3402
 
3403
+ #: app/helpers/PrliLinksHelper.php:69
3404
+ msgid "Are you sure you want to reset your %s Pretty Link? This will delete all of the statistical data about this Pretty Link in your database."
3405
  msgstr ""
3406
 
3407
+ #: app/helpers/PrliLinksHelper.php:69
3408
+ #: app/helpers/PrliLinksHelper.php:147
3409
+ msgid "Reset %s"
 
3410
  msgstr ""
3411
 
3412
+ #: app/helpers/PrliLinksHelper.php:72
3413
+ #: app/views/clicks/list.php:161
3414
+ msgid "View clicks for %s"
3415
  msgstr ""
3416
 
3417
+ #: app/helpers/PrliLinksHelper.php:77
3418
+ #: app/helpers/PrliLinksHelper.php:158
3419
+ msgid "Post %s to Twitter"
3420
  msgstr ""
3421
 
3422
+ #: app/helpers/PrliLinksHelper.php:78
3423
+ #: app/helpers/PrliLinksHelper.php:169
3424
+ msgid "Send %s in an Email"
 
3425
  msgstr ""
3426
 
3427
+ #: app/helpers/PrliLinksHelper.php:83
3428
+ #: app/helpers/PrliLinksHelper.php:180
3429
+ msgid "Visit Target URL: %s in a New Window"
3430
  msgstr ""
3431
 
3432
+ #: app/helpers/PrliLinksHelper.php:84
3433
+ #: app/helpers/PrliLinksHelper.php:191
3434
+ msgid "Visit Short URL: %s in a New Window"
3435
  msgstr ""
3436
 
3437
+ #: app/helpers/PrliLinksHelper.php:102
3438
+ msgid "%d Clicks / %d Uniques"
 
 
 
 
 
 
3439
  msgstr ""
3440
 
3441
+ #: app/helpers/PrliLinksHelper.php:111
3442
+ msgid "This link isn't being tracked"
3443
  msgstr ""
3444
 
3445
+ #: app/helpers/PrliLinksHelper.php:135
3446
+ msgid "Target URL:"
3447
  msgstr ""
3448
 
3449
+ #: app/helpers/PrliLinksHelper.php:167
3450
+ #: app/views/links/form_basic.php:48
3451
+ #: app/views/shared/tinymce_form_popup.php:78
3452
+ #: app/views/widgets/widget.php:15
3453
+ #: app/controllers/PrliLinksController.php:44
3454
+ msgid "Pretty Link"
3455
  msgstr ""
3456
 
3457
+ #: app/models/PrliUtils.php:88
3458
+ msgid "*** Pretty Links Debug: %s"
3459
  msgstr ""
3460
 
3461
+ #: app/models/PrliUtils.php:98
3462
+ msgid "The Slug can't be empty"
3463
  msgstr ""
3464
 
3465
+ #: app/models/PrliUtils.php:106
3466
+ msgid "There's a file this slug conflicts with: %s"
 
 
 
 
 
 
 
 
3467
  msgstr ""
3468
 
3469
+ #: app/models/PrliUtils.php:115
3470
+ msgid "This Pretty Link Slug is already taken. There's already another pretty link with this slug: %s"
3471
  msgstr ""
3472
 
3473
+ #: app/models/PrliUtils.php:133
3474
+ msgid "This Pretty Link Slug is already taken. The path resolved to URL: %s"
 
 
 
 
 
 
3475
  msgstr ""
3476
 
3477
+ #: app/models/PrliUtils.php:138
3478
+ msgid "This Pretty Link Slug is already taken. The path redirected to URL: %s"
3479
  msgstr ""
3480
 
3481
+ #. translators: %1$s: open link tag, %2$s: close link tag, %3$s: br tag
3482
+ #: app/models/PrliUtils.php:1107
3483
+ msgid "Get started by %1$sadding a URL%2$s that you want to turn into a pretty link.%3$sCome back to see how many times it was clicked."
 
3484
  msgstr ""
3485
 
3486
+ #: app/models/PrliLink.php:495
3487
+ msgid "Target URL can't be blank"
3488
  msgstr ""
3489
 
3490
+ #: app/models/PrliLink.php:499
3491
+ msgid "Target URL must be different than the Pretty Link"
3492
  msgstr ""
3493
 
3494
+ #: app/models/PrliLink.php:503
3495
+ msgid "Link URL must be a correctly formatted url"
3496
  msgstr ""
3497
 
3498
+ #: app/models/PrliLink.php:507
3499
+ msgid "Pretty Link slugs must not contain question marks, ampersands or number signs."
3500
  msgstr ""
3501
 
3502
+ #: app/models/PrliLink.php:511
3503
+ msgid "Pretty Link slugs must not end with a slash (\"/\")"
 
 
3504
  msgstr ""
3505
 
3506
+ #: app/models/PrliClick.php:237
3507
+ msgid "all links"
3508
  msgstr ""
3509
 
3510
+ #: app/models/PrliClick.php:244
3511
+ msgid "All clicks"
3512
  msgstr ""
3513
 
3514
+ #: app/models/PrliClick.php:247
3515
+ msgid "Unique hits"
3516
  msgstr ""
3517
 
3518
+ #: app/models/PrliClick.php:251
3519
+ msgid "on"
3520
  msgstr ""
3521
 
3522
+ #: app/models/PrliGroup.php:114
3523
+ msgid "Group must have a name."
 
 
3524
  msgstr ""
3525
 
3526
+ #: app/views/links/form_advanced.php:6
3527
+ msgid "No Follow"
3528
  msgstr ""
3529
 
3530
+ #: app/views/links/form_advanced.php:9
3531
+ msgid "Nofollow Link"
3532
  msgstr ""
3533
 
3534
+ #: app/views/links/form_advanced.php:10
3535
+ msgid "Add a nofollow and noindex to this link's http redirect header"
 
 
 
3536
  msgstr ""
3537
 
3538
+ #: app/views/links/form_advanced.php:19
3539
+ #: app/views/links/form_advanced.php:22
3540
+ msgid "Delay Redirect"
3541
  msgstr ""
3542
 
3543
+ #: app/views/links/form_advanced.php:23
3544
+ msgid "Time in seconds to wait before redirecting"
3545
  msgstr ""
3546
 
3547
+ #: app/views/links/form_advanced.php:32
3548
+ #: app/views/links/form_advanced.php:35
3549
+ msgid "Parameter Forwarding"
 
3550
  msgstr ""
3551
 
3552
+ #: app/views/links/form_advanced.php:36
3553
+ msgid "Forward parameters passed to this link onto the Target URL"
3554
  msgstr ""
3555
 
3556
+ #: app/views/links/form_advanced.php:45
3557
+ #: app/views/links/form_advanced.php:48
3558
+ #: app/views/shared/tinymce_form_popup.php:54
3559
+ msgid "Tracking"
3560
  msgstr ""
3561
 
3562
+ #: app/views/links/form_advanced.php:49
3563
+ msgid "Enable Pretty Link's built-in hit (click) tracking"
 
 
3564
  msgstr ""
3565
 
3566
+ #: app/views/links/form_advanced.php:61
3567
+ msgid "Google Analytics Tracking"
3568
  msgstr ""
3569
 
3570
+ #: app/views/links/form_advanced.php:62
3571
+ msgid "Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work."
3572
  msgstr ""
3573
 
3574
+ #: app/views/links/form_advanced.php:75
3575
+ msgid "It appears that %s is currently installed. Pretty Link will attempt to use its settings to track this link."
 
 
3576
  msgstr ""
3577
 
3578
+ #: app/views/links/form_advanced.php:84
3579
+ msgid "No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is."
3580
  msgstr ""
3581
 
3582
+ #: app/views/links/form.php:28
3583
+ msgid "Basic"
3584
  msgstr ""
3585
 
3586
+ #: app/views/links/form.php:29
3587
+ msgid "Advanced"
 
 
3588
  msgstr ""
3589
 
3590
+ #: app/views/links/form_basic.php:6
3591
+ msgid "Redirection*"
3592
  msgstr ""
3593
 
3594
+ #: app/views/links/form_basic.php:9
3595
+ #: app/views/options/form.php:77
3596
+ msgid "Redirection Type"
3597
  msgstr ""
3598
 
3599
+ #: app/views/links/form_basic.php:10
3600
+ msgid "This is the method of redirection for your link."
 
 
3601
  msgstr ""
3602
 
3603
+ #: app/views/links/form_basic.php:24
3604
+ #: app/views/options/form.php:87
3605
+ msgid "Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s"
3606
  msgstr ""
3607
 
3608
+ #: app/views/links/form_basic.php:32
3609
+ msgid "Target URL*"
3610
  msgstr ""
3611
 
3612
+ #: app/views/links/form_basic.php:35
3613
+ #: app/views/shared/tinymce_form_popup.php:13
3614
+ #: app/views/shared/tinymce_form_popup.php:74
3615
+ #: app/views/widgets/widget.php:11
3616
+ msgid "Target URL"
 
3617
  msgstr ""
3618
 
3619
+ #: app/views/links/form_basic.php:36
3620
+ msgid "This is the URL that your Pretty Link will redirect to."
3621
  msgstr ""
3622
 
3623
+ #: app/views/links/form_basic.php:45
3624
+ msgid "Pretty Link*"
3625
  msgstr ""
3626
 
3627
+ #: app/views/links/form_basic.php:49
3628
+ msgid "This is how your pretty link will appear. You can edit the Pretty Link slug here."
 
 
 
 
3629
  msgstr ""
3630
 
3631
+ #: app/views/links/form_basic.php:58
3632
+ #: app/views/links/form_basic.php:61
3633
+ msgid "Notes"
3634
  msgstr ""
3635
 
3636
+ #: app/views/links/form_basic.php:62
3637
+ msgid "This is a field where you can enter notes about a particular link. This notes field is mainly for your own link management needs. It isn't currently used anywhere on the front end."
3638
  msgstr ""
3639
 
3640
+ #: app/views/links/form_pro.php:34
3641
+ msgid "Enter a comma separated list of keywords / keyword phrases that you'd like to replace with this link in your Posts & Pages."
 
 
 
3642
  msgstr ""
3643
 
3644
+ #. translators: %1$s: open code tag, %2$s: close code tag
3645
+ #: app/views/links/form_pro.php:50
3646
+ msgid "Enter a comma separated list of the URLs that you'd like to replace with this Pretty Link in your Posts & Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
3647
  msgstr ""
3648
 
3649
+ #: app/views/shared/nav.php:6
3650
+ msgid "Pro Manual"
3651
  msgstr ""
3652
 
3653
+ #: app/views/shared/nav.php:9
3654
+ #: app/views/admin/update/license.php:39
3655
+ #: app/views/admin/onboarding/welcome.php:116
3656
+ #: app/controllers/PrliAppController.php:276
3657
+ msgid "Upgrade to Pro"
3658
  msgstr ""
3659
 
3660
+ #: app/views/shared/nav.php:14
3661
+ msgid "Connect:"
3662
  msgstr ""
3663
 
3664
+ #: app/views/shared/nav.php:18
3665
+ msgid "Get Help:"
3666
  msgstr ""
3667
 
3668
+ #: app/views/shared/nav.php:19
3669
+ msgid "Tutorials"
 
 
3670
  msgstr ""
3671
 
3672
+ #: app/views/shared/public_link.php:22
3673
+ msgid "Here is your Pretty Link"
3674
  msgstr ""
3675
 
3676
+ #: app/views/shared/public_link.php:30
3677
+ msgid "Here's your pretty link for"
3678
  msgstr ""
3679
 
3680
+ #: app/views/shared/public_link.php:41
3681
+ msgid "send this link to:"
 
 
3682
  msgstr ""
3683
 
3684
+ #: app/views/shared/public_link.php:45
3685
+ msgid "back"
3686
  msgstr ""
3687
 
3688
+ #: app/views/shared/table-nav.php:14
3689
+ #: app/views/shared/link-table-nav.php:16
3690
+ #: app/views/shared/link-table-nav.php:106
3691
+ msgid "Displaying %1$s&#8211;%2$s of %3$s"
3692
  msgstr ""
3693
 
3694
+ #: app/views/shared/tinymce_form_popup.php:4
3695
+ msgid "Insert Pretty Link"
 
 
3696
  msgstr ""
3697
 
3698
+ #: app/views/shared/tinymce_form_popup.php:10
3699
+ #: js/editor/components/link-editor/index.js:377
3700
+ #: js/editor.js:12
3701
+ msgid "Create New Pretty Link"
3702
  msgstr ""
3703
 
3704
+ #: app/views/shared/tinymce_form_popup.php:17
3705
+ msgid "Slug"
 
 
 
 
 
3706
  msgstr ""
3707
 
3708
+ #: app/views/shared/tinymce_form_popup.php:20
3709
+ msgid "valid"
3710
  msgstr ""
3711
 
3712
+ #: app/views/shared/tinymce_form_popup.php:21
3713
+ msgid "invalid"
3714
  msgstr ""
3715
 
3716
+ #: app/views/shared/tinymce_form_popup.php:25
3717
+ #: app/views/shared/tinymce_form_popup.php:82
3718
+ msgid "Link Text"
 
 
3719
  msgstr ""
3720
 
3721
+ #: app/views/shared/tinymce_form_popup.php:29
3722
+ msgid "Redirect Type"
3723
  msgstr ""
3724
 
3725
+ #: app/views/shared/tinymce_form_popup.php:46
3726
+ msgid "Nofollow"
3727
  msgstr ""
3728
 
3729
+ #: app/views/shared/tinymce_form_popup.php:49
3730
+ #: app/views/shared/tinymce_form_popup.php:57
3731
+ msgid "Enabled"
3732
  msgstr ""
3733
 
3734
+ #: app/views/shared/tinymce_form_popup.php:50
3735
+ #: app/views/shared/tinymce_form_popup.php:58
3736
+ msgid "Disabled"
 
 
 
3737
  msgstr ""
3738
 
3739
+ #: app/views/shared/tinymce_form_popup.php:63
3740
+ #: app/views/shared/tinymce_form_popup.php:87
3741
+ msgid "Open this Pretty Link in a new window/tab"
3742
  msgstr ""
3743
 
3744
+ #: app/views/shared/tinymce_form_popup.php:66
3745
+ msgid "Insert New Pretty Link"
3746
  msgstr ""
3747
 
3748
+ #: app/views/shared/tinymce_form_popup.php:70
3749
+ msgid "Use Existing Pretty Link"
 
 
 
 
3750
  msgstr ""
3751
 
3752
+ #: app/views/shared/tinymce_form_popup.php:72
3753
+ msgid "Search by Slug, Title, or Target URL..."
3754
  msgstr ""
3755
 
3756
+ #: app/views/shared/tinymce_form_popup.php:91
3757
+ msgid "Insert Existing Pretty Link"
 
 
 
 
3758
  msgstr ""
3759
 
3760
+ #: app/views/shared/errors.php:12
3761
+ #: app/views/admin/errors.php:7
3762
+ msgid "ERROR"
3763
  msgstr ""
3764
 
3765
+ #: app/views/admin/popups/upgrade.php:6
3766
+ msgid "Upgrade to Pretty Links PRO"
3767
  msgstr ""
3768
 
3769
+ #: app/views/admin/popups/upgrade.php:7
3770
+ msgid "Unlock Pretty Links' PRO features and you'll be able to:"
3771
  msgstr ""
3772
 
3773
+ #: app/views/admin/popups/upgrade.php:9
3774
+ msgid "Monetize existing content with automated Pretty Link placement"
 
 
 
 
 
3775
  msgstr ""
3776
 
3777
+ #: app/views/admin/popups/upgrade.php:10
3778
+ msgid "Redirect with cloaking, Javascript or Meta-refresh"
3779
  msgstr ""
3780
 
3781
+ #: app/views/admin/popups/upgrade.php:11
3782
+ msgid "Redirect by location, time, device or rotation"
3783
  msgstr ""
3784
 
3785
+ #: app/views/admin/popups/upgrade.php:12
3786
+ msgid "Expire your Pretty Links"
 
 
 
 
 
3787
  msgstr ""
3788
 
3789
+ #: app/views/admin/popups/upgrade.php:13
3790
+ msgid "Split-test your Pretty Links"
3791
  msgstr ""
3792
 
3793
+ #: app/views/admin/popups/upgrade.php:14
3794
+ #: app/views/admin/update/license.php:60
3795
+ msgid "And much, much more!"
3796
  msgstr ""
3797
 
3798
+ #: app/views/admin/popups/upgrade.php:17
3799
+ msgid "Plus, upgrading is fast, easy and won't disrupt any of your existing links or data."
 
 
 
 
 
3800
  msgstr ""
3801
 
3802
+ #: app/views/admin/popups/upgrade.php:18
3803
+ #: app/views/admin/update/license.php:66
3804
+ msgid "We think you'll love it!"
3805
  msgstr ""
3806
 
3807
+ #: app/views/admin/popups/upgrade.php:23
3808
+ msgid "Upgrade to Pretty Links Pro"
3809
  msgstr ""
3810
 
3811
+ #: app/views/admin/popups/upgrade.php:24
3812
+ msgid "Maybe Later"
 
 
 
 
 
 
3813
  msgstr ""
3814
 
3815
+ #: app/views/admin/popups/rating.php:8
3816
+ msgid "Are you enjoying using Pretty Links?"
3817
  msgstr ""
3818
 
3819
+ #: app/views/admin/popups/rating.php:17
3820
+ msgid "Rate Pretty Links"
 
 
3821
  msgstr ""
3822
 
3823
+ #: app/views/admin/popups/rating.php:18
3824
+ msgid "If you enjoy using Pretty Links would you mind taking a moment to rate it on WordPress.org? It won't take more than a minute."
3825
  msgstr ""
3826
 
3827
+ #: app/views/admin/popups/rating.php:19
3828
+ #: app/views/admin/popups/rating.php:31
3829
+ msgid "Thanks for your support!"
3830
  msgstr ""
3831
 
3832
+ #: app/views/admin/popups/rating.php:24
3833
+ #: app/views/admin/popups/rating.php:36
3834
+ msgid "Remind Me Later"
 
3835
  msgstr ""
3836
 
3837
+ #: app/views/admin/popups/rating.php:25
3838
+ msgid "Review Pretty Links"
3839
  msgstr ""
3840
 
3841
+ #: app/views/admin/popups/rating.php:29
3842
+ #: app/views/admin/popups/rating.php:37
3843
+ msgid "Leave Feedback"
3844
  msgstr ""
3845
 
3846
+ #: app/views/admin/popups/rating.php:30
3847
+ msgid "To help us improve Pretty Links, would you mind taking a moment to leave feedback?"
3848
  msgstr ""
3849
 
3850
+ #: app/views/admin/popups/rating.php:40
3851
+ msgid "Never Remind Me Again"
3852
  msgstr ""
3853
 
3854
+ #: app/views/admin/update/addons.php:3
3855
+ msgid "Pretty Link Add-ons"
3856
  msgstr ""
3857
 
3858
+ #: app/views/admin/update/addons.php:8
3859
+ msgid "There were no Add-ons found for your license or lack thereof..."
3860
  msgstr ""
3861
 
3862
+ #: app/views/admin/update/addons.php:14
3863
+ msgid "Add-on"
3864
  msgstr ""
3865
 
3866
+ #: app/views/admin/update/addons.php:15
3867
+ msgid "Description"
3868
  msgstr ""
3869
 
3870
+ #: app/views/admin/update/addons.php:16
3871
+ #: app/views/admin/update/addons.php:54
3872
+ msgid "Install"
3873
  msgstr ""
3874
 
3875
+ #: app/views/admin/update/addons.php:42
3876
+ msgid "(Update Available)"
3877
  msgstr ""
3878
 
3879
+ #: app/views/admin/update/addons.php:50
3880
+ msgid "Installed & Active"
3881
  msgstr ""
3882
 
3883
+ #: app/views/admin/update/addons.php:52
3884
+ msgid "Installed & Inactive"
3885
  msgstr ""
3886
 
3887
+ #: app/views/admin/update/license.php:7
3888
+ msgid "Pretty Links Pro License"
3889
  msgstr ""
3890
 
3891
+ #. translators: %1$s: link to pro site, %2$s: link to pro site login page
3892
+ #: app/views/admin/update/license.php:14
3893
+ msgid "You must have a License Key to enable automatic updates for Pretty Links Pro. If you don't have a License please go to %1$s to get one. If you do have a license you can login at %2$s to manage your licenses and site activations."
3894
  msgstr ""
3895
 
3896
+ #: app/views/admin/update/license.php:25
3897
+ msgid "Enter Your Pretty Links Pro License Key:"
 
 
 
3898
  msgstr ""
3899
 
3900
+ #: app/views/admin/update/license.php:32
3901
+ msgid "Activate License Key on %s"
3902
  msgstr ""
3903
 
3904
+ #. translators: %1$s: open link tag, %2$s: close link tag
3905
+ #: app/views/admin/update/license.php:45
3906
+ msgid "It looks like you haven't %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:"
3907
  msgstr ""
3908
 
3909
+ #: app/views/admin/update/license.php:55
3910
+ msgid "Auto-replace keywords throughout your site with Pretty Links"
3911
  msgstr ""
3912
 
3913
+ #: app/views/admin/update/license.php:56
3914
+ msgid "Protect your affiliate links by using Cloaked Redirects"
3915
  msgstr ""
3916
 
3917
+ #: app/views/admin/update/license.php:57
3918
+ msgid "Redirect based on a visitor's location"
3919
  msgstr ""
3920
 
3921
+ #: app/views/admin/update/license.php:58
3922
+ msgid "Auto-prettylink your Pages &amp; Posts"
 
 
3923
  msgstr ""
3924
 
3925
+ #: app/views/admin/update/license.php:59
3926
+ msgid "Find out what works and what doesn't by split testing your links"
3927
  msgstr ""
3928
 
3929
+ #: app/views/admin/update/license.php:64
3930
+ msgid "Plus, upgrading is fast, easy and won't disrupt any of your existing links or data. And there's even a 14 day money back guarantee."
3931
  msgstr ""
3932
 
3933
+ #: app/views/admin/update/license.php:68
3934
+ msgid "Upgrade to Pro today!"
3935
  msgstr ""
3936
 
3937
+ #: app/views/admin/update/license.php:72
3938
+ msgid "Active License Key Information:"
3939
  msgstr ""
3940
 
3941
+ #: app/views/admin/update/license.php:75
3942
+ msgid "License Key:"
3943
  msgstr ""
3944
 
3945
+ #: app/views/admin/update/license.php:79
3946
+ msgid "Status:"
3947
  msgstr ""
3948
 
3949
+ #: app/views/admin/update/license.php:80
3950
+ msgid "Active on %s"
3951
  msgstr ""
3952
 
3953
+ #: app/views/admin/update/license.php:83
3954
+ msgid "Product:"
3955
  msgstr ""
3956
 
3957
+ #: app/views/admin/update/license.php:87
3958
+ msgid "Activations:"
3959
  msgstr ""
3960
 
3961
+ #. translators: %1$s: open b tag, %2$s: close b tag, %3$d: current activation count, %4$s: max activations
3962
+ #: app/views/admin/update/license.php:92
3963
+ msgid "%1$s%3$d of %4$s%2$s sites have been activated with this license key"
3964
  msgstr ""
3965
 
3966
+ #: app/views/admin/update/license.php:102
3967
+ msgid "Are you sure? Pretty Links Pro will not be functional on %s if this License Key is deactivated."
3968
  msgstr ""
3969
 
3970
+ #: app/views/admin/update/license.php:102
3971
+ msgid "Deactivate License Key on %s"
3972
  msgstr ""
3973
 
3974
+ #: app/views/admin/update/license.php:105
3975
+ msgid "Upgrade plugin to Pro"
3976
  msgstr ""
3977
 
3978
+ #: app/views/admin/update/license.php:110
3979
+ msgid "You're currently running version %s of Pretty Links Pro"
 
 
 
 
 
3980
  msgstr ""
3981
 
3982
+ #: app/views/admin/update/addon_popup.php:4
3983
+ msgid "ACTION REQUIRED"
 
3984
  msgstr ""
3985
 
3986
+ #: app/views/admin/update/addon_popup.php:5
3987
+ msgid "The %s features in your Pretty Link options have been moved from Pretty Link into a separate plugin."
3988
  msgstr ""
3989
 
3990
+ #: app/views/admin/update/addon_popup.php:6
3991
+ msgid "Why you ask? Well, it's to streamline and increase the performance of Pretty Link for you."
 
3992
  msgstr ""
3993
 
3994
+ #: app/views/admin/update/addon_popup.php:9
3995
+ msgid "And good for you, it looks like you've already got the %1$s Add-on installed. Just click the \"Activate %2$s Add-on\" button below and you'll get all these features back now."
3996
  msgstr ""
3997
 
3998
+ #: app/views/admin/update/addon_popup.php:11
3999
+ msgid "Luckily it's easy to get these features back now. Just click the \"Install %s Add-on\" button below."
 
4000
  msgstr ""
4001
 
4002
+ #. translators: %1$s: open link tag, %2$s: close link tag
4003
+ #: app/views/admin/update/addon_popup.php:16
4004
+ msgid "If you have problems with the auto-install please refer to %1$sthe user manual%2$s for manual install instructions."
4005
  msgstr ""
4006
 
4007
+ #: app/views/admin/update/addon_popup.php:27
4008
+ msgid "Activate %s Add-on"
 
4009
  msgstr ""
4010
 
4011
+ #: app/views/admin/update/addon_popup.php:29
4012
+ msgid "Install %s Add-on"
4013
  msgstr ""
4014
 
4015
+ #: app/views/admin/update/addon_popup.php:31
4016
+ msgid "Don't Show This Message Again"
4017
  msgstr ""
4018
 
4019
+ #: app/views/admin/update/ui.php:3
4020
+ msgid "Activate Pretty Links Pro"
4021
  msgstr ""
4022
 
4023
+ #: app/views/admin/update/ui.php:16
4024
+ msgid "License"
4025
  msgstr ""
4026
 
4027
+ #: app/views/admin/update/ui.php:17
4028
+ msgid "Add-Ons"
4029
  msgstr ""
4030
 
4031
+ #: app/views/admin/update/edge_updates.php:4
4032
+ msgid "Include Pretty Links Pro edge (development) releases in automatic updates (not recommended for production websites)"
4033
  msgstr ""
4034
 
4035
+ #: app/views/admin/update/edge_updates.php:4
4036
+ #: app/views/widgets/widget.php:22
4037
+ msgid "Loading..."
4038
  msgstr ""
4039
 
4040
+ #: app/views/admin/update/activation_warning.php:7
4041
+ msgid "Error with PRETTYLINK_LICENSE_KEY: %s"
4042
  msgstr ""
4043
 
4044
+ #: app/views/admin/update/activation_warning.php:14
4045
+ #: app/views/admin/update/activation_warning.php:41
4046
+ msgid "Pretty Links Pro isn't able to get critical automatic updates"
4047
  msgstr ""
4048
 
4049
+ #: app/views/admin/update/activation_warning.php:15
4050
+ msgid "It looks like you used to have Pretty Links Pro activated with a username and password but now you need a license key to activate it."
4051
  msgstr ""
4052
 
4053
+ #. translators: %1$s: open link tag, %2$s: close link tag
4054
+ #: app/views/admin/update/activation_warning.php:21
4055
+ msgid "You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s"
4056
  msgstr ""
4057
 
4058
+ #. translators: %1$s: open link tag, %2$s: close link tag
4059
+ #: app/views/admin/update/activation_warning.php:32
4060
+ msgid "After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro\" admin page,%2$s you'll start getting updates again."
4061
  msgstr ""
4062
 
4063
+ #. translators: %1$s: open link tag, %2$s: close link tag
4064
+ #: app/views/admin/update/activation_warning.php:47
4065
+ msgid "You can retrieve or purchase a license key at %1$sPrettyLinks.com%2$s to enable automatic updates today."
4066
  msgstr ""
4067
 
4068
+ #. translators: %1$s: open link tag, %2$s: close link tag
4069
+ #: app/views/admin/update/activation_warning.php:58
4070
+ msgid "After you paste your license key on the %1$s\"Pretty Links\" -> \"Activate Pro\" admin page,%2$s you'll start getting automatic updates."
4071
  msgstr ""
4072
 
4073
+ #: app/views/admin/onboarding/welcome.php:4
4074
+ #: app/views/admin/onboarding/welcome.php:7
4075
+ msgid "Welcome to Pretty Links!"
4076
  msgstr ""
4077
 
4078
+ #: app/views/admin/onboarding/welcome.php:10
4079
+ msgid "Congratulations, you've just installed the most powerful link management platform for WordPress on Earth!"
4080
  msgstr ""
4081
 
4082
+ #: app/views/admin/onboarding/welcome.php:11
4083
+ msgid "With Pretty Links, you'll no longer need to manage links from a spreadsheet and you'll be able to maximize the visibility of your links - these benefits (and more) will make it possible to make more money from your content like never before!"
4084
  msgstr ""
4085
 
4086
+ #: app/views/admin/onboarding/welcome.php:17
4087
+ msgid "Getting Started"
4088
  msgstr ""
4089
 
4090
+ #: app/views/admin/onboarding/welcome.php:18
4091
+ msgid "Start by creating your first Pretty Link:"
4092
  msgstr ""
4093
 
4094
+ #: app/views/admin/onboarding/welcome.php:24
4095
+ msgid "Click \"Add New Link\""
4096
  msgstr ""
4097
 
4098
+ #: app/views/admin/onboarding/welcome.php:25
4099
+ msgid "1. Click \"Add New Link\""
4100
  msgstr ""
4101
 
4102
+ #: app/views/admin/onboarding/welcome.php:28
4103
+ msgid "Enter the URL of your Affiliate Link"
4104
  msgstr ""
4105
 
4106
+ #: app/views/admin/onboarding/welcome.php:29
4107
+ msgid "2. Enter the URL of your Affiliate Link"
4108
  msgstr ""
4109
 
4110
+ #: app/views/admin/onboarding/welcome.php:32
4111
+ msgid "Customize your Pretty Link Slug"
4112
  msgstr ""
4113
 
4114
+ #: app/views/admin/onboarding/welcome.php:33
4115
+ msgid "3. Customize your Pretty Link Slug"
4116
  msgstr ""
4117
 
4118
+ #: app/views/admin/onboarding/welcome.php:36
4119
+ msgid "Click \"Update\""
4120
  msgstr ""
4121
 
4122
+ #: app/views/admin/onboarding/welcome.php:37
4123
+ msgid "4. Click \"Update\""
4124
  msgstr ""
4125
 
4126
+ #: app/views/admin/onboarding/welcome.php:40
4127
+ msgid "Copy the Pretty Link URL"
4128
  msgstr ""
4129
 
4130
+ #: app/views/admin/onboarding/welcome.php:41
4131
+ msgid "5. Copy the Pretty Link URL"
4132
  msgstr ""
4133
 
4134
+ #: app/views/admin/onboarding/welcome.php:45
4135
+ msgid "Wasn't that easy? Now, you can use this link wherever you want!"
4136
  msgstr ""
4137
 
4138
+ #: app/views/admin/onboarding/welcome.php:53
4139
+ msgid "The Power of Pretty Links Pro"
4140
  msgstr ""
4141
 
4142
+ #: app/views/admin/onboarding/welcome.php:54
4143
+ msgid "There are many reasons that premium users of Pretty Links are able to take their business to the next level:"
4144
  msgstr ""
4145
 
4146
+ #: app/views/admin/onboarding/welcome.php:59
4147
+ #: app/views/admin/onboarding/welcome.php:64
4148
+ msgid "Automated, Site-Wide Link Placement (Keyword Replacement)"
4149
  msgstr ""
4150
 
4151
+ #: app/views/admin/onboarding/welcome.php:60
4152
+ msgid "Imagine if you never had to hand-edit links, copy and paste from a spreadsheet, or actively have to keep up with you links ever again. Well that time has come! Now with Pretty Links, all you have to do is create your links and let Pretty Links do the rest!"
4153
  msgstr ""
4154
 
4155
+ #: app/views/admin/onboarding/welcome.php:61
4156
+ msgid "Pretty Links will scan your content for the keywords or URLs that you want to target and will replace them with Pretty Links automatically! This will save you tons of time so you can focus on growing your business!"
4157
  msgstr ""
4158
 
4159
+ #: app/views/admin/onboarding/welcome.php:70
4160
+ #: app/views/admin/onboarding/welcome.php:73
4161
+ msgid "Categories & Tags"
4162
  msgstr ""
4163
 
4164
+ #: app/views/admin/onboarding/welcome.php:74
4165
+ msgid "When you are dealing with a large number of links, it can be easy to be overwhelmed and confused by which links to you planned to use where. It's now easier than ever to organize your links and group them any way that you like for ultimate productivity and monetization!"
4166
  msgstr ""
4167
 
4168
+ #: app/views/admin/onboarding/welcome.php:80
4169
+ #: app/views/admin/onboarding/welcome.php:85
4170
+ msgid "Advanced Redirect Types"
4171
  msgstr ""
4172
 
4173
+ #: app/views/admin/onboarding/welcome.php:81
4174
+ msgid "Lite users can take advantage of 301 & 302 server side redirects but our pro users can also redirect with cloaking, JavaScript, Meta-refresh and more."
4175
  msgstr ""
4176
 
4177
+ #: app/views/admin/onboarding/welcome.php:82
4178
+ msgid "So if you have social media links, a landing page, or a new page or post you'd like to redirect your customers to, this feature will definitely come in handy!"
4179
  msgstr ""
4180
 
4181
+ #: app/views/admin/onboarding/welcome.php:91
4182
+ #: app/views/admin/onboarding/welcome.php:94
4183
+ msgid "Dynamic Redirect Types"
4184
  msgstr ""
4185
 
4186
+ #: app/views/admin/onboarding/welcome.php:95
4187
+ msgid "Would you like your Pretty Link to redirect somewhere custom depending on what country your user is in, device they're using, time they're clicking the link or just randomly? Our pro users can do this easily with our Dynamic Redirections!"
4188
  msgstr ""
4189
 
4190
+ #: app/views/admin/onboarding/welcome.php:96
4191
+ msgid "This feature is excellent if you are running a time-sensitive sales, want to create custom content for you customers, create stellar landing pages for customers in different countries!"
4192
  msgstr ""
4193
 
4194
+ #: app/views/admin/onboarding/welcome.php:102
4195
+ #: app/views/admin/onboarding/welcome.php:106
4196
+ msgid "Import and Export Links"
4197
  msgstr ""
4198
 
4199
+ #: app/views/admin/onboarding/welcome.php:103
4200
+ msgid "Export your links to a spreadsheet or import them en masse - our pro users can do this with ease. Simply download your spreadsheet, upload to WordPress, and your links are automatically added to Pretty Links!"
4201
  msgstr ""
4202
 
4203
+ #: app/views/admin/onboarding/welcome.php:111
4204
+ msgid "The list goes on and on"
4205
  msgstr ""
4206
 
4207
+ #: app/views/admin/onboarding/welcome.php:112
4208
+ msgid "Our premium editions of Pretty Links are a HUGE upgrade from Lite. Don’t miss out on our critical PRO benefits!"
4209
  msgstr ""
4210
 
4211
+ #: app/views/admin/onboarding/welcome.php:117
4212
+ msgid "Upgrade NOW and get 50% off of your subscription!!!"
4213
  msgstr ""
4214
 
4215
+ #: app/views/admin/onboarding/update.php:4
4216
+ #: app/views/admin/onboarding/update.php:7
4217
+ msgid "Get Some Quick Wins with Pretty Links 3.0!"
4218
  msgstr ""
4219
 
4220
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4221
+ #: app/views/admin/onboarding/update.php:14
4222
+ msgid "We hope you know that here at Pretty Links, we work every day to deliver amazing tools for business owners to help them %1$swin more%2$s. We want our customers to make more money, easier through superior affiliate link strategy and management."
4223
  msgstr ""
4224
 
4225
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4226
+ #: app/views/admin/onboarding/update.php:25
4227
+ msgid "That's why today, we're excited to announce that we're rolling out a major, new release. This release won't deliver any huge, new features but rather a set of incremental features & fixes that will %1$sinstantly give you some well deserved quick wins%2$s in your business."
4228
  msgstr ""
4229
 
4230
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4231
+ #: app/views/admin/onboarding/update.php:36
4232
+ msgid "That's why we're calling Pretty Links 3.0 - %1$sQuick Wins!%2$s"
4233
  msgstr ""
4234
 
4235
+ #: app/views/admin/onboarding/update.php:43
4236
+ msgid "What Changes Can You Expect, Exactly?"
4237
  msgstr ""
4238
 
4239
+ #: app/views/admin/onboarding/update.php:45
4240
+ msgid "Check out these solid improvements that will make your experience with Pretty Links better in almost every way:"
4241
  msgstr ""
4242
 
4243
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4244
+ #: app/views/admin/onboarding/update.php:53
4245
+ msgid "%1$sAn all-new Link Editor%2$s - We've completely overhauled our link editing experience. Our new, power-packed link editor will make creating and managing your affiliate links easier than ever before!"
4246
  msgstr ""
4247
 
4248
+ #: app/views/admin/onboarding/update.php:61
4249
+ #: app/views/admin/onboarding/update.php:62
4250
+ #: app/views/admin/onboarding/update.php:66
4251
+ #: app/views/admin/onboarding/update.php:67
4252
+ msgid "An all-new Link Editor"
4253
  msgstr ""
4254
 
4255
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4256
+ #: app/views/admin/onboarding/update.php:77
4257
+ msgid "%1$sAll new Link Listing%2$s - Gone is the clumsy, old Link Listing feature! You’ll now be able to send links to the \"Trash,\" customize what columns you see in your listing with \"Screen Options\" and change the number of rows displayed."
4258
  msgstr ""
4259
 
4260
+ #: app/views/admin/onboarding/update.php:85
4261
+ #: app/views/admin/onboarding/update.php:86
4262
+ msgid "All new Link Listing"
4263
  msgstr ""
4264
 
4265
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4266
+ #: app/views/admin/onboarding/update.php:96
4267
+ msgid "%1$sCustomizable Links Tags / Categories (Pro Only)%2$s - Once you upgrade to Quick Wins, you'll be able to categorize and tag your pretty links! This is a long-requested feature that will help you organize your links and group them any way that you'd like to for ultimate productivity and monetization!"
4268
  msgstr ""
4269
 
4270
+ #: app/views/admin/onboarding/update.php:104
4271
+ #: app/views/admin/onboarding/update.php:105
4272
+ msgid "Customizable Links Tags / Categories (Pro Only)"
4273
  msgstr ""
4274
 
4275
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4276
+ #: app/views/admin/onboarding/update.php:115
4277
+ msgid "%1$sGutenberg Block Link Integration%2$s - You can now use your Pretty Links directly inside the Gutenberg Paragraph Block. All you have to do is select the \"Pretty Link\" button from your Paragraph Block's formatting bar then you can search and insert Pretty Links instantly!"
4278
  msgstr ""
4279
 
4280
+ #: app/views/admin/onboarding/update.php:123
4281
+ #: app/views/admin/onboarding/update.php:124
4282
+ msgid "Gutenberg Block Link Integration"
4283
  msgstr ""
4284
 
4285
+ #: app/views/admin/onboarding/update.php:133
4286
+ msgid "Tons of Fixes and Enhancements"
4287
  msgstr ""
4288
 
4289
+ #: app/views/admin/onboarding/update.php:135
4290
+ msgid "In addition to these streamlined, new features we’ve made hundreds of enhancements and numerous small fixes. Pretty Links Quick Wins is going to make your link experience easier, faster, more secure and more capable than ever before!"
4291
  msgstr ""
4292
 
4293
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4294
+ #: app/views/admin/onboarding/update.php:141
4295
+ msgid "We're excited for you to start winning more today with %1$sPretty Link Quick Wins!%2$s"
4296
  msgstr ""
4297
 
4298
+ #: app/views/options/form.php:3
4299
+ #: app/controllers/PrliAppController.php:125
4300
+ msgid "Options"
4301
  msgstr ""
4302
 
4303
+ #: app/views/options/form.php:4
4304
+ msgid "User Manual"
4305
  msgstr ""
4306
 
4307
+ #. translators: %1$s: open strong tag, %2$s: close strong tag
4308
+ #: app/views/options/form.php:17
4309
+ msgid "%1$sWordPress Must be Configured:%2$s Pretty Links won't work until you select a Permalink Structure other than 'Default'"
4310
  msgstr ""
4311
 
4312
+ #: app/views/options/form.php:22
4313
+ msgid "Permalink Settings"
4314
  msgstr ""
4315
 
4316
+ #: app/views/options/form.php:49
4317
+ msgid "General"
4318
  msgstr ""
4319
 
4320
+ #: app/views/options/form.php:52
4321
+ msgid "Reporting"
4322
  msgstr ""
4323
 
4324
+ #: app/views/options/form.php:53
4325
+ msgid "Replacements"
4326
  msgstr ""
4327
 
4328
+ #: app/views/options/form.php:54
4329
+ msgid "Auto-Create Links"
4330
  msgstr ""
4331
 
4332
+ #: app/views/options/form.php:56
4333
+ msgid "Social"
4334
  msgstr ""
4335
 
4336
+ #: app/views/options/form.php:57
4337
+ msgid "Public"
4338
  msgstr ""
4339
 
4340
+ #: app/views/options/form.php:64
4341
+ msgid "General Options"
4342
  msgstr ""
4343
 
4344
+ #: app/views/options/form.php:70
4345
+ msgid "Default Link Options"
4346
  msgstr ""
4347
 
4348
+ #: app/views/options/form.php:75
4349
+ msgid "Redirection"
4350
  msgstr ""
4351
 
4352
+ #: app/views/options/form.php:78
4353
+ msgid "Select the type of redirection you want your newly created links to have."
4354
  msgstr ""
4355
 
4356
+ #: app/views/options/form.php:95
4357
+ #: app/views/options/form.php:97
4358
+ msgid "Enable Tracking"
4359
  msgstr ""
4360
 
4361
+ #: app/views/options/form.php:98
4362
+ msgid "Default all new links to be tracked."
4363
  msgstr ""
4364
 
4365
+ #: app/views/options/form.php:107
4366
+ msgid "Enable No Follow"
4367
  msgstr ""
4368
 
4369
+ #: app/views/options/form.php:109
4370
+ msgid "Add No Follow"
4371
  msgstr ""
4372
 
4373
+ #: app/views/options/form.php:110
4374
+ msgid "Add the 'nofollow' attribute by default to new links."
4375
+ msgstr ""
4376
+
4377
+ #: app/views/options/form.php:119
4378
+ msgid "Enable Permalink Fix"
4379
  msgstr ""
4380
 
4381
+ #: app/views/options/form.php:121
4382
+ msgid "Use fix for index.php Permalink Structure"
4383
  msgstr ""
4384
 
4385
+ #: app/views/options/form.php:122
4386
+ msgid "This option should ONLY be checked if you have elements in your permalink structure that must be present in any link on your site. For example, some WordPress installs don't have the benefit of full rewrite capabilities and in this case you'd need an index.php included in each link (http://example.com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this is the case for you then check this option but the vast majority of users will want to keep this unchecked."
4387
  msgstr ""
4388
 
4389
+ #: app/views/options/form.php:180
4390
+ msgid "Enable %sQR Codes%s"
4391
  msgstr ""
4392
 
4393
+ #: app/views/options/form.php:220
4394
+ msgid "Reporting Options"
4395
  msgstr ""
4396
 
4397
+ #: app/views/options/form.php:225
4398
+ #: app/views/options/form.php:227
4399
+ msgid "Tracking Style"
4400
  msgstr ""
4401
 
4402
+ #: app/views/options/form.php:228
4403
+ msgid "Changing your tracking style can affect the accuracy of your existing statistics. Extended mode must be used for Conversion reporting."
4404
  msgstr ""
4405
 
4406
+ #: app/views/options/form.php:232
4407
+ msgid "Normal Tracking"
4408
  msgstr ""
4409
 
4410
+ #: app/views/options/form.php:233
4411
+ msgid "Extended Tracking (more stats / slower performance)"
4412
  msgstr ""
4413
 
4414
+ #: app/views/options/form.php:234
4415
+ msgid "Simple Click Count Tracking (less stats / faster performance)"
4416
  msgstr ""
4417
 
4418
+ #: app/views/options/form.php:240
4419
+ msgid "Excluded IP Addresses:"
4420
  msgstr ""
4421
 
4422
+ #: app/views/options/form.php:242
4423
+ msgid "Excluded IP Addresses"
4424
  msgstr ""
4425
 
4426
+ #: app/views/options/form.php:243
4427
+ msgid "Enter IP Addresses or IP Ranges you want to exclude from your Click data and Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*"
4428
  msgstr ""
4429
 
4430
+ #: app/views/options/form.php:246
4431
+ msgid "FYI, your current IP address is %s."
4432
  msgstr ""
4433
 
4434
+ #: app/views/options/form.php:257
4435
+ msgid "Auto-Trim Clicks"
4436
  msgstr ""
4437
 
4438
+ #: app/views/options/form.php:259
4439
+ msgid "Automatically Trim Clicks"
4440
  msgstr ""
4441
 
4442
+ #: app/views/options/form.php:260
4443
+ msgid "Will automatically delete all hits older than 90 days. We strongly recommend doing this to keep your database performance up. This will permanently delete this click data, and is not undo-able. "
4444
  msgstr ""
4445
 
4446
+ #: app/views/options/form.php:269
4447
+ #: app/views/options/form.php:271
4448
+ msgid "Filter Robots"
4449
  msgstr ""
4450
 
4451
+ #: app/views/options/form.php:272
4452
+ msgid "Filter known Robots and unidentifiable browser clients from your click data, stats and reports. Works best if Tracking Style above is set to 'Extended Tracking'."
4453
  msgstr ""
4454
 
4455
+ #: app/views/options/form.php:288
4456
+ #: app/views/options/form.php:290
4457
+ msgid "Whitelist IP Addresses"
4458
  msgstr ""
4459
 
4460
+ #: app/views/options/form.php:291
4461
+ msgid "Enter IP Addresses or IP Ranges you want to always include in your Click data and Stats even if they are flagged as robots. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*"
4462
  msgstr ""
4463
 
4464
+ #: app/views/options/form.php:556
4465
+ msgid "Post Shortlinks"
4466
  msgstr ""
4467
 
4468
+ #: app/views/options/form.php:559
4469
+ msgid "Create Pretty Links for Posts"
4470
  msgstr ""
4471
 
4472
+ #: app/views/options/form.php:560
4473
+ msgid "Automatically Create a Pretty Link for each of your published Posts"
4474
  msgstr ""
4475
 
4476
+ #: app/views/options/form.php:573
4477
+ msgid "Page Shortlinks"
4478
  msgstr ""
4479
 
4480
+ #: app/views/options/form.php:576
4481
+ msgid "Create Pretty Links for Pages"
4482
  msgstr ""
4483
 
4484
+ #: app/views/options/form.php:577
4485
+ msgid "Automatically Create a Pretty Link for each of your published Pages"
4486
  msgstr ""
4487
 
4488
+ #: app/views/groups/edit.php:10
4489
+ msgid "Edit Group"
4490
  msgstr ""
4491
 
4492
+ #: app/views/groups/edit.php:23
4493
+ #: app/views/groups/new.php:24
4494
+ msgid "This is how you'll identify your Group."
4495
  msgstr ""
4496
 
4497
+ #: app/views/groups/edit.php:26
4498
+ #: app/views/groups/new.php:27
4499
+ msgid "Description:"
4500
  msgstr ""
4501
 
4502
+ #: app/views/groups/edit.php:28
4503
+ #: app/views/groups/new.php:29
4504
+ msgid "A Description of this group."
4505
  msgstr ""
4506
 
4507
+ #: app/views/groups/edit.php:31
4508
+ #: app/views/groups/new.php:32
4509
+ msgid "Links:"
4510
  msgstr ""
4511
 
4512
+ #: app/views/groups/edit.php:37
4513
+ #: app/views/groups/new.php:38
4514
+ msgid "Current Group"
4515
  msgstr ""
4516
 
4517
+ #. translators: %1$s: open strong tag, %2$s close strong tag
4518
+ #: app/views/groups/edit.php:61
4519
+ #: app/views/groups/new.php:60
4520
+ msgid "Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s"
4521
  msgstr ""
4522
 
4523
+ #: app/views/groups/list.php:6
4524
+ msgid "Groups"
4525
  msgstr ""
4526
 
4527
+ #: app/views/groups/list.php:7
4528
+ msgid "Add Group"
4529
  msgstr ""
4530
 
4531
+ #: app/views/groups/list.php:62
4532
+ msgid "No Pretty Link Groups were found"
4533
  msgstr ""
4534
 
4535
+ #: app/views/groups/list.php:79
4536
+ msgid "Are you sure you want to delete your %s Pretty Link Group?"
4537
  msgstr ""
4538
 
4539
+ #: app/views/groups/list.php:80
4540
+ #: app/views/groups/list.php:84
4541
+ msgid "View links in %s"
4542
  msgstr ""
4543
 
4544
+ #: app/views/groups/list.php:81
4545
+ msgid "View hits in %s"
4546
  msgstr ""
4547
 
4548
+ #: app/views/groups/new.php:10
4549
+ msgid "New Group"
4550
  msgstr ""
4551
 
4552
+ #: app/views/tools/form.php:3
4553
+ #: app/controllers/PrliAppController.php:122
4554
+ msgid "Tools"
4555
  msgstr ""
4556
 
4557
+ #: app/views/tools/form.php:18
4558
+ #: app/views/tools/form.php:25
4559
+ msgid "Bookmarklet"
4560
  msgstr ""
4561
 
4562
+ #: app/views/tools/form.php:19
4563
+ #: app/views/tools/form.php:70
4564
+ msgid "Trim Clicks"
4565
  msgstr ""
4566
 
4567
+ #: app/views/tools/form.php:28
4568
+ msgid "Install Pretty Link Bookmarklet"
4569
  msgstr ""
4570
 
4571
+ #. translators: %1$s: open link tag, %2$s close link tag
4572
+ #: app/views/tools/form.php:31
4573
+ msgid "Just drag this \"Get PrettyLink\" link to your toolbar to install the bookmarklet. As you browse the web, you can just click this bookmarklet to create a pretty link from the current url you're looking at. %1$s(more help)%2$s"
4574
  msgstr ""
4575
 
4576
+ #: app/views/tools/form.php:36
4577
+ msgid "Show iPhone Bookmarklet Instructions"
4578
  msgstr ""
4579
 
4580
+ #. translators: %1$s: open strong tag, %2$s close strong tag
4581
+ #: app/views/tools/form.php:43
4582
+ msgid "%1$sNote:%2$s iPhone users can install this bookmarklet in their Safari to create Pretty Links with the following steps:"
4583
  msgstr ""
4584
 
4585
+ #: app/views/tools/form.php:49
4586
+ msgid "Copy this text:"
4587
  msgstr ""
4588
 
4589
+ #: app/views/tools/form.php:50
4590
+ msgid "Tap the + button at the bottom of the screen"
4591
  msgstr ""
4592
 
4593
+ #: app/views/tools/form.php:51
4594
+ msgid "Choose to share the page, then click on \"Bookmark\". We recommend saving it in your Favorites folder. Rename your bookmark to \"Get PrettyLink\" (or whatever you want) and then \"Save\""
4595
  msgstr ""
4596
 
4597
+ #: app/views/tools/form.php:52
4598
+ msgid "Navigate through your Bookmarks until you find the new bookmark and click \"Edit\""
4599
  msgstr ""
4600
 
4601
+ #: app/views/tools/form.php:53
4602
+ msgid "Delete all the text from the address"
4603
  msgstr ""
4604
 
4605
+ #: app/views/tools/form.php:54
4606
+ msgid "Paste the text you copied in Step 1 into the address field"
4607
  msgstr ""
4608
 
4609
+ #. translators: %1$s: open strong tag, %2$s close strong tag
4610
+ #: app/views/tools/form.php:59
4611
+ msgid "To save the changes hit \"Bookmarks\" and %1$syou're done!%2$s"
4612
  msgstr ""
4613
 
4614
+ #: app/views/tools/form.php:64
4615
+ msgid "Now when you find a page you want to save off as a Pretty Link, just click the \"Bookmarks\" icon at the bottom of the screen and select your \"Get PrettyLink\" bookmarklet."
4616
  msgstr ""
4617
 
4618
+ #: app/views/tools/form.php:72
4619
+ msgid "Pretty Link is already automatically trimming Clicks older than 90 days. Although not necessary, you can still use the buttons below to force click trimming."
4620
  msgstr ""
4621
 
4622
+ #: app/views/tools/form.php:75
4623
+ msgid "***WARNING*** If you click OK you will delete ALL of the Click data that is older than 30 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!"
4624
  msgstr ""
4625
 
4626
+ #: app/views/tools/form.php:75
4627
+ msgid "Delete Clicks older than 30 days"
4628
  msgstr ""
4629
 
4630
+ #: app/views/tools/form.php:77
4631
+ msgid "Clear clicks 30 days or older"
4632
  msgstr ""
4633
 
4634
+ #: app/views/tools/form.php:78
4635
+ msgid "This will clear all clicks in your database that are older than 30 days."
4636
  msgstr ""
4637
 
4638
+ #: app/views/tools/form.php:80
4639
+ msgid "***WARNING*** If you click OK you will delete ALL of the Click data that is older than 90 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!"
4640
  msgstr ""
4641
 
4642
+ #: app/views/tools/form.php:80
4643
+ msgid "Delete Clicks older than 90 days"
4644
  msgstr ""
4645
 
4646
+ #: app/views/tools/form.php:82
4647
+ msgid "Clear clicks 90 days or older"
4648
  msgstr ""
4649
 
4650
+ #: app/views/tools/form.php:83
4651
+ msgid "This will clear all clicks in your database that are older than 90 days."
4652
  msgstr ""
4653
 
4654
+ #: app/views/tools/form.php:87
4655
+ msgid "***WARNING*** If you click OK you will delete ALL of the Click data in your Database. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete all your data because there is no going back!"
4656
  msgstr ""
4657
 
4658
+ #: app/views/tools/form.php:87
4659
+ msgid "Delete All Clicks"
4660
  msgstr ""
4661
 
4662
+ #: app/views/tools/form.php:89
4663
+ msgid "Clear all clicks"
4664
  msgstr ""
4665
 
4666
+ #: app/views/tools/form.php:90
4667
+ msgid "Seriously, only click this link if you want to delete all the Click data in your database."
4668
  msgstr ""
4669
 
4670
+ #: app/views/clicks/list.php:6
4671
+ #: app/views/clicks/csv_download.php:4
4672
+ msgid "For %s"
4673
  msgstr ""
4674
 
4675
+ #: app/views/clicks/list.php:21
4676
+ msgid "Back to Clicks"
4677
  msgstr ""
4678
 
4679
+ #: app/views/clicks/list.php:30
4680
+ msgid "Type:"
4681
  msgstr ""
4682
 
4683
+ #: app/views/clicks/list.php:39
4684
+ msgid "to"
4685
  msgstr ""
4686
 
4687
+ #: app/views/clicks/list.php:62
4688
+ msgid "Search Clicks"
4689
  msgstr ""
4690
 
4691
+ #: app/views/clicks/list.php:73
4692
+ #: app/views/clicks/list.php:171
4693
+ msgid "Browser"
4694
  msgstr ""
4695
 
4696
+ #: app/views/clicks/list.php:75
4697
+ #: app/views/clicks/list.php:172
4698
+ msgid "OS"
4699
  msgstr ""
4700
 
4701
+ #: app/views/clicks/list.php:79
4702
+ #: app/views/clicks/list.php:174
4703
+ msgid "IP"
4704
  msgstr ""
4705
 
4706
+ #: app/views/clicks/list.php:83
4707
+ #: app/views/clicks/list.php:176
4708
+ msgid "Visitor"
4709
  msgstr ""
4710
 
4711
+ #: app/views/clicks/list.php:87
4712
+ #: app/views/clicks/list.php:178
4713
+ msgid "Timestamp"
4714
  msgstr ""
4715
 
4716
+ #: app/views/clicks/list.php:91
4717
+ #: app/views/clicks/list.php:180
4718
+ msgid "Host"
4719
  msgstr ""
4720
 
4721
+ #: app/views/clicks/list.php:95
4722
+ #: app/views/clicks/list.php:182
4723
+ msgid "URI"
4724
  msgstr ""
4725
 
4726
+ #: app/views/clicks/list.php:98
4727
+ #: app/views/clicks/list.php:183
4728
+ msgid "Referrer"
4729
  msgstr ""
4730
 
4731
+ #: app/views/clicks/list.php:111
4732
+ msgid "No Clicks have been recorded yet"
4733
  msgstr ""
4734
 
4735
+ #: app/views/clicks/list.php:147
4736
+ msgid "View All Activity for IP Address: %s"
4737
  msgstr ""
4738
 
4739
+ #: app/views/clicks/list.php:150
4740
+ msgid "View All Activity for Visitor: %s"
4741
  msgstr ""
4742
 
4743
+ #: app/views/clicks/list.php:190
4744
+ msgid "Download CSV"
4745
  msgstr ""
4746
 
4747
+ #: app/views/clicks/csv_download.php:3
4748
+ msgid "Download Clicks"
4749
  msgstr ""
4750
 
4751
+ #: app/views/clicks/csv_download.php:6
4752
+ msgid "Click Reports:"
4753
  msgstr ""
4754
 
4755
+ #: app/views/clicks/csv_download.php:7
4756
+ msgid "All clicks on %s"
4757
  msgstr ""
4758
 
4759
+ #: app/views/clicks/csv_download.php:24
4760
+ msgid "Clicks %d-%d (%d Records)"
4761
  msgstr ""
4762
 
4763
+ #: app/controllers/PrliUpdateController.php:72
4764
+ msgid "Why you creepin'?"
4765
  msgstr ""
4766
 
4767
+ #: app/controllers/PrliUpdateController.php:305
4768
+ msgid "Check for Update"
4769
  msgstr ""
4770
 
4771
+ #: app/controllers/PrliUpdateController.php:374
4772
+ msgid "You had an HTTP error connecting to Caseproof's Mothership API"
4773
  msgstr ""
4774
 
4775
+ #: app/controllers/PrliUpdateController.php:386
4776
+ msgid "Your License Key was invalid"
4777
  msgstr ""
4778
 
4779
+ #: app/controllers/PrliUpdateController.php:412
4780
+ msgid "You do not have access."
4781
  msgstr ""
4782
 
4783
+ #: app/controllers/PrliUpdateController.php:416
4784
+ msgid "Edge updates couldn't be updated."
4785
  msgstr ""
4786
 
4787
+ #: app/controllers/PrliToolsController.php:94
4788
+ msgid "Click Database was Cleared."
4789
  msgstr ""
4790
 
4791
+ #: app/controllers/PrliToolsController.php:100
4792
+ msgid "Clicks older than %1$d days (%2$d Clicks) were deleted"
4793
  msgstr ""
4794
 
4795
+ #: app/controllers/PrliToolsController.php:103
4796
+ msgid "No clicks older than %1$d days were found, so nothing was deleted"
4797
  msgstr ""
4798
 
4799
+ #: app/controllers/PrliClicksController.php:89
4800
+ msgid "IP Address: "
4801
  msgstr ""
4802
 
4803
+ #: app/controllers/PrliClicksController.php:94
4804
+ msgid "Visitor: "
4805
  msgstr ""
4806
 
4807
+ #: app/controllers/PrliClicksController.php:99
4808
+ msgid "All Links"
4809
  msgstr ""
4810
 
4811
+ #: app/controllers/PrliXmlRpcController.php:36
4812
+ #: app/controllers/PrliXmlRpcController.php:98
4813
+ #: app/controllers/PrliXmlRpcController.php:145
4814
+ #: app/controllers/PrliXmlRpcController.php:200
4815
+ #: app/controllers/PrliXmlRpcController.php:229
4816
+ #: app/controllers/PrliXmlRpcController.php:257
4817
+ #: app/controllers/PrliXmlRpcController.php:290
4818
+ #: app/controllers/PrliXmlRpcController.php:322
4819
+ msgid "Sorry, XML-RPC Not enabled for this website"
4820
  msgstr ""
4821
 
4822
+ #: app/controllers/PrliXmlRpcController.php:39
4823
+ #: app/controllers/PrliXmlRpcController.php:101
4824
+ #: app/controllers/PrliXmlRpcController.php:148
4825
+ #: app/controllers/PrliXmlRpcController.php:203
4826
+ #: app/controllers/PrliXmlRpcController.php:232
4827
+ #: app/controllers/PrliXmlRpcController.php:260
4828
+ #: app/controllers/PrliXmlRpcController.php:293
4829
+ #: app/controllers/PrliXmlRpcController.php:325
4830
+ msgid "Sorry, Login failed"
4831
  msgstr ""
4832
 
4833
+ #: app/controllers/PrliXmlRpcController.php:45
4834
+ #: app/controllers/PrliXmlRpcController.php:107
4835
+ #: app/controllers/PrliXmlRpcController.php:154
4836
+ #: app/controllers/PrliXmlRpcController.php:209
4837
+ #: app/controllers/PrliXmlRpcController.php:238
4838
+ #: app/controllers/PrliXmlRpcController.php:266
4839
+ #: app/controllers/PrliXmlRpcController.php:299
4840
+ #: app/controllers/PrliXmlRpcController.php:331
4841
+ msgid "Sorry, you must be an administrator to access this resource"
4842
  msgstr ""
4843
 
4844
+ #: app/controllers/PrliXmlRpcController.php:111
4845
+ msgid "You must provide a target URL"
4846
  msgstr ""
4847
 
4848
+ #: app/controllers/PrliXmlRpcController.php:137
4849
+ #: app/controllers/PrliXmlRpcController.php:185
4850
+ msgid "There was an error creating your Pretty Link"
4851
  msgstr ""
4852
 
4853
+ #: app/controllers/PrliXmlRpcController.php:158
4854
+ msgid "You must provide the id of the link you want to update"
4855
  msgstr ""
4856
 
4857
+ #: app/controllers/PrliXmlRpcController.php:214
4858
+ msgid "There was an error fetching the Pretty Link Groups"
4859
  msgstr ""
4860
 
4861
+ #: app/controllers/PrliXmlRpcController.php:243
4862
+ msgid "There was an error fetching the Pretty Links"
4863
  msgstr ""
4864
 
4865
+ #: app/controllers/PrliXmlRpcController.php:269
4866
+ msgid "Sorry, you must provide a slug to lookup"
4867
  msgstr ""
4868
 
4869
+ #: app/controllers/PrliXmlRpcController.php:276
4870
+ #: app/controllers/PrliXmlRpcController.php:309
4871
+ msgid "There was an error fetching your Pretty Link"
4872
  msgstr ""
4873
 
4874
+ #: app/controllers/PrliXmlRpcController.php:302
4875
+ #: app/controllers/PrliXmlRpcController.php:334
4876
+ msgid "Sorry, you must provide an id to lookup"
4877
  msgstr ""
4878
 
4879
+ #: app/controllers/PrliXmlRpcController.php:341
4880
+ msgid "There was an error fetching your Pretty Link URL"
4881
  msgstr ""
4882
 
4883
+ #: app/controllers/PrliOptionsController.php:61
4884
+ msgid "Options saved."
4885
  msgstr ""
4886
 
4887
+ #: app/controllers/PrliOptionsController.php:75
4888
+ msgid "Excluded IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges."
4889
  msgstr ""
4890
 
4891
+ #: app/controllers/PrliOptionsController.php:79
4892
+ msgid "Whitelist IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges."
4893
  msgstr ""
4894
 
4895
+ #: app/controllers/PrliPopupController.php:63
4896
+ msgid "An unknown error occurred."
4897
  msgstr ""
4898
 
4899
+ #: app/controllers/PrliPopupController.php:93
4900
+ #: app/controllers/PrliLinksController.php:338
4901
+ #: app/controllers/PrliLinksController.php:550
4902
+ msgid "Forbidden"
4903
  msgstr ""
4904
 
4905
+ #: app/controllers/PrliPopupController.php:97
4906
+ msgid "Must specify a popup"
4907
  msgstr ""
4908
 
4909
+ #: app/controllers/PrliPopupController.php:103
4910
+ msgid "Invalid popup"
4911
  msgstr ""
4912
 
4913
+ #: app/controllers/PrliPopupController.php:108
4914
+ msgid "The popup was successfully delayed"
4915
  msgstr ""
4916
 
4917
+ #: app/controllers/PrliPopupController.php:112
4918
+ msgid "The popup was successfully stopped"
4919
  msgstr ""
4920
 
4921
+ #: app/controllers/PrliLocalApiController.php:100
4922
+ #: app/controllers/PrliLocalApiController.php:159
4923
+ msgid "An error prevented your Pretty Link from being created"
4924
  msgstr ""
4925
 
4926
+ #: app/controllers/PrliLocalApiController.php:124
4927
+ msgid "Pretty Link ID must be set for successful update."
4928
  msgstr ""
4929
 
4930
+ #: app/controllers/PrliLinksController.php:45
4931
+ msgid "Add New Pretty Link"
4932
  msgstr ""
4933
 
4934
+ #: app/controllers/PrliLinksController.php:46
4935
+ msgid "Edit Pretty Link"
4936
  msgstr ""
4937
 
4938
+ #: app/controllers/PrliLinksController.php:47
4939
+ #: js/editor/components/link-editor/index.js:324
4940
+ #: js/editor.js:12
4941
+ msgid "New Pretty Link"
4942
  msgstr ""
4943
 
4944
+ #: app/controllers/PrliLinksController.php:48
4945
+ msgid "View Pretty Link"
4946
  msgstr ""
4947
 
4948
+ #: app/controllers/PrliLinksController.php:49
4949
+ msgid "Search Pretty Links"
4950
  msgstr ""
4951
 
4952
+ #: app/controllers/PrliLinksController.php:50
4953
+ msgid "No Pretty Links found"
4954
  msgstr ""
4955
 
4956
+ #: app/controllers/PrliLinksController.php:51
4957
+ msgid "No Pretty Links found in Trash"
4958
  msgstr ""
4959
 
4960
+ #: app/controllers/PrliLinksController.php:52
4961
+ msgid "Parent Pretty Link:"
4962
  msgstr ""
4963
 
4964
+ #: app/controllers/PrliLinksController.php:97
4965
+ msgid "Pretty Link Settings"
4966
  msgstr ""
4967
 
4968
+ #: app/controllers/PrliLinksController.php:326
4969
+ msgid "Pretty Link Cleanup Visitor Locks"
4970
  msgstr ""
4971
 
4972
+ #: app/controllers/PrliLinksController.php:346
4973
+ msgid "Success!"
4974
  msgstr ""
4975
 
4976
+ #: app/controllers/PrliLinksController.php:348
4977
+ msgid "Fix the following errors:"
4978
  msgstr ""
4979
 
4980
+ #: app/controllers/PrliLinksController.php:384
4981
+ msgid "Upgrade to a Pretty Links premium plan to get Link Categories"
4982
  msgstr ""
4983
 
4984
+ #: app/controllers/PrliLinksController.php:390
4985
+ msgid "Upgrade to a Pretty Links premium plan to get Link Tags"
4986
  msgstr ""
4987
 
4988
+ #: app/controllers/PrliLinksController.php:396
4989
+ msgid "Upgrade to a Pretty Links premium plan to get Keyword Replacements"
4990
  msgstr ""
4991
 
4992
+ #: app/controllers/PrliLinksController.php:402
4993
+ msgid "Settings"
4994
  msgstr ""
4995
 
4996
+ #: app/controllers/PrliLinksController.php:403
4997
+ msgid "Link Title"
4998
  msgstr ""
4999
 
5000
+ #: app/controllers/PrliLinksController.php:505
5001
+ msgid "Tweet"
5002
  msgstr ""
5003
 
5004
+ #: app/controllers/PrliLinksController.php:507
5005
+ msgid "Target &raquo;"
5006
  msgstr ""
5007
 
5008
+ #: app/controllers/PrliLinksController.php:508
5009
+ msgid "Pretty Link &raquo;"
5010
  msgstr ""
5011
 
5012
+ #: app/controllers/PrliLinksController.php:530
5013
+ #: app/controllers/PrliLinksController.php:531
5014
+ msgid "View Split Test Report"
5015
  msgstr ""
5016
 
5017
+ #: app/controllers/PrliLinksController.php:556
5018
+ msgid "Your Pretty Link was Successfully Reset"
5019
  msgstr ""
5020
 
5021
+ #: app/controllers/PrliLinksController.php:564
5022
+ msgid "Bad request"
5023
  msgstr ""
5024
 
5025
+ #: app/controllers/PrliLinksController.php:568
5026
+ msgid "Insufficient permissions"
5027
  msgstr ""
5028
 
5029
+ #: app/controllers/PrliLinksController.php:597
5030
+ msgid "An error occurred creating the link"
5031
  msgstr ""
5032
 
5033
+ #: app/controllers/PrliLinksController.php:629
5034
+ msgid "All Groups (Legacy)"
5035
  msgstr ""
5036
 
5037
+ #: app/controllers/PrliAppController.php:84
5038
+ msgid "Link Categories [Pro Only]"
5039
  msgstr ""
5040
 
5041
+ #: app/controllers/PrliAppController.php:85
5042
+ msgid "Categories [Pro]"
5043
  msgstr ""
5044
 
5045
+ #: app/controllers/PrliAppController.php:92
5046
+ msgid "Link Tags [Pro Only]"
5047
  msgstr ""
5048
 
5049
+ #: app/controllers/PrliAppController.php:93
5050
+ msgid "Tags [Pro]"
5051
  msgstr ""
5052
 
5053
+ #: app/controllers/PrliAppController.php:100
5054
+ msgid "Link Reports [Pro Only]"
5055
  msgstr ""
5056
 
5057
+ #: app/controllers/PrliAppController.php:101
5058
+ msgid "Reports [Pro]"
5059
  msgstr ""
5060
 
5061
+ #: app/controllers/PrliAppController.php:108
5062
+ msgid "Import / Export [Pro Only]"
5063
  msgstr ""
5064
 
5065
+ #: app/controllers/PrliAppController.php:109
5066
+ msgid "Import / Export [Pro]"
5067
  msgstr ""
5068
 
5069
+ #: app/controllers/PrliAppController.php:118
5070
+ msgid "Pretty Links | Clicks"
5071
  msgstr ""
5072
 
5073
+ #: app/controllers/PrliAppController.php:122
5074
+ msgid "Pretty Links | Tools"
5075
  msgstr ""
5076
 
5077
+ #: app/controllers/PrliAppController.php:125
5078
+ msgid "Pretty Links | Options"
5079
  msgstr ""
5080
 
5081
+ #: app/controllers/PrliAppController.php:129
5082
+ #: app/controllers/PrliAppController.php:132
5083
+ #: app/controllers/PrliAppController.php:268
5084
+ msgid "Activate"
5085
  msgstr ""
5086
 
5087
+ #: app/controllers/PrliAppController.php:135
5088
+ msgid "Upgrade"
5089
  msgstr ""
5090
 
5091
+ #: app/controllers/PrliAppController.php:140
5092
+ msgid "Welcome"
5093
  msgstr ""
5094
 
5095
+ #: app/controllers/PrliAppController.php:141
5096
+ msgid "What's New"
5097
  msgstr ""
5098
 
5099
+ #: app/controllers/PrliAppController.php:267
5100
+ #: app/controllers/PrliAppController.php:273
5101
+ #: app/controllers/PrliAppController.php:278
5102
+ msgid "Docs"
5103
  msgstr ""
5104
 
5105
+ #: app/controllers/PrliAppController.php:271
5106
+ #: app/controllers/PrliAppController.php:277
5107
+ msgid "Activate Pro License"
5108
  msgstr ""
5109
 
5110
+ #: app/controllers/PrliAppController.php:272
5111
+ msgid "Buy"
5112
  msgstr ""
5113
 
5114
+ #: app/controllers/PrliAppController.php:397
5115
+ msgid "Are you sure you want to reset your Pretty Link? This will delete all of the statistical data about this Pretty Link in your database."
5116
  msgstr ""
5117
 
5118
+ #. translators: %1$s: br tag, %2$s: open link tag, %3$s: close link tag
5119
+ #: app/controllers/PrliAppController.php:483
5120
+ msgid "You're almost done!%1$s%2$sFinish your Re-Install of Pretty Links Pro%3$s"
5121
  msgstr ""
5122
 
5123
+ #: app/controllers/PrliAppController.php:498
5124
+ msgid "Pretty Links Pro Successfully Uninstalled."
5125
  msgstr ""
5126
 
5127
+ #: app/controllers/PrliAppController.php:547
5128
+ msgid "Invalid server response"
5129
  msgstr ""
5130
 
5131
+ #: app/controllers/PrliAppController.php:548
5132
+ msgid "Ajax error"
5133
  msgstr ""
5134
 
5135
+ #: app/controllers/PrliAppController.php:565
5136
+ msgid "Pretty Link Quick Add"
5137
  msgstr ""
5138
 
5139
+ #: app/controllers/PrliAppController.php:604
5140
+ msgid "Your Pretty Links Pro installation isn't quite complete yet. %1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
 
5141
  msgstr ""
5142
 
5143
+ #: app/controllers/PrliAppController.php:625
5144
+ msgid "Your Pretty Links Pro installation isn't quite complete yet.<br/>%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
5145
  msgstr ""
5146
 
5147
+ #. translators: $1$s - Pretty Links plugin name; $2$s - WP.org review link; $3$s - WP.org review link.
5148
+ #: app/controllers/PrliAppController.php:672
5149
+ msgid "Enjoying %1$s? Please rate <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href=\"%3$s\" target=\"_blank\" rel=\"noopener\">WordPress.org</a> to help us spread the word. Thanks from the Pretty Links team!"
5150
  msgstr ""
images/dark_add_twitter_account.png DELETED
Binary file
images/pbar_grad.png DELETED
Binary file
images/pl-logo-horiz-RGB.png DELETED
Binary file
images/pretty-links-logo-color-white.svg ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ viewBox="0 0 240 39" style="enable-background:new 0 0 240 39;" xml:space="preserve">
6
+ <style type="text/css">
7
+ .st0{fill:#4FD6F6;}
8
+ .st1{fill:#9AE8FA;}
9
+ .st2{fill:#03C5F2;}
10
+ .st3{fill:url(#SVGID_1_);}
11
+ .st4{fill:#FFFFFF;}
12
+ </style>
13
+ <g>
14
+ <path class="st0" d="M36.5,14.3c-0.8-0.8-1.2-1.9-1.2-3C28.9,11,22.5,11.2,15.7,12c-0.5,0.1-0.9,0.4-1,0.7
15
+ c-0.1,0.4,0.3,0.6,0.4,0.6c2.9,1.3,4.4,2,7.1,3.6c0.2,0.1,0.5,0.2,0.8,0.2c1.4-0.1,2.7-0.2,4-0.2c4.2-0.1,8.4,0,12.4,0.5L36.5,14.3
16
+ z"/>
17
+ <path class="st1" d="M43.2,21.3L42,20.1c-4.5-0.7-9.1-1-13.7-0.9c0,0,0,0,0,0c-0.4,0-0.8,0.2-0.9,0.5c-0.1,0.3,0.1,0.6,0.3,0.7
18
+ c2.4,1.7,3.6,2.6,5.9,4.5c0.2,0.1,0.3,0.2,0.5,0.2c2.7,0.2,4.9,0.3,6.9,0.7L43.2,21.3z"/>
19
+ <path class="st2" d="M39.5,7c0.2,0,0.5,0,0.7,0l9.8,1.2l1.5-3C34.3,1.8,18.2,2.4,1.1,7C0.5,7.2,0,7.6,0,8c0,0.3,0.4,0.4,0.5,0.5
20
+ c3.3,0.8,5,1.3,8.1,2.4c0.3,0.1,0.6,0.1,1,0c5.9-1.1,11.4-1.7,17-1.9c3.1-0.1,6.2,0,9.3,0.2C36.7,7.9,38,7.1,39.5,7z"/>
21
+
22
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="33.6324" y1="17.0546" x2="70.2706" y2="17.0546" gradientTransform="matrix(0.9992 -3.984763e-02 3.984763e-02 0.9992 3.8206 4.7075)">
23
+ <stop offset="0" style="stop-color:#FF8C00"/>
24
+ <stop offset="0.7" style="stop-color:#FFD200"/>
25
+ </linearGradient>
26
+ <path class="st3" d="M74.5,15c-0.2-0.8-0.8-1.4-1.6-1.5l-11.4-1.4L59.7,1.9c-0.1-0.8-0.8-1.4-1.6-1.5c-0.8-0.1-1.6,0.3-2,1
27
+ l-4.8,9.5L39.9,9.5c-0.8-0.1-1.6,0.3-1.9,1c-0.4,0.7-0.2,1.6,0.3,2.1l7.9,8.2l-5.8,11.8l0,0l0,0c0,0,0,0.1-0.1,0.1
28
+ c0,0,0,0.1-0.1,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1
29
+ c0,0,0,0.1,0,0.1c0,0.1,0,0.1,0,0.2c0,0,0,0.1,0.1,0.1c0,0.1,0,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1
30
+ c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,0.2,0.1,0.2,0.2c0,0,0.1,0,0.1,0c0.1,0,0.1,0.1,0.2,0.1
31
+ c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0
32
+ c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.2-0.1c0,0,0,0,0.1,0c0.1,0,0.2-0.1,0.3-0.1l10.8-6.4l8.8,9.4
33
+ c0.3,0.3,0.7,0.5,1.1,0.6c0.4,0,0.7,0,1.1-0.2c0.7-0.4,1.2-1.2,1-2l-2.4-13.4l10.2-6C74.3,16.6,74.7,15.8,74.5,15z"/>
34
+ </g>
35
+ <g>
36
+ <path class="st4" d="M129.6,22.8c0.7,0,1.2-0.5,1.2-1.2c0-5.5-3.5-8.1-7.9-8.1c-4.8,0-8.2,3.4-8.2,8.2c0,5,3.4,8.2,8.3,8.2
37
+ c2.3,0,4.9-0.8,6.5-2.4c0.2-0.2,0.3-0.5,0.3-0.8c0-0.6-0.5-1.2-1.2-1.2c-0.3,0-0.6,0.1-0.8,0.4c-1.1,1.1-3.1,1.7-4.7,1.7
38
+ c-3,0-5.4-1.8-5.7-4.7L129.6,22.8z M117.3,20.6c0.4-3,2.8-4.7,5.6-4.7c3.1,0,5.2,1.6,5.3,4.7L117.3,20.6z"/>
39
+ <path class="st4" d="M91.7,13.6c-2.3,0-4.7,0.9-5.8,3l0-1.7c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3c0,0,0,20.2,0,21
40
+ c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3c0-0.7,0-9.1,0-9.1c1.1,2.1,3.7,3.1,5.9,3.1c4.5,0,8-2.8,8-8.2
41
+ C99.8,16.6,96.2,13.6,91.7,13.6z M91.6,27.5c-3.1,0-5.6-2.3-5.6-5.7c0-3.4,2.4-5.7,5.6-5.7c3.1,0,5.6,2.1,5.6,5.7
42
+ C97.1,25.5,94.6,27.5,91.6,27.5z"/>
43
+ <path class="st4" d="M112.9,14.2c-0.9-0.4-1.8-0.6-2.8-0.6c-1.9,0-3.9,0.7-4.9,2.4v-1.1c0-0.7-0.6-1.3-1.3-1.3
44
+ c-0.7,0-1.3,0.6-1.3,1.3c0,0,0,13.1,0,13.8c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3c0-0.7,0-7.8,0-7.8c0-3,1.7-4.7,4.7-4.7
45
+ c0.7,0,1.3,0.1,1.9,0.4c0.2,0.1,0.3,0.1,0.5,0.1c0.7,0,1.3-0.6,1.3-1.3C113.6,14.9,113.3,14.4,112.9,14.2z"/>
46
+ <path class="st4" d="M233.2,20.4c-2-0.2-3.9-0.6-4-2.2c0-1.7,1.7-2.6,3.9-2.5c1,0,2.7,0.2,3.5,0.7l0.7,0.3l0,0
47
+ c0.2,0.1,0.3,0.1,0.5,0.1c0.7,0,1.2-0.5,1.2-1.2c0-0.5-0.3-0.9-0.8-1.1c-0.2-0.1-0.5-0.2-0.7-0.3c-1.4-0.5-3-0.7-4.5-0.7
48
+ c-3,0-6.5,1.4-6.4,4.8c0,3.3,3.3,4.1,6.3,4.5c2.5,0.3,4.4,0.8,4.4,2.5c-0.1,2.1-2.6,2.4-4.1,2.4c-1.4,0-2.9-0.3-4.2-1l0,0
49
+ c-0.2-0.1-0.4-0.1-0.6-0.1c-0.7,0-1.3,0.6-1.3,1.3c0,0.5,0.3,0.9,0.7,1.1l0,0c0,0,0,0,0,0c0,0,0,0,0,0c1.6,0.8,3.2,1.1,5.2,1.1
50
+ c3.6,0,6.7-1.5,6.7-4.8C240.1,21.4,236.1,20.8,233.2,20.4z"/>
51
+ <path class="st4" d="M142.7,28.5c0-0.6-0.5-1.2-1.2-1.2c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c-0.3,0.1-0.7,0.1-1,0.1
52
+ c-1.9,0-2.5-1.2-2.5-3v-8.3l3,0c0.6,0,1.1-0.5,1.1-1.1c0-0.6-0.5-1.1-1.1-1.1l-2.9,0l0-3.3c0-0.7-0.6-1.3-1.3-1.3s-1.3,0.6-1.3,1.3
53
+ V14l-2,0c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1l2,0v8.3c0,3.5,1.6,5.5,5,5.4c0.6,0,1.1-0.1,1.6-0.2c0,0,0,0,0,0
54
+ c0,0,0.1,0,0.1,0C142.4,29.5,142.7,29.1,142.7,28.5z"/>
55
+ <path class="st4" d="M154.3,28.5c0-0.6-0.5-1.2-1.2-1.2c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c-0.3,0.1-0.7,0.1-1,0.1
56
+ c-1.9,0-2.5-1.2-2.5-3v-8.3l3.5,0c0.6,0,1.1-0.5,1.1-1.1c0-0.6-0.5-1.1-1.1-1.1l-3.4,0l0-3.3c0-0.7-0.6-1.3-1.3-1.3
57
+ c-0.7,0-1.3,0.6-1.3,1.3V14l-2,0c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1l2,0v8.3c0,3.5,1.6,5.5,5,5.4c0.6,0,1.1-0.1,1.6-0.2
58
+ c0,0,0,0,0,0c0,0,0.1,0,0.1,0C154,29.5,154.3,29.1,154.3,28.5z"/>
59
+ <path class="st4" d="M171.2,14.9c0-0.7-0.6-1.3-1.3-1.3c-0.6,0-1.1,0.4-1.3,0.9l-4.7,12.2l-5.1-12.3l0,0c-0.2-0.5-0.7-0.8-1.2-0.8
60
+ c-0.7,0-1.3,0.6-1.3,1.3c0,0.2,0,0.4,0.1,0.5l0,0l6,14.1l-1.5,3.8c-0.8,1.7-2.1,1.6-3.5,1c0,0,0,0,0,0c-0.2-0.1-0.3-0.1-0.5-0.1
61
+ c-0.7,0-1.2,0.5-1.2,1.2c0,0.5,0.3,0.9,0.7,1.1l0,0c2.9,1.4,5.6,0.9,7-2.4l7.7-18.7C171.2,15.3,171.2,15.1,171.2,14.9z"/>
62
+ <path class="st4" d="M202.1,13.7c-2.1,0-3.8,0.7-5.3,2.7l0-1.2c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3v13.5
63
+ c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3l0-7.5c0-3.1,2.1-5.1,5-5.1c3.2,0,4.5,1.5,4.5,4.9c0,0,0,7.6,0,7.6
64
+ c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3V21C209,16.3,206.7,13.7,202.1,13.7z"/>
65
+ <path class="st4" d="M219,20.5l5.5-4.6c0.2-0.2,0.4-0.5,0.4-0.8c0-0.6-0.5-1.1-1.1-1.1c-0.3,0-0.6,0.1-0.8,0.3l-7.7,6.7l0-12.2
66
+ c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3l0,20c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3l0-5.1l1.8-1.4l5.4,7.4
67
+ c0.2,0.3,0.6,0.5,1,0.5c0.7,0,1.3-0.6,1.3-1.3c0-0.3-0.1-0.6-0.3-0.8L219,20.5z"/>
68
+ <path class="st4" d="M180.9,7.4c-0.7,0-1.3,0.6-1.3,1.3l0,20c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3v-20
69
+ C182.2,8,181.7,7.4,180.9,7.4z"/>
70
+ <g>
71
+ <path class="st4" d="M190.2,10.5c0-2.1-3.1-2.1-3.1,0C187,12.6,190.2,12.6,190.2,10.5z"/>
72
+ <path class="st4" d="M188.5,14.5c-0.7,0-1.3,0.6-1.3,1.3v12.9c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3V15.8
73
+ C189.9,15.1,189.3,14.5,188.5,14.5z"/>
74
+ </g>
75
+ </g>
76
+ </svg>
images/pretty-links-plugin-header.jpg ADDED
Binary file
images/twitter.png DELETED
Binary file
images/update-3-0.png ADDED
Binary file
images/update-all-new-link-listing.png ADDED
Binary file
images/update-categories-tags.png ADDED
Binary file
images/update-gutenberg-editor.png ADDED
Binary file
images/update-new-link-editor-1.png ADDED
Binary file
images/update-new-link-editor-2.png ADDED
Binary file
images/welcome-add-new.png ADDED
Binary file
images/welcome-advanced-redirects.png ADDED
Binary file
images/welcome-categories.png ADDED
Binary file
images/welcome-click-update.png ADDED
Binary file
images/welcome-copy-url.png ADDED
Binary file
images/welcome-customize-slug.png ADDED
Binary file
images/welcome-desk.png ADDED
Binary file
images/welcome-dynamic-redirects.png ADDED
Binary file
images/welcome-enter-url.png ADDED
Binary file
images/welcome-import-export.png ADDED
Binary file
images/welcome-link.png ADDED
Binary file
js/admin_link_form.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($) {
2
+ $(document).ready(function() {
3
+ function prli_objectify_form(formArray, allowed) {//serialize data function
4
+ var returnArray = {};
5
+
6
+ for (var i = 0; i < formArray.length; i++){
7
+ var name = formArray[i]['name'],
8
+ value = formArray[i]['value'];
9
+
10
+ if(-1 !== $.inArray(name, allowed)) {
11
+ if (name.slice(-2) === '[]') {
12
+ if (typeof returnArray[name] === 'undefined') {
13
+ returnArray[name] = [];
14
+ }
15
+
16
+ returnArray[name].push(value);
17
+ } else {
18
+ returnArray[name] = value;
19
+ }
20
+ }
21
+ }
22
+
23
+ return returnArray;
24
+ }
25
+
26
+ $('form#post').submit(function(e) {
27
+ e.preventDefault();
28
+
29
+ $('#pretty_link_errors').hide();
30
+ $('.spinner').css('visibility','visible');
31
+
32
+ var fields_to_validate = [
33
+ 'url', 'redirect_type', 'slug', 'url_replacements', 'enable_expire', 'expire_type', 'expire_date',
34
+ 'expire_clicks', 'enable_expired_url', 'expired_url', 'dynamic_redirection', 'url_rotations[]',
35
+ 'target_url_weight', 'url_rotation_weights[]', 'prli_geo_url[]', 'prli_geo_countries[]', 'prli_tech_url[]',
36
+ 'prli_time_url[]', 'prli_time_start[]', 'prli_time_end[]', 'delay'
37
+ ];
38
+
39
+ var args = prli_objectify_form($(this).serializeArray(), fields_to_validate);
40
+ args['id'] = PrliLinkValidation.args['id'];
41
+ args['action'] = PrliLinkValidation.args['action'];
42
+ args['security'] = PrliLinkValidation.args['security'];
43
+
44
+ var form = this;
45
+
46
+ $.post( ajaxurl, args, function(data) {
47
+ if(data.valid) {
48
+ $('#pretty_link_errors').hide();
49
+ $(form).triggerHandler('submit.edit-post');
50
+ form.submit();
51
+ }
52
+ else {
53
+ $('#pretty_link_errors p').html(data.message);
54
+ $('#pretty_link_errors').show();
55
+
56
+ $('.spinner').css('visibility','hidden');
57
+ }
58
+ }, 'json' );
59
+ });
60
+
61
+ if (window.adminpage === 'post-new-php' && window.typenow === 'pretty-link') {
62
+ $('#publish').val(PrliLinkValidation.args.update);
63
+ }
64
+ });
65
+ })(jQuery);
js/admin_popup.js CHANGED
@@ -8,7 +8,8 @@ jQuery(document).ready(function($) {
8
  type: 'inline'
9
  },
10
  closeOnBgClick: false,
11
- closeBtnInside: false
 
12
  });
13
  });
14
 
@@ -69,5 +70,28 @@ jQuery(document).ready(function($) {
69
  }
70
  });
71
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  });
73
 
8
  type: 'inline'
9
  },
10
  closeOnBgClick: false,
11
+ closeBtnInside: false,
12
+ mainClass: 'mfp-prli'
13
  });
14
  });
15
 
70
  }
71
  });
72
  });
73
+
74
+ $('.prli-leave-feedback').on('click', function () {
75
+ var _this = this;
76
+
77
+ prli_delay_popup('rating', function() {
78
+ $(_this).trigger('prli-popup-delayed',['rating']);
79
+ $.magnificPopup.close();
80
+ });
81
+ });
82
+
83
+ $('.prli-rating-enjoy-yes-popup').on('click', function (e) {
84
+ e.preventDefault();
85
+
86
+ $('#prli-rating-stage-one').hide();
87
+ $('#prli-rating-stage-two-yes').show();
88
+ });
89
+
90
+ $('.prli-rating-enjoy-no-popup').on('click', function (e) {
91
+ e.preventDefault();
92
+
93
+ $('#prli-rating-stage-one').hide();
94
+ $('#prli-rating-stage-two-no').show();
95
+ });
96
  });
97
 
js/admin_shared.js CHANGED
@@ -4,5 +4,21 @@ function toggle_iphone_instructions() {
4
 
5
  jQuery(document).ready(function($) {
6
  $(".prli-social-button-checkboxes").sortable();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  });
8
 
4
 
5
  jQuery(document).ready(function($) {
6
  $(".prli-social-button-checkboxes").sortable();
7
+
8
+ if ($.fn.magnificPopup) {
9
+ $('.prli-update').magnificPopup({
10
+ delegate: '.prli-image-popup',
11
+ type: 'image',
12
+ mainClass: 'mfp-prli',
13
+ gallery: {
14
+ enabled: true
15
+ }
16
+ });
17
+ }
18
+
19
+ // Remove Status from Link quick edit
20
+ if (window.pagenow === 'edit-pretty-link' && $('#bulk-edit').length) {
21
+ $('#bulk-edit').find('select[name="_status"]').closest('.inline-edit-col').remove();
22
+ }
23
  });
24
 
js/editor.deps.json ADDED
@@ -0,0 +1 @@
 
1
+ ["lodash","wp-api-fetch","wp-block-editor","wp-components","wp-compose","wp-data","wp-dom","wp-element","wp-html-entities","wp-i18n","wp-keycodes","wp-polyfill","wp-rich-text","wp-url"]
js/editor.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:o})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=38)}([function(t,e){!function(){t.exports=this.wp.element}()},function(t,e){!function(){t.exports=this.wp.i18n}()},function(t,e){!function(){t.exports=this.wp.url}()},function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}},function(t,e){!function(){t.exports=this.wp.components}()},function(t,e){!function(){t.exports=this.wp.richText}()},function(t,e){!function(){t.exports=this.wp.keycodes}()},function(t,e){!function(){t.exports=this.wp.blockEditor}()},function(t,e,n){var o=n(35);t.exports=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&o(t,e)}},function(t,e){function n(e){return t.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},n(e)}t.exports=n},function(t,e,n){var o=n(36),r=n(3);t.exports=function(t,e){return!e||"object"!==o(e)&&"function"!=typeof e?r(t):e}},function(t,e){function n(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}t.exports=function(t,e,o){return e&&n(t.prototype,e),o&&n(t,o),t}},function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e){!function(){t.exports=this.lodash}()},function(t,e,n){"use strict";n.r(e);var o=n(12),r=n.n(o),i=n(11),s=n.n(i),a=n(10),c=n.n(a),u=n(9),l=n.n(u),f=n(3),p=n.n(f),d=n(8),h=n.n(d),v=n(21),b=n.n(v),g=n(26),m=n.n(g),y=n(0),k=n(13),w=n(15),O=n.n(w),j=n(25),L=n.n(j),S=n(1),x=n(6),E=n(4),_=n(17),C=n(24),R=n(19),T=n.n(R),P=n(2),N=n(20),A=function(t){return t.stopPropagation()},I=function(){var t=m()(b.a.mark(function t(e){var n;return b.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,T()({url:Object(P.addQueryArgs)(ajaxurl,{action:"prli_search_for_links",term:e})});case 2:return n=t.sent,t.abrupt("return",Object(k.map)(n,function(t){return{url:t.pretty_url,title:Object(N.decodeEntities)(t.value)+" ("+Object(N.decodeEntities)(t.slug)+")"||Object(S.__)("(no title)")}}));case 4:case"end":return t.stop()}},t)}));return function(e){return t.apply(this,arguments)}}(),U=function(t){function e(t){var n,o=t.autocompleteRef;return r()(this,e),(n=c()(this,l()(e).apply(this,arguments))).onChange=n.onChange.bind(p()(n)),n.onKeyDown=n.onKeyDown.bind(p()(n)),n.autocompleteRef=o||Object(y.createRef)(),n.inputRef=Object(y.createRef)(),n.updateSuggestions=Object(k.throttle)(n.updateSuggestions.bind(p()(n)),200),n.suggestionNodes=[],n.state={suggestions:[],showSuggestions:!1,selectedSuggestion:null},n}return h()(e,t),s()(e,[{key:"componentDidUpdate",value:function(){var t=this,e=this.state,n=e.showSuggestions,o=e.selectedSuggestion;n&&null!==o&&!this.scrollingIntoView&&(this.scrollingIntoView=!0,L()(this.suggestionNodes[o],this.autocompleteRef.current,{onlyScrollIfNeeded:!0}),this.props.setTimeout(function(){t.scrollingIntoView=!1},100))}},{key:"componentWillUnmount",value:function(){delete this.suggestionsRequest}},{key:"bindSuggestionNode",value:function(t){var e=this;return function(n){e.suggestionNodes[t]=n}}},{key:"updateSuggestions",value:function(t){var e=this;if(t.length<2||/^https?:/.test(t))this.setState({showSuggestions:!1,selectedSuggestion:null,loading:!1});else{this.setState({showSuggestions:!0,selectedSuggestion:null,loading:!0});var n=I(t);n.then(function(t){e.suggestionsRequest===n&&(e.setState({suggestions:t,loading:!1}),t.length?e.props.debouncedSpeak(Object(S.sprintf)(Object(S._n)("%d result found, use up and down arrow keys to navigate.","%d results found, use up and down arrow keys to navigate.",t.length),t.length),"assertive"):e.props.debouncedSpeak(Object(S.__)("No results."),"assertive"))}).catch(function(){e.suggestionsRequest===n&&e.setState({loading:!1})}),this.suggestionsRequest=n}}},{key:"onChange",value:function(t){var e=t.target.value;this.props.onChange(e),this.updateSuggestions(e)}},{key:"onKeyDown",value:function(t){var e=this.state,n=e.showSuggestions,o=e.selectedSuggestion,r=e.suggestions,i=e.loading;if(n&&r.length&&!i){var s=this.state.suggestions[this.state.selectedSuggestion];switch(t.keyCode){case x.UP:t.stopPropagation(),t.preventDefault();var a=o?o-1:r.length-1;this.setState({selectedSuggestion:a});break;case x.DOWN:t.stopPropagation(),t.preventDefault();var c=null===o||o===r.length-1?0:o+1;this.setState({selectedSuggestion:c});break;case x.TAB:null!==this.state.selectedSuggestion&&(this.selectLink(s),this.props.speak(Object(S.__)("Link selected.")));break;case x.ENTER:null!==this.state.selectedSuggestion&&(t.stopPropagation(),this.selectLink(s))}}else switch(t.keyCode){case x.UP:0!==t.target.selectionStart&&(t.stopPropagation(),t.preventDefault(),t.target.setSelectionRange(0,0));break;case x.DOWN:this.props.value.length!==t.target.selectionStart&&(t.stopPropagation(),t.preventDefault(),t.target.setSelectionRange(this.props.value.length,this.props.value.length))}}},{key:"selectLink",value:function(t){this.props.onChange(t.url,t),this.setState({selectedSuggestion:null,showSuggestions:!1})}},{key:"handleOnClick",value:function(t){this.selectLink(t),this.inputRef.current.focus()}},{key:"render",value:function(){var t=this,e=this.props,n=e.value,o=void 0===n?"":n,r=e.autoFocus,i=void 0===r||r,s=e.instanceId,a=e.className,c=this.state,u=c.showSuggestions,l=c.suggestions,f=c.selectedSuggestion,p=c.loading,d="block-editor-url-input-suggestions-".concat(s),h="block-editor-url-input-suggestion-".concat(s);return Object(y.createElement)("div",{className:O()("editor-url-input block-editor-url-input",a)},Object(y.createElement)("input",{autoFocus:i,type:"text","aria-label":Object(S.__)("URL"),required:!0,value:o,onChange:this.onChange,onInput:A,placeholder:Object(S.__)("Paste or type to search for your Pretty Link"),onKeyDown:this.onKeyDown,role:"combobox","aria-expanded":u,"aria-autocomplete":"list","aria-owns":d,"aria-activedescendant":null!==f?"".concat(h,"-").concat(f):void 0,ref:this.inputRef}),p&&Object(y.createElement)(E.Spinner,null),u&&!!l.length&&Object(y.createElement)(E.Popover,{position:"bottom",noArrow:!0,focusOnMount:!1},Object(y.createElement)("div",{className:"editor-url-input__suggestions block-editor-url-input__suggestions",id:d,ref:this.autocompleteRef,role:"listbox"},l.map(function(e,n){return Object(y.createElement)("button",{key:e.id,role:"option",tabIndex:"-1",id:"".concat(h,"-").concat(n),ref:t.bindSuggestionNode(n),className:O()("editor-url-input__suggestion block-editor-url-input__suggestion",{"is-selected":n===f}),onClick:function(){return t.handleOnClick(e)},"aria-selected":n===f},e.title)}))))}}]),e}(y.Component);e.default=Object(_.compose)(_.withSafeTimeout,E.withSpokenMessages,_.withInstanceId,Object(C.withSelect)(function(t){return{fetchLinkSuggestions:(0,t("core/block-editor").getSettings)().__experimentalFetchLinkSuggestions}}))(U)},function(t,e,n){var o;
2
+ /*!
3
+ Copyright (c) 2017 Jed Watson.
4
+ Licensed under the MIT License (MIT), see
5
+ http://jedwatson.github.io/classnames
6
+ */
7
+ /*!
8
+ Copyright (c) 2017 Jed Watson.
9
+ Licensed under the MIT License (MIT), see
10
+ http://jedwatson.github.io/classnames
11
+ */
12
+ !function(){"use strict";var n={}.hasOwnProperty;function r(){for(var t=[],e=0;e<arguments.length;e++){var o=arguments[e];if(o){var i=typeof o;if("string"===i||"number"===i)t.push(o);else if(Array.isArray(o)&&o.length){var s=r.apply(null,o);s&&t.push(s)}else if("object"===i)for(var a in o)n.call(o,a)&&o[a]&&t.push(a)}}return t.join(" ")}void 0!==t&&t.exports?(r.default=r,t.exports=r):void 0===(o=function(){return r}.apply(e,[]))||(t.exports=o)}()},function(t,e,n){var o=n(32);t.exports=function(t,e){if(null==t)return{};var n,r,i=o(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r<s.length;r++)n=s[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(i[n]=t[n])}return i}},function(t,e){!function(){t.exports=this.wp.compose}()},function(t,e,n){"use strict";n.r(e);var o=n(12),r=n.n(o),i=n(11),s=n.n(i),a=n(10),c=n.n(a),u=n(9),l=n.n(u),f=n(3),p=n.n(f),d=n(8),h=n.n(d),v=n(23),b=n.n(v),g=n(16),m=n.n(g),y=n(0),k=n(15),w=n.n(k),O=n(1),j=n(4),L=n(6),S=n(22),x=n(2),E=n(5),_=n(7),C=(n(19),n(14)),R=(n(31),n(13));function T(t){if(!t)return!1;var e=t.trim();if(!e)return!1;if(/^\S+:/.test(e)){var n=Object(x.getProtocol)(e);if(!Object(x.isValidProtocol)(n))return!1;if(Object(R.startsWith)(n,"http")&&!/^https?:\/\/[^\/\s]/i.test(e))return!1;var o=Object(x.getAuthority)(e);if(!Object(x.isValidAuthority)(o))return!1;var r=Object(x.getPath)(e);if(r&&!Object(x.isValidPath)(r))return!1;var i=Object(x.getQueryString)(e);if(i&&!Object(x.isValidQueryString)(i))return!1;var s=Object(x.getFragment)(e);if(s&&!Object(x.isValidFragment)(s))return!1}return!(Object(R.startsWith)(e,"#")&&!Object(x.isValidFragment)(e))}function P(t){var e=t.url,n=t.opensInNewWindow,o=t.text,r={type:"core/link",attributes:{url:e}};if(n){var i=Object(O.sprintf)(Object(O.__)("%s (opens in a new tab)"),o);r.attributes.target="_blank",r.attributes.rel="noreferrer noopener",r.attributes["aria-label"]=i}return r}var N=function(t){return t.stopPropagation()};function A(t,e){return t.addingLink||e.editLink}var I=function(t){var e=t.value,n=t.onChangeInputValue,o=t.onKeyDown,r=t.submitLink,i=t.autocompleteRef;return Object(y.createElement)("form",{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",onKeyPress:N,onKeyDown:o,onSubmit:r},Object(y.createElement)(C.default,{value:e,onChange:n,autocompleteRef:i}),Object(y.createElement)(j.IconButton,{icon:"editor-break",label:Object(O.__)("Insert Pretty Link"),type:"submit"}))},U=function(t){var e=t.url,n=Object(x.prependHTTP)(e),o=w()("editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value",{"has-invalid-link":!T(n)});return e?Object(y.createElement)(j.ExternalLink,{className:o,href:e},Object(x.filterURLForDisplay)(Object(x.safeDecodeURI)(e))):Object(y.createElement)("span",{className:o})},W=function(t){var e=t.isActive,n=t.addingLink,o=t.value,r=m()(t,["isActive","addingLink","value"]),i=Object(y.useMemo)(function(){var t=window.getSelection(),e=t.rangeCount>0?t.getRangeAt(0):null;if(e){if(n)return Object(S.getRectangleFromRange)(e);var o=e.startContainer;for(o=o.nextElementSibling||o;o.nodeType!==window.Node.ELEMENT_NODE;)o=o.parentNode;var r=o.closest("a");return r?r.getBoundingClientRect():void 0}},[e,n,o.start,o.end]);return i?Object(y.createElement)(_.URLPopover,b()({anchorRect:i},r)):null},D=function(t){var e=t.url,n=t.editLink;return Object(y.createElement)("div",{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",onKeyPress:N},Object(y.createElement)(U,{url:e}),Object(y.createElement)(j.IconButton,{icon:"edit",label:Object(O.__)("Edit"),onClick:n}))},F=function(t){function e(){var t;return r()(this,e),(t=c()(this,l()(e).apply(this,arguments))).editLink=t.editLink.bind(p()(t)),t.submitLink=t.submitLink.bind(p()(t)),t.onKeyDown=t.onKeyDown.bind(p()(t)),t.onChangeInputValue=t.onChangeInputValue.bind(p()(t)),t.setLinkTarget=t.setLinkTarget.bind(p()(t)),t.onClickOutside=t.onClickOutside.bind(p()(t)),t.resetState=t.resetState.bind(p()(t)),t.autocompleteRef=Object(y.createRef)(),t.state={opensInNewWindow:!1,inputValue:"",newLinkUrl:"",newLinkSlug:"",creatingLink:!1,createdLink:!1,createdLinkError:!1},t}return h()(e,t),s()(e,[{key:"onKeyDown",value:function(t){[L.LEFT,L.DOWN,L.RIGHT,L.UP,L.BACKSPACE,L.ENTER].indexOf(t.keyCode)>-1&&t.stopPropagation()}},{key:"onChangeInputValue",value:function(t){this.setState({inputValue:t})}},{key:"setLinkTarget",value:function(t){var e=this.props,n=e.activeAttributes.url,o=void 0===n?"":n,r=e.value,i=e.onChange;if(this.setState({opensInNewWindow:t}),!A(this.props,this.state)){var s=Object(E.getTextContent)(Object(E.slice)(r));i(Object(E.applyFormat)(r,P({url:o,opensInNewWindow:t,text:s})))}}},{key:"editLink",value:function(t){this.setState({editLink:!0}),t.preventDefault()}},{key:"submitLink",value:function(t){var e=this.props,n=e.isActive,o=e.value,r=e.onChange,i=e.speak,s=this.state,a=s.inputValue,c=s.opensInNewWindow,u=Object(x.prependHTTP)(a),l=P({url:u,opensInNewWindow:c,text:Object(E.getTextContent)(Object(E.slice)(o))});if(t.preventDefault(),Object(E.isCollapsed)(o)&&!n){var f=Object(E.applyFormat)(Object(E.create)({text:u}),l,0,u.length);r(Object(E.insert)(o,f))}else r(Object(E.applyFormat)(o,l));this.resetState(),T(u)?i(n?Object(O.__)("Link edited."):Object(O.__)("Link inserted."),"assertive"):i(Object(O.__)("Warning: the link has been inserted but may have errors. Please test it."),"assertive")}},{key:"onClickOutside",value:function(t){var e=this.autocompleteRef.current;e&&e.contains(t.target)||this.resetState()}},{key:"resetState",value:function(){this.props.stopAddingLink(),this.setState({editLink:!1})}},{key:"render",value:function(){var t=this,e=this.props,n=e.isActive,o=e.activeAttributes.url,r=e.addingLink,i=e.value;if(!n&&!r)return null;var s=this.state,a=s.inputValue,c=s.opensInNewWindow,u=s.newLinkUrl,l=s.newLinkSlug,f=s.creatingLink,p=s.createdLink,d=s.createdLinkError,h=A(this.props,this.state);return Object(y.createElement)(W,{className:"pretty-link-inserter",value:i,isActive:n,addingLink:r,onClickOutside:this.onClickOutside,onClose:this.resetState,focusOnMount:!!h&&"firstElement",renderSettings:function(){return Object(y.createElement)(y.Fragment,null,Object(y.createElement)("div",null,Object(y.createElement)(j.ToggleControl,{label:Object(O.__)("Open in New Tab"),checked:c,onChange:t.setLinkTarget})),Object(y.createElement)("div",{className:"pretty-link-inserter-form-container"},p&&Object(y.createElement)(j.Notice,{status:"success",onRemove:function(){return t.setState({createdLink:!1})}},Object(y.createElement)("p",null,Object(O.__)("Pretty Link created successfully.","memberpress"))),d&&Object(y.createElement)(j.Notice,{status:"error",onRemove:function(){return t.setState({createdLink:!1,createdLinkError:!1})}},Object(y.createElement)("p",null,Object(O.__)("Pretty Link could not be created. Please try a slug that is not already used.","memberpress"))),Object(y.createElement)("strong",null,Object(O.__)("New Pretty Link","pretty-link")),Object(y.createElement)("form",{onSubmit:function(e){e.preventDefault(),t.setState({creatingLink:!0,createdLinkError:!1}),function(t,e){return new Promise(function(n,o){jQuery.post(ajaxurl,{action:"prli_create_pretty_link",target:t,slug:e,redirect:"",nofollow:1,tracking:1},function(t,e,r){"true"===t?n(t):o(t)}).fail(function(t){o(t)})})}(u,l).then(function(e){t.setState({createdLink:!0,creatingLink:!1,inputValue:plEditor.homeUrl+l,newLinkUrl:"",newLinkSlug:""})}).catch(function(e){t.setState({createdLink:!1,creatingLink:!1,createdLinkError:!0})})}},Object(y.createElement)("p",null,Object(y.createElement)(j.TextControl,{placeholder:"URL",className:"pretty-link-new-link-url",value:u,onChange:function(e){t.setState({newLinkUrl:e})}})),Object(y.createElement)("p",null,Object(y.createElement)(j.TextControl,{placeholder:"Slug",className:"pretty-link-new-link-slug",value:l,onChange:function(e){t.setState({newLinkSlug:e})}})),Object(y.createElement)("p",null,Object(y.createElement)("button",{className:"pretty-link-submit-new-link components-button is-button is-primary",onClick:function(){console.log("Creating new Pretty Link...")}},Object(O.__)("Create New Pretty Link","pretty-link")),f&&Object(y.createElement)(j.Spinner,null)))))}},h?Object(y.createElement)(I,{value:a,onChangeInputValue:this.onChangeInputValue,onKeyDown:this.onKeyDown,submitLink:this.submitLink,autocompleteRef:this.autocompleteRef}):Object(y.createElement)(D,{url:o,editLink:this.editLink}))}}],[{key:"getDerivedStateFromProps",value:function(t,e){var n=t.activeAttributes,o=n.url,r="_blank"===n.target;if(!A(t,e)){if(o!==e.inputValue)return{inputValue:o};if(r!==e.opensInNewWindow)return{opensInNewWindow:r}}return null}}]),e}(y.Component);e.default=Object(j.withSpokenMessages)(F)},function(t,e){!function(){t.exports=this.wp.apiFetch}()},function(t,e){!function(){t.exports=this.wp.htmlEntities}()},function(t,e){!function(){t.exports=this.regeneratorRuntime}()},function(t,e){!function(){t.exports=this.wp.dom}()},function(t,e){function n(){return t.exports=n=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},n.apply(this,arguments)}t.exports=n},function(t,e){!function(){t.exports=this.wp.data}()},function(t,e,n){"use strict";t.exports=n(34)},function(t,e){function n(t,e,n,o,r,i,s){try{var a=t[i](s),c=a.value}catch(t){return void n(t)}a.done?e(c):Promise.resolve(c).then(o,r)}t.exports=function(t){return function(){var e=this,o=arguments;return new Promise(function(r,i){var s=t.apply(e,o);function a(t){n(s,r,i,a,c,"next",t)}function c(t){n(s,r,i,a,c,"throw",t)}a(void 0)})}}},function(t,e,n){"use strict";n.r(e),n.d(e,"prettyLink",function(){return x});var o=n(16),r=n.n(o),i=n(12),s=n.n(i),a=n(11),c=n.n(a),u=n(10),l=n.n(u),f=n(9),p=n.n(f),d=n(3),h=n.n(d),v=n(8),b=n.n(v),g=n(0),m=n(1),y=n(4),k=n(5),w=n(2),O=n(7),j=n(18),L="pretty-link/pretty-link",S=Object(m.__)("Pretty Link"),x={name:L,title:S,tagName:"a",className:"pretty-link",attributes:{url:"href",target:"target"},edit:Object(y.withSpokenMessages)(function(t){function e(){var t;return s()(this,e),(t=l()(this,p()(e).apply(this,arguments))).addLink=t.addLink.bind(h()(t)),t.stopAddingLink=t.stopAddingLink.bind(h()(t)),t.onRemoveFormat=t.onRemoveFormat.bind(h()(t)),t.state={addingLink:!1},t}return b()(e,t),c()(e,[{key:"addLink",value:function(){var t=this.props,e=t.value,n=t.onChange,o=Object(k.getTextContent)(Object(k.slice)(e));o&&Object(w.isURL)(o)?n(Object(k.applyFormat)(e,{type:L,attributes:{url:o}})):this.setState({addingLink:!0})}},{key:"stopAddingLink",value:function(){this.setState({addingLink:!1})}},{key:"onRemoveFormat",value:function(){var t=this.props,e=t.value,n=t.onChange,o=t.speak;n(Object(k.removeFormat)(e,L)),o(Object(m.__)("Link removed."),"assertive")}},{key:"render",value:function(){var t=this.props,e=t.isActive,n=t.activeAttributes,o=t.value,r=t.onChange;return Object(g.createElement)(g.Fragment,null,Object(g.createElement)(O.RichTextShortcut,{type:"primary",character:"k",onUse:this.addLink}),Object(g.createElement)(O.RichTextShortcut,{type:"primaryShift",character:"k",onUse:this.onRemoveFormat}),e&&Object(g.createElement)(O.RichTextToolbarButton,{icon:"star-filled",title:Object(m.__)("Unlink"),onClick:this.onRemoveFormat,isActive:e,shortcutType:"primaryShift",shortcutCharacter:"k"}),!e&&Object(g.createElement)(O.RichTextToolbarButton,{icon:"star-filled",title:S,onClick:this.addLink,isActive:e,shortcutType:"primary",shortcutCharacter:"k"}),Object(g.createElement)(j.default,{addingLink:this.state.addingLink,stopAddingLink:this.stopAddingLink,isActive:e,activeAttributes:n,value:o,onChange:r}))}}]),e}(g.Component))};[x].forEach(function(t){var e=t.name,n=r()(t,["name"]);return Object(k.registerFormatType)(e,n)})},function(t,e){t.exports=function(t){var e="undefined"!=typeof window&&window.location;if(!e)throw new Error("fixUrls requires window.location");if(!t||"string"!=typeof t)return t;var n=e.protocol+"//"+e.host,o=n+e.pathname.replace(/\/[^\/]*$/,"/");return t.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(t,e){var r,i=e.trim().replace(/^"(.*)"$/,function(t,e){return e}).replace(/^'(.*)'$/,function(t,e){return e});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?t:(r=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:o+i.replace(/^\.\//,""),"url("+JSON.stringify(r)+")")})}},function(t,e,n){var o={},r=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),i=function(t){var e={};return function(t,n){if("function"==typeof t)return t();if(void 0===e[t]){var o=function(t,e){return e?e.querySelector(t):document.querySelector(t)}.call(this,t,n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(t){o=null}e[t]=o}return e[t]}}(),s=null,a=0,c=[],u=n(28);function l(t,e){for(var n=0;n<t.length;n++){var r=t[n],i=o[r.id];if(i){i.refs++;for(var s=0;s<i.parts.length;s++)i.parts[s](r.parts[s]);for(;s<r.parts.length;s++)i.parts.push(b(r.parts[s],e))}else{var a=[];for(s=0;s<r.parts.length;s++)a.push(b(r.parts[s],e));o[r.id]={id:r.id,refs:1,parts:a}}}}function f(t,e){for(var n=[],o={},r=0;r<t.length;r++){var i=t[r],s=e.base?i[0]+e.base:i[0],a={css:i[1],media:i[2],sourceMap:i[3]};o[s]?o[s].parts.push(a):n.push(o[s]={id:s,parts:[a]})}return n}function p(t,e){var n=i(t.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var o=c[c.length-1];if("top"===t.insertAt)o?o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),c.push(e);else if("bottom"===t.insertAt)n.appendChild(e);else{if("object"!=typeof t.insertAt||!t.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var r=i(t.insertAt.before,n);n.insertBefore(e,r)}}function d(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t);var e=c.indexOf(t);e>=0&&c.splice(e,1)}function h(t){var e=document.createElement("style");if(void 0===t.attrs.type&&(t.attrs.type="text/css"),void 0===t.attrs.nonce){var o=function(){0;return n.nc}();o&&(t.attrs.nonce=o)}return v(e,t.attrs),p(t,e),e}function v(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function b(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i="function"==typeof e.transform?e.transform(t.css):e.transform.default(t.css)))return function(){};t.css=i}if(e.singleton){var c=a++;n=s||(s=h(e)),o=m.bind(null,n,c,!1),r=m.bind(null,n,c,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(t){var e=document.createElement("link");return void 0===t.attrs.type&&(t.attrs.type="text/css"),t.attrs.rel="stylesheet",v(e,t.attrs),p(t,e),e}(e),o=function(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=u(o));r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var s=new Blob([o],{type:"text/css"}),a=t.href;t.href=URL.createObjectURL(s),a&&URL.revokeObjectURL(a)}.bind(null,n,e),r=function(){d(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(e),o=function(t,e){var n=e.css,o=e.media;o&&t.setAttribute("media",o);if(t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}.bind(null,n),r=function(){d(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(e=e||{}).attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||"boolean"==typeof e.singleton||(e.singleton=r()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=f(t,e);return l(n,e),function(t){for(var r=[],i=0;i<n.length;i++){var s=n[i];(a=o[s.id]).refs--,r.push(a)}t&&l(f(t,e),e);for(i=0;i<r.length;i++){var a;if(0===(a=r[i]).refs){for(var c=0;c<a.parts.length;c++)a.parts[c]();delete o[a.id]}}}};var g=function(){var t=[];return function(e,n){return t[e]=n,t.filter(Boolean).join("\n")}}();function m(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=g(e,r);else{var i=document.createTextNode(r),s=t.childNodes;s[e]&&t.removeChild(s[e]),s.length?t.insertBefore(i,s[e]):t.appendChild(i)}}},function(t,e){t.exports=".pretty-link-inserter .block-editor-url-popover__settings {\n display: block; }\n\n.pretty-link-inserter .pretty-link-inserter-form-container {\n margin-top: 30px; }\n"},function(t,e,n){var o=n(30);"string"==typeof o&&(o=[[t.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(29)(o,r);o.locals&&(t.exports=o.locals)},function(t,e){t.exports=function(t,e){if(null==t)return{};var n,o,r={},i=Object.keys(t);for(o=0;o<i.length;o++)n=i[o],e.indexOf(n)>=0||(r[n]=t[n]);return r}},function(t,e,n){"use strict";var o=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};function i(t,e){var n=t["page"+(e?"Y":"X")+"Offset"],o="scroll"+(e?"Top":"Left");if("number"!=typeof n){var r=t.document;"number"!=typeof(n=r.documentElement[o])&&(n=r.body[o])}return n}function s(t){return i(t)}function a(t){return i(t,!0)}function c(t){var e=function(t){var e,n=void 0,o=void 0,r=t.ownerDocument,i=r.body,s=r&&r.documentElement;return n=(e=t.getBoundingClientRect()).left,o=e.top,{left:n-=s.clientLeft||i.clientLeft||0,top:o-=s.clientTop||i.clientTop||0}}(t),n=t.ownerDocument,o=n.defaultView||n.parentWindow;return e.left+=s(o),e.top+=a(o),e}var u=new RegExp("^("+/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source+")(?!px)[a-z%]+$","i"),l=/^(top|right|bottom|left)$/,f="currentStyle",p="runtimeStyle",d="left",h="px";var v=void 0;function b(t,e){for(var n=0;n<t.length;n++)e(t[n])}function g(t){return"border-box"===v(t,"boxSizing")}"undefined"!=typeof window&&(v=window.getComputedStyle?function(t,e,n){var o="",r=t.ownerDocument,i=n||r.defaultView.getComputedStyle(t,null);return i&&(o=i.getPropertyValue(e)||i[e]),o}:function(t,e){var n=t[f]&&t[f][e];if(u.test(n)&&!l.test(e)){var o=t.style,r=o[d],i=t[p][d];t[p][d]=t[f][d],o[d]="fontSize"===e?"1em":n||0,n=o.pixelLeft+h,o[d]=r,t[p][d]=i}return""===n?"auto":n});var m=["margin","border","padding"],y=-1,k=2,w=1;function O(t,e,n){var o=0,r=void 0,i=void 0,s=void 0;for(i=0;i<e.length;i++)if(r=e[i])for(s=0;s<n.length;s++){var a=void 0;a="border"===r?r+n[s]+"Width":r+n[s],o+=parseFloat(v(t,a))||0}return o}function j(t){return null!=t&&t==t.window}var L={};function S(t,e,n){if(j(t))return"width"===e?L.viewportWidth(t):L.viewportHeight(t);if(9===t.nodeType)return"width"===e?L.docWidth(t):L.docHeight(t);var o="width"===e?["Left","Right"]:["Top","Bottom"],r="width"===e?t.offsetWidth:t.offsetHeight,i=(v(t),g(t)),s=0;(null==r||r<=0)&&(r=void 0,(null==(s=v(t,e))||Number(s)<0)&&(s=t.style[e]||0),s=parseFloat(s)||0),void 0===n&&(n=i?w:y);var a=void 0!==r||i,c=r||s;if(n===y)return a?c-O(t,["border","padding"],o):s;if(a){var u=n===k?-O(t,["border"],o):O(t,["margin"],o);return c+(n===w?0:u)}return s+O(t,m.slice(n),o)}b(["Width","Height"],function(t){L["doc"+t]=function(e){var n=e.document;return Math.max(n.documentElement["scroll"+t],n.body["scroll"+t],L["viewport"+t](n))},L["viewport"+t]=function(e){var n="client"+t,o=e.document,r=o.body,i=o.documentElement[n];return"CSS1Compat"===o.compatMode&&i||r&&r[n]||i}});var x={position:"absolute",visibility:"hidden",display:"block"};function E(t){var e=void 0,n=arguments;return 0!==t.offsetWidth?e=S.apply(void 0,n):function(t,e,n){var o={},r=t.style,i=void 0;for(i in e)e.hasOwnProperty(i)&&(o[i]=r[i],r[i]=e[i]);for(i in n.call(t),e)e.hasOwnProperty(i)&&(r[i]=o[i])}(t,x,function(){e=S.apply(void 0,n)}),e}function _(t,e,n){var o=n;if("object"!==(void 0===e?"undefined":r(e)))return void 0!==o?("number"==typeof o&&(o+="px"),void(t.style[e]=o)):v(t,e);for(var i in e)e.hasOwnProperty(i)&&_(t,i,e[i])}b(["width","height"],function(t){var e=t.charAt(0).toUpperCase()+t.slice(1);L["outer"+e]=function(e,n){return e&&E(e,t,n?0:w)};var n="width"===t?["Left","Right"]:["Top","Bottom"];L[t]=function(e,o){if(void 0===o)return e&&E(e,t,y);if(e){v(e);return g(e)&&(o+=O(e,["padding","border"],n)),_(e,t,o)}}}),t.exports=o({getWindow:function(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow},offset:function(t,e){if(void 0===e)return c(t);!function(t,e){"static"===_(t,"position")&&(t.style.position="relative");var n=c(t),o={},r=void 0,i=void 0;for(i in e)e.hasOwnProperty(i)&&(r=parseFloat(_(t,i))||0,o[i]=r+e[i]-n[i]);_(t,o)}(t,e)},isWindow:j,each:b,css:_,clone:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);if(t.overflow)for(var n in t)t.hasOwnProperty(n)&&(e.overflow[n]=t.overflow[n]);return e},scrollLeft:function(t,e){if(j(t)){if(void 0===e)return s(t);window.scrollTo(e,a(t))}else{if(void 0===e)return t.scrollLeft;t.scrollLeft=e}},scrollTop:function(t,e){if(j(t)){if(void 0===e)return a(t);window.scrollTo(s(t),e)}else{if(void 0===e)return t.scrollTop;t.scrollTop=e}},viewportWidth:0,viewportHeight:0},L)},function(t,e,n){"use strict";var o=n(33);t.exports=function(t,e,n){n=n||{},9===e.nodeType&&(e=o.getWindow(e));var r=n.allowHorizontalScroll,i=n.onlyScrollIfNeeded,s=n.alignWithTop,a=n.alignWithLeft,c=n.offsetTop||0,u=n.offsetLeft||0,l=n.offsetBottom||0,f=n.offsetRight||0;r=void 0===r||r;var p=o.isWindow(e),d=o.offset(t),h=o.outerHeight(t),v=o.outerWidth(t),b=void 0,g=void 0,m=void 0,y=void 0,k=void 0,w=void 0,O=void 0,j=void 0,L=void 0,S=void 0;p?(O=e,S=o.height(O),L=o.width(O),j={left:o.scrollLeft(O),top:o.scrollTop(O)},k={left:d.left-j.left-u,top:d.top-j.top-c},w={left:d.left+v-(j.left+L)+f,top:d.top+h-(j.top+S)+l},y=j):(b=o.offset(e),g=e.clientHeight,m=e.clientWidth,y={left:e.scrollLeft,top:e.scrollTop},k={left:d.left-(b.left+(parseFloat(o.css(e,"borderLeftWidth"))||0))-u,top:d.top-(b.top+(parseFloat(o.css(e,"borderTopWidth"))||0))-c},w={left:d.left+v-(b.left+m+(parseFloat(o.css(e,"borderRightWidth"))||0))+f,top:d.top+h-(b.top+g+(parseFloat(o.css(e,"borderBottomWidth"))||0))+l}),k.top<0||w.top>0?!0===s?o.scrollTop(e,y.top+k.top):!1===s?o.scrollTop(e,y.top+w.top):k.top<0?o.scrollTop(e,y.top+k.top):o.scrollTop(e,y.top+w.top):i||((s=void 0===s||!!s)?o.scrollTop(e,y.top+k.top):o.scrollTop(e,y.top+w.top)),r&&(k.left<0||w.left>0?!0===a?o.scrollLeft(e,y.left+k.left):!1===a?o.scrollLeft(e,y.left+w.left):k.left<0?o.scrollLeft(e,y.left+k.left):o.scrollLeft(e,y.left+w.left):i||((a=void 0===a||!!a)?o.scrollLeft(e,y.left+k.left):o.scrollLeft(e,y.left+w.left)))}},function(t,e){function n(e,o){return t.exports=n=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},n(e,o)}t.exports=n},function(t,e){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(e){return"function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?t.exports=o=function(t){return n(t)}:t.exports=o=function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":n(t)},o(e)}t.exports=o},function(t,e,n){"use strict";n.r(e);var o=n(14);n.d(e,"URLInput",function(){return o.default})},function(t,e,n){n(37),n(18),n(14),t.exports=n(27)}]);
js/editor.js.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./js/editor/components/index.js","webpack:///./js/editor/components/link-editor/index.js","webpack:///./js/editor/components/link-editor/style.scss?a870","webpack:///./js/editor/components/link-editor/utils.js","webpack:///./js/editor/components/url-input/index.js","webpack:///./js/editor/formats/pretty-link/index.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/inherits.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./node_modules/classnames/index.js","webpack:///./node_modules/dom-scroll-into-view/lib/dom-scroll-into-view.js","webpack:///./node_modules/dom-scroll-into-view/lib/index.js","webpack:///./node_modules/dom-scroll-into-view/lib/util.js","webpack:///./js/editor/components/link-editor/style.scss","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///external {\"this\":\"regeneratorRuntime\"}","webpack:///external {\"this\":[\"wp\",\"apiFetch\"]}","webpack:///external {\"this\":[\"wp\",\"blockEditor\"]}","webpack:///external {\"this\":[\"wp\",\"components\"]}","webpack:///external {\"this\":[\"wp\",\"compose\"]}","webpack:///external {\"this\":[\"wp\",\"data\"]}","webpack:///external {\"this\":[\"wp\",\"dom\"]}","webpack:///external {\"this\":[\"wp\",\"element\"]}","webpack:///external {\"this\":[\"wp\",\"htmlEntities\"]}","webpack:///external {\"this\":[\"wp\",\"i18n\"]}","webpack:///external {\"this\":[\"wp\",\"keycodes\"]}","webpack:///external {\"this\":[\"wp\",\"richText\"]}","webpack:///external {\"this\":[\"wp\",\"url\"]}","webpack:///external {\"this\":\"lodash\"}"],"names":["stopKeyPropagation","event","stopPropagation","isShowingInput","props","state","addingLink","editLink","LinkEditor","value","onChangeInputValue","onKeyDown","submitLink","autocompleteRef","__","LinkViewerUrl","url","prependedURL","prependHTTP","linkClassName","classnames","isValidHref","filterURLForDisplay","safeDecodeURI","URLPopoverAtLink","isActive","anchorRect","useMemo","selection","window","getSelection","range","rangeCount","getRangeAt","getRectangleFromRange","element","startContainer","nextElementSibling","nodeType","Node","ELEMENT_NODE","parentNode","closest","getBoundingClientRect","start","end","LinkViewer","createNewPrettyLink","target","slug","Promise","resolve","reject","jQuery","post","ajaxurl","action","redirect","nofollow","tracking","data","textStatus","xhr","fail","error","InlineLinkUI","arguments","bind","setLinkTarget","onClickOutside","resetState","createRef","opensInNewWindow","inputValue","newLinkUrl","newLinkSlug","creatingLink","createdLink","createdLinkError","LEFT","DOWN","RIGHT","UP","BACKSPACE","ENTER","indexOf","keyCode","setState","activeAttributes","onChange","selectedText","getTextContent","slice","applyFormat","createLinkFormat","text","preventDefault","speak","format","isCollapsed","toInsert","create","length","insert","autocompleteElement","current","contains","stopAddingLink","showInput","then","plEditor","homeUrl","catch","console","log","Component","withSpokenMessages","href","trimmedHref","trim","test","protocol","getProtocol","isValidProtocol","startsWith","authority","getAuthority","isValidAuthority","path","getPath","isValidPath","queryString","getQueryString","isValidQueryString","fragment","getFragment","isValidFragment","type","attributes","label","sprintf","rel","stopEventPropagation","fetchLinkSuggestions","search","apiFetch","addQueryArgs","term","links","map","link","title","decodeEntities","URLInput","inputRef","updateSuggestions","throttle","suggestionNodes","suggestions","showSuggestions","selectedSuggestion","scrollingIntoView","scrollIntoView","onlyScrollIfNeeded","setTimeout","suggestionsRequest","index","ref","loading","request","debouncedSpeak","_n","selectionStart","setSelectionRange","suggestion","previousIndex","nextIndex","TAB","selectLink","focus","autoFocus","instanceId","className","suggestionsListboxId","suggestionOptionIdPrefix","undefined","id","bindSuggestionNode","handleOnClick","compose","withSafeTimeout","withInstanceId","withSelect","select","getSettings","__experimentalFetchLinkSuggestions","name","prettyLink","tagName","edit","addLink","onRemoveFormat","isURL","removeFormat","registerFormats","forEach","settings","registerFormatType"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;ACnEA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;AAGA;AAEA;;;;AAGA;AACA;AACA;AAUA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AAEA;;;;AAGA;;AAEA,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAAEC,KAAF;AAAA,SAAaA,KAAK,CAACC,eAAN,EAAb;AAAA,CAA3B;;AAEA,SAASC,cAAT,CAAyBC,KAAzB,EAAgCC,KAAhC,EAAwC;AACvC,SAAOD,KAAK,CAACE,UAAN,IAAoBD,KAAK,CAACE,QAAjC;AACA;;AAED,IAAMC,UAAU,GAAG,SAAbA,UAAa;AAAA,MAAIC,KAAJ,QAAIA,KAAJ;AAAA,MAAWC,kBAAX,QAAWA,kBAAX;AAAA,MAA+BC,SAA/B,QAA+BA,SAA/B;AAAA,MAA0CC,UAA1C,QAA0CA,UAA1C;AAAA,MAAsDC,eAAtD,QAAsDA,eAAtD;AAAA,SAClB;;AACA;AACA;AACC,eAAS,EAAC,mGADX;AAEC,gBAAU,EAAGb,kBAFd;AAGC,eAAS,EAAGW,SAHb;AAIC,cAAQ,EAAGC;AAJZ,OAMC,yEAAC,mDAAD;AACC,WAAK,EAAGH,KADT;AAEC,cAAQ,EAAGC,kBAFZ;AAGC,qBAAe,EAAGG;AAHnB,MAND,EAWC,yEAAC,iEAAD;AAAY,UAAI,EAAC,cAAjB;AAAgC,WAAK,EAAGC,2DAAE,CAAE,oBAAF,CAA1C;AAAqE,UAAI,EAAC;AAA1E,MAXD;AAaA;;AAhBkB;AAAA,CAAnB;;AAmBA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,QAAe;AAAA,MAAXC,GAAW,SAAXA,GAAW;AACpC,MAAMC,YAAY,GAAGC,mEAAW,CAAEF,GAAF,CAAhC;AACA,MAAMG,aAAa,GAAGC,iDAAU,CAAE,+FAAF,EAAmG;AAClI,wBAAoB,CAAEC,2DAAW,CAAEJ,YAAF;AADiG,GAAnG,CAAhC;;AAIA,MAAK,CAAED,GAAP,EAAa;AACZ,WAAO;AAAM,eAAS,EAAGG;AAAlB,MAAP;AACA;;AAED,SACC,yEAAC,mEAAD;AACC,aAAS,EAAGA,aADb;AAEC,QAAI,EAAGH;AAFR,KAIGM,2EAAmB,CAAEC,qEAAa,CAAEP,GAAF,CAAf,CAJtB,CADD;AAQA,CAlBD;;AAoBA,IAAMQ,gBAAgB,GAAG,SAAnBA,gBAAmB,QAAiD;AAAA,MAA7CC,QAA6C,SAA7CA,QAA6C;AAAA,MAAnCnB,UAAmC,SAAnCA,UAAmC;AAAA,MAAvBG,KAAuB,SAAvBA,KAAuB;AAAA,MAAbL,KAAa;;AACzE,MAAMsB,UAAU,GAAGC,kEAAO,CAAE,YAAM;AACjC,QAAMC,SAAS,GAAGC,MAAM,CAACC,YAAP,EAAlB;AACA,QAAMC,KAAK,GAAGH,SAAS,CAACI,UAAV,GAAuB,CAAvB,GAA2BJ,SAAS,CAACK,UAAV,CAAsB,CAAtB,CAA3B,GAAuD,IAArE;;AACA,QAAK,CAAEF,KAAP,EAAe;AACd;AACA;;AAED,QAAKzB,UAAL,EAAkB;AACjB,aAAO4B,6EAAqB,CAAEH,KAAF,CAA5B;AACA;;AAED,QAAII,OAAO,GAAGJ,KAAK,CAACK,cAApB,CAXiC,CAajC;;AACAD,WAAO,GAAGA,OAAO,CAACE,kBAAR,IAA8BF,OAAxC;;AAEA,WAAQA,OAAO,CAACG,QAAR,KAAqBT,MAAM,CAACU,IAAP,CAAYC,YAAzC,EAAwD;AACvDL,aAAO,GAAGA,OAAO,CAACM,UAAlB;AACA;;AAED,QAAMC,OAAO,GAAGP,OAAO,CAACO,OAAR,CAAiB,GAAjB,CAAhB;;AACA,QAAKA,OAAL,EAAe;AACd,aAAOA,OAAO,CAACC,qBAAR,EAAP;AACA;AACD,GAxByB,EAwBvB,CAAElB,QAAF,EAAYnB,UAAZ,EAAwBG,KAAK,CAACmC,KAA9B,EAAqCnC,KAAK,CAACoC,GAA3C,CAxBuB,CAA1B;;AA0BA,MAAK,CAAEnB,UAAP,EAAoB;AACnB,WAAO,IAAP;AACA;;AAED,SAAO,yEAAC,mEAAD;AAAY,cAAU,EAAGA;AAAzB,KAA2CtB,KAA3C,EAAP;AACA,CAhCD;;AAkCA,IAAM0C,UAAU,GAAG,SAAbA,UAAa,QAAyB;AAAA,MAArB9B,GAAqB,SAArBA,GAAqB;AAAA,MAAhBT,QAAgB,SAAhBA,QAAgB;AAC3C,SACC;;AACA;AACA;AACC,eAAS,EAAC,mGADX;AAEC,gBAAU,EAAGP;AAFd,OAIC,yEAAC,aAAD;AAAe,SAAG,EAAGgB;AAArB,MAJD,EAKC,yEAAC,iEAAD;AAAY,UAAI,EAAC,MAAjB;AAAwB,WAAK,EAAGF,2DAAE,CAAE,MAAF,CAAlC;AAA+C,aAAO,EAAGP;AAAzD,MALD;AAOA;;AAVD;AAYA,CAbD;;AAeA,IAAMwC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACC,MAAD,EAASC,IAAT,EAAkB;AAC7C,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACvCC,UAAM,CAACC,IAAP,CACCC,OADD,EAEC;AACCC,YAAM,EAAE,yBADT;AAECR,YAAM,EAAEA,MAFT;AAGCC,UAAI,EAAEA,IAHP;AAICQ,cAAQ,EAAE,EAJX;AAKCC,cAAQ,EAAE,CALX;AAMCC,cAAQ,EAAE;AANX,KAFD,EAUC,UAACC,IAAD,EAAOC,UAAP,EAAmBC,GAAnB,EAA2B;AAC1B,iBAAWF,IAAX,GAAkBT,OAAO,CAACS,IAAD,CAAzB,GAAkCR,MAAM,CAACQ,IAAD,CAAxC;AACA,KAZF,EAaIG,IAbJ,CAaS,UAAAC,KAAK,EAAI;AACfZ,YAAM,CAACY,KAAD,CAAN;AACA,KAfH;AAgBA,GAjBM,CAAP;AAkBA,CAnBD;;IAqBMC,Y;;;;;AACL,0BAAc;AAAA;;AAAA;;AACb,iNAAUC,SAAV;AAEA,UAAK3D,QAAL,GAAgB,MAAKA,QAAL,CAAc4D,IAAd,4FAAhB;AACA,UAAKvD,UAAL,GAAkB,MAAKA,UAAL,CAAgBuD,IAAhB,4FAAlB;AACA,UAAKxD,SAAL,GAAiB,MAAKA,SAAL,CAAewD,IAAf,4FAAjB;AACA,UAAKzD,kBAAL,GAA0B,MAAKA,kBAAL,CAAwByD,IAAxB,4FAA1B;AACA,UAAKC,aAAL,GAAqB,MAAKA,aAAL,CAAmBD,IAAnB,4FAArB;AACA,UAAKE,cAAL,GAAsB,MAAKA,cAAL,CAAoBF,IAApB,4FAAtB;AACA,UAAKG,UAAL,GAAkB,MAAKA,UAAL,CAAgBH,IAAhB,4FAAlB;AACA,UAAKtD,eAAL,GAAuB0D,oEAAS,EAAhC;AAEA,UAAKlE,KAAL,GAAa;AACZmE,sBAAgB,EAAE,KADN;AAEZC,gBAAU,EAAE,EAFA;AAGZC,gBAAU,EAAE,EAHA;AAIZC,iBAAW,EAAE,EAJD;AAKZC,kBAAY,EAAE,KALF;AAMZC,iBAAW,EAAE,KAND;AAOZC,sBAAgB,EAAE;AAPN,KAAb;AAZa;AAqBb;;;;8BAmBU7E,K,EAAQ;AAClB,UAAK,CAAE8E,yDAAF,EAAQC,yDAAR,EAAcC,0DAAd,EAAqBC,uDAArB,EAAyBC,8DAAzB,EAAoCC,0DAApC,EAA4CC,OAA5C,CAAqDpF,KAAK,CAACqF,OAA3D,IAAuE,CAAC,CAA7E,EAAiF;AAChF;AACArF,aAAK,CAACC,eAAN;AACA;AACD;;;uCAEmBuE,U,EAAa;AAChC,WAAKc,QAAL,CAAe;AAAEd,kBAAU,EAAVA;AAAF,OAAf;AACA;;;kCAEcD,gB,EAAmB;AAAA,wBAC2B,KAAKpE,KADhC;AAAA,8CACzBoF,gBADyB,CACLxE,GADK;AAAA,UACLA,GADK,sCACC,EADD;AAAA,UACOP,KADP,eACOA,KADP;AAAA,UACcgF,QADd,eACcA,QADd;AAGjC,WAAKF,QAAL,CAAe;AAAEf,wBAAgB,EAAhBA;AAAF,OAAf,EAHiC,CAKjC;;AACA,UAAK,CAAErE,cAAc,CAAE,KAAKC,KAAP,EAAc,KAAKC,KAAnB,CAArB,EAAkD;AACjD,YAAMqF,YAAY,GAAGC,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAAnC;AAEAgF,gBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAASqF,gEAAgB,CAAE;AAC/C9E,aAAG,EAAHA,GAD+C;AAE/CwD,0BAAgB,EAAhBA,gBAF+C;AAG/CuB,cAAI,EAAEL;AAHyC,SAAF,CAAzB,CAAb,CAAR;AAKA;AACD;;;6BAESzF,K,EAAQ;AACjB,WAAKsF,QAAL,CAAe;AAAEhF,gBAAQ,EAAE;AAAZ,OAAf;AACAN,WAAK,CAAC+F,cAAN;AACA;;;+BAEW/F,K,EAAQ;AAAA,yBAC0B,KAAKG,KAD/B;AAAA,UACXqB,QADW,gBACXA,QADW;AAAA,UACDhB,KADC,gBACDA,KADC;AAAA,UACMgF,QADN,gBACMA,QADN;AAAA,UACgBQ,KADhB,gBACgBA,KADhB;AAAA,wBAEsB,KAAK5F,KAF3B;AAAA,UAEXoE,UAFW,eAEXA,UAFW;AAAA,UAECD,gBAFD,eAECA,gBAFD;AAGnB,UAAMxD,GAAG,GAAGE,mEAAW,CAAEuD,UAAF,CAAvB;AACA,UAAMiB,YAAY,GAAGC,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAAnC;AACA,UAAMyF,MAAM,GAAGJ,gEAAgB,CAAE;AAChC9E,WAAG,EAAHA,GADgC;AAEhCwD,wBAAgB,EAAhBA,gBAFgC;AAGhCuB,YAAI,EAAEL;AAH0B,OAAF,CAA/B;AAMAzF,WAAK,CAAC+F,cAAN;;AAEA,UAAKG,yEAAW,CAAE1F,KAAF,CAAX,IAAwB,CAAEgB,QAA/B,EAA0C;AACzC,YAAM2E,QAAQ,GAAGP,yEAAW,CAAEQ,oEAAM,CAAE;AAAEN,cAAI,EAAE/E;AAAR,SAAF,CAAR,EAA2BkF,MAA3B,EAAmC,CAAnC,EAAsClF,GAAG,CAACsF,MAA1C,CAA5B;AACAb,gBAAQ,CAAEc,oEAAM,CAAE9F,KAAF,EAAS2F,QAAT,CAAR,CAAR;AACA,OAHD,MAGO;AACNX,gBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAASyF,MAAT,CAAb,CAAR;AACA;;AAED,WAAK5B,UAAL;;AAEA,UAAK,CAAEjD,2DAAW,CAAEL,GAAF,CAAlB,EAA4B;AAC3BiF,aAAK,CAAEnF,2DAAE,CAAE,0EAAF,CAAJ,EAAoF,WAApF,CAAL;AACA,OAFD,MAEO,IAAKW,QAAL,EAAgB;AACtBwE,aAAK,CAAEnF,2DAAE,CAAE,cAAF,CAAJ,EAAwB,WAAxB,CAAL;AACA,OAFM,MAEA;AACNmF,aAAK,CAAEnF,2DAAE,CAAE,gBAAF,CAAJ,EAA0B,WAA1B,CAAL;AACA;AACD;;;mCAEeb,K,EAAQ;AACvB;AACA;AACA;AACA;AACA,UAAMuG,mBAAmB,GAAG,KAAK3F,eAAL,CAAqB4F,OAAjD;;AACA,UAAKD,mBAAmB,IAAIA,mBAAmB,CAACE,QAApB,CAA8BzG,KAAK,CAAC+C,MAApC,CAA5B,EAA2E;AAC1E;AACA;;AAED,WAAKsB,UAAL;AACA;;;iCAEY;AACZ,WAAKlE,KAAL,CAAWuG,cAAX;AACA,WAAKpB,QAAL,CAAe;AAAEhF,gBAAQ,EAAE;AAAZ,OAAf;AACA;;;6BAEQ;AAAA;;AAAA,yBAC2D,KAAKH,KADhE;AAAA,UACAqB,QADA,gBACAA,QADA;AAAA,UAC8BT,GAD9B,gBACUwE,gBADV,CAC8BxE,GAD9B;AAAA,UACqCV,UADrC,gBACqCA,UADrC;AAAA,UACiDG,KADjD,gBACiDA,KADjD;;AAGR,UAAK,CAAEgB,QAAF,IAAc,CAAEnB,UAArB,EAAkC;AACjC,eAAO,IAAP;AACA;;AALO,yBAOuG,KAAKD,KAP5G;AAAA,UAOAoE,UAPA,gBAOAA,UAPA;AAAA,UAOYD,gBAPZ,gBAOYA,gBAPZ;AAAA,UAO8BE,UAP9B,gBAO8BA,UAP9B;AAAA,UAO0CC,WAP1C,gBAO0CA,WAP1C;AAAA,UAOuDC,YAPvD,gBAOuDA,YAPvD;AAAA,UAOqEC,WAPrE,gBAOqEA,WAPrE;AAAA,UAOkFC,gBAPlF,gBAOkFA,gBAPlF;AAQR,UAAM8B,SAAS,GAAGzG,cAAc,CAAE,KAAKC,KAAP,EAAc,KAAKC,KAAnB,CAAhC;AAEA,aACC,yEAAC,gBAAD;AACC,iBAAS,EAAC,sBADX;AAEC,aAAK,EAAGI,KAFT;AAGC,gBAAQ,EAAGgB,QAHZ;AAIC,kBAAU,EAAGnB,UAJd;AAKC,sBAAc,EAAG,KAAK+D,cALvB;AAMC,eAAO,EAAG,KAAKC,UANhB;AAOC,oBAAY,EAAGsC,SAAS,GAAG,cAAH,GAAoB,KAP7C;AAQC,sBAAc,EAAG;AAAA,iBAChB,yEAAC,2DAAD,QACC,sFACC,yEAAC,oEAAD;AACC,iBAAK,EAAG9F,2DAAE,CAAE,iBAAF,CADX;AAEC,mBAAO,EAAG0D,gBAFX;AAGC,oBAAQ,EAAG,MAAI,CAACJ;AAHjB,YADD,CADD,EAQC;AAAK,qBAAS,EAAC;AAAf,aAEES,WAAW,IACV,yEAAC,6DAAD;AAAQ,kBAAM,EAAC,SAAf;AAAyB,oBAAQ,EAAE;AAAA,qBAAM,MAAI,CAACU,QAAL,CAAc;AAACV,2BAAW,EAAE;AAAd,eAAd,CAAN;AAAA;AAAnC,aACO,oFAAI/D,2DAAE,CAAE,mCAAF,EAAuC,aAAvC,CAAN,CADP,CAHH,EASEgE,gBAAgB,IACf,yEAAC,6DAAD;AAAQ,kBAAM,EAAC,OAAf;AAAuB,oBAAQ,EAAE;AAAA,qBAAM,MAAI,CAACS,QAAL,CAAc;AAACV,2BAAW,EAAE,KAAd;AAAqBC,gCAAgB,EAAE;AAAvC,eAAd,CAAN;AAAA;AAAjC,aACO,oFAAIhE,2DAAE,CAAE,+EAAF,EAAmF,aAAnF,CAAN,CADP,CAVH,EAeC,yFAASA,2DAAE,CAAC,iBAAD,EAAoB,aAApB,CAAX,CAfD,EAgBC;AAAM,oBAAQ,EAAE,kBAACb,KAAD,EAAW;AAC1BA,mBAAK,CAAC+F,cAAN,GAD0B,CAE1B;;AACA,oBAAI,CAACT,QAAL,CAAc;AACbX,4BAAY,EAAE,IADD;AAEbE,gCAAgB,EAAE;AAFL,eAAd;;AAIA/B,iCAAmB,CAAE2B,UAAF,EAAcC,WAAd,CAAnB,CACEkC,IADF,CACO,UAAAjD,IAAI,EAAI;AACb,sBAAI,CAAC2B,QAAL,CAAc;AACbV,6BAAW,EAAE,IADA;AAEbD,8BAAY,EAAE,KAFD;AAGbH,4BAAU,EAAEqC,QAAQ,CAACC,OAAT,GAAmBpC,WAHlB;AAIbD,4BAAU,EAAE,EAJC;AAKbC,6BAAW,EAAE;AALA,iBAAd;AAOA,eATF,EAUEqC,KAVF,CAUQ,UAAAhD,KAAK,EAAI;AACf,sBAAI,CAACuB,QAAL,CAAc;AACbV,6BAAW,EAAE,KADA;AAEbD,8BAAY,EAAE,KAFD;AAGbE,kCAAgB,EAAE;AAHL,iBAAd;AAKA,eAhBF;AAiBA;AAxBD,aAyBC,oFACC,yEAAC,kEAAD;AACO,uBAAW,EAAC,KADnB;AAEO,qBAAS,EAAC,0BAFjB;AAGO,iBAAK,EAAEJ,UAHd;AAIO,oBAAQ,EAAG,kBAAEA,UAAF,EAAkB;AAC5B,oBAAI,CAACa,QAAL,CAAe;AAAEb,0BAAU,EAAVA;AAAF,eAAf;AACA;AANR,YADD,CAzBD,EAmCI,oFACC,yEAAC,kEAAD;AACO,uBAAW,EAAC,MADnB;AAEO,qBAAS,EAAC,2BAFjB;AAGO,iBAAK,EAAEC,WAHd;AAIO,oBAAQ,EAAG,kBAAEA,WAAF,EAAmB;AAC7B,oBAAI,CAACY,QAAL,CAAe;AAAEZ,2BAAW,EAAXA;AAAF,eAAf;AACA;AANR,YADD,CAnCJ,EA6CI,oFACC;AACC,qBAAS,EAAC,oEADX;AAEC,mBAAO,EAAG,mBAAM;AACfsC,qBAAO,CAACC,GAAR,CAAY,6BAAZ;AACA;AAJF,aAMGpG,2DAAE,CAAE,wBAAF,EAA4B,aAA5B,CANL,CADD,EAUE8D,YAAY,IACX,yEAAC,8DAAD,OAXH,CA7CJ,CAhBD,CARD,CADgB;AAAA;AARlB,SAkGGgC,SAAS,GACV,yEAAC,UAAD;AACC,aAAK,EAAGnC,UADT;AAEC,0BAAkB,EAAG,KAAK/D,kBAF3B;AAGC,iBAAS,EAAG,KAAKC,SAHlB;AAIC,kBAAU,EAAG,KAAKC,UAJnB;AAKC,uBAAe,EAAG,KAAKC;AALxB,QADU,GASV,yEAAC,UAAD;AACC,WAAG,EAAGG,GADP;AAEC,gBAAQ,EAAG,KAAKT;AAFjB,QA3GF,CADD;AAmHA;;;6CAhOgCH,K,EAAOC,K,EAAQ;AAAA,kCACDD,KADC,CACvCoF,gBADuC;AAAA,UACnBxE,GADmB,yBACnBA,GADmB;AAAA,UACdgC,MADc,yBACdA,MADc;AAE/C,UAAMwB,gBAAgB,GAAGxB,MAAM,KAAK,QAApC;;AAEA,UAAK,CAAE7C,cAAc,CAAEC,KAAF,EAASC,KAAT,CAArB,EAAwC;AACvC,YAAKW,GAAG,KAAKX,KAAK,CAACoE,UAAnB,EAAgC;AAC/B,iBAAO;AAAEA,sBAAU,EAAEzD;AAAd,WAAP;AACA;;AAED,YAAKwD,gBAAgB,KAAKnE,KAAK,CAACmE,gBAAhC,EAAmD;AAClD,iBAAO;AAAEA,4BAAgB,EAAhBA;AAAF,WAAP;AACA;AACD;;AAED,aAAO,IAAP;AACA;;;;EAvCyB2C,4D;;AA2PZC,gJAAkB,CAAEnD,YAAF,CAAjC,E;;;;;;;;;;;;ACvZA,cAAc,mBAAO,CAAC,2QAAkI;;AAExJ,4CAA4C,QAAS;;AAErD;AACA;;;;AAIA,eAAe;;AAEf;AACA;;AAEA,aAAa,mBAAO,CAAC,4GAAyD;;AAE9E;;AAEA,GAAG,KAAU,EAAE,E;;;;;;;;;;;;ACnBf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAGA;AAEA;;;;AAGA;AAYA;AAEA;;;;;;;;AAOO,SAAS5C,WAAT,CAAsBgG,IAAtB,EAA6B;AACnC,MAAK,CAAEA,IAAP,EAAc;AACb,WAAO,KAAP;AACA;;AAED,MAAMC,WAAW,GAAGD,IAAI,CAACE,IAAL,EAApB;;AAEA,MAAK,CAAED,WAAP,EAAqB;AACpB,WAAO,KAAP;AACA,GATkC,CAWnC;;;AACA,MAAK,QAAQE,IAAR,CAAcF,WAAd,CAAL,EAAmC;AAClC,QAAMG,QAAQ,GAAGC,kEAAW,CAAEJ,WAAF,CAA5B;;AACA,QAAK,CAAEK,sEAAe,CAAEF,QAAF,CAAtB,EAAqC;AACpC,aAAO,KAAP;AACA,KAJiC,CAMlC;AACA;;;AACA,QAAKG,yDAAU,CAAEH,QAAF,EAAY,MAAZ,CAAV,IAAkC,CAAE,uBAAuBD,IAAvB,CAA6BF,WAA7B,CAAzC,EAAsF;AACrF,aAAO,KAAP;AACA;;AAED,QAAMO,SAAS,GAAGC,mEAAY,CAAER,WAAF,CAA9B;;AACA,QAAK,CAAES,uEAAgB,CAAEF,SAAF,CAAvB,EAAuC;AACtC,aAAO,KAAP;AACA;;AAED,QAAMG,IAAI,GAAGC,8DAAO,CAAEX,WAAF,CAApB;;AACA,QAAKU,IAAI,IAAI,CAAEE,kEAAW,CAAEF,IAAF,CAA1B,EAAqC;AACpC,aAAO,KAAP;AACA;;AAED,QAAMG,WAAW,GAAGC,qEAAc,CAAEd,WAAF,CAAlC;;AACA,QAAKa,WAAW,IAAI,CAAEE,yEAAkB,CAAEF,WAAF,CAAxC,EAA0D;AACzD,aAAO,KAAP;AACA;;AAED,QAAMG,QAAQ,GAAGC,kEAAW,CAAEjB,WAAF,CAA5B;;AACA,QAAKgB,QAAQ,IAAI,CAAEE,sEAAe,CAAEF,QAAF,CAAlC,EAAiD;AAChD,aAAO,KAAP;AACA;AACD,GA3CkC,CA6CnC;;;AACA,MAAKV,yDAAU,CAAEN,WAAF,EAAe,GAAf,CAAV,IAAkC,CAAEkB,sEAAe,CAAElB,WAAF,CAAxD,EAA0E;AACzE,WAAO,KAAP;AACA;;AAED,SAAO,IAAP;AACA;AAED;;;;;;;;;;AASO,SAASxB,gBAAT,OAA6D;AAAA,MAAhC9E,GAAgC,QAAhCA,GAAgC;AAAA,MAA3BwD,gBAA2B,QAA3BA,gBAA2B;AAAA,MAATuB,IAAS,QAATA,IAAS;AACnE,MAAMG,MAAM,GAAG;AACduC,QAAI,EAAE,WADQ;AAEdC,cAAU,EAAE;AACX1H,SAAG,EAAHA;AADW;AAFE,GAAf;;AAOA,MAAKwD,gBAAL,EAAwB;AACvB;AACA,QAAMmE,KAAK,GAAGC,+DAAO,CAAE9H,0DAAE,CAAE,yBAAF,CAAJ,EAAmCiF,IAAnC,CAArB;AAEAG,UAAM,CAACwC,UAAP,CAAkB1F,MAAlB,GAA2B,QAA3B;AACAkD,UAAM,CAACwC,UAAP,CAAkBG,GAAlB,GAAwB,qBAAxB;AACA3C,UAAM,CAACwC,UAAP,CAAmB,YAAnB,IAAoCC,KAApC;AACA;;AAED,SAAOzC,MAAP;AACA,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7GD;;;AAGA;AACA;AACA;AAEA;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CAGA;AACA;AACA;;AACA,IAAM4C,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAE7I,KAAF;AAAA,SAAaA,KAAK,CAACC,eAAN,EAAb;AAAA,CAA7B;;AAEA,IAAM6I,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,yEAAG,iBAAQC,MAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAERC,4DAAQ,CAAE;AAC7BjI,iBAAG,EAAEkI,oEAAY,CAAE3F,OAAF,EAAW;AAC3BC,sBAAM,EAAE,uBADmB;AAE3B2F,oBAAI,EAAEH;AAFqB,eAAX;AADY,aAAF,CAFA;;AAAA;AAEtBI,iBAFsB;AAAA,6CASrBC,kDAAG,CAAED,KAAF,EAAS,UAAEE,IAAF;AAAA,qBAAc;AAChCtI,mBAAG,EAAE8F,QAAQ,CAACC,OAAT,GAAmBuC,IAAI,CAACrG,IADG;AAEhCsG,qBAAK,EAAEC,gFAAc,CAAEF,IAAI,CAAC7I,KAAP,CAAd,GAA+B,IAA/B,GAAsC+I,gFAAc,CAAEF,IAAI,CAACrG,IAAP,CAApD,GAAoE,GAApE,IAA2EnC,2DAAE,CAAE,YAAF;AAFpD,eAAd;AAAA,aAAT,CATkB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAH;;AAAA,kBAApBiI,oBAAoB;AAAA;AAAA;AAAA,GAA1B;;IAeMU,Q;;;;;AACL,2BAAmC;AAAA;;AAAA,QAApB5I,eAAoB,SAApBA,eAAoB;;AAAA;;AAClC,6MAAUqD,SAAV;AAEA,UAAKuB,QAAL,GAAgB,MAAKA,QAAL,CAActB,IAAd,4FAAhB;AACA,UAAKxD,SAAL,GAAiB,MAAKA,SAAL,CAAewD,IAAf,4FAAjB;AACA,UAAKtD,eAAL,GAAuBA,eAAe,IAAI0D,oEAAS,EAAnD;AACA,UAAKmF,QAAL,GAAgBnF,oEAAS,EAAzB;AACA,UAAKoF,iBAAL,GAAyBC,uDAAQ,CAAE,MAAKD,iBAAL,CAAuBxF,IAAvB,4FAAF,EAAuC,GAAvC,CAAjC;AAEA,UAAK0F,eAAL,GAAuB,EAAvB;AAEA,UAAKxJ,KAAL,GAAa;AACZyJ,iBAAW,EAAE,EADD;AAEZC,qBAAe,EAAE,KAFL;AAGZC,wBAAkB,EAAE;AAHR,KAAb;AAXkC;AAgBlC;;;;yCAEoB;AAAA;;AAAA,wBAC4B,KAAK3J,KADjC;AAAA,UACZ0J,eADY,eACZA,eADY;AAAA,UACKC,kBADL,eACKA,kBADL,EAEpB;AACA;;AACA,UAAKD,eAAe,IAAIC,kBAAkB,KAAK,IAA1C,IAAkD,CAAE,KAAKC,iBAA9D,EAAkF;AACjF,aAAKA,iBAAL,GAAyB,IAAzB;AACAC,oEAAc,CAAE,KAAKL,eAAL,CAAsBG,kBAAtB,CAAF,EAA8C,KAAKnJ,eAAL,CAAqB4F,OAAnE,EAA4E;AACzF0D,4BAAkB,EAAE;AADqE,SAA5E,CAAd;AAIA,aAAK/J,KAAL,CAAWgK,UAAX,CAAuB,YAAM;AAC5B,gBAAI,CAACH,iBAAL,GAAyB,KAAzB;AACA,SAFD,EAEG,GAFH;AAGA;AACD;;;2CAEsB;AACtB,aAAO,KAAKI,kBAAZ;AACA;;;uCAEmBC,K,EAAQ;AAAA;;AAC3B,aAAO,UAAEC,GAAF,EAAW;AACjB,cAAI,CAACV,eAAL,CAAsBS,KAAtB,IAAgCC,GAAhC;AACA,OAFD;AAGA;;;sCAEkB9J,K,EAAQ;AAAA;;AAE1B;AACA;AACA,UAAKA,KAAK,CAAC6F,MAAN,GAAe,CAAf,IAAoB,WAAWkB,IAAX,CAAiB/G,KAAjB,CAAzB,EAAoD;AACnD,aAAK8E,QAAL,CAAe;AACdwE,yBAAe,EAAE,KADH;AAEdC,4BAAkB,EAAE,IAFN;AAGdQ,iBAAO,EAAE;AAHK,SAAf;AAMA;AACA;;AAED,WAAKjF,QAAL,CAAe;AACdwE,uBAAe,EAAE,IADH;AAEdC,0BAAkB,EAAE,IAFN;AAGdQ,eAAO,EAAE;AAHK,OAAf;AAMA,UAAMC,OAAO,GAAG1B,oBAAoB,CAAEtI,KAAF,CAApC;AAEAgK,aAAO,CAAC5D,IAAR,CAAc,UAAEiD,WAAF,EAAmB;AAChC;AACA;AACA;AACA,YAAK,MAAI,CAACO,kBAAL,KAA4BI,OAAjC,EAA2C;AAC1C;AACA;;AAED,cAAI,CAAClF,QAAL,CAAe;AACduE,qBAAW,EAAXA,WADc;AAEdU,iBAAO,EAAE;AAFK,SAAf;;AAKA,YAAK,CAAC,CAAEV,WAAW,CAACxD,MAApB,EAA6B;AAC5B,gBAAI,CAAClG,KAAL,CAAWsK,cAAX,CAA2B9B,gEAAO,CAAE+B,2DAAE,CACrC,0DADqC,EAErC,2DAFqC,EAGrCb,WAAW,CAACxD,MAHyB,CAAJ,EAI/BwD,WAAW,CAACxD,MAJmB,CAAlC,EAIyB,WAJzB;AAKA,SAND,MAMO;AACN,gBAAI,CAAClG,KAAL,CAAWsK,cAAX,CAA2B5J,2DAAE,CAAE,aAAF,CAA7B,EAAgD,WAAhD;AACA;AACD,OAtBD,EAsBIkG,KAtBJ,CAsBW,YAAM;AAChB,YAAK,MAAI,CAACqD,kBAAL,KAA4BI,OAAjC,EAA2C;AAC1C,gBAAI,CAAClF,QAAL,CAAe;AACdiF,mBAAO,EAAE;AADK,WAAf;AAGA;AACD,OA5BD;AA8BA,WAAKH,kBAAL,GAA0BI,OAA1B;AACA;;;6BAESxK,K,EAAQ;AACjB,UAAMwE,UAAU,GAAGxE,KAAK,CAAC+C,MAAN,CAAavC,KAAhC;AACA,WAAKL,KAAL,CAAWqF,QAAX,CAAqBhB,UAArB;AACA,WAAKkF,iBAAL,CAAwBlF,UAAxB;AACA;;;8BAEUxE,K,EAAQ;AAAA,yBACoD,KAAKI,KADzD;AAAA,UACV0J,eADU,gBACVA,eADU;AAAA,UACOC,kBADP,gBACOA,kBADP;AAAA,UAC2BF,WAD3B,gBAC2BA,WAD3B;AAAA,UACwCU,OADxC,gBACwCA,OADxC,EAElB;AACA;;AACA,UAAK,CAAET,eAAF,IAAqB,CAAED,WAAW,CAACxD,MAAnC,IAA6CkE,OAAlD,EAA4D;AAC3D;AACA;AACA;AACA;AACA;AACA,gBAASvK,KAAK,CAACqF,OAAf;AACC;AACA;AACA,eAAKJ,uDAAL;AAAS;AACR,kBAAK,MAAMjF,KAAK,CAAC+C,MAAN,CAAa4H,cAAxB,EAAyC;AACxC3K,qBAAK,CAACC,eAAN;AACAD,qBAAK,CAAC+F,cAAN,GAFwC,CAIxC;;AACA/F,qBAAK,CAAC+C,MAAN,CAAa6H,iBAAb,CAAgC,CAAhC,EAAmC,CAAnC;AACA;;AACD;AACA;AACD;AACA;;AACA,eAAK7F,yDAAL;AAAW;AACV,kBAAK,KAAK5E,KAAL,CAAWK,KAAX,CAAiB6F,MAAjB,KAA4BrG,KAAK,CAAC+C,MAAN,CAAa4H,cAA9C,EAA+D;AAC9D3K,qBAAK,CAACC,eAAN;AACAD,qBAAK,CAAC+F,cAAN,GAF8D,CAI9D;;AACA/F,qBAAK,CAAC+C,MAAN,CAAa6H,iBAAb,CAAgC,KAAKzK,KAAL,CAAWK,KAAX,CAAiB6F,MAAjD,EAAyD,KAAKlG,KAAL,CAAWK,KAAX,CAAiB6F,MAA1E;AACA;;AACD;AACA;AAxBF;;AA2BA;AACA;;AAED,UAAMwE,UAAU,GAAG,KAAKzK,KAAL,CAAWyJ,WAAX,CAAwB,KAAKzJ,KAAL,CAAW2J,kBAAnC,CAAnB;;AAEA,cAAS/J,KAAK,CAACqF,OAAf;AACC,aAAKJ,uDAAL;AAAS;AACRjF,iBAAK,CAACC,eAAN;AACAD,iBAAK,CAAC+F,cAAN;AACA,gBAAM+E,aAAa,GAAG,CAAEf,kBAAF,GAAuBF,WAAW,CAACxD,MAAZ,GAAqB,CAA5C,GAAgD0D,kBAAkB,GAAG,CAA3F;AACA,iBAAKzE,QAAL,CAAe;AACdyE,gCAAkB,EAAEe;AADN,aAAf;AAGA;AACA;;AACD,aAAK/F,yDAAL;AAAW;AACV/E,iBAAK,CAACC,eAAN;AACAD,iBAAK,CAAC+F,cAAN;AACA,gBAAMgF,SAAS,GAAGhB,kBAAkB,KAAK,IAAvB,IAAiCA,kBAAkB,KAAKF,WAAW,CAACxD,MAAZ,GAAqB,CAA7E,GAAmF,CAAnF,GAAuF0D,kBAAkB,GAAG,CAA9H;AACA,iBAAKzE,QAAL,CAAe;AACdyE,gCAAkB,EAAEgB;AADN,aAAf;AAGA;AACA;;AACD,aAAKC,wDAAL;AAAU;AACT,gBAAK,KAAK5K,KAAL,CAAW2J,kBAAX,KAAkC,IAAvC,EAA8C;AAC7C,mBAAKkB,UAAL,CAAiBJ,UAAjB,EAD6C,CAE7C;;AACA,mBAAK1K,KAAL,CAAW6F,KAAX,CAAkBnF,2DAAE,CAAE,gBAAF,CAApB;AACA;;AACD;AACA;;AACD,aAAKsE,0DAAL;AAAY;AACX,gBAAK,KAAK/E,KAAL,CAAW2J,kBAAX,KAAkC,IAAvC,EAA8C;AAC7C/J,mBAAK,CAACC,eAAN;AACA,mBAAKgL,UAAL,CAAiBJ,UAAjB;AACA;;AACD;AACA;AAjCF;AAmCA;;;+BAEWA,U,EAAa;AACxB,WAAK1K,KAAL,CAAWqF,QAAX,CAAqBqF,UAAU,CAAC9J,GAAhC,EAAqC8J,UAArC;AACA,WAAKvF,QAAL,CAAe;AACdyE,0BAAkB,EAAE,IADN;AAEdD,uBAAe,EAAE;AAFH,OAAf;AAIA;;;kCAEce,U,EAAa;AAC3B,WAAKI,UAAL,CAAiBJ,UAAjB,EAD2B,CAE3B;;AACA,WAAKpB,QAAL,CAAcjD,OAAd,CAAsB0E,KAAtB;AACA;;;6BAEQ;AAAA;;AAAA,wBACwD,KAAK/K,KAD7D;AAAA,0CACAK,KADA;AAAA,UACAA,KADA,kCACQ,EADR;AAAA,8CACY2K,SADZ;AAAA,UACYA,SADZ,sCACwB,IADxB;AAAA,UAC8BC,UAD9B,eAC8BA,UAD9B;AAAA,UAC0CC,SAD1C,eAC0CA,SAD1C;AAAA,yBAE8D,KAAKjL,KAFnE;AAAA,UAEA0J,eAFA,gBAEAA,eAFA;AAAA,UAEiBD,WAFjB,gBAEiBA,WAFjB;AAAA,UAE8BE,kBAF9B,gBAE8BA,kBAF9B;AAAA,UAEkDQ,OAFlD,gBAEkDA,OAFlD;AAIR,UAAMe,oBAAoB,gDAA0CF,UAA1C,CAA1B;AACA,UAAMG,wBAAwB,+CAAyCH,UAAzC,CAA9B;AAEA;;AACA,aACC;AAAK,iBAAS,EAAGjK,kDAAU,CAAE,yCAAF,EAA6CkK,SAA7C;AAA3B,SACC;AACC,iBAAS,EAAGF,SADb;AAEC,YAAI,EAAC,MAFN;AAGC,sBAAatK,2DAAE,CAAE,KAAF,CAHhB;AAIC,gBAAQ,MAJT;AAKC,aAAK,EAAGL,KALT;AAMC,gBAAQ,EAAG,KAAKgF,QANjB;AAOC,eAAO,EAAGqD,oBAPX;AAQC,mBAAW,EAAGhI,2DAAE,CAAE,8CAAF,CARjB;AASC,iBAAS,EAAG,KAAKH,SATlB;AAUC,YAAI,EAAC,UAVN;AAWC,yBAAgBoJ,eAXjB;AAYC,6BAAkB,MAZnB;AAaC,qBAAYwB,oBAbb;AAcC,iCAAwBvB,kBAAkB,KAAK,IAAvB,aAAkCwB,wBAAlC,cAAgExB,kBAAhE,IAAwFyB,SAdjH;AAeC,WAAG,EAAG,KAAK/B;AAfZ,QADD,EAmBKc,OAAF,IAAe,yEAAC,8DAAD,OAnBlB,EAqBGT,eAAe,IAAI,CAAC,CAAED,WAAW,CAACxD,MAAlC,IACD,yEAAC,8DAAD;AAAS,gBAAQ,EAAC,QAAlB;AAA2B,eAAO,MAAlC;AAAmC,oBAAY,EAAG;AAAlD,SACC;AACC,iBAAS,EAAC,mEADX;AAEC,UAAE,EAAGiF,oBAFN;AAGC,WAAG,EAAG,KAAK1K,eAHZ;AAIC,YAAI,EAAC;AAJN,SAMGiJ,WAAW,CAACT,GAAZ,CAAiB,UAAEyB,UAAF,EAAcR,KAAd;AAAA,eAClB;AACC,aAAG,EAAGQ,UAAU,CAACY,EADlB;AAEC,cAAI,EAAC,QAFN;AAGC,kBAAQ,EAAC,IAHV;AAIC,YAAE,YAAOF,wBAAP,cAAqClB,KAArC,CAJH;AAKC,aAAG,EAAG,MAAI,CAACqB,kBAAL,CAAyBrB,KAAzB,CALP;AAMC,mBAAS,EAAGlJ,kDAAU,CAAE,iEAAF,EAAqE;AAC1F,2BAAekJ,KAAK,KAAKN;AADiE,WAArE,CANvB;AASC,iBAAO,EAAG;AAAA,mBAAM,MAAI,CAAC4B,aAAL,CAAoBd,UAApB,CAAN;AAAA,WATX;AAUC,2BAAgBR,KAAK,KAAKN;AAV3B,WAYGc,UAAU,CAACvB,KAZd,CADkB;AAAA,OAAjB,CANH,CADD,CAtBF,CADD;AAmDA;AACA;;;;EAnQqBpC,4D;AAsQvB;;;;;AAGe0E,kIAAO,CACrBC,mEADqB,EAErB1E,yEAFqB,EAGrB2E,kEAHqB,EAIrBC,mEAAU,CAAE,UAAEC,MAAF,EAAc;AAAA,gBACDA,MAAM,CAAE,mBAAF,CADL;AAAA,MACjBC,WADiB,WACjBA,WADiB;;AAEzB,SAAO;AACNnD,wBAAoB,EAAEmD,WAAW,GAAGC;AAD9B,GAAP;AAGA,CALS,CAJW,CAAP,CAUZ1C,QAVY,CAAf,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjTA;;;AAGA;AACA;AACA;AACA;AAOA;AACA;AACA;AAEA;;;;AAGA,IAAM2C,IAAI,GAAG,yBAAb;;AACA,IAAM7C,KAAK,GAAGzI,0DAAE,CAAE,aAAF,CAAhB;;AAEO,IAAMuL,UAAU,GAAG;AACxBD,MAAI,EAAJA,IADwB;AAExB7C,OAAK,EAALA,KAFwB;AAGxB+C,SAAO,EAAE,GAHe;AAIxBhB,WAAS,EAAE,aAJa;AAKxB5C,YAAU,EAAE;AACV1H,OAAG,EAAE,MADK;AAEVgC,UAAM,EAAE;AAFE,GALY;AASxBuJ,MAAI,EAAEnF,gFAAkB;AAAA;AAAA;AAAA;;AACtB,wBAAc;AAAA;;AAAA;;AACZ,+MAAUlD,SAAV;AAEA,YAAKsI,OAAL,GAAe,MAAKA,OAAL,CAAarI,IAAb,4FAAf;AACA,YAAKwC,cAAL,GAAsB,MAAKA,cAAL,CAAoBxC,IAApB,4FAAtB;AACA,YAAKsI,cAAL,GAAsB,MAAKA,cAAL,CAAoBtI,IAApB,4FAAtB;AACA,YAAK9D,KAAL,GAAa;AACXC,kBAAU,EAAE;AADD,OAAb;AANY;AASb;;AAVqB;AAAA;AAAA,gCAYZ;AAAA,0BACoB,KAAKF,KADzB;AAAA,YACAK,KADA,eACAA,KADA;AAAA,YACOgF,QADP,eACOA,QADP;AAER,YAAMM,IAAI,GAAGJ,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAA3B;;AAEA,YAAKsF,IAAI,IAAI2G,6DAAK,CAAE3G,IAAF,CAAlB,EAA6B;AAC3BN,kBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAAS;AAAEgI,gBAAI,EAAE2D,IAAR;AAAc1D,sBAAU,EAAE;AAAE1H,iBAAG,EAAE+E;AAAP;AAA1B,WAAT,CAAb,CAAR;AACD,SAFD,MAEO;AACL,eAAKR,QAAL,CAAe;AAAEjF,sBAAU,EAAE;AAAd,WAAf;AACD;AACF;AArBqB;AAAA;AAAA,uCAuBL;AACf,aAAKiF,QAAL,CAAe;AAAEjF,oBAAU,EAAE;AAAd,SAAf;AACD;AAzBqB;AAAA;AAAA,uCA2BL;AAAA,2BACoB,KAAKF,KADzB;AAAA,YACPK,KADO,gBACPA,KADO;AAAA,YACAgF,QADA,gBACAA,QADA;AAAA,YACUQ,KADV,gBACUA,KADV;AAGfR,gBAAQ,CAAEkH,0EAAY,CAAElM,KAAF,EAAS2L,IAAT,CAAd,CAAR;AACAnG,aAAK,CAAEnF,0DAAE,CAAE,eAAF,CAAJ,EAAyB,WAAzB,CAAL;AACD;AAhCqB;AAAA;AAAA,+BAkCb;AAAA,2BACiD,KAAKV,KADtD;AAAA,YACCqB,QADD,gBACCA,QADD;AAAA,YACW+D,gBADX,gBACWA,gBADX;AAAA,YAC6B/E,KAD7B,gBAC6BA,KAD7B;AAAA,YACoCgF,QADpC,gBACoCA,QADpC;AAGP,eACE,4IACE,yEAAC,yEAAD;AACE,cAAI,EAAC,SADP;AAEE,mBAAS,EAAC,GAFZ;AAGE,eAAK,EAAG,KAAK+G;AAHf,UADF,EAME,yEAAC,yEAAD;AACE,cAAI,EAAC,cADP;AAEE,mBAAS,EAAC,GAFZ;AAGE,eAAK,EAAG,KAAKC;AAHf,UANF,EAWIhL,QAAQ,IAAI,yEAAC,8EAAD;AACZ,cAAI,EAAC,aADO;AAEZ,eAAK,EAAGX,0DAAE,CAAE,QAAF,CAFE;AAGZ,iBAAO,EAAG,KAAK2L,cAHH;AAIZ,kBAAQ,EAAGhL,QAJC;AAKZ,sBAAY,EAAC,cALD;AAMZ,2BAAiB,EAAC;AANN,UAXhB,EAmBI,CAAEA,QAAF,IAAc,yEAAC,8EAAD;AACd,cAAI,EAAC,aADS;AAEd,eAAK,EAAG8H,KAFM;AAGd,iBAAO,EAAG,KAAKiD,OAHD;AAId,kBAAQ,EAAG/K,QAJG;AAKd,sBAAY,EAAC,SALC;AAMd,2BAAiB,EAAC;AANJ,UAnBlB,EA2BE,yEAAC,gEAAD;AACE,oBAAU,EAAG,KAAKpB,KAAL,CAAWC,UAD1B;AAEE,wBAAc,EAAG,KAAKqG,cAFxB;AAGE,kBAAQ,EAAGlF,QAHb;AAIE,0BAAgB,EAAG+D,gBAJrB;AAKE,eAAK,EAAG/E,KALV;AAME,kBAAQ,EAAGgF;AANb,UA3BF,CADF;AAsCD;AA3EqB;;AAAA;AAAA,IAAyB0B,4DAAzB;AATA,CAAnB;;AAyFP,SAASyF,eAAT,GAA4B;AAC1B,GACEP,UADF,EAEEQ,OAFF,CAEW;AAAA,QAAIT,IAAJ,QAAIA,IAAJ;AAAA,QAAaU,QAAb;;AAAA,WAA6BC,gFAAkB,CAAEX,IAAF,EAAQU,QAAR,CAA/C;AAAA,GAFX;AAGD;;AAAA;AACDF,eAAe,G;;;;;;;;;;;ACrHf;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wC;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA,mC;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACNA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;;;;;AChBA;AACA;AACA,mBAAmB,sBAAsB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,0B;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACPA,qBAAqB,mBAAO,CAAC,iFAAkB;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,2B;;;;;;;;;;;ACjBA,mCAAmC,mBAAO,CAAC,6GAAgC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0C;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;;AAEA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+C;;;;;;;;;;;ACfA,cAAc,mBAAO,CAAC,0EAAmB;;AAEzC,4BAA4B,mBAAO,CAAC,+FAAyB;;AAE7D;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4C;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;;;;;ACTA,wBAAwB,2EAA2E,oCAAoC,mBAAmB,GAAG,EAAE,OAAO,oCAAoC,8HAA8H,GAAG,EAAE,sBAAsB;;AAEnW;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yB;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gBAAgB;;AAEhB;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE,UAAU,IAA4E;AACxF;AACA,EAAE,iCAAqB,EAAE,mCAAE;AAC3B;AACA,GAAG;AAAA,oGAAC;AACJ,EAAE,MAAM,EAEN;AACF,CAAC;;;;;;;;;;;;;ACnDY;;AAEb,WAAW,mBAAO,CAAC,+DAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;;;;;;;AChIa;;AAEb,iBAAiB,mBAAO,CAAC,+FAAwB,E;;;;;;;;;;;;ACFpC;;AAEb,mDAAmD,gBAAgB,sBAAsB,OAAO,2BAA2B,0BAA0B,yDAAyD,2BAA2B,EAAE,EAAE,EAAE,eAAe;;AAE9P,oGAAoG,mBAAmB,EAAE,mBAAmB,kGAAkG;;AAE9O;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,kBAAkB;AAC/B;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,CAAC,Y;;;;;;;;;;;ACtbD,6EAA6E,mBAAmB,EAAE,gEAAgE,qBAAqB,EAAE,G;;;;;;;;;;;ACAzL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,uDAAQ;;AAE9B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAiB,mBAAmB;AACpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA,mBAAmB,2BAA2B;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;;AAEA;AACA;;AAEA,iBAAiB,2BAA2B;AAC5C;AACA;;AAEA,QAAQ,uBAAuB;AAC/B;AACA;AACA,GAAG;AACH;;AAEA,iBAAiB,uBAAuB;AACxC;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd,kDAAkD,sBAAsB;AACxE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA,KAAK,KAAwC,EAAE,EAE7C;;AAEF,QAAQ,sBAAiB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD;;AAEA,6BAA6B,mBAAmB;;AAEhD;;AAEA;;AAEA;AACA;;;;;;;;;;;;;AC9YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,WAAW,EAAE;AACrD,wCAAwC,WAAW,EAAE;;AAErD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC;AACtC,GAAG;AACH;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxFA,aAAa,6CAA6C,EAAE,I;;;;;;;;;;;ACA5D,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,4CAA4C,EAAE,I;;;;;;;;;;;ACA3D,aAAa,2CAA2C,EAAE,I;;;;;;;;;;;ACA1D,aAAa,wCAAwC,EAAE,I;;;;;;;;;;;ACAvD,aAAa,qCAAqC,EAAE,I;;;;;;;;;;;ACApD,aAAa,oCAAoC,EAAE,I;;;;;;;;;;;ACAnD,aAAa,wCAAwC,EAAE,I;;;;;;;;;;;ACAvD,aAAa,6CAA6C,EAAE,I;;;;;;;;;;;ACA5D,aAAa,qCAAqC,EAAE,I;;;;;;;;;;;ACApD,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,oCAAoC,EAAE,I;;;;;;;;;;;ACAnD,aAAa,iCAAiC,EAAE,I","file":"editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","export { default as URLInput } from './url-input';","/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { Component, Fragment, createRef, useMemo } from '@wordpress/element';\nimport {\n\tExternalLink,\n\tIconButton,\n\tToggleControl,\n\tButton,\n\tTextControl,\n\tNotice,\n\tSpinner,\n\twithSpokenMessages,\n} from '@wordpress/components';\nimport { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';\nimport { getRectangleFromRange } from '@wordpress/dom';\nimport { prependHTTP, safeDecodeURI, filterURLForDisplay } from '@wordpress/url';\nimport {\n\tcreate,\n\tinsert,\n\tisCollapsed,\n\tapplyFormat,\n\tgetTextContent,\n\tslice,\n} from '@wordpress/rich-text';\nimport { URLPopover } from '@wordpress/block-editor';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport URLInput from '../url-input';\nimport './style.scss';\n\n/**\n * Internal dependencies\n */\nimport { createLinkFormat, isValidHref } from './utils';\n\nconst stopKeyPropagation = ( event ) => event.stopPropagation();\n\nfunction isShowingInput( props, state ) {\n\treturn props.addingLink || state.editLink;\n}\n\nconst LinkEditor = ( { value, onChangeInputValue, onKeyDown, submitLink, autocompleteRef } ) => (\n\t// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar\n\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\n\t<form\n\t\tclassName=\"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content\"\n\t\tonKeyPress={ stopKeyPropagation }\n\t\tonKeyDown={ onKeyDown }\n\t\tonSubmit={ submitLink }\n\t>\n\t\t<URLInput\n\t\t\tvalue={ value }\n\t\t\tonChange={ onChangeInputValue }\n\t\t\tautocompleteRef={ autocompleteRef }\n\t\t/>\n\t\t<IconButton icon=\"editor-break\" label={ __( 'Insert Pretty Link' ) } type=\"submit\" />\n\t</form>\n\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions */\n);\n\nconst LinkViewerUrl = ( { url } ) => {\n\tconst prependedURL = prependHTTP( url );\n\tconst linkClassName = classnames( 'editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value', {\n\t\t'has-invalid-link': ! isValidHref( prependedURL ),\n\t} );\n\n\tif ( ! url ) {\n\t\treturn <span className={ linkClassName }></span>;\n\t}\n\n\treturn (\n\t\t<ExternalLink\n\t\t\tclassName={ linkClassName }\n\t\t\thref={ url }\n\t\t>\n\t\t\t{ filterURLForDisplay( safeDecodeURI( url ) ) }\n\t\t</ExternalLink>\n\t);\n};\n\nconst URLPopoverAtLink = ( { isActive, addingLink, value, ...props } ) => {\n\tconst anchorRect = useMemo( () => {\n\t\tconst selection = window.getSelection();\n\t\tconst range = selection.rangeCount > 0 ? selection.getRangeAt( 0 ) : null;\n\t\tif ( ! range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( addingLink ) {\n\t\t\treturn getRectangleFromRange( range );\n\t\t}\n\n\t\tlet element = range.startContainer;\n\n\t\t// If the caret is right before the element, select the next element.\n\t\telement = element.nextElementSibling || element;\n\n\t\twhile ( element.nodeType !== window.Node.ELEMENT_NODE ) {\n\t\t\telement = element.parentNode;\n\t\t}\n\n\t\tconst closest = element.closest( 'a' );\n\t\tif ( closest ) {\n\t\t\treturn closest.getBoundingClientRect();\n\t\t}\n\t}, [ isActive, addingLink, value.start, value.end ] );\n\n\tif ( ! anchorRect ) {\n\t\treturn null;\n\t}\n\n\treturn <URLPopover anchorRect={ anchorRect } { ...props } />;\n};\n\nconst LinkViewer = ( { url, editLink } ) => {\n\treturn (\n\t\t// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar\n\t\t/* eslint-disable jsx-a11y/no-static-element-interactions */\n\t\t<div\n\t\t\tclassName=\"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content\"\n\t\t\tonKeyPress={ stopKeyPropagation }\n\t\t>\n\t\t\t<LinkViewerUrl url={ url } />\n\t\t\t<IconButton icon=\"edit\" label={ __( 'Edit' ) } onClick={ editLink } />\n\t\t</div>\n\t\t/* eslint-enable jsx-a11y/no-static-element-interactions */\n\t);\n};\n\nconst createNewPrettyLink = (target, slug) => {\n\treturn new Promise((resolve, reject) => {\n\t\tjQuery.post(\n\t\t\tajaxurl, \n\t\t\t{\n\t\t\t\taction: 'prli_create_pretty_link',\n\t\t\t\ttarget: target,\n\t\t\t\tslug: slug,\n\t\t\t\tredirect: '',\n\t\t\t\tnofollow: 1,\n\t\t\t\ttracking: 1\n\t\t\t}, \n\t\t\t(data, textStatus, xhr) => {\n\t\t\t\t'true' === data ? resolve(data) : reject(data);\n\t\t\t}\n\t \t).fail(error => {\n\t \t\treject(error);\n\t \t});\n\t});\n}\n\nclass InlineLinkUI extends Component {\n\tconstructor() {\n\t\tsuper( ...arguments );\n\n\t\tthis.editLink = this.editLink.bind( this );\n\t\tthis.submitLink = this.submitLink.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.onChangeInputValue = this.onChangeInputValue.bind( this );\n\t\tthis.setLinkTarget = this.setLinkTarget.bind( this );\n\t\tthis.onClickOutside = this.onClickOutside.bind( this );\n\t\tthis.resetState = this.resetState.bind( this );\n\t\tthis.autocompleteRef = createRef();\n\n\t\tthis.state = {\n\t\t\topensInNewWindow: false,\n\t\t\tinputValue: '',\n\t\t\tnewLinkUrl: '',\n\t\t\tnewLinkSlug: '',\n\t\t\tcreatingLink: false,\n\t\t\tcreatedLink: false,\n\t\t\tcreatedLinkError: false\n\t\t};\n\t}\n\n\tstatic getDerivedStateFromProps( props, state ) {\n\t\tconst { activeAttributes: { url, target } } = props;\n\t\tconst opensInNewWindow = target === '_blank';\n\n\t\tif ( ! isShowingInput( props, state ) ) {\n\t\t\tif ( url !== state.inputValue ) {\n\t\t\t\treturn { inputValue: url };\n\t\t\t}\n\n\t\t\tif ( opensInNewWindow !== state.opensInNewWindow ) {\n\t\t\t\treturn { opensInNewWindow };\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tonKeyDown( event ) {\n\t\tif ( [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( event.keyCode ) > -1 ) {\n\t\t\t// Stop the key event from propagating up to ObserveTyping.startTypingInTextField.\n\t\t\tevent.stopPropagation();\n\t\t}\n\t}\n\n\tonChangeInputValue( inputValue ) {\n\t\tthis.setState( { inputValue } );\n\t}\n\n\tsetLinkTarget( opensInNewWindow ) {\n\t\tconst { activeAttributes: { url = '' }, value, onChange } = this.props;\n\n\t\tthis.setState( { opensInNewWindow } );\n\n\t\t// Apply now if URL is not being edited.\n\t\tif ( ! isShowingInput( this.props, this.state ) ) {\n\t\t\tconst selectedText = getTextContent( slice( value ) );\n\n\t\t\tonChange( applyFormat( value, createLinkFormat( {\n\t\t\t\turl,\n\t\t\t\topensInNewWindow,\n\t\t\t\ttext: selectedText,\n\t\t\t} ) ) );\n\t\t}\n\t}\n\n\teditLink( event ) {\n\t\tthis.setState( { editLink: true } );\n\t\tevent.preventDefault();\n\t}\n\n\tsubmitLink( event ) {\n\t\tconst { isActive, value, onChange, speak } = this.props;\n\t\tconst { inputValue, opensInNewWindow } = this.state;\n\t\tconst url = prependHTTP( inputValue );\n\t\tconst selectedText = getTextContent( slice( value ) );\n\t\tconst format = createLinkFormat( {\n\t\t\turl,\n\t\t\topensInNewWindow,\n\t\t\ttext: selectedText,\n\t\t} );\n\n\t\tevent.preventDefault();\n\n\t\tif ( isCollapsed( value ) && ! isActive ) {\n\t\t\tconst toInsert = applyFormat( create( { text: url } ), format, 0, url.length );\n\t\t\tonChange( insert( value, toInsert ) );\n\t\t} else {\n\t\t\tonChange( applyFormat( value, format ) );\n\t\t}\n\n\t\tthis.resetState();\n\n\t\tif ( ! isValidHref( url ) ) {\n\t\t\tspeak( __( 'Warning: the link has been inserted but may have errors. Please test it.' ), 'assertive' );\n\t\t} else if ( isActive ) {\n\t\t\tspeak( __( 'Link edited.' ), 'assertive' );\n\t\t} else {\n\t\t\tspeak( __( 'Link inserted.' ), 'assertive' );\n\t\t}\n\t}\n\n\tonClickOutside( event ) {\n\t\t// The autocomplete suggestions list renders in a separate popover (in a portal),\n\t\t// so onClickOutside fails to detect that a click on a suggestion occurred in the\n\t\t// LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and\n\t\t// return to avoid the popover being closed.\n\t\tconst autocompleteElement = this.autocompleteRef.current;\n\t\tif ( autocompleteElement && autocompleteElement.contains( event.target ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.resetState();\n\t}\n\n\tresetState() {\n\t\tthis.props.stopAddingLink();\n\t\tthis.setState( { editLink: false } );\n\t}\n\n\trender() {\n\t\tconst { isActive, activeAttributes: { url }, addingLink, value } = this.props;\n\n\t\tif ( ! isActive && ! addingLink ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { inputValue, opensInNewWindow, newLinkUrl, newLinkSlug, creatingLink, createdLink, createdLinkError } = this.state;\n\t\tconst showInput = isShowingInput( this.props, this.state );\n\n\t\treturn (\n\t\t\t<URLPopoverAtLink\n\t\t\t\tclassName=\"pretty-link-inserter\"\n\t\t\t\tvalue={ value }\n\t\t\t\tisActive={ isActive }\n\t\t\t\taddingLink={ addingLink }\n\t\t\t\tonClickOutside={ this.onClickOutside }\n\t\t\t\tonClose={ this.resetState }\n\t\t\t\tfocusOnMount={ showInput ? 'firstElement' : false }\n\t\t\t\trenderSettings={ () => (\n\t\t\t\t\t<Fragment>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Open in New Tab' ) }\n\t\t\t\t\t\t\t\tchecked={ opensInNewWindow }\n\t\t\t\t\t\t\t\tonChange={ this.setLinkTarget }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"pretty-link-inserter-form-container\">\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcreatedLink && (\n\t\t\t\t\t\t\t\t\t<Notice status=\"success\" onRemove={() => this.setState({createdLink: false})}>\n\t\t\t\t\t\t\t\t <p>{__( 'Pretty Link created successfully.', 'memberpress' )}</p>\n\t\t\t\t\t\t\t\t </Notice>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcreatedLinkError && (\n\t\t\t\t\t\t\t\t\t<Notice status=\"error\" onRemove={() => this.setState({createdLink: false, createdLinkError: false})}>\n\t\t\t\t\t\t\t\t <p>{__( 'Pretty Link could not be created. Please try a slug that is not already used.', 'memberpress' )}</p>\n\t\t\t\t\t\t\t\t </Notice>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t<strong>{__('New Pretty Link', 'pretty-link')}</strong>\n\t\t\t\t\t\t\t<form onSubmit={(event) => {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t// Send request to create new Pretty Link\n\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\tcreatingLink: true,\n\t\t\t\t\t\t\t\t\tcreatedLinkError: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tcreateNewPrettyLink( newLinkUrl, newLinkSlug )\n\t\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\t\t\tcreatedLink: true,\n\t\t\t\t\t\t\t\t\t\t\tcreatingLink: false,\n\t\t\t\t\t\t\t\t\t\t\tinputValue: plEditor.homeUrl + newLinkSlug,\n\t\t\t\t\t\t\t\t\t\t\tnewLinkUrl: '',\n\t\t\t\t\t\t\t\t\t\t\tnewLinkSlug: ''\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\t\t\tcreatedLink: false,\n\t\t\t\t\t\t\t\t\t\t\tcreatingLink: false,\n\t\t\t\t\t\t\t\t\t\t\tcreatedLinkError: true,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t placeholder=\"URL\"\n\t\t\t\t\t\t\t\t className=\"pretty-link-new-link-url\"\n\t\t\t\t\t\t\t\t value={newLinkUrl}\n\t\t\t\t\t\t\t\t onChange={ ( newLinkUrl ) => {\n\t\t\t\t\t\t\t\t \tthis.setState( { newLinkUrl } );\n\t\t\t\t\t\t\t\t } }\n\t\t\t\t\t\t\t\t />\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t \t<p>\n\t\t\t\t \t\t\t\t<TextControl\n\t\t\t\t \t\t\t placeholder=\"Slug\"\n\t\t\t\t \t\t\t className=\"pretty-link-new-link-slug\"\n\t\t\t\t \t\t\t value={newLinkSlug}\n\t\t\t\t \t\t\t onChange={ ( newLinkSlug ) => {\n\t\t\t\t \t\t\t \tthis.setState( { newLinkSlug } );\n\t\t\t\t \t\t\t } }\n\t\t\t\t \t\t\t />\n\t\t\t\t\t\t \t</p>\n\t\t\t\t\t\t \t<p>\n\t\t\t\t\t\t \t\t<button \n\t\t\t\t\t\t \t\t\tclassName=\"pretty-link-submit-new-link components-button is-button is-primary\"\n\t\t\t\t\t\t \t\t\tonClick={ () => {\n\t\t\t\t\t\t \t\t\t\tconsole.log('Creating new Pretty Link...');\n\t\t\t\t\t\t \t\t\t} }\n\t\t\t\t\t\t \t\t>\n\t\t\t\t\t\t \t\t\t{ __( 'Create New Pretty Link', 'pretty-link' ) }\n\t\t\t\t\t\t \t\t</button>\n\t\t\t\t\t\t \t\t{\n\t\t\t\t\t\t \t\t\tcreatingLink && (\n\t\t\t\t\t\t \t\t\t\t<Spinner />\n\t\t\t\t\t\t \t\t\t)\n\t\t\t\t\t\t \t\t}\n\t\t\t\t\t\t \t</p>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Fragment>\n\t\t\t\t) }\n\t\t\t>\n\t\t\t\t{ showInput ? (\n\t\t\t\t\t<LinkEditor\n\t\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\t\tonChangeInputValue={ this.onChangeInputValue }\n\t\t\t\t\t\tonKeyDown={ this.onKeyDown }\n\t\t\t\t\t\tsubmitLink={ this.submitLink }\n\t\t\t\t\t\tautocompleteRef={ this.autocompleteRef }\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<LinkViewer\n\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\teditLink={ this.editLink }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</URLPopoverAtLink>\n\t\t);\n\t}\n}\n\nexport default withSpokenMessages( InlineLinkUI );\n","\nvar content = require(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","/**\n * External dependencies\n */\nimport { startsWith } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tgetProtocol,\n\tisValidProtocol,\n\tgetAuthority,\n\tisValidAuthority,\n\tgetPath,\n\tisValidPath,\n\tgetQueryString,\n\tisValidQueryString,\n\tgetFragment,\n\tisValidFragment,\n} from '@wordpress/url';\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Check for issues with the provided href.\n *\n * @param {string} href The href.\n *\n * @return {boolean} Is the href invalid?\n */\nexport function isValidHref( href ) {\n\tif ( ! href ) {\n\t\treturn false;\n\t}\n\n\tconst trimmedHref = href.trim();\n\n\tif ( ! trimmedHref ) {\n\t\treturn false;\n\t}\n\n\t// Does the href start with something that looks like a URL protocol?\n\tif ( /^\\S+:/.test( trimmedHref ) ) {\n\t\tconst protocol = getProtocol( trimmedHref );\n\t\tif ( ! isValidProtocol( protocol ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Add some extra checks for http(s) URIs, since these are the most common use-case.\n\t\t// This ensures URIs with an http protocol have exactly two forward slashes following the protocol.\n\t\tif ( startsWith( protocol, 'http' ) && ! /^https?:\\/\\/[^\\/\\s]/i.test( trimmedHref ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst authority = getAuthority( trimmedHref );\n\t\tif ( ! isValidAuthority( authority ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst path = getPath( trimmedHref );\n\t\tif ( path && ! isValidPath( path ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst queryString = getQueryString( trimmedHref );\n\t\tif ( queryString && ! isValidQueryString( queryString ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst fragment = getFragment( trimmedHref );\n\t\tif ( fragment && ! isValidFragment( fragment ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Validate anchor links.\n\tif ( startsWith( trimmedHref, '#' ) && ! isValidFragment( trimmedHref ) ) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Generates the format object that will be applied to the link text.\n *\n * @param {string} url The href of the link.\n * @param {boolean} opensInNewWindow Whether this link will open in a new window.\n * @param {Object} text The text that is being hyperlinked.\n *\n * @return {Object} The final format object.\n */\nexport function createLinkFormat( { url, opensInNewWindow, text } ) {\n\tconst format = {\n\t\ttype: 'core/link',\n\t\tattributes: {\n\t\t\turl,\n\t\t},\n\t};\n\n\tif ( opensInNewWindow ) {\n\t\t// translators: accessibility label for external links, where the argument is the link text\n\t\tconst label = sprintf( __( '%s (opens in a new tab)' ), text );\n\n\t\tformat.attributes.target = '_blank';\n\t\tformat.attributes.rel = 'noreferrer noopener';\n\t\tformat.attributes[ 'aria-label' ] = label;\n\t}\n\n\treturn format;\n}\n","/**\n * External dependencies\n */\nimport { throttle, map, pick, defaultTo } from 'lodash';\nimport classnames from 'classnames';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n/**\n * WordPress dependencies\n */\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { Component, createRef } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport { Spinner, withSpokenMessages, Popover } from '@wordpress/components';\nimport { withInstanceId, withSafeTimeout, compose } from '@wordpress/compose';\nimport { withSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\n\n// Since URLInput is rendered in the context of other inputs, but should be\n// considered a separate modal node, prevent keyboard events from propagating\n// as being considered from the input.\nconst stopEventPropagation = ( event ) => event.stopPropagation();\n\nconst fetchLinkSuggestions = async ( search ) => {\n\n\tconst links = await apiFetch( {\n\t\turl: addQueryArgs( ajaxurl, {\n\t\t\taction: 'prli_search_for_links',\n\t\t\tterm: search,\n\t\t} ),\n\t} );\n\n\treturn map( links, ( link ) => ( {\n\t\turl: plEditor.homeUrl + link.slug,\n\t\ttitle: decodeEntities( link.value ) + ' (' + decodeEntities( link.slug ) + ')' || __( '(no title)' ),\n\t} ) );\n};\n\nclass URLInput extends Component {\n\tconstructor( { autocompleteRef } ) {\n\t\tsuper( ...arguments );\n\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.autocompleteRef = autocompleteRef || createRef();\n\t\tthis.inputRef = createRef();\n\t\tthis.updateSuggestions = throttle( this.updateSuggestions.bind( this ), 200 );\n\n\t\tthis.suggestionNodes = [];\n\n\t\tthis.state = {\n\t\t\tsuggestions: [],\n\t\t\tshowSuggestions: false,\n\t\t\tselectedSuggestion: null,\n\t\t};\n\t}\n\n\tcomponentDidUpdate() {\n\t\tconst { showSuggestions, selectedSuggestion } = this.state;\n\t\t// only have to worry about scrolling selected suggestion into view\n\t\t// when already expanded\n\t\tif ( showSuggestions && selectedSuggestion !== null && ! this.scrollingIntoView ) {\n\t\t\tthis.scrollingIntoView = true;\n\t\t\tscrollIntoView( this.suggestionNodes[ selectedSuggestion ], this.autocompleteRef.current, {\n\t\t\t\tonlyScrollIfNeeded: true,\n\t\t\t} );\n\n\t\t\tthis.props.setTimeout( () => {\n\t\t\t\tthis.scrollingIntoView = false;\n\t\t\t}, 100 );\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tdelete this.suggestionsRequest;\n\t}\n\n\tbindSuggestionNode( index ) {\n\t\treturn ( ref ) => {\n\t\t\tthis.suggestionNodes[ index ] = ref;\n\t\t};\n\t}\n\n\tupdateSuggestions( value ) {\n\n\t\t// Show the suggestions after typing at least 2 characters\n\t\t// and also for URLs\n\t\tif ( value.length < 2 || /^https?:/.test( value ) ) {\n\t\t\tthis.setState( {\n\t\t\t\tshowSuggestions: false,\n\t\t\t\tselectedSuggestion: null,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState( {\n\t\t\tshowSuggestions: true,\n\t\t\tselectedSuggestion: null,\n\t\t\tloading: true,\n\t\t} );\n\n\t\tconst request = fetchLinkSuggestions( value );\n\n\t\trequest.then( ( suggestions ) => {\n\t\t\t// A fetch Promise doesn't have an abort option. It's mimicked by\n\t\t\t// comparing the request reference in on the instance, which is\n\t\t\t// reset or deleted on subsequent requests or unmounting.\n\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setState( {\n\t\t\t\tsuggestions,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\tif ( !! suggestions.length ) {\n\t\t\t\tthis.props.debouncedSpeak( sprintf( _n(\n\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\tsuggestions.length\n\t\t\t\t), suggestions.length ), 'assertive' );\n\t\t\t} else {\n\t\t\t\tthis.props.debouncedSpeak( __( 'No results.' ), 'assertive' );\n\t\t\t}\n\t\t} ).catch( () => {\n\t\t\tif ( this.suggestionsRequest === request ) {\n\t\t\t\tthis.setState( {\n\t\t\t\t\tloading: false,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tthis.suggestionsRequest = request;\n\t}\n\n\tonChange( event ) {\n\t\tconst inputValue = event.target.value;\n\t\tthis.props.onChange( inputValue );\n\t\tthis.updateSuggestions( inputValue );\n\t}\n\n\tonKeyDown( event ) {\n\t\tconst { showSuggestions, selectedSuggestion, suggestions, loading } = this.state;\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation\n\t\tif ( ! showSuggestions || ! suggestions.length || loading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif ( this.props.value.length !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position\n\t\t\t\t\t\tevent.target.setSelectionRange( this.props.value.length, this.props.value.length );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion = this.state.suggestions[ this.state.selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst previousIndex = ! selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: previousIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextIndex = selectedSuggestion === null || ( selectedSuggestion === suggestions.length - 1 ) ? 0 : selectedSuggestion + 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: nextIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tthis.props.speak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tselectLink( suggestion ) {\n\t\tthis.props.onChange( suggestion.url, suggestion );\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tshowSuggestions: false,\n\t\t} );\n\t}\n\n\thandleOnClick( suggestion ) {\n\t\tthis.selectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tthis.inputRef.current.focus();\n\t}\n\n\trender() {\n\t\tconst { value = '', autoFocus = true, instanceId, className } = this.props;\n\t\tconst { showSuggestions, suggestions, selectedSuggestion, loading } = this.state;\n\n\t\tconst suggestionsListboxId = `block-editor-url-input-suggestions-${ instanceId }`;\n\t\tconst suggestionOptionIdPrefix = `block-editor-url-input-suggestion-${ instanceId }`;\n\n\t\t/* eslint-disable jsx-a11y/no-autofocus */\n\t\treturn (\n\t\t\t<div className={ classnames( 'editor-url-input block-editor-url-input', className ) }>\n\t\t\t\t<input\n\t\t\t\t\tautoFocus={ autoFocus }\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\taria-label={ __( 'URL' ) }\n\t\t\t\t\trequired\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ this.onChange }\n\t\t\t\t\tonInput={ stopEventPropagation }\n\t\t\t\t\tplaceholder={ __( 'Paste or type to search for your Pretty Link' ) }\n\t\t\t\t\tonKeyDown={ this.onKeyDown }\n\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\taria-expanded={ showSuggestions }\n\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\taria-owns={ suggestionsListboxId }\n\t\t\t\t\taria-activedescendant={ selectedSuggestion !== null ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` : undefined }\n\t\t\t\t\tref={ this.inputRef }\n\t\t\t\t/>\n\n\t\t\t\t{ ( loading ) && <Spinner /> }\n\n\t\t\t\t{ showSuggestions && !! suggestions.length &&\n\t\t\t\t\t<Popover position=\"bottom\" noArrow focusOnMount={ false }>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"editor-url-input__suggestions block-editor-url-input__suggestions\"\n\t\t\t\t\t\t\tid={ suggestionsListboxId }\n\t\t\t\t\t\t\tref={ this.autocompleteRef }\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\ttabIndex=\"-1\"\n\t\t\t\t\t\t\t\t\tid={ `${ suggestionOptionIdPrefix }-${ index }` }\n\t\t\t\t\t\t\t\t\tref={ this.bindSuggestionNode( index ) }\n\t\t\t\t\t\t\t\t\tclassName={ classnames( 'editor-url-input__suggestion block-editor-url-input__suggestion', {\n\t\t\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t\tonClick={ () => this.handleOnClick( suggestion ) }\n\t\t\t\t\t\t\t\t\taria-selected={ index === selectedSuggestion }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover>\n\t\t\t\t}\n\t\t\t</div>\n\t\t);\n\t\t/* eslint-enable jsx-a11y/no-autofocus */\n\t}\n}\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/url-input/README.md\n */\nexport default compose(\n\twithSafeTimeout,\n\twithSpokenMessages,\n\twithInstanceId,\n\twithSelect( ( select ) => {\n\t\tconst { getSettings } = select( 'core/block-editor' );\n\t\treturn {\n\t\t\tfetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions,\n\t\t};\n\t} )\n)( URLInput );\n","/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { withSpokenMessages } from '@wordpress/components';\nimport { Component, Fragment } from '@wordpress/element';\nimport {\n getTextContent,\n applyFormat,\n removeFormat,\n slice,\n registerFormatType\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport { RichTextToolbarButton, RichTextShortcut } from '@wordpress/block-editor';\nimport InlineLinkUI from '../../components/link-editor';\n\n/**\n * Block constants\n */\nconst name = 'pretty-link/pretty-link';\nconst title = __( 'Pretty Link' );\n\nexport const prettyLink = {\n name,\n title,\n tagName: 'a',\n className: 'pretty-link',\n attributes: {\n url: 'href',\n target: 'target'\n },\n edit: withSpokenMessages( class LinkEdit extends Component {\n constructor() {\n super( ...arguments );\n\n this.addLink = this.addLink.bind( this );\n this.stopAddingLink = this.stopAddingLink.bind( this );\n this.onRemoveFormat = this.onRemoveFormat.bind( this );\n this.state = {\n addingLink: false,\n };\n }\n\n addLink() {\n const { value, onChange } = this.props;\n const text = getTextContent( slice( value ) );\n\n if ( text && isURL( text ) ) {\n onChange( applyFormat( value, { type: name, attributes: { url: text } } ) );\n } else {\n this.setState( { addingLink: true } );\n }\n }\n\n stopAddingLink() {\n this.setState( { addingLink: false } );\n }\n\n onRemoveFormat() {\n const { value, onChange, speak } = this.props;\n\n onChange( removeFormat( value, name ) );\n speak( __( 'Link removed.' ), 'assertive' );\n }\n\n render() {\n const { isActive, activeAttributes, value, onChange } = this.props;\n\n return (\n <>\n <RichTextShortcut\n type=\"primary\"\n character=\"k\"\n onUse={ this.addLink }\n />\n <RichTextShortcut\n type=\"primaryShift\"\n character=\"k\"\n onUse={ this.onRemoveFormat }\n />\n { isActive && <RichTextToolbarButton\n icon=\"star-filled\"\n title={ __( 'Unlink' ) }\n onClick={ this.onRemoveFormat }\n isActive={ isActive }\n shortcutType=\"primaryShift\"\n shortcutCharacter=\"k\"\n /> }\n { ! isActive && <RichTextToolbarButton\n icon=\"star-filled\"\n title={ title }\n onClick={ this.addLink }\n isActive={ isActive }\n shortcutType=\"primary\"\n shortcutCharacter=\"k\"\n /> }\n <InlineLinkUI\n addingLink={ this.state.addingLink }\n stopAddingLink={ this.stopAddingLink }\n isActive={ isActive }\n activeAttributes={ activeAttributes }\n value={ value }\n onChange={ onChange }\n />\n </>\n );\n }\n } ),\n \n};\n\nfunction registerFormats () {\n [\n prettyLink,\n ].forEach( ( { name, ...settings } ) => registerFormatType( name, settings ) );\n};\nregisterFormats();","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose\");\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutProperties;","function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","'use strict';\n\nvar util = require('./util');\n\nfunction scrollIntoView(elem, container, config) {\n config = config || {};\n // document 归一化到 window\n if (container.nodeType === 9) {\n container = util.getWindow(container);\n }\n\n var allowHorizontalScroll = config.allowHorizontalScroll;\n var onlyScrollIfNeeded = config.onlyScrollIfNeeded;\n var alignWithTop = config.alignWithTop;\n var alignWithLeft = config.alignWithLeft;\n var offsetTop = config.offsetTop || 0;\n var offsetLeft = config.offsetLeft || 0;\n var offsetBottom = config.offsetBottom || 0;\n var offsetRight = config.offsetRight || 0;\n\n allowHorizontalScroll = allowHorizontalScroll === undefined ? true : allowHorizontalScroll;\n\n var isWin = util.isWindow(container);\n var elemOffset = util.offset(elem);\n var eh = util.outerHeight(elem);\n var ew = util.outerWidth(elem);\n var containerOffset = undefined;\n var ch = undefined;\n var cw = undefined;\n var containerScroll = undefined;\n var diffTop = undefined;\n var diffBottom = undefined;\n var win = undefined;\n var winScroll = undefined;\n var ww = undefined;\n var wh = undefined;\n\n if (isWin) {\n win = container;\n wh = util.height(win);\n ww = util.width(win);\n winScroll = {\n left: util.scrollLeft(win),\n top: util.scrollTop(win)\n };\n // elem 相对 container 可视视窗的距离\n diffTop = {\n left: elemOffset.left - winScroll.left - offsetLeft,\n top: elemOffset.top - winScroll.top - offsetTop\n };\n diffBottom = {\n left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,\n top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom\n };\n containerScroll = winScroll;\n } else {\n containerOffset = util.offset(container);\n ch = container.clientHeight;\n cw = container.clientWidth;\n containerScroll = {\n left: container.scrollLeft,\n top: container.scrollTop\n };\n // elem 相对 container 可视视窗的距离\n // 注意边框, offset 是边框到根节点\n diffTop = {\n left: elemOffset.left - (containerOffset.left + (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) - offsetLeft,\n top: elemOffset.top - (containerOffset.top + (parseFloat(util.css(container, 'borderTopWidth')) || 0)) - offsetTop\n };\n diffBottom = {\n left: elemOffset.left + ew - (containerOffset.left + cw + (parseFloat(util.css(container, 'borderRightWidth')) || 0)) + offsetRight,\n top: elemOffset.top + eh - (containerOffset.top + ch + (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) + offsetBottom\n };\n }\n\n if (diffTop.top < 0 || diffBottom.top > 0) {\n // 强制向上\n if (alignWithTop === true) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else if (alignWithTop === false) {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n } else {\n // 自动调整\n if (diffTop.top < 0) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n }\n }\n } else {\n if (!onlyScrollIfNeeded) {\n alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;\n if (alignWithTop) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n }\n }\n }\n\n if (allowHorizontalScroll) {\n if (diffTop.left < 0 || diffBottom.left > 0) {\n // 强制向上\n if (alignWithLeft === true) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else if (alignWithLeft === false) {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n } else {\n // 自动调整\n if (diffTop.left < 0) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n }\n }\n } else {\n if (!onlyScrollIfNeeded) {\n alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;\n if (alignWithLeft) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n }\n }\n }\n }\n}\n\nmodule.exports = scrollIntoView;","'use strict';\n\nmodule.exports = require('./dom-scroll-into-view');","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nfunction getClientPosition(elem) {\n var box = undefined;\n var x = undefined;\n var y = undefined;\n var doc = elem.ownerDocument;\n var body = doc.body;\n var docElem = doc && doc.documentElement;\n // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式\n box = elem.getBoundingClientRect();\n\n // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop\n // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确\n // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin\n\n x = box.left;\n y = box.top;\n\n // In IE, most of the time, 2 extra pixels are added to the top and left\n // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and\n // IE6 standards mode, this border can be overridden by setting the\n // document element's border to zero -- thus, we cannot rely on the\n // offset always being 2 pixels.\n\n // In quirks mode, the offset can be determined by querying the body's\n // clientLeft/clientTop, but in standards mode, it is found by querying\n // the document element's clientLeft/clientTop. Since we already called\n // getClientBoundingRect we have already forced a reflow, so it is not\n // too expensive just to query them all.\n\n // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的\n // 窗口边框标准是设 documentElement ,quirks 时设置 body\n // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去\n // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置\n // 标准 ie 下 docElem.clientTop 就是 border-top\n // ie7 html 即窗口边框改变不了。永远为 2\n // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0\n\n x -= docElem.clientLeft || body.clientLeft || 0;\n y -= docElem.clientTop || body.clientTop || 0;\n\n return {\n left: x,\n top: y\n };\n}\n\nfunction getScroll(w, top) {\n var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];\n var method = 'scroll' + (top ? 'Top' : 'Left');\n if (typeof ret !== 'number') {\n var d = w.document;\n // ie6,7,8 standard mode\n ret = d.documentElement[method];\n if (typeof ret !== 'number') {\n // quirks mode\n ret = d.body[method];\n }\n }\n return ret;\n}\n\nfunction getScrollLeft(w) {\n return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n var pos = getClientPosition(el);\n var doc = el.ownerDocument;\n var w = doc.defaultView || doc.parentWindow;\n pos.left += getScrollLeft(w);\n pos.top += getScrollTop(w);\n return pos;\n}\nfunction _getComputedStyle(elem, name, computedStyle_) {\n var val = '';\n var d = elem.ownerDocument;\n var computedStyle = computedStyle_ || d.defaultView.getComputedStyle(elem, null);\n\n // https://github.com/kissyteam/kissy/issues/61\n if (computedStyle) {\n val = computedStyle.getPropertyValue(name) || computedStyle[name];\n }\n\n return val;\n}\n\nvar _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');\nvar RE_POS = /^(top|right|bottom|left)$/;\nvar CURRENT_STYLE = 'currentStyle';\nvar RUNTIME_STYLE = 'runtimeStyle';\nvar LEFT = 'left';\nvar PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n // currentStyle maybe null\n // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值\n // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n // 在 ie 下不对,需要直接用 offset 方式\n // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了\n\n // From the awesome hack by Dean Edwards\n // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n // If we're not dealing with a regular pixel number\n // but a number that has a weird ending, we need to convert it to pixels\n // exclude left right for relativity\n if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n // Remember the original values\n var style = elem.style;\n var left = style[LEFT];\n var rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n // prevent flashing of content\n elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n // Put in the new values to get a computed value out\n style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n ret = style.pixelLeft + PX;\n\n // Revert the changed values\n style[LEFT] = left;\n\n elem[RUNTIME_STYLE][LEFT] = rsLeft;\n }\n return ret === '' ? 'auto' : ret;\n}\n\nvar getComputedStyleX = undefined;\nif (typeof window !== 'undefined') {\n getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;\n}\n\nfunction each(arr, fn) {\n for (var i = 0; i < arr.length; i++) {\n fn(arr[i]);\n }\n}\n\nfunction isBorderBoxFn(elem) {\n return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nvar BOX_MODELS = ['margin', 'border', 'padding'];\nvar CONTENT_INDEX = -1;\nvar PADDING_INDEX = 2;\nvar BORDER_INDEX = 1;\nvar MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n var old = {};\n var style = elem.style;\n var name = undefined;\n\n // Remember the old values, and insert the new ones\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n old[name] = style[name];\n style[name] = options[name];\n }\n }\n\n callback.call(elem);\n\n // Revert the old values\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n style[name] = old[name];\n }\n }\n}\n\nfunction getPBMWidth(elem, props, which) {\n var value = 0;\n var prop = undefined;\n var j = undefined;\n var i = undefined;\n for (j = 0; j < props.length; j++) {\n prop = props[j];\n if (prop) {\n for (i = 0; i < which.length; i++) {\n var cssProp = undefined;\n if (prop === 'border') {\n cssProp = prop + which[i] + 'Width';\n } else {\n cssProp = prop + which[i];\n }\n value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n }\n }\n }\n return value;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n // must use == for ie8\n /* eslint eqeqeq:0 */\n return obj != null && obj == obj.window;\n}\n\nvar domUtils = {};\n\neach(['Width', 'Height'], function (name) {\n domUtils['doc' + name] = function (refWin) {\n var d = refWin.document;\n return Math.max(\n // firefox chrome documentElement.scrollHeight< body.scrollHeight\n // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n d.documentElement['scroll' + name],\n // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?\n d.body['scroll' + name], domUtils['viewport' + name](d));\n };\n\n domUtils['viewport' + name] = function (win) {\n // pc browser includes scrollbar in window.innerWidth\n var prop = 'client' + name;\n var doc = win.document;\n var body = doc.body;\n var documentElement = doc.documentElement;\n var documentElementProp = documentElement[prop];\n // 标准模式取 documentElement\n // backcompat 取 body\n return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;\n };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra] 'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, extra) {\n if (isWindow(elem)) {\n return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);\n } else if (elem.nodeType === 9) {\n return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);\n }\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem, computedStyle);\n var cssBoxValue = 0;\n if (borderBoxValue == null || borderBoxValue <= 0) {\n borderBoxValue = undefined;\n // Fall back to computed then un computed css if necessary\n cssBoxValue = getComputedStyleX(elem, name);\n if (cssBoxValue == null || Number(cssBoxValue) < 0) {\n cssBoxValue = elem.style[name] || 0;\n }\n // Normalize '', auto, and prepare for extra\n cssBoxValue = parseFloat(cssBoxValue) || 0;\n }\n if (extra === undefined) {\n extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n }\n var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;\n var val = borderBoxValue || cssBoxValue;\n if (extra === CONTENT_INDEX) {\n if (borderBoxValueOrIsBorderBox) {\n return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);\n }\n return cssBoxValue;\n }\n if (borderBoxValueOrIsBorderBox) {\n var padding = extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle);\n return val + (extra === BORDER_INDEX ? 0 : padding);\n }\n return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);\n}\n\nvar cssShow = {\n position: 'absolute',\n visibility: 'hidden',\n display: 'block'\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay(elem) {\n var val = undefined;\n var args = arguments;\n // in case elem is window\n // elem.offsetWidth === undefined\n if (elem.offsetWidth !== 0) {\n val = getWH.apply(undefined, args);\n } else {\n swap(elem, cssShow, function () {\n val = getWH.apply(undefined, args);\n });\n }\n return val;\n}\n\nfunction css(el, name, v) {\n var value = v;\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var i in name) {\n if (name.hasOwnProperty(i)) {\n css(el, i, name[i]);\n }\n }\n return undefined;\n }\n if (typeof value !== 'undefined') {\n if (typeof value === 'number') {\n value += 'px';\n }\n el.style[name] = value;\n return undefined;\n }\n return getComputedStyleX(el, name);\n}\n\neach(['width', 'height'], function (name) {\n var first = name.charAt(0).toUpperCase() + name.slice(1);\n domUtils['outer' + first] = function (el, includeMargin) {\n return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);\n };\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n domUtils[name] = function (elem, val) {\n if (val !== undefined) {\n if (elem) {\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem);\n if (isBorderBox) {\n val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n }\n return css(elem, name, val);\n }\n return undefined;\n }\n return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n };\n});\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setOffset(elem, offset) {\n // set position first, in-case top/left are set even on static elem\n if (css(elem, 'position') === 'static') {\n elem.style.position = 'relative';\n }\n\n var old = getOffset(elem);\n var ret = {};\n var current = undefined;\n var key = undefined;\n\n for (key in offset) {\n if (offset.hasOwnProperty(key)) {\n current = parseFloat(css(elem, key)) || 0;\n ret[key] = current + offset[key] - old[key];\n }\n }\n css(elem, ret);\n}\n\nmodule.exports = _extends({\n getWindow: function getWindow(node) {\n var doc = node.ownerDocument || node;\n return doc.defaultView || doc.parentWindow;\n },\n offset: function offset(el, value) {\n if (typeof value !== 'undefined') {\n setOffset(el, value);\n } else {\n return getOffset(el);\n }\n },\n\n isWindow: isWindow,\n each: each,\n css: css,\n clone: function clone(obj) {\n var ret = {};\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret[i] = obj[i];\n }\n }\n var overflow = obj.overflow;\n if (overflow) {\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret.overflow[i] = obj.overflow[i];\n }\n }\n }\n return ret;\n },\n scrollLeft: function scrollLeft(w, v) {\n if (isWindow(w)) {\n if (v === undefined) {\n return getScrollLeft(w);\n }\n window.scrollTo(v, getScrollTop(w));\n } else {\n if (v === undefined) {\n return w.scrollLeft;\n }\n w.scrollLeft = v;\n }\n },\n scrollTop: function scrollTop(w, v) {\n if (isWindow(w)) {\n if (v === undefined) {\n return getScrollTop(w);\n }\n window.scrollTo(getScrollLeft(w), v);\n } else {\n if (v === undefined) {\n return w.scrollTop;\n }\n w.scrollTop = v;\n }\n },\n\n viewportWidth: 0,\n viewportHeight: 0\n}, domUtils);","module.exports = \".pretty-link-inserter .block-editor-url-popover__settings {\\n display: block; }\\n\\n.pretty-link-inserter .pretty-link-inserter-form-container {\\n margin-top: 30px; }\\n\"","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target, parent) {\n if (parent){\n return parent.querySelector(target);\n }\n return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target, parent) {\n // If passing function in options, then use it for resolve \"head\" element.\n // Useful for Shadow Root style i.e\n // {\n // insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n // }\n if (typeof target === 'function') {\n return target();\n }\n if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target, parent);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n\t// tags it will allow on a page\n\tif (!options.singleton && typeof options.singleton !== \"boolean\") options.singleton = isOldIE();\n\n\t// By default, add <style> tags to the <head> element\n if (!options.insertInto) options.insertInto = \"head\";\n\n\t// By default, add <style> tags to the bottom of the target\n\tif (!options.insertAt) options.insertAt = \"bottom\";\n\n\tvar styles = listToStyles(list, options);\n\n\taddStylesToDom(styles, options);\n\n\treturn function update (newList) {\n\t\tvar mayRemove = [];\n\n\t\tfor (var i = 0; i < styles.length; i++) {\n\t\t\tvar item = styles[i];\n\t\t\tvar domStyle = stylesInDom[item.id];\n\n\t\t\tdomStyle.refs--;\n\t\t\tmayRemove.push(domStyle);\n\t\t}\n\n\t\tif(newList) {\n\t\t\tvar newStyles = listToStyles(newList, options);\n\t\t\taddStylesToDom(newStyles, options);\n\t\t}\n\n\t\tfor (var i = 0; i < mayRemove.length; i++) {\n\t\t\tvar domStyle = mayRemove[i];\n\n\t\t\tif(domStyle.refs === 0) {\n\t\t\t\tfor (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();\n\n\t\t\t\tdelete stylesInDom[domStyle.id];\n\t\t\t}\n\t\t}\n\t};\n};\n\nfunction addStylesToDom (styles, options) {\n\tfor (var i = 0; i < styles.length; i++) {\n\t\tvar item = styles[i];\n\t\tvar domStyle = stylesInDom[item.id];\n\n\t\tif(domStyle) {\n\t\t\tdomStyle.refs++;\n\n\t\t\tfor(var j = 0; j < domStyle.parts.length; j++) {\n\t\t\t\tdomStyle.parts[j](item.parts[j]);\n\t\t\t}\n\n\t\t\tfor(; j < item.parts.length; j++) {\n\t\t\t\tdomStyle.parts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\t\t} else {\n\t\t\tvar parts = [];\n\n\t\t\tfor(var j = 0; j < item.parts.length; j++) {\n\t\t\t\tparts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\n\t\t\tstylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};\n\t\t}\n\t}\n}\n\nfunction listToStyles (list, options) {\n\tvar styles = [];\n\tvar newStyles = {};\n\n\tfor (var i = 0; i < list.length; i++) {\n\t\tvar item = list[i];\n\t\tvar id = options.base ? item[0] + options.base : item[0];\n\t\tvar css = item[1];\n\t\tvar media = item[2];\n\t\tvar sourceMap = item[3];\n\t\tvar part = {css: css, media: media, sourceMap: sourceMap};\n\n\t\tif(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});\n\t\telse newStyles[id].parts.push(part);\n\t}\n\n\treturn styles;\n}\n\nfunction insertStyleElement (options, style) {\n\tvar target = getElement(options.insertInto)\n\n\tif (!target) {\n\t\tthrow new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n\t}\n\n\tvar lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];\n\n\tif (options.insertAt === \"top\") {\n\t\tif (!lastStyleElementInsertedAtTop) {\n\t\t\ttarget.insertBefore(style, target.firstChild);\n\t\t} else if (lastStyleElementInsertedAtTop.nextSibling) {\n\t\t\ttarget.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);\n\t\t} else {\n\t\t\ttarget.appendChild(style);\n\t\t}\n\t\tstylesInsertedAtTop.push(style);\n\t} else if (options.insertAt === \"bottom\") {\n\t\ttarget.appendChild(style);\n\t} else if (typeof options.insertAt === \"object\" && options.insertAt.before) {\n\t\tvar nextSibling = getElement(options.insertAt.before, target);\n\t\ttarget.insertBefore(style, nextSibling);\n\t} else {\n\t\tthrow new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n\t}\n}\n\nfunction removeStyleElement (style) {\n\tif (style.parentNode === null) return false;\n\tstyle.parentNode.removeChild(style);\n\n\tvar idx = stylesInsertedAtTop.indexOf(style);\n\tif(idx >= 0) {\n\t\tstylesInsertedAtTop.splice(idx, 1);\n\t}\n}\n\nfunction createStyleElement (options) {\n\tvar style = document.createElement(\"style\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\n\tif(options.attrs.nonce === undefined) {\n\t\tvar nonce = getNonce();\n\t\tif (nonce) {\n\t\t\toptions.attrs.nonce = nonce;\n\t\t}\n\t}\n\n\taddAttrs(style, options.attrs);\n\tinsertStyleElement(options, style);\n\n\treturn style;\n}\n\nfunction createLinkElement (options) {\n\tvar link = document.createElement(\"link\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\toptions.attrs.rel = \"stylesheet\";\n\n\taddAttrs(link, options.attrs);\n\tinsertStyleElement(options, link);\n\n\treturn link;\n}\n\nfunction addAttrs (el, attrs) {\n\tObject.keys(attrs).forEach(function (key) {\n\t\tel.setAttribute(key, attrs[key]);\n\t});\n}\n\nfunction getNonce() {\n\tif (typeof __webpack_nonce__ === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn __webpack_nonce__;\n}\n\nfunction addStyle (obj, options) {\n\tvar style, update, remove, result;\n\n\t// If a transform function was defined, run it on the css\n\tif (options.transform && obj.css) {\n\t result = typeof options.transform === 'function'\n\t\t ? options.transform(obj.css) \n\t\t : options.transform.default(obj.css);\n\n\t if (result) {\n\t \t// If transform returns a value, use that instead of the original css.\n\t \t// This allows running runtime transformations on the css.\n\t \tobj.css = result;\n\t } else {\n\t \t// If the transform function returns a falsy value, don't add this css.\n\t \t// This allows conditional loading of css\n\t \treturn function() {\n\t \t\t// noop\n\t \t};\n\t }\n\t}\n\n\tif (options.singleton) {\n\t\tvar styleIndex = singletonCounter++;\n\n\t\tstyle = singleton || (singleton = createStyleElement(options));\n\n\t\tupdate = applyToSingletonTag.bind(null, style, styleIndex, false);\n\t\tremove = applyToSingletonTag.bind(null, style, styleIndex, true);\n\n\t} else if (\n\t\tobj.sourceMap &&\n\t\ttypeof URL === \"function\" &&\n\t\ttypeof URL.createObjectURL === \"function\" &&\n\t\ttypeof URL.revokeObjectURL === \"function\" &&\n\t\ttypeof Blob === \"function\" &&\n\t\ttypeof btoa === \"function\"\n\t) {\n\t\tstyle = createLinkElement(options);\n\t\tupdate = updateLink.bind(null, style, options);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\n\t\t\tif(style.href) URL.revokeObjectURL(style.href);\n\t\t};\n\t} else {\n\t\tstyle = createStyleElement(options);\n\t\tupdate = applyToTag.bind(null, style);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\t\t};\n\t}\n\n\tupdate(obj);\n\n\treturn function updateStyle (newObj) {\n\t\tif (newObj) {\n\t\t\tif (\n\t\t\t\tnewObj.css === obj.css &&\n\t\t\t\tnewObj.media === obj.media &&\n\t\t\t\tnewObj.sourceMap === obj.sourceMap\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdate(obj = newObj);\n\t\t} else {\n\t\t\tremove();\n\t\t}\n\t};\n}\n\nvar replaceText = (function () {\n\tvar textStore = [];\n\n\treturn function (index, replacement) {\n\t\ttextStore[index] = replacement;\n\n\t\treturn textStore.filter(Boolean).join('\\n');\n\t};\n})();\n\nfunction applyToSingletonTag (style, index, remove, obj) {\n\tvar css = remove ? \"\" : obj.css;\n\n\tif (style.styleSheet) {\n\t\tstyle.styleSheet.cssText = replaceText(index, css);\n\t} else {\n\t\tvar cssNode = document.createTextNode(css);\n\t\tvar childNodes = style.childNodes;\n\n\t\tif (childNodes[index]) style.removeChild(childNodes[index]);\n\n\t\tif (childNodes.length) {\n\t\t\tstyle.insertBefore(cssNode, childNodes[index]);\n\t\t} else {\n\t\t\tstyle.appendChild(cssNode);\n\t\t}\n\t}\n}\n\nfunction applyToTag (style, obj) {\n\tvar css = obj.css;\n\tvar media = obj.media;\n\n\tif(media) {\n\t\tstyle.setAttribute(\"media\", media)\n\t}\n\n\tif(style.styleSheet) {\n\t\tstyle.styleSheet.cssText = css;\n\t} else {\n\t\twhile(style.firstChild) {\n\t\t\tstyle.removeChild(style.firstChild);\n\t\t}\n\n\t\tstyle.appendChild(document.createTextNode(css));\n\t}\n}\n\nfunction updateLink (link, options, obj) {\n\tvar css = obj.css;\n\tvar sourceMap = obj.sourceMap;\n\n\t/*\n\t\tIf convertToAbsoluteUrls isn't defined, but sourcemaps are enabled\n\t\tand there is no publicPath defined then lets turn convertToAbsoluteUrls\n\t\ton by default. Otherwise default to the convertToAbsoluteUrls option\n\t\tdirectly\n\t*/\n\tvar autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;\n\n\tif (options.convertToAbsoluteUrls || autoFixUrls) {\n\t\tcss = fixUrls(css);\n\t}\n\n\tif (sourceMap) {\n\t\t// http://stackoverflow.com/a/26603875\n\t\tcss += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\n\t}\n\n\tvar blob = new Blob([css], { type: \"text/css\" });\n\n\tvar oldSrc = link.href;\n\n\tlink.href = URL.createObjectURL(blob);\n\n\tif(oldSrc) URL.revokeObjectURL(oldSrc);\n}\n","\n/**\n * When source maps are enabled, `style-loader` uses a link element with a data-uri to\n * embed the css on the page. This breaks all relative urls because now they are relative to a\n * bundle instead of the current page.\n *\n * One solution is to only use full urls, but that may be impossible.\n *\n * Instead, this function \"fixes\" the relative urls to be absolute according to the current page location.\n *\n * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.\n *\n */\n\nmodule.exports = function (css) {\n // get current location\n var location = typeof window !== \"undefined\" && window.location;\n\n if (!location) {\n throw new Error(\"fixUrls requires window.location\");\n }\n\n\t// blank or null?\n\tif (!css || typeof css !== \"string\") {\n\t return css;\n }\n\n var baseUrl = location.protocol + \"//\" + location.host;\n var currentDir = baseUrl + location.pathname.replace(/\\/[^\\/]*$/, \"/\");\n\n\t// convert each url(...)\n\t/*\n\tThis regular expression is just a way to recursively match brackets within\n\ta string.\n\n\t /url\\s*\\( = Match on the word \"url\" with any whitespace after it and then a parens\n\t ( = Start a capturing group\n\t (?: = Start a non-capturing group\n\t [^)(] = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t (?: = Start another non-capturing groups\n\t [^)(]+ = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t [^)(]* = Match anything that isn't a parentheses\n\t \\) = Match a end parentheses\n\t ) = End Group\n *\\) = Match anything and then a close parens\n ) = Close non-capturing group\n * = Match anything\n ) = Close capturing group\n\t \\) = Match a close parens\n\n\t /gi = Get all matches, not the first. Be case insensitive.\n\t */\n\tvar fixedCss = css.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function(fullMatch, origUrl) {\n\t\t// strip quotes (if they exist)\n\t\tvar unquotedOrigUrl = origUrl\n\t\t\t.trim()\n\t\t\t.replace(/^\"(.*)\"$/, function(o, $1){ return $1; })\n\t\t\t.replace(/^'(.*)'$/, function(o, $1){ return $1; });\n\n\t\t// already a full url? no change\n\t\tif (/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(unquotedOrigUrl)) {\n\t\t return fullMatch;\n\t\t}\n\n\t\t// convert the url to a full url\n\t\tvar newUrl;\n\n\t\tif (unquotedOrigUrl.indexOf(\"//\") === 0) {\n\t\t \t//TODO: should we add protocol?\n\t\t\tnewUrl = unquotedOrigUrl;\n\t\t} else if (unquotedOrigUrl.indexOf(\"/\") === 0) {\n\t\t\t// path should be relative to the base url\n\t\t\tnewUrl = baseUrl + unquotedOrigUrl; // already starts with '/'\n\t\t} else {\n\t\t\t// path should be relative to current directory\n\t\t\tnewUrl = currentDir + unquotedOrigUrl.replace(/^\\.\\//, \"\"); // Strip leading './'\n\t\t}\n\n\t\t// send back the fixed url(...)\n\t\treturn \"url(\" + JSON.stringify(newUrl) + \")\";\n\t});\n\n\t// send back the fixed css\n\treturn fixedCss;\n};\n","(function() { module.exports = this[\"regeneratorRuntime\"]; }());","(function() { module.exports = this[\"wp\"][\"apiFetch\"]; }());","(function() { module.exports = this[\"wp\"][\"blockEditor\"]; }());","(function() { module.exports = this[\"wp\"][\"components\"]; }());","(function() { module.exports = this[\"wp\"][\"compose\"]; }());","(function() { module.exports = this[\"wp\"][\"data\"]; }());","(function() { module.exports = this[\"wp\"][\"dom\"]; }());","(function() { module.exports = this[\"wp\"][\"element\"]; }());","(function() { module.exports = this[\"wp\"][\"htmlEntities\"]; }());","(function() { module.exports = this[\"wp\"][\"i18n\"]; }());","(function() { module.exports = this[\"wp\"][\"keycodes\"]; }());","(function() { module.exports = this[\"wp\"][\"richText\"]; }());","(function() { module.exports = this[\"wp\"][\"url\"]; }());","(function() { module.exports = this[\"lodash\"]; }());"],"sourceRoot":""}
js/editor/components/index.js ADDED
@@ -0,0 +1 @@
 
1
+ export { default as URLInput } from './url-input';
js/editor/components/link-editor/index.js ADDED
@@ -0,0 +1,409 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __ } from '@wordpress/i18n';
10
+ import { Component, Fragment, createRef, useMemo } from '@wordpress/element';
11
+ import {
12
+ ExternalLink,
13
+ IconButton,
14
+ ToggleControl,
15
+ Button,
16
+ TextControl,
17
+ Notice,
18
+ Spinner,
19
+ withSpokenMessages,
20
+ } from '@wordpress/components';
21
+ import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';
22
+ import { getRectangleFromRange } from '@wordpress/dom';
23
+ import { prependHTTP, safeDecodeURI, filterURLForDisplay } from '@wordpress/url';
24
+ import {
25
+ create,
26
+ insert,
27
+ isCollapsed,
28
+ applyFormat,
29
+ getTextContent,
30
+ slice,
31
+ } from '@wordpress/rich-text';
32
+ import { URLPopover } from '@wordpress/block-editor';
33
+ import apiFetch from '@wordpress/api-fetch';
34
+ import { addQueryArgs } from '@wordpress/url';
35
+ import URLInput from '../url-input';
36
+ import './style.scss';
37
+
38
+ /**
39
+ * Internal dependencies
40
+ */
41
+ import { createLinkFormat, isValidHref } from './utils';
42
+
43
+ const stopKeyPropagation = ( event ) => event.stopPropagation();
44
+
45
+ function isShowingInput( props, state ) {
46
+ return props.addingLink || state.editLink;
47
+ }
48
+
49
+ const LinkEditor = ( { value, onChangeInputValue, onKeyDown, submitLink, autocompleteRef } ) => (
50
+ // Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar
51
+ /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
52
+ <form
53
+ className="editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content"
54
+ onKeyPress={ stopKeyPropagation }
55
+ onKeyDown={ onKeyDown }
56
+ onSubmit={ submitLink }
57
+ >
58
+ <URLInput
59
+ value={ value }
60
+ onChange={ onChangeInputValue }
61
+ autocompleteRef={ autocompleteRef }
62
+ />
63
+ <IconButton icon="editor-break" label={ __( 'Insert Pretty Link' ) } type="submit" />
64
+ </form>
65
+ /* eslint-enable jsx-a11y/no-noninteractive-element-interactions */
66
+ );
67
+
68
+ const LinkViewerUrl = ( { url } ) => {
69
+ const prependedURL = prependHTTP( url );
70
+ const linkClassName = classnames( 'editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value', {
71
+ 'has-invalid-link': ! isValidHref( prependedURL ),
72
+ } );
73
+
74
+ if ( ! url ) {
75
+ return <span className={ linkClassName }></span>;
76
+ }
77
+
78
+ return (
79
+ <ExternalLink
80
+ className={ linkClassName }
81
+ href={ url }
82
+ >
83
+ { filterURLForDisplay( safeDecodeURI( url ) ) }
84
+ </ExternalLink>
85
+ );
86
+ };
87
+
88
+ const URLPopoverAtLink = ( { isActive, addingLink, value, ...props } ) => {
89
+ const anchorRect = useMemo( () => {
90
+ const selection = window.getSelection();
91
+ const range = selection.rangeCount > 0 ? selection.getRangeAt( 0 ) : null;
92
+ if ( ! range ) {
93
+ return;
94
+ }
95
+
96
+ if ( addingLink ) {
97
+ return getRectangleFromRange( range );
98
+ }
99
+
100
+ let element = range.startContainer;
101
+
102
+ // If the caret is right before the element, select the next element.
103
+ element = element.nextElementSibling || element;
104
+
105
+ while ( element.nodeType !== window.Node.ELEMENT_NODE ) {
106
+ element = element.parentNode;
107
+ }
108
+
109
+ const closest = element.closest( 'a' );
110
+ if ( closest ) {
111
+ return closest.getBoundingClientRect();
112
+ }
113
+ }, [ isActive, addingLink, value.start, value.end ] );
114
+
115
+ if ( ! anchorRect ) {
116
+ return null;
117
+ }
118
+
119
+ return <URLPopover anchorRect={ anchorRect } { ...props } />;
120
+ };
121
+
122
+ const LinkViewer = ( { url, editLink } ) => {
123
+ return (
124
+ // Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar
125
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
126
+ <div
127
+ className="editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content"
128
+ onKeyPress={ stopKeyPropagation }
129
+ >
130
+ <LinkViewerUrl url={ url } />
131
+ <IconButton icon="edit" label={ __( 'Edit' ) } onClick={ editLink } />
132
+ </div>
133
+ /* eslint-enable jsx-a11y/no-static-element-interactions */
134
+ );
135
+ };
136
+
137
+ const createNewPrettyLink = (target, slug) => {
138
+ return new Promise((resolve, reject) => {
139
+ jQuery.post(
140
+ ajaxurl,
141
+ {
142
+ action: 'prli_create_pretty_link',
143
+ target: target,
144
+ slug: slug,
145
+ redirect: '',
146
+ nofollow: 1,
147
+ tracking: 1
148
+ },
149
+ (data, textStatus, xhr) => {
150
+ 'true' === data ? resolve(data) : reject(data);
151
+ }
152
+ ).fail(error => {
153
+ reject(error);
154
+ });
155
+ });
156
+ }
157
+
158
+ class InlineLinkUI extends Component {
159
+ constructor() {
160
+ super( ...arguments );
161
+
162
+ this.editLink = this.editLink.bind( this );
163
+ this.submitLink = this.submitLink.bind( this );
164
+ this.onKeyDown = this.onKeyDown.bind( this );
165
+ this.onChangeInputValue = this.onChangeInputValue.bind( this );
166
+ this.setLinkTarget = this.setLinkTarget.bind( this );
167
+ this.onClickOutside = this.onClickOutside.bind( this );
168
+ this.resetState = this.resetState.bind( this );
169
+ this.autocompleteRef = createRef();
170
+
171
+ this.state = {
172
+ opensInNewWindow: false,
173
+ inputValue: '',
174
+ newLinkUrl: '',
175
+ newLinkSlug: '',
176
+ creatingLink: false,
177
+ createdLink: false,
178
+ createdLinkError: false
179
+ };
180
+ }
181
+
182
+ static getDerivedStateFromProps( props, state ) {
183
+ const { activeAttributes: { url, target } } = props;
184
+ const opensInNewWindow = target === '_blank';
185
+
186
+ if ( ! isShowingInput( props, state ) ) {
187
+ if ( url !== state.inputValue ) {
188
+ return { inputValue: url };
189
+ }
190
+
191
+ if ( opensInNewWindow !== state.opensInNewWindow ) {
192
+ return { opensInNewWindow };
193
+ }
194
+ }
195
+
196
+ return null;
197
+ }
198
+
199
+ onKeyDown( event ) {
200
+ if ( [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( event.keyCode ) > -1 ) {
201
+ // Stop the key event from propagating up to ObserveTyping.startTypingInTextField.
202
+ event.stopPropagation();
203
+ }
204
+ }
205
+
206
+ onChangeInputValue( inputValue ) {
207
+ this.setState( { inputValue } );
208
+ }
209
+
210
+ setLinkTarget( opensInNewWindow ) {
211
+ const { activeAttributes: { url = '' }, value, onChange } = this.props;
212
+
213
+ this.setState( { opensInNewWindow } );
214
+
215
+ // Apply now if URL is not being edited.
216
+ if ( ! isShowingInput( this.props, this.state ) ) {
217
+ const selectedText = getTextContent( slice( value ) );
218
+
219
+ onChange( applyFormat( value, createLinkFormat( {
220
+ url,
221
+ opensInNewWindow,
222
+ text: selectedText,
223
+ } ) ) );
224
+ }
225
+ }
226
+
227
+ editLink( event ) {
228
+ this.setState( { editLink: true } );
229
+ event.preventDefault();
230
+ }
231
+
232
+ submitLink( event ) {
233
+ const { isActive, value, onChange, speak } = this.props;
234
+ const { inputValue, opensInNewWindow } = this.state;
235
+ const url = prependHTTP( inputValue );
236
+ const selectedText = getTextContent( slice( value ) );
237
+ const format = createLinkFormat( {
238
+ url,
239
+ opensInNewWindow,
240
+ text: selectedText,
241
+ } );
242
+
243
+ event.preventDefault();
244
+
245
+ if ( isCollapsed( value ) && ! isActive ) {
246
+ const toInsert = applyFormat( create( { text: url } ), format, 0, url.length );
247
+ onChange( insert( value, toInsert ) );
248
+ } else {
249
+ onChange( applyFormat( value, format ) );
250
+ }
251
+
252
+ this.resetState();
253
+
254
+ if ( ! isValidHref( url ) ) {
255
+ speak( __( 'Warning: the link has been inserted but may have errors. Please test it.' ), 'assertive' );
256
+ } else if ( isActive ) {
257
+ speak( __( 'Link edited.' ), 'assertive' );
258
+ } else {
259
+ speak( __( 'Link inserted.' ), 'assertive' );
260
+ }
261
+ }
262
+
263
+ onClickOutside( event ) {
264
+ // The autocomplete suggestions list renders in a separate popover (in a portal),
265
+ // so onClickOutside fails to detect that a click on a suggestion occurred in the
266
+ // LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and
267
+ // return to avoid the popover being closed.
268
+ const autocompleteElement = this.autocompleteRef.current;
269
+ if ( autocompleteElement && autocompleteElement.contains( event.target ) ) {
270
+ return;
271
+ }
272
+
273
+ this.resetState();
274
+ }
275
+
276
+ resetState() {
277
+ this.props.stopAddingLink();
278
+ this.setState( { editLink: false } );
279
+ }
280
+
281
+ render() {
282
+ const { isActive, activeAttributes: { url }, addingLink, value } = this.props;
283
+
284
+ if ( ! isActive && ! addingLink ) {
285
+ return null;
286
+ }
287
+
288
+ const { inputValue, opensInNewWindow, newLinkUrl, newLinkSlug, creatingLink, createdLink, createdLinkError } = this.state;
289
+ const showInput = isShowingInput( this.props, this.state );
290
+
291
+ return (
292
+ <URLPopoverAtLink
293
+ className="pretty-link-inserter"
294
+ value={ value }
295
+ isActive={ isActive }
296
+ addingLink={ addingLink }
297
+ onClickOutside={ this.onClickOutside }
298
+ onClose={ this.resetState }
299
+ focusOnMount={ showInput ? 'firstElement' : false }
300
+ renderSettings={ () => (
301
+ <Fragment>
302
+ <div>
303
+ <ToggleControl
304
+ label={ __( 'Open in New Tab' ) }
305
+ checked={ opensInNewWindow }
306
+ onChange={ this.setLinkTarget }
307
+ />
308
+ </div>
309
+ <div className="pretty-link-inserter-form-container">
310
+ {
311
+ createdLink && (
312
+ <Notice status="success" onRemove={() => this.setState({createdLink: false})}>
313
+ <p>{__( 'Pretty Link created successfully.', 'memberpress' )}</p>
314
+ </Notice>
315
+ )
316
+ }
317
+ {
318
+ createdLinkError && (
319
+ <Notice status="error" onRemove={() => this.setState({createdLink: false, createdLinkError: false})}>
320
+ <p>{__( 'Pretty Link could not be created. Please try a slug that is not already used.', 'memberpress' )}</p>
321
+ </Notice>
322
+ )
323
+ }
324
+ <strong>{__('New Pretty Link', 'pretty-link')}</strong>
325
+ <form onSubmit={(event) => {
326
+ event.preventDefault();
327
+ // Send request to create new Pretty Link
328
+ this.setState({
329
+ creatingLink: true,
330
+ createdLinkError: false,
331
+ });
332
+ createNewPrettyLink( newLinkUrl, newLinkSlug )
333
+ .then(data => {
334
+ this.setState({
335
+ createdLink: true,
336
+ creatingLink: false,
337
+ inputValue: plEditor.homeUrl + newLinkSlug,
338
+ newLinkUrl: '',
339
+ newLinkSlug: ''
340
+ });
341
+ })
342
+ .catch(error => {
343
+ this.setState({
344
+ createdLink: false,
345
+ creatingLink: false,
346
+ createdLinkError: true,
347
+ });
348
+ });
349
+ }}>
350
+ <p>
351
+ <TextControl
352
+ placeholder="URL"
353
+ className="pretty-link-new-link-url"
354
+ value={newLinkUrl}
355
+ onChange={ ( newLinkUrl ) => {
356
+ this.setState( { newLinkUrl } );
357
+ } }
358
+ />
359
+ </p>
360
+ <p>
361
+ <TextControl
362
+ placeholder="Slug"
363
+ className="pretty-link-new-link-slug"
364
+ value={newLinkSlug}
365
+ onChange={ ( newLinkSlug ) => {
366
+ this.setState( { newLinkSlug } );
367
+ } }
368
+ />
369
+ </p>
370
+ <p>
371
+ <button
372
+ className="pretty-link-submit-new-link components-button is-button is-primary"
373
+ onClick={ () => {
374
+ console.log('Creating new Pretty Link...');
375
+ } }
376
+ >
377
+ { __( 'Create New Pretty Link', 'pretty-link' ) }
378
+ </button>
379
+ {
380
+ creatingLink && (
381
+ <Spinner />
382
+ )
383
+ }
384
+ </p>
385
+ </form>
386
+ </div>
387
+ </Fragment>
388
+ ) }
389
+ >
390
+ { showInput ? (
391
+ <LinkEditor
392
+ value={ inputValue }
393
+ onChangeInputValue={ this.onChangeInputValue }
394
+ onKeyDown={ this.onKeyDown }
395
+ submitLink={ this.submitLink }
396
+ autocompleteRef={ this.autocompleteRef }
397
+ />
398
+ ) : (
399
+ <LinkViewer
400
+ url={ url }
401
+ editLink={ this.editLink }
402
+ />
403
+ ) }
404
+ </URLPopoverAtLink>
405
+ );
406
+ }
407
+ }
408
+
409
+ export default withSpokenMessages( InlineLinkUI );
js/editor/components/link-editor/style.scss ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ .pretty-link-inserter {
2
+ .block-editor-url-popover__settings {
3
+ display: block;
4
+ }
5
+ .pretty-link-inserter-form-container {
6
+ margin-top: 30px;
7
+ }
8
+ }
js/editor/components/link-editor/utils.js ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { startsWith } from 'lodash';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import {
10
+ getProtocol,
11
+ isValidProtocol,
12
+ getAuthority,
13
+ isValidAuthority,
14
+ getPath,
15
+ isValidPath,
16
+ getQueryString,
17
+ isValidQueryString,
18
+ getFragment,
19
+ isValidFragment,
20
+ } from '@wordpress/url';
21
+ import { __, sprintf } from '@wordpress/i18n';
22
+
23
+ /**
24
+ * Check for issues with the provided href.
25
+ *
26
+ * @param {string} href The href.
27
+ *
28
+ * @return {boolean} Is the href invalid?
29
+ */
30
+ export function isValidHref( href ) {
31
+ if ( ! href ) {
32
+ return false;
33
+ }
34
+
35
+ const trimmedHref = href.trim();
36
+
37
+ if ( ! trimmedHref ) {
38
+ return false;
39
+ }
40
+
41
+ // Does the href start with something that looks like a URL protocol?
42
+ if ( /^\S+:/.test( trimmedHref ) ) {
43
+ const protocol = getProtocol( trimmedHref );
44
+ if ( ! isValidProtocol( protocol ) ) {
45
+ return false;
46
+ }
47
+
48
+ // Add some extra checks for http(s) URIs, since these are the most common use-case.
49
+ // This ensures URIs with an http protocol have exactly two forward slashes following the protocol.
50
+ if ( startsWith( protocol, 'http' ) && ! /^https?:\/\/[^\/\s]/i.test( trimmedHref ) ) {
51
+ return false;
52
+ }
53
+
54
+ const authority = getAuthority( trimmedHref );
55
+ if ( ! isValidAuthority( authority ) ) {
56
+ return false;
57
+ }
58
+
59
+ const path = getPath( trimmedHref );
60
+ if ( path && ! isValidPath( path ) ) {
61
+ return false;
62
+ }
63
+
64
+ const queryString = getQueryString( trimmedHref );
65
+ if ( queryString && ! isValidQueryString( queryString ) ) {
66
+ return false;
67
+ }
68
+
69
+ const fragment = getFragment( trimmedHref );
70
+ if ( fragment && ! isValidFragment( fragment ) ) {
71
+ return false;
72
+ }
73
+ }
74
+
75
+ // Validate anchor links.
76
+ if ( startsWith( trimmedHref, '#' ) && ! isValidFragment( trimmedHref ) ) {
77
+ return false;
78
+ }
79
+
80
+ return true;
81
+ }
82
+
83
+ /**
84
+ * Generates the format object that will be applied to the link text.
85
+ *
86
+ * @param {string} url The href of the link.
87
+ * @param {boolean} opensInNewWindow Whether this link will open in a new window.
88
+ * @param {Object} text The text that is being hyperlinked.
89
+ *
90
+ * @return {Object} The final format object.
91
+ */
92
+ export function createLinkFormat( { url, opensInNewWindow, text } ) {
93
+ const format = {
94
+ type: 'core/link',
95
+ attributes: {
96
+ url,
97
+ },
98
+ };
99
+
100
+ if ( opensInNewWindow ) {
101
+ // translators: accessibility label for external links, where the argument is the link text
102
+ const label = sprintf( __( '%s (opens in a new tab)' ), text );
103
+
104
+ format.attributes.target = '_blank';
105
+ format.attributes.rel = 'noreferrer noopener';
106
+ format.attributes[ 'aria-label' ] = label;
107
+ }
108
+
109
+ return format;
110
+ }
js/editor/components/url-input/index.js ADDED
@@ -0,0 +1,316 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { throttle, map, pick, defaultTo } from 'lodash';
5
+ import classnames from 'classnames';
6
+ import scrollIntoView from 'dom-scroll-into-view';
7
+
8
+ /**
9
+ * WordPress dependencies
10
+ */
11
+ import { __, sprintf, _n } from '@wordpress/i18n';
12
+ import { Component, createRef } from '@wordpress/element';
13
+ import { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';
14
+ import { Spinner, withSpokenMessages, Popover } from '@wordpress/components';
15
+ import { withInstanceId, withSafeTimeout, compose } from '@wordpress/compose';
16
+ import { withSelect } from '@wordpress/data';
17
+ import apiFetch from '@wordpress/api-fetch';
18
+ import { addQueryArgs } from '@wordpress/url';
19
+ import { decodeEntities } from '@wordpress/html-entities';
20
+
21
+ // Since URLInput is rendered in the context of other inputs, but should be
22
+ // considered a separate modal node, prevent keyboard events from propagating
23
+ // as being considered from the input.
24
+ const stopEventPropagation = ( event ) => event.stopPropagation();
25
+
26
+ const fetchLinkSuggestions = async ( search ) => {
27
+
28
+ const links = await apiFetch( {
29
+ url: addQueryArgs( ajaxurl, {
30
+ action: 'prli_search_for_links',
31
+ term: search,
32
+ } ),
33
+ } );
34
+
35
+ return map( links, ( link ) => ( {
36
+ url: link.pretty_url,
37
+ title: decodeEntities( link.value ) + ' (' + decodeEntities( link.slug ) + ')' || __( '(no title)' ),
38
+ } ) );
39
+ };
40
+
41
+ class URLInput extends Component {
42
+ constructor( { autocompleteRef } ) {
43
+ super( ...arguments );
44
+
45
+ this.onChange = this.onChange.bind( this );
46
+ this.onKeyDown = this.onKeyDown.bind( this );
47
+ this.autocompleteRef = autocompleteRef || createRef();
48
+ this.inputRef = createRef();
49
+ this.updateSuggestions = throttle( this.updateSuggestions.bind( this ), 200 );
50
+
51
+ this.suggestionNodes = [];
52
+
53
+ this.state = {
54
+ suggestions: [],
55
+ showSuggestions: false,
56
+ selectedSuggestion: null,
57
+ };
58
+ }
59
+
60
+ componentDidUpdate() {
61
+ const { showSuggestions, selectedSuggestion } = this.state;
62
+ // only have to worry about scrolling selected suggestion into view
63
+ // when already expanded
64
+ if ( showSuggestions && selectedSuggestion !== null && ! this.scrollingIntoView ) {
65
+ this.scrollingIntoView = true;
66
+ scrollIntoView( this.suggestionNodes[ selectedSuggestion ], this.autocompleteRef.current, {
67
+ onlyScrollIfNeeded: true,
68
+ } );
69
+
70
+ this.props.setTimeout( () => {
71
+ this.scrollingIntoView = false;
72
+ }, 100 );
73
+ }
74
+ }
75
+
76
+ componentWillUnmount() {
77
+ delete this.suggestionsRequest;
78
+ }
79
+
80
+ bindSuggestionNode( index ) {
81
+ return ( ref ) => {
82
+ this.suggestionNodes[ index ] = ref;
83
+ };
84
+ }
85
+
86
+ updateSuggestions( value ) {
87
+
88
+ // Show the suggestions after typing at least 2 characters
89
+ // and also for URLs
90
+ if ( value.length < 2 || /^https?:/.test( value ) ) {
91
+ this.setState( {
92
+ showSuggestions: false,
93
+ selectedSuggestion: null,
94
+ loading: false,
95
+ } );
96
+
97
+ return;
98
+ }
99
+
100
+ this.setState( {
101
+ showSuggestions: true,
102
+ selectedSuggestion: null,
103
+ loading: true,
104
+ } );
105
+
106
+ const request = fetchLinkSuggestions( value );
107
+
108
+ request.then( ( suggestions ) => {
109
+ // A fetch Promise doesn't have an abort option. It's mimicked by
110
+ // comparing the request reference in on the instance, which is
111
+ // reset or deleted on subsequent requests or unmounting.
112
+ if ( this.suggestionsRequest !== request ) {
113
+ return;
114
+ }
115
+
116
+ this.setState( {
117
+ suggestions,
118
+ loading: false,
119
+ } );
120
+
121
+ if ( !! suggestions.length ) {
122
+ this.props.debouncedSpeak( sprintf( _n(
123
+ '%d result found, use up and down arrow keys to navigate.',
124
+ '%d results found, use up and down arrow keys to navigate.',
125
+ suggestions.length
126
+ ), suggestions.length ), 'assertive' );
127
+ } else {
128
+ this.props.debouncedSpeak( __( 'No results.' ), 'assertive' );
129
+ }
130
+ } ).catch( () => {
131
+ if ( this.suggestionsRequest === request ) {
132
+ this.setState( {
133
+ loading: false,
134
+ } );
135
+ }
136
+ } );
137
+
138
+ this.suggestionsRequest = request;
139
+ }
140
+
141
+ onChange( event ) {
142
+ const inputValue = event.target.value;
143
+ this.props.onChange( inputValue );
144
+ this.updateSuggestions( inputValue );
145
+ }
146
+
147
+ onKeyDown( event ) {
148
+ const { showSuggestions, selectedSuggestion, suggestions, loading } = this.state;
149
+ // If the suggestions are not shown or loading, we shouldn't handle the arrow keys
150
+ // We shouldn't preventDefault to allow block arrow keys navigation
151
+ if ( ! showSuggestions || ! suggestions.length || loading ) {
152
+ // In the Windows version of Firefox the up and down arrows don't move the caret
153
+ // within an input field like they do for Mac Firefox/Chrome/Safari. This causes
154
+ // a form of focus trapping that is disruptive to the user experience. This disruption
155
+ // only happens if the caret is not in the first or last position in the text input.
156
+ // See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747
157
+ switch ( event.keyCode ) {
158
+ // When UP is pressed, if the caret is at the start of the text, move it to the 0
159
+ // position.
160
+ case UP: {
161
+ if ( 0 !== event.target.selectionStart ) {
162
+ event.stopPropagation();
163
+ event.preventDefault();
164
+
165
+ // Set the input caret to position 0
166
+ event.target.setSelectionRange( 0, 0 );
167
+ }
168
+ break;
169
+ }
170
+ // When DOWN is pressed, if the caret is not at the end of the text, move it to the
171
+ // last position.
172
+ case DOWN: {
173
+ if ( this.props.value.length !== event.target.selectionStart ) {
174
+ event.stopPropagation();
175
+ event.preventDefault();
176
+
177
+ // Set the input caret to the last position
178
+ event.target.setSelectionRange( this.props.value.length, this.props.value.length );
179
+ }
180
+ break;
181
+ }
182
+ }
183
+
184
+ return;
185
+ }
186
+
187
+ const suggestion = this.state.suggestions[ this.state.selectedSuggestion ];
188
+
189
+ switch ( event.keyCode ) {
190
+ case UP: {
191
+ event.stopPropagation();
192
+ event.preventDefault();
193
+ const previousIndex = ! selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1;
194
+ this.setState( {
195
+ selectedSuggestion: previousIndex,
196
+ } );
197
+ break;
198
+ }
199
+ case DOWN: {
200
+ event.stopPropagation();
201
+ event.preventDefault();
202
+ const nextIndex = selectedSuggestion === null || ( selectedSuggestion === suggestions.length - 1 ) ? 0 : selectedSuggestion + 1;
203
+ this.setState( {
204
+ selectedSuggestion: nextIndex,
205
+ } );
206
+ break;
207
+ }
208
+ case TAB: {
209
+ if ( this.state.selectedSuggestion !== null ) {
210
+ this.selectLink( suggestion );
211
+ // Announce a link has been selected when tabbing away from the input field.
212
+ this.props.speak( __( 'Link selected.' ) );
213
+ }
214
+ break;
215
+ }
216
+ case ENTER: {
217
+ if ( this.state.selectedSuggestion !== null ) {
218
+ event.stopPropagation();
219
+ this.selectLink( suggestion );
220
+ }
221
+ break;
222
+ }
223
+ }
224
+ }
225
+
226
+ selectLink( suggestion ) {
227
+ this.props.onChange( suggestion.url, suggestion );
228
+ this.setState( {
229
+ selectedSuggestion: null,
230
+ showSuggestions: false,
231
+ } );
232
+ }
233
+
234
+ handleOnClick( suggestion ) {
235
+ this.selectLink( suggestion );
236
+ // Move focus to the input field when a link suggestion is clicked.
237
+ this.inputRef.current.focus();
238
+ }
239
+
240
+ render() {
241
+ const { value = '', autoFocus = true, instanceId, className } = this.props;
242
+ const { showSuggestions, suggestions, selectedSuggestion, loading } = this.state;
243
+
244
+ const suggestionsListboxId = `block-editor-url-input-suggestions-${ instanceId }`;
245
+ const suggestionOptionIdPrefix = `block-editor-url-input-suggestion-${ instanceId }`;
246
+
247
+ /* eslint-disable jsx-a11y/no-autofocus */
248
+ return (
249
+ <div className={ classnames( 'editor-url-input block-editor-url-input', className ) }>
250
+ <input
251
+ autoFocus={ autoFocus }
252
+ type="text"
253
+ aria-label={ __( 'URL' ) }
254
+ required
255
+ value={ value }
256
+ onChange={ this.onChange }
257
+ onInput={ stopEventPropagation }
258
+ placeholder={ __( 'Paste or type to search for your Pretty Link' ) }
259
+ onKeyDown={ this.onKeyDown }
260
+ role="combobox"
261
+ aria-expanded={ showSuggestions }
262
+ aria-autocomplete="list"
263
+ aria-owns={ suggestionsListboxId }
264
+ aria-activedescendant={ selectedSuggestion !== null ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` : undefined }
265
+ ref={ this.inputRef }
266
+ />
267
+
268
+ { ( loading ) && <Spinner /> }
269
+
270
+ { showSuggestions && !! suggestions.length &&
271
+ <Popover position="bottom" noArrow focusOnMount={ false }>
272
+ <div
273
+ className="editor-url-input__suggestions block-editor-url-input__suggestions"
274
+ id={ suggestionsListboxId }
275
+ ref={ this.autocompleteRef }
276
+ role="listbox"
277
+ >
278
+ { suggestions.map( ( suggestion, index ) => (
279
+ <button
280
+ key={ suggestion.id }
281
+ role="option"
282
+ tabIndex="-1"
283
+ id={ `${ suggestionOptionIdPrefix }-${ index }` }
284
+ ref={ this.bindSuggestionNode( index ) }
285
+ className={ classnames( 'editor-url-input__suggestion block-editor-url-input__suggestion', {
286
+ 'is-selected': index === selectedSuggestion,
287
+ } ) }
288
+ onClick={ () => this.handleOnClick( suggestion ) }
289
+ aria-selected={ index === selectedSuggestion }
290
+ >
291
+ { suggestion.title }
292
+ </button>
293
+ ) ) }
294
+ </div>
295
+ </Popover>
296
+ }
297
+ </div>
298
+ );
299
+ /* eslint-enable jsx-a11y/no-autofocus */
300
+ }
301
+ }
302
+
303
+ /**
304
+ * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/url-input/README.md
305
+ */
306
+ export default compose(
307
+ withSafeTimeout,
308
+ withSpokenMessages,
309
+ withInstanceId,
310
+ withSelect( ( select ) => {
311
+ const { getSettings } = select( 'core/block-editor' );
312
+ return {
313
+ fetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions,
314
+ };
315
+ } )
316
+ )( URLInput );
js/editor/formats/pretty-link/index.js ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { withSpokenMessages } from '@wordpress/components';
6
+ import { Component, Fragment } from '@wordpress/element';
7
+ import {
8
+ getTextContent,
9
+ applyFormat,
10
+ removeFormat,
11
+ slice,
12
+ registerFormatType
13
+ } from '@wordpress/rich-text';
14
+ import { isURL, isEmail } from '@wordpress/url';
15
+ import { RichTextToolbarButton, RichTextShortcut } from '@wordpress/block-editor';
16
+ import InlineLinkUI from '../../components/link-editor';
17
+
18
+ /**
19
+ * Block constants
20
+ */
21
+ const name = 'pretty-link/pretty-link';
22
+ const title = __( 'Pretty Link' );
23
+
24
+ export const prettyLink = {
25
+ name,
26
+ title,
27
+ tagName: 'a',
28
+ className: 'pretty-link',
29
+ attributes: {
30
+ url: 'href',
31
+ target: 'target'
32
+ },
33
+ edit: withSpokenMessages( class LinkEdit extends Component {
34
+ constructor() {
35
+ super( ...arguments );
36
+
37
+ this.addLink = this.addLink.bind( this );
38
+ this.stopAddingLink = this.stopAddingLink.bind( this );
39
+ this.onRemoveFormat = this.onRemoveFormat.bind( this );
40
+ this.state = {
41
+ addingLink: false,
42
+ };
43
+ }
44
+
45
+ addLink() {
46
+ const { value, onChange } = this.props;
47
+ const text = getTextContent( slice( value ) );
48
+
49
+ if ( text && isURL( text ) ) {
50
+ onChange( applyFormat( value, { type: name, attributes: { url: text } } ) );
51
+ } else {
52
+ this.setState( { addingLink: true } );
53
+ }
54
+ }
55
+
56
+ stopAddingLink() {
57
+ this.setState( { addingLink: false } );
58
+ }
59
+
60
+ onRemoveFormat() {
61
+ const { value, onChange, speak } = this.props;
62
+
63
+ onChange( removeFormat( value, name ) );
64
+ speak( __( 'Link removed.' ), 'assertive' );
65
+ }
66
+
67
+ render() {
68
+ const { isActive, activeAttributes, value, onChange } = this.props;
69
+
70
+ return (
71
+ <>
72
+ <RichTextShortcut
73
+ type="primary"
74
+ character="k"
75
+ onUse={ this.addLink }
76
+ />
77
+ <RichTextShortcut
78
+ type="primaryShift"
79
+ character="k"
80
+ onUse={ this.onRemoveFormat }
81
+ />
82
+ { isActive && <RichTextToolbarButton
83
+ icon="star-filled"
84
+ title={ __( 'Unlink' ) }
85
+ onClick={ this.onRemoveFormat }
86
+ isActive={ isActive }
87
+ shortcutType="primaryShift"
88
+ shortcutCharacter="k"
89
+ /> }
90
+ { ! isActive && <RichTextToolbarButton
91
+ icon="star-filled"
92
+ title={ title }
93
+ onClick={ this.addLink }
94
+ isActive={ isActive }
95
+ shortcutType="primary"
96
+ shortcutCharacter="k"
97
+ /> }
98
+ <InlineLinkUI
99
+ addingLink={ this.state.addingLink }
100
+ stopAddingLink={ this.stopAddingLink }
101
+ isActive={ isActive }
102
+ activeAttributes={ activeAttributes }
103
+ value={ value }
104
+ onChange={ onChange }
105
+ />
106
+ </>
107
+ );
108
+ }
109
+ } ),
110
+
111
+ };
112
+
113
+ function registerFormats () {
114
+ [
115
+ prettyLink,
116
+ ].forEach( ( { name, ...settings } ) => registerFormatType( name, settings ) );
117
+ };
118
+ registerFormats();
js/prli-admin-links.js CHANGED
@@ -62,43 +62,6 @@ function prli_toggle_link_options() {
62
  return false;
63
  });
64
 
65
- $("#add_group_textbox").keypress(function(e) {
66
- // Apparently 13 is the enter key
67
- if(e.which == 13) {
68
- e.preventDefault();
69
-
70
- var add_new_group_data = {
71
- action: 'add_new_prli_group',
72
- new_group_name: $('#add_group_textbox').val(),
73
- _prli_nonce: $('#add_group_textbox').attr('prli_nonce')
74
- };
75
-
76
- $.post(ajaxurl, add_new_group_data, function(data) {
77
- if(data['status']=='success') {
78
- $('#group_dropdown').append(data['group_option']);
79
- $('#group_dropdown').val(data['group_id']);
80
- $('#add_group_textbox').val('');
81
- $("#add_group_textbox").blur();
82
- $("#add_group_message").addClass('updated');
83
- $("#add_group_message").text(data['message']);
84
- $("#add_group_message").show();
85
-
86
- $("#add_group_message").fadeOut(5000, function(e) {
87
- $("#add_group_message").removeClass('updated');
88
- });
89
- }
90
- else {
91
- $("#add_group_message").addClass('error');
92
- $("#add_group_message").text(data['message']);
93
-
94
- $("#add_group_message").fadeOut(5000, function(e) {
95
- $("#add_group_message").removeClass('error');
96
- });
97
- }
98
- });
99
- }
100
- });
101
-
102
  $(".defaultText").focus(function(srcc) {
103
  if ($(this).val() == $(this)[0].title) {
104
  $(this).removeClass("defaultTextActive");
@@ -116,101 +79,31 @@ function prli_toggle_link_options() {
116
 
117
  $(".defaultText").blur();
118
 
119
- $(".link_row").hover( function() {
120
- $(this).find(".link_actions").show();
121
- },
122
- function() {
123
- $(this).find(".link_actions").hide();
124
- });
125
-
126
- $('.prli_bulk_action_apply').click( function() {
127
- if($('.prli_bulk_action').val()=='edit') {
128
- if($('.link-action-checkbox:checkbox:checked').length > 0)
129
- $('#bulk-edit').slideDown('slow');
130
- }
131
- else if($('.prli_bulk_action').val()=='delete') {
132
- var confmsg = $(this).attr('data-confmsg');
133
- if(confirm(confmsg)) {
134
- var ids = $('.link-action-checkbox:checkbox:checked').map(function() {
135
- return $(this).attr('data-id');
136
- }).get().join(',');
137
- var delurl = $('.prli_bulk_action_apply').attr('data-url') +
138
- window.location.search +
139
- '&action=bulk-destroy' +
140
- '&_wpnonce=' + $('.prli_bulk_action_apply').attr('data-wpnonce') +
141
- '&ids=' + ids;
142
-
143
- window.location = delurl;
144
- }
145
- }
146
- });
147
-
148
- $('.bulk-edit-cancel').click( function() {
149
- $('#bulk-edit').slideUp('slow');
150
- });
151
-
152
- $('.bulk-edit-update').click( function() {
153
- var ids = $('.link-action-checkbox:checkbox:checked').map(function() {
154
- return $(this).attr('data-id');
155
- }).get().join(',');
156
- var editurl = $('.prli_bulk_action_apply').attr('data-url') +
157
- window.location.search +
158
- '&action=bulk-update' +
159
- '&_wpnonce=' + $('.prli_bulk_action_apply').attr('data-wpnonce') +
160
- '&ids=' + ids;
161
-
162
- $('.bulk-edit-select').each( function() {
163
- if($(this).val() != '##nochange##')
164
- editurl += '&' + $(this).attr('name') + '=' + encodeURIComponent($(this).val());
165
- });
166
-
167
- $('.bulk-edit-text').each( function() {
168
- editurl += '&' + $(this).attr('name') + '=' + encodeURIComponent($(this).val());
169
- });
170
-
171
- window.location = editurl;
172
- });
173
 
174
- $('.link-action-checkbox').change( function() {
175
- if($(this).prop('checked')==false)
176
- $('.select-all-link-action-checkboxes').prop('checked',false);
177
-
178
- $('#bulk-titles').html('');
179
- $('.link-action-checkbox:checkbox:checked').each( function() {
180
- var nid = $(this).attr('data-id');
181
- var ntitle = $(this).attr('data-title');
182
- $('#bulk-titles').append('<div id="ttle'+nid+'"><a data-id="'+nid+'" class="ntdelbutton" title="Remove From Bulk Edit">X</a>"'+ntitle+'"</div>');
183
- $('.ntdelbutton').click( function() {
184
- var nid = $(this).attr('data-id');
185
- $('.link-action-checkbox[data-id='+nid+']').prop('checked',false);
186
- $('.link-action-checkbox[data-id='+nid+']').trigger('change');
187
- });
188
- });
189
  });
190
 
191
- // Check all boxes when the select all box is checked, etc
192
- $('.select-all-link-action-checkboxes').change(function() {
193
- if($(this).prop('checked'))
194
- $('.link-action-checkbox').prop('checked',true);
195
- else
196
- $('.link-action-checkbox').prop('checked',false);
197
 
198
- $('.link-action-checkbox').trigger('change');
199
- });
 
 
 
 
200
 
201
- // Set the correct colspan for the bulk-edit form
202
- // This is necessary because in some cases, PLP adds a
203
- // keyword column to this table -- so it has to be dynamic
204
- $('.prli-edit-table td.colspanchange').attr('colspan', $('table.prli-edit-table thead tr th').length);
205
 
206
- $('#prli_add_link_rotation').on('click', function(e) {
207
- e.preventDefault();
208
- $('#prli_link_rotations').append(PlpLink.rotation_row_html);
 
 
209
  });
210
 
211
- //PAGE TOGGLING IN LIST MODE
212
- $('.prli-page-size').change(function() {
213
- window.location.href = $(this).data("url") + $(this).val();
214
- });
215
  });
216
  })(jQuery);
62
  return false;
63
  });
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  $(".defaultText").focus(function(srcc) {
66
  if ($(this).val() == $(this)[0].title) {
67
  $(this).removeClass("defaultTextActive");
79
 
80
  $(".defaultText").blur();
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
+ $('#prli_add_link_rotation').on('click', function(e) {
84
+ e.preventDefault();
85
+ $('#prli_link_rotations').append(PlpLink.rotation_row_html);
 
 
 
 
 
 
 
 
 
 
 
 
86
  });
87
 
88
+ $('.prli_reset_pretty_link').on('click', function(e) {
89
+ e.preventDefault();
 
 
 
 
90
 
91
+ if(confirm(PrliLinkList.reset_str)) {
92
+ var args = {
93
+ 'action' : 'reset_pretty_link',
94
+ 'id' : $(this).data('id'),
95
+ 'security' : PrliLinkList.reset_security
96
+ };
97
 
98
+ $.post( ajaxurl, args, function(data) {
99
+ $('.clicks.column-clicks a#link_clicks_' + args.id).html('0/0');
 
 
100
 
101
+ // show message coming from the server indicating
102
+ // whether or not the reset was successful or not
103
+ alert(data.message);
104
+ }, 'json' );
105
+ }
106
  });
107
 
 
 
 
 
108
  });
109
  })(jQuery);
js/quick_create.js ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function ($) {
2
+ var $error = $('#prli-quick-create-error'),
3
+ $loading = $('#prli-quick-create-loading'),
4
+ showError = function (message) {
5
+ $error.html(
6
+ $('<div class="notice notice-error">').append(
7
+ $('<p>').text(message)
8
+ )
9
+ ).show();
10
+ };
11
+
12
+ $('#prli-quick-create').on('submit', function (e) {
13
+ e.preventDefault();
14
+
15
+ $error.hide();
16
+ $loading.show();
17
+
18
+ $.ajax({
19
+ type: 'POST',
20
+ url: PrliQuickCreate.ajaxUrl,
21
+ data: {
22
+ action: 'prli_quick_create',
23
+ _ajax_nonce: PrliQuickCreate.nonce,
24
+ url: $('#prli-quick-create-url').val(),
25
+ slug: $('#prli-quick-create-slug').val()
26
+ },
27
+ dataType: 'json'
28
+ }).done(function (response) {
29
+ if (response && typeof response === 'object') {
30
+ if (response.success) {
31
+ window.location = response.data.redirect;
32
+ } else {
33
+ showError(response.data.message);
34
+ }
35
+ } else {
36
+ showError(PrliQuickCreate.invalidServerResponse);
37
+ }
38
+ }).fail(function () {
39
+ showError(PrliQuickCreate.ajaxError);
40
+ }).always(function () {
41
+ $loading.hide();
42
+ });
43
+ });
44
+ });
js/tinymce_form_popup.js CHANGED
@@ -6,7 +6,7 @@ function prliHasWhiteSpace(s) {
6
  var PrliPopUpHandler = {
7
  init : function() {
8
  //Used in our insert function for link text
9
- prli_selected_text = parent.tinymce.activeEditor.selection.getContent({format: 'text'});
10
  },
11
  insert_new : function() {
12
  jQuery('#errors').html('');
@@ -23,13 +23,13 @@ var PrliPopUpHandler = {
23
 
24
  //Change vars to actual defaults if default was chosen
25
  if(redirect == 'default') {
26
- redirect = default_redirect;
27
  }
28
  if(nofollow == 'default') {
29
- nofollow = default_nofollow;
30
  }
31
  if(tracking == 'default') {
32
- tracking = default_tracking;
33
  }
34
 
35
  //Some validations
@@ -58,12 +58,12 @@ var PrliPopUpHandler = {
58
  jQuery("#insert").hide();
59
  jQuery("#insert_loading").fadeIn();
60
 
61
- jQuery.post(ajaxurl, data, function(response) {
62
  var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
63
 
64
  if(trimmed_data == 'true') {
65
  var output = '';
66
- var pretty_link = home_url + slug;
67
 
68
  //Set the link text to the link itself
69
  if(link_text.length === 0) {
@@ -144,19 +144,19 @@ var PrliPopUpHandler = {
144
  //Add a small delay so that prli_selected_text will be avaiable
145
  setTimeout(function() {
146
  //Nothing selected
147
- if(prli_selected_text.length === 0) {
148
  $("#prli_insert_link_link_text").val("Click Here");
149
  $("#existing_link_link_text").val("Click Here");
150
  }
151
  //If selected text is a link, make it the target URL
152
- else if(prli_selected_text.match(/https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/)) {
153
- $("#prli_insert_link_target").val(prli_selected_text);
154
  $("#prli_insert_link_link_text").val("Click Here");
155
  $("#existing_link_link_text").val("Click Here");
156
  //Show selected text
157
  } else {
158
- $("#prli_insert_link_link_text").val(prli_selected_text);
159
- $("#existing_link_link_text").val(prli_selected_text);
160
  }
161
  }, 200); //200ms
162
 
@@ -177,7 +177,7 @@ var PrliPopUpHandler = {
177
  $("#prlitinymce-bad-slug").hide();
178
  $("#prlitinymce-thinking").show();
179
 
180
- $.post(ajaxurl, data, function(response) {
181
  var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
182
 
183
  if(trimmed_data == 'true') {
@@ -222,12 +222,12 @@ var PrliPopUpHandler = {
222
 
223
  //Load the autocomplete stuff
224
  $('#prli_search_box').autocomplete({
225
- source: ajaxurl + "?action=prli_search_for_links",
226
  minLength: 2,
227
  select: function(event, ui) {
228
  $("#existing_link_target").html(ui.item.target);
229
  $("#existing_link_nofollow").val(ui.item.nofollow);
230
- $("#existing_link_slug").html(home_url + ui.item.slug);
231
  }
232
  });
233
  });
6
  var PrliPopUpHandler = {
7
  init : function() {
8
  //Used in our insert function for link text
9
+ prliTinymceL10n.prli_selected_text = parent.tinymce.activeEditor.selection.getContent({format: 'text'});
10
  },
11
  insert_new : function() {
12
  jQuery('#errors').html('');
23
 
24
  //Change vars to actual defaults if default was chosen
25
  if(redirect == 'default') {
26
+ redirect = prliTinymceL10n.default_redirect;
27
  }
28
  if(nofollow == 'default') {
29
+ nofollow = prliTinymceL10n.default_nofollow;
30
  }
31
  if(tracking == 'default') {
32
+ tracking = prliTinymceL10n.default_tracking;
33
  }
34
 
35
  //Some validations
58
  jQuery("#insert").hide();
59
  jQuery("#insert_loading").fadeIn();
60
 
61
+ jQuery.post(prliTinymceL10n.ajaxurl, data, function(response) {
62
  var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
63
 
64
  if(trimmed_data == 'true') {
65
  var output = '';
66
+ var pretty_link = prliTinymceL10n.home_url + slug;
67
 
68
  //Set the link text to the link itself
69
  if(link_text.length === 0) {
144
  //Add a small delay so that prli_selected_text will be avaiable
145
  setTimeout(function() {
146
  //Nothing selected
147
+ if(prliTinymceL10n.prli_selected_text.length === 0) {
148
  $("#prli_insert_link_link_text").val("Click Here");
149
  $("#existing_link_link_text").val("Click Here");
150
  }
151
  //If selected text is a link, make it the target URL
152
+ else if(prliTinymceL10n.prli_selected_text.match(/https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/)) {
153
+ $("#prli_insert_link_target").val(prliTinymceL10n.prli_selected_text);
154
  $("#prli_insert_link_link_text").val("Click Here");
155
  $("#existing_link_link_text").val("Click Here");
156
  //Show selected text
157
  } else {
158
+ $("#prli_insert_link_link_text").val(prliTinymceL10n.prli_selected_text);
159
+ $("#existing_link_link_text").val(prliTinymceL10n.prli_selected_text);
160
  }
161
  }, 200); //200ms
162
 
177
  $("#prlitinymce-bad-slug").hide();
178
  $("#prlitinymce-thinking").show();
179
 
180
+ $.post(prliTinymceL10n.ajaxurl, data, function(response) {
181
  var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
182
 
183
  if(trimmed_data == 'true') {
222
 
223
  //Load the autocomplete stuff
224
  $('#prli_search_box').autocomplete({
225
+ source: prliTinymceL10n.ajaxurl + "?action=prli_search_for_links",
226
  minLength: 2,
227
  select: function(event, ui) {
228
  $("#existing_link_target").html(ui.item.target);
229
  $("#existing_link_nofollow").val(ui.item.nofollow);
230
+ $("#existing_link_slug").html(prliTinymceL10n.home_url + ui.item.slug);
231
  }
232
  });
233
  });
js/vendor/jquery.form-validator.min.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /** File generated by Grunt -- do not modify
2
+ * JQUERY-FORM-VALIDATOR
3
+ *
4
+ * @version 2.3.79
5
+ * @website http://formvalidator.net/
6
+ * @author Victor Jonsson, http://victorjonsson.se
7
+ * @license MIT
8
+ */
9
+ !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a,b,c){function d(a,b){this.$form=a,this.$input=b,this.reset(),b.on("change paste",this.reset.bind(this))}var e=function(){return!1},f=null,g={numHalted:0,haltValidation:function(b){this.numHalted++,a.formUtils.haltValidation=!0,b.unbind("submit",e).bind("submit",e).find('*[type="submit"]').addClass("disabled").attr("disabled","disabled")},unHaltValidation:function(b){this.numHalted--,0===this.numHalted&&(a.formUtils.haltValidation=!1,b.unbind("submit",e).find('*[type="submit"]').removeClass("disabled").removeAttr("disabled","disabled"))}};d.prototype.reset=function(){this.haltedFormValidation=!1,this.hasRun=!1,this.isRunning=!1,this.result=c},d.prototype.run=function(a,b){return"keyup"===a?null:this.isRunning?(f=a,this.haltedFormValidation||(g.haltValidation(),this.haltedFormValidation=!0),null):this.hasRun?this.result:(f=a,g.haltValidation(this.$form),this.haltedFormValidation=!0,this.isRunning=!0,this.$input.attr("disabled","disabled").addClass("async-validation"),this.$form.addClass("async-validation"),b(function(a){this.done(a)}.bind(this)),null)},d.prototype.done=function(a){this.result=a,this.hasRun=!0,this.isRunning=!1,this.$input.removeAttr("disabled").removeClass("async-validation"),this.$form.removeClass("async-validation"),this.haltedFormValidation&&(g.unHaltValidation(this.$form),"submit"===f?this.$form.trigger("submit"):this.$input.trigger("validation.revalidate"))},d.loadInstance=function(a,b,c){var e,f=b.get(0);return f.asyncValidators||(f.asyncValidators={}),f.asyncValidators[a]?e=f.asyncValidators[a]:(e=new d(c,b),f.asyncValidators[a]=e),e},a.formUtils=a.extend(a.formUtils||{},{asyncValidation:function(a,b,c){return this.warn("Use of deprecated function $.formUtils.asyncValidation, use $.formUtils.addAsyncValidator() instead"),d.loadInstance(a,b,c)},addAsyncValidator:function(b){var c=a.extend({},b),e=c.validatorFunction;c.async=!0,c.validatorFunction=function(a,b,f,g,h,i){var j=d.loadInstance(this.name,b,h);return j.run(i,function(d){e.apply(c,[d,a,b,f,g,h,i])})},this.addValidator(c)}}),a(b).bind("validatorsLoaded formValidationSetup",function(b,c){c||(c=a("form")),c.find("[data-validation]").each(function(){var b=a(this);b.valAttr("async",!1),a.each(a.split(b.attr("data-validation")),function(c,d){var e=a.formUtils.validators["validate_"+d];e&&e.async&&b.valAttr("async","yes")})})})}(a,window),function(a,b){"use strict";function c(b){b&&"custom"===b.errorMessagePosition&&"function"==typeof b.errorMessageCustom&&(a.formUtils.warn("Use of deprecated function errorMessageCustom, use config.submitErrorMessageCallback instead"),b.submitErrorMessageCallback=function(a,c){b.errorMessageCustom(a,b.language.errorTitle,c,b)})}function d(b){if(b.errorMessagePosition&&"object"==typeof b.errorMessagePosition){a.formUtils.warn("Deprecated use of config parameter errorMessagePosition, use config.submitErrorMessageCallback instead");var c=b.errorMessagePosition;b.errorMessagePosition="top",b.submitErrorMessageCallback=function(){return c}}}function e(b){var c=b.find("[data-validation-if-checked]");c.length&&a.formUtils.warn('Detected use of attribute "data-validation-if-checked" which is deprecated. Use "data-validation-depends-on" provided by module "logic"'),c.on("beforeValidation",function(){var c=a(this),d=c.valAttr("if-checked"),e=a('input[name="'+d+'"]',b),f=e.is(":checked"),g=(a.formUtils.getValue(e)||"").toString(),h=c.valAttr("if-checked-value");(!f||h&&h!==g)&&c.valAttr("skipped",!0)})}function f(b){var c={se:"sv",cz:"cs",dk:"da"};if(b.lang in c){var d=c[b.lang];a.formUtils.warn('Deprecated use of lang code "'+b.lang+'" use "'+d+'" instead'),b.lang=d}}a.fn.validateForm=function(b,c){return a.formUtils.warn("Use of deprecated function $.validateForm, use $.isValid instead"),this.isValid(b,c,!0)},a(window).on("formValidationPluginInit",function(a,b){f(b),c(b),d(b)}).on("validatorsLoaded formValidationSetup",function(b,c){c||(c=a("form")),e(c)})}(a),function(a){"use strict";var b={resolveErrorMessage:function(a,b,c,d,e){var f=d.validationErrorMsgAttribute+"-"+c.replace("validate_",""),g=a.attr(f);return g||(g=a.attr(d.validationErrorMsgAttribute),g||(g="function"!=typeof b.errorMessageKey?e[b.errorMessageKey]:e[b.errorMessageKey(d)],g||(g=b.errorMessage))),g},getParentContainer:function(b){if(b.valAttr("error-msg-container"))return a(b.valAttr("error-msg-container"));var c=b.parent();return"checkbox"===b.attr("type")&&b.closest(".checkbox").length?c=b.closest(".checkbox").parent():"radio"===b.attr("type")&&b.closest(".radio").length&&(c=b.closest(".radio").parent()),c.closest(".input-group").length&&(c=c.closest(".input-group").parent()),c},applyInputErrorStyling:function(a,b){a.addClass(b.errorElementClass).removeClass(b.successElementClass),this.getParentContainer(a).addClass(b.inputParentClassOnError).removeClass(b.inputParentClassOnSuccess),""!==b.borderColorOnError&&a.css("border-color",b.borderColorOnError)},applyInputSuccessStyling:function(a,b){a.addClass(b.successElementClass),this.getParentContainer(a).addClass(b.inputParentClassOnSuccess)},removeInputStylingAndMessage:function(a,c){a.removeClass(c.successElementClass).removeClass(c.errorElementClass).css("border-color","");var d=b.getParentContainer(a);if(d.removeClass(c.inputParentClassOnError).removeClass(c.inputParentClassOnSuccess),"function"==typeof c.inlineErrorMessageCallback){var e=c.inlineErrorMessageCallback(a,!1,c);e&&e.html("")}else d.find("."+c.errorMessageClass).remove()},removeAllMessagesAndStyling:function(c,d){if("function"==typeof d.submitErrorMessageCallback){var e=d.submitErrorMessageCallback(c,!1,d);e&&e.html("")}else c.find("."+d.errorMessageClass+".alert").remove();c.find("."+d.errorElementClass+",."+d.successElementClass).each(function(){b.removeInputStylingAndMessage(a(this),d)})},setInlineMessage:function(b,c,d){this.applyInputErrorStyling(b,d);var e,f=document.getElementById(b.attr("name")+"_err_msg"),g=!1,h=function(d){a.formUtils.$win.trigger("validationErrorDisplay",[b,d]),d.html(c)},i=function(){var f=!1;g.find("."+d.errorMessageClass).each(function(){if(this.inputReferer===b[0])return f=a(this),!1}),f?c?h(f):f.remove():""!==c&&(e=a('<div class="'+d.errorMessageClass+' alert"></div>'),h(e),e[0].inputReferer=b[0],g.prepend(e))};if(f)a.formUtils.warn("Using deprecated element reference "+f.id),g=a(f),i();else if("function"==typeof d.inlineErrorMessageCallback){if(g=d.inlineErrorMessageCallback(b,c,d),!g)return;i()}else{var j=this.getParentContainer(b);e=j.find("."+d.errorMessageClass+".help-block"),0===e.length&&(e=a("<span></span>").addClass("help-block").addClass(d.errorMessageClass),e.appendTo(j)),h(e)}},setMessageInTopOfForm:function(b,c,d,e){var f='<div class="{errorMessageClass} alert alert-danger"><strong>{errorTitle}</strong><ul>{fields}</ul></div>',g=!1;if("function"!=typeof d.submitErrorMessageCallback||(g=d.submitErrorMessageCallback(b,c,d))){var h={errorTitle:e.errorTitle,fields:"",errorMessageClass:d.errorMessageClass};a.each(c,function(a,b){h.fields+="<li>"+b+"</li>"}),a.each(h,function(a,b){f=f.replace("{"+a+"}",b)}),g?g.html(f):b.children().eq(0).before(a(f))}}};a.formUtils=a.extend(a.formUtils||{},{dialogs:b})}(a),function(a,b,c){"use strict";var d=0;a.fn.validateOnBlur=function(b,c){var d=this,e=this.find("*[data-validation]");return e.each(function(){var e=a(this);if(e.is("[type=radio]")){var f=d.find('[type=radio][name="'+e.attr("name")+'"]');f.bind("blur.validation",function(){e.validateInputOnBlur(b,c,!0,"blur")}),c.validateCheckboxRadioOnClick&&f.bind("click.validation",function(){e.validateInputOnBlur(b,c,!0,"click")})}}),e.bind("blur.validation",function(){a(this).validateInputOnBlur(b,c,!0,"blur")}),c.validateCheckboxRadioOnClick&&this.find("input[type=checkbox][data-validation],input[type=radio][data-validation]").bind("click.validation",function(){a(this).validateInputOnBlur(b,c,!0,"click")}),this},a.fn.validateOnEvent=function(b,c){if(0!==this.length){var d="FORM"===this[0].nodeName?this.find("*[data-validation-event]"):this;return d.each(function(){var d=a(this),e=d.valAttr("event");e&&d.unbind(e+".validation").bind(e+".validation",function(d){9!==(d||{}).keyCode&&a(this).validateInputOnBlur(b,c,!0,e)})}),this}},a.fn.showHelpOnFocus=function(b){return b||(b="data-validation-help"),this.find("textarea,input").each(function(){var c=a(this),e="jquery_form_help_"+ ++d,f=c.attr(b);c.removeClass("has-help-text").unbind("focus.help").unbind("blur.help"),f&&c.addClass("has-help-txt").bind("focus.help",function(){var b=c.parent().find("."+e);0===b.length&&(b=a("<span />").addClass(e).addClass("help").addClass("help-block").text(f).hide(),c.after(b)),b.fadeIn()}).bind("blur.help",function(){a(this).parent().find("."+e).fadeOut("slow")})}),this},a.fn.validate=function(b,c,d){var e=a.extend({},a.formUtils.LANG,d||{});this.each(function(){var d=a(this),f=d.closest("form").get(0)||{},g=f.validationConfig||a.formUtils.defaultConfig();d.one("validation",function(a,c){"function"==typeof b&&b(c,this,a)}),d.validateInputOnBlur(e,a.extend({},g,c||{}),!0)})},a.fn.willPostponeValidation=function(){return(this.valAttr("suggestion-nr")||this.valAttr("postpone")||this.hasClass("hasDatepicker"))&&!b.postponedValidation},a.fn.validateInputOnBlur=function(c,d,e,f){if(a.formUtils.eventType=f,this.willPostponeValidation()){var g=this,h=this.valAttr("postpone")||200;return b.postponedValidation=function(){g.validateInputOnBlur(c,d,e,f),b.postponedValidation=!1},setTimeout(function(){b.postponedValidation&&b.postponedValidation()},h),this}c=a.extend({},a.formUtils.LANG,c||{}),a.formUtils.dialogs.removeInputStylingAndMessage(this,d);var i=this,j=i.closest("form"),k=a.formUtils.validateInput(i,c,d,j,f),l=function(){i.validateInputOnBlur(c,d,!1,"blur.revalidated")};return"blur"===f&&i.unbind("validation.revalidate",l).one("validation.revalidate",l),e&&i.removeKeyUpValidation(),k.shouldChangeDisplay&&(k.isValid?a.formUtils.dialogs.applyInputSuccessStyling(i,d):a.formUtils.dialogs.setInlineMessage(i,k.errorMsg,d)),!k.isValid&&e&&i.validateOnKeyUp(c,d),this},a.fn.validateOnKeyUp=function(b,c){return this.each(function(){var d=a(this);d.valAttr("has-keyup-event")||d.valAttr("has-keyup-event","true").bind("keyup.validation",function(a){9!==a.keyCode&&d.validateInputOnBlur(b,c,!1,"keyup")})}),this},a.fn.removeKeyUpValidation=function(){return this.each(function(){a(this).valAttr("has-keyup-event",!1).unbind("keyup.validation")}),this},a.fn.valAttr=function(a,b){return b===c?this.attr("data-validation-"+a):b===!1||null===b?this.removeAttr("data-validation-"+a):(a=a.length>0?"-"+a:"",this.attr("data-validation"+a,b))},a.fn.isValid=function(b,c,d){if(a.formUtils.isLoadingModules){var e=this;return setTimeout(function(){e.isValid(b,c,d)},200),null}c=a.extend({},a.formUtils.defaultConfig(),c||{}),b=a.extend({},a.formUtils.LANG,b||{}),d=d!==!1,a.formUtils.errorDisplayPreventedWhenHalted&&(delete a.formUtils.errorDisplayPreventedWhenHalted,d=!1);var f=function(b,e){a.inArray(b,h)<0&&h.push(b),i.push(e),e.valAttr("current-error",b),d&&a.formUtils.dialogs.applyInputErrorStyling(e,c)},g=[],h=[],i=[],j=this,k=function(b,d){return"submit"===d||"button"===d||"reset"===d||a.inArray(b,c.ignore||[])>-1};if(d&&a.formUtils.dialogs.removeAllMessagesAndStyling(j,c),j.find("input,textarea,select").filter(':not([type="submit"],[type="button"])').each(function(){var d=a(this),e=d.attr("type"),h="radio"===e||"checkbox"===e,i=d.attr("name");if(!k(i,e)&&(!h||a.inArray(i,g)<0)){h&&g.push(i);var l=a.formUtils.validateInput(d,b,c,j,"submit");l.isValid?l.isValid&&l.shouldChangeDisplay&&(d.valAttr("current-error",!1),a.formUtils.dialogs.applyInputSuccessStyling(d,c)):f(l.errorMsg,d)}}),"function"==typeof c.onValidate){var l=c.onValidate(j);a.isArray(l)?a.each(l,function(a,b){f(b.message,b.element)}):l&&l.element&&l.message&&f(l.message,l.element)}return a.formUtils.isValidatingEntireForm=!1,i.length>0&&d&&("top"===c.errorMessagePosition?a.formUtils.dialogs.setMessageInTopOfForm(j,h,c,b):a.each(i,function(b,d){a.formUtils.dialogs.setInlineMessage(d,d.valAttr("current-error"),c)}),c.scrollToTopOnError&&a.formUtils.$win.scrollTop(j.offset().top-20)),!d&&a.formUtils.haltValidation&&(a.formUtils.errorDisplayPreventedWhenHalted=!0),0===i.length&&!a.formUtils.haltValidation},a.fn.restrictLength=function(b){return new a.formUtils.lengthRestriction(this,b),this},a.fn.addSuggestions=function(b){var c=!1;return this.find("input").each(function(){var d=a(this);c=a.split(d.attr("data-suggestions")),c.length>0&&!d.hasClass("has-suggestions")&&(a.formUtils.suggest(d,c,b),d.addClass("has-suggestions"))}),this}}(a,window),function(a){"use strict";a.formUtils=a.extend(a.formUtils||{},{isLoadingModules:!1,loadedModules:{},registerLoadedModule:function(b){this.loadedModules[a.trim(b).toLowerCase()]=!0},hasLoadedModule:function(b){return a.trim(b).toLowerCase()in this.loadedModules},loadModules:function(b,c,d){if(a.formUtils.isLoadingModules)return void setTimeout(function(){a.formUtils.loadModules(b,c,d)},100);var e=function(b,c){var e=a.split(b),f=e.length,g=function(){f--,0===f&&(a.formUtils.isLoadingModules=!1,"function"==typeof d&&d())};f>0&&(a.formUtils.isLoadingModules=!0);var h="?_="+(new Date).getTime(),i=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];a.each(e,function(b,d){if(d=a.trim(d),0===d.length||a.formUtils.hasLoadedModule(d))g();else{var e=c+d+(".js"===d.slice(-3)?"":".js"),f=document.createElement("SCRIPT");"function"==typeof define&&define.amd?require([e+(".dev.js"===e.slice(-7)?h:"")],g):(f.type="text/javascript",f.onload=g,f.src=e+(".dev.js"===e.slice(-7)?h:""),f.onerror=function(){a.formUtils.warn("Unable to load form validation module "+e,!0),g()},f.onreadystatechange=function(){"complete"!==this.readyState&&"loaded"!==this.readyState||(g(),this.onload=null,this.onreadystatechange=null)},i.appendChild(f))}})};if(c)e(b,c);else{var f=function(){var c=!1;return a('script[src*="form-validator"]').each(function(){var a=this.src.split("form-validator")[1].split("node_modules").length>1;if(!a)return c=this.src.substr(0,this.src.lastIndexOf("/"))+"/","/"===c&&(c=""),!1}),c!==!1&&(e(b,c),!0)};f()||a(function(){var a=f();a||"function"==typeof d&&d()})}}})}(a),function(a){"use strict";a.split=function(b,c,d){d=void 0===d||d===!0;var e="[,|"+(d?"\\s":"")+"-]\\s*",f=new RegExp(e,"g");if("function"!=typeof c){if(!b)return[];var g=[];return a.each(b.split(c?c:f),function(b,c){c=a.trim(c),c.length&&g.push(c)}),g}b&&a.each(b.split(f),function(b,d){if(d=a.trim(d),d.length)return c(d,b)})},a.validate=function(b){var c=a.extend(a.formUtils.defaultConfig(),{form:"form",validateOnEvent:!1,validateOnBlur:!0,validateCheckboxRadioOnClick:!0,showHelpOnFocus:!0,addSuggestions:!0,modules:"",onModulesLoaded:null,language:!1,onSuccess:!1,onError:!1,onElementValidate:!1});if(b=a.extend(c,b||{}),a(window).trigger("formValidationPluginInit",[b]),b.lang&&"en"!==b.lang){var d="lang/"+b.lang+".js";b.modules+=b.modules.length?","+d:d}a(b.form).each(function(c,d){d.validationConfig=b;var e=a(d);e.trigger("formValidationSetup",[e,b]),e.find(".has-help-txt").unbind("focus.validation").unbind("blur.validation"),e.removeClass("has-validation-callback").unbind("submit.validation").unbind("reset.validation").find("input[data-validation],textarea[data-validation]").unbind("blur.validation"),e.bind("submit.validation",function(c){var d=a(this),e=function(){return c.stopImmediatePropagation(),!1};if(a.formUtils.haltValidation)return e();if(a.formUtils.isLoadingModules)return setTimeout(function(){d.trigger("submit.validation")},200),e();var f=d.isValid(b.language,b);if(a.formUtils.haltValidation)return e();if(!f||"function"!=typeof b.onSuccess)return f||"function"!=typeof b.onError?!!f||e():(b.onError(d),e());var g=b.onSuccess(d);return g===!1?e():void 0}).bind("reset.validation",function(){a.formUtils.dialogs.removeAllMessagesAndStyling(e,b)}).addClass("has-validation-callback"),b.showHelpOnFocus&&e.showHelpOnFocus(),b.addSuggestions&&e.addSuggestions(),b.validateOnBlur&&(e.validateOnBlur(b.language,b),e.bind("html5ValidationAttrsFound",function(){e.validateOnBlur(b.language,b)})),b.validateOnEvent&&e.validateOnEvent(b.language,b)}),""!==b.modules&&a.formUtils.loadModules(b.modules,null,function(){"function"==typeof b.onModulesLoaded&&b.onModulesLoaded();var c="string"==typeof b.form?a(b.form):b.form;a.formUtils.$win.trigger("validatorsLoaded",[c,b])})}}(a),function(a,b){"use strict";var c=a(b);a.formUtils=a.extend(a.formUtils||{},{$win:c,defaultConfig:function(){return{ignore:[],errorElementClass:"error",successElementClass:"valid",borderColorOnError:"#b94a48",errorMessageClass:"form-error",validationRuleAttribute:"data-validation",validationErrorMsgAttribute:"data-validation-error-msg",errorMessagePosition:"inline",errorMessageTemplate:{container:'<div class="{errorMessageClass} alert alert-danger">{messages}</div>',messages:"<strong>{errorTitle}</strong><ul>{fields}</ul>",field:"<li>{msg}</li>"},scrollToTopOnError:!0,dateFormat:"yyyy-mm-dd",addValidClassOnAll:!1,decimalSeparator:".",inputParentClassOnError:"has-error",inputParentClassOnSuccess:"has-success",validateHiddenInputs:!1,inlineErrorMessageCallback:!1,submitErrorMessageCallback:!1}},validators:{},sanitizers:{},_events:{load:[],valid:[],invalid:[]},haltValidation:!1,addValidator:function(a){var b=0===a.name.indexOf("validate_")?a.name:"validate_"+a.name;void 0===a.validateOnKeyUp&&(a.validateOnKeyUp=!0),this.validators[b]=a},addSanitizer:function(a){this.sanitizers[a.name]=a},warn:function(a,c){"console"in b?"function"==typeof b.console.warn?b.console.warn(a):"function"==typeof b.console.log&&b.console.log(a):c&&alert(a)},getValue:function(a,b){var c=b?b.find(a):a;if(c.length>0){var d=c.eq(0).attr("type");return"radio"===d||"checkbox"===d?c.filter(":checked").val()||"":c.val()||""}return!1},validateInput:function(b,c,d,e,f){d=d||a.formUtils.defaultConfig(),c=c||a.formUtils.LANG,e.length||(e=b.parent());var g=this.getValue(b);b.valAttr("skipped",!1).one("beforeValidation",function(){(b.attr("disabled")||!b.is(":visible")&&!d.validateHiddenInputs)&&b.valAttr("skipped",1)}).trigger("beforeValidation",[g,c,d]);var h="true"===b.valAttr("optional"),i=!g&&h,j=b.attr(d.validationRuleAttribute),k=!0,l="",m={isValid:!0,shouldChangeDisplay:!0,errorMsg:""};if(!j||i||b.valAttr("skipped"))return m.shouldChangeDisplay=d.addValidClassOnAll,m;var n=b.valAttr("ignore");return n&&a.each(n.split(""),function(a,b){g=g.replace(new RegExp("\\"+b,"g"),"")}),a.split(j,function(h){0!==h.indexOf("validate_")&&(h="validate_"+h);var i=a.formUtils.validators[h];if(!i)throw new Error('Using undefined validator "'+h+'". Maybe you have forgotten to load the module that "'+h+'" belongs to?');if("validate_checkbox_group"===h&&(b=e.find('[name="'+b.attr("name")+'"]:eq(0)')),("keyup"!==f||i.validateOnKeyUp)&&(k=i.validatorFunction(g,b,d,c,e,f)),!k)return d.validateOnBlur&&b.validateOnKeyUp(c,d),l=a.formUtils.dialogs.resolveErrorMessage(b,i,h,d,c),!1}),k===!1?(b.trigger("validation",!1),m.errorMsg=l,m.isValid=!1,m.shouldChangeDisplay=!0):null===k?m.shouldChangeDisplay=!1:(b.trigger("validation",!0),m.shouldChangeDisplay=!0),"function"==typeof d.onElementValidate&&null!==l&&d.onElementValidate(m.isValid,b,e,l),b.trigger("afterValidation",[m,f]),m},parseDate:function(b,c,d){var e,f,g,h,i=c.replace(/[a-zA-Z]/gi,"").substring(0,1),j="^",k=c.split(i||null);if(a.each(k,function(a,b){j+=(a>0?"\\"+i:"")+"(\\d{"+b.length+"})"}),j+="$",d){var l=[];a.each(b.split(i),function(a,b){1===b.length&&(b="0"+b),l.push(b)}),b=l.join(i)}if(e=b.match(new RegExp(j)),null===e)return!1;var m=function(b,c,d){for(var e=0;e<c.length;e++)if(c[e].substring(0,1)===b)return a.formUtils.parseDateInt(d[e+1]);return-1};return g=m("m",k,e),f=m("d",k,e),h=m("y",k,e),!(2===g&&f>28&&(h%4!==0||h%100===0&&h%400!==0)||2===g&&f>29&&(h%4===0||h%100!==0&&h%400===0)||g>12||0===g)&&(!(this.isShortMonth(g)&&f>30||!this.isShortMonth(g)&&f>31||0===f)&&[h,g,f])},parseDateInt:function(a){return 0===a.indexOf("0")&&(a=a.replace("0","")),parseInt(a,10)},isShortMonth:function(a){return a%2===0&&a<7||a%2!==0&&a>7},lengthRestriction:function(b,c){var d=parseInt(c.text(),10),e=0,f=function(){var a=b.val().length;if(a>d){var f=b.scrollTop();b.val(b.val().substring(0,d)),b.scrollTop(f)}e=d-a,e<0&&(e=0),c.text(e)};a(b).bind("keydown keyup keypress focus blur",f).bind("cut paste",function(){setTimeout(f,100)}),a(document).bind("ready",f)},numericRangeCheck:function(b,c){var d=a.split(c),e=parseInt(c.substr(3),10);return 1===d.length&&c.indexOf("min")===-1&&c.indexOf("max")===-1&&(d=[c,c]),2===d.length&&(b<parseInt(d[0],10)||b>parseInt(d[1],10))?["out",d[0],d[1]]:0===c.indexOf("min")&&b<e?["min",e]:0===c.indexOf("max")&&b>e?["max",e]:["ok"]},_numSuggestionElements:0,_selectedSuggestion:null,_previousTypedVal:null,suggest:function(b,d,e){var f={css:{maxHeight:"150px",background:"#FFF",lineHeight:"150%",textDecoration:"underline",overflowX:"hidden",overflowY:"auto",border:"#CCC solid 1px",borderTop:"none",cursor:"pointer"},activeSuggestionCSS:{background:"#E9E9E9"}},g=function(a,b){var c=b.offset();a.css({width:b.outerWidth(),left:c.left+"px",top:c.top+b.outerHeight()+"px"})};e&&a.extend(f,e),f.css.position="absolute",f.css["z-index"]=9999,b.attr("autocomplete","off"),0===this._numSuggestionElements&&c.bind("resize",function(){a(".jquery-form-suggestions").each(function(){var b=a(this),c=b.attr("data-suggest-container");g(b,a(".suggestions-"+c).eq(0))})}),this._numSuggestionElements++;var h=function(b){var c=b.valAttr("suggestion-nr");a.formUtils._selectedSuggestion=null,a.formUtils._previousTypedVal=null,a(".jquery-form-suggestion-"+c).fadeOut("fast")};return b.data("suggestions",d).valAttr("suggestion-nr",this._numSuggestionElements).unbind("focus.suggest").bind("focus.suggest",function(){a(this).trigger("keyup"),a.formUtils._selectedSuggestion=null}).unbind("keyup.suggest").bind("keyup.suggest",function(){var c=a(this),d=[],e=a.trim(c.val()).toLocaleLowerCase();if(e!==a.formUtils._previousTypedVal){a.formUtils._previousTypedVal=e;var i=!1,j=c.valAttr("suggestion-nr"),k=a(".jquery-form-suggestion-"+j);if(k.scrollTop(0),""!==e){var l=e.length>2;a.each(c.data("suggestions"),function(a,b){var c=b.toLocaleLowerCase();return c===e?(d.push("<strong>"+b+"</strong>"),i=!0,!1):void((0===c.indexOf(e)||l&&c.indexOf(e)>-1)&&d.push(b.replace(new RegExp(e,"gi"),"<strong>$&</strong>")))})}i||0===d.length&&k.length>0?k.hide():d.length>0&&0===k.length?(k=a("<div></div>").css(f.css).appendTo("body"),b.addClass("suggestions-"+j),k.attr("data-suggest-container",j).addClass("jquery-form-suggestions").addClass("jquery-form-suggestion-"+j)):d.length>0&&!k.is(":visible")&&k.show(),d.length>0&&e.length!==d[0].length&&(g(k,c),k.html(""),a.each(d,function(b,d){a("<div></div>").append(d).css({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"5px"}).addClass("form-suggest-element").appendTo(k).click(function(){c.focus(),c.val(a(this).text()),c.trigger("change"),h(c)})}))}}).unbind("keydown.validation").bind("keydown.validation",function(b){var c,d,e=b.keyCode?b.keyCode:b.which,g=a(this);if(13===e&&null!==a.formUtils._selectedSuggestion){if(c=g.valAttr("suggestion-nr"),d=a(".jquery-form-suggestion-"+c),d.length>0){var i=d.find("div").eq(a.formUtils._selectedSuggestion).text();g.val(i),g.trigger("change"),h(g),b.preventDefault()}}else{c=g.valAttr("suggestion-nr"),d=a(".jquery-form-suggestion-"+c);var j=d.children();if(j.length>0&&a.inArray(e,[38,40])>-1){38===e?(null===a.formUtils._selectedSuggestion?a.formUtils._selectedSuggestion=j.length-1:a.formUtils._selectedSuggestion--,a.formUtils._selectedSuggestion<0&&(a.formUtils._selectedSuggestion=j.length-1)):40===e&&(null===a.formUtils._selectedSuggestion?a.formUtils._selectedSuggestion=0:a.formUtils._selectedSuggestion++,a.formUtils._selectedSuggestion>j.length-1&&(a.formUtils._selectedSuggestion=0));var k=d.innerHeight(),l=d.scrollTop(),m=d.children().eq(0).outerHeight(),n=m*a.formUtils._selectedSuggestion;return(n<l||n>l+k)&&d.scrollTop(n),j.removeClass("active-suggestion").css("background","none").eq(a.formUtils._selectedSuggestion).addClass("active-suggestion").css(f.activeSuggestionCSS),b.preventDefault(),!1}}}).unbind("blur.suggest").bind("blur.suggest",function(){h(a(this))}),b},LANG:{errorTitle:"Form submission failed!",requiredField:"This is a required field",requiredFields:"You have not answered all required fields",badTime:"You have not given a correct time",badEmail:"You have not given a correct e-mail address",badTelephone:"You have not given a correct phone number",badSecurityAnswer:"You have not given a correct answer to the security question",badDate:"You have not given a correct date",lengthBadStart:"The input value must be between ",lengthBadEnd:" characters",lengthTooLongStart:"The input value is longer than ",lengthTooShortStart:"The input value is shorter than ",notConfirmed:"Input values could not be confirmed",badDomain:"Incorrect domain value",badUrl:"The input value is not a correct URL",badCustomVal:"The input value is incorrect",andSpaces:" and spaces ",badInt:"The input value was not a correct number",badSecurityNumber:"Your social security number was incorrect",badUKVatAnswer:"Incorrect UK VAT Number",badUKNin:"Incorrect UK NIN",badUKUtr:"Incorrect UK UTR Number",badStrength:"The password isn't strong enough",badNumberOfSelectedOptionsStart:"You have to choose at least ",badNumberOfSelectedOptionsEnd:" answers",badAlphaNumeric:"The input value can only contain alphanumeric characters ",badAlphaNumericExtra:" and ",wrongFileSize:"The file you are trying to upload is too large (max %s)",wrongFileType:"Only files of type %s is allowed",groupCheckedRangeStart:"Please choose between ",groupCheckedTooFewStart:"Please choose at least ",groupCheckedTooManyStart:"Please choose a maximum of ",groupCheckedEnd:" item(s)",badCreditCard:"The credit card number is not correct",badCVV:"The CVV number was not correct",wrongFileDim:"Incorrect image dimensions,",imageTooTall:"the image can not be taller than",imageTooWide:"the image can not be wider than",imageTooSmall:"the image was too small",min:"min",max:"max",imageRatioNotAccepted:"Image ratio is not be accepted",badBrazilTelephoneAnswer:"The phone number entered is invalid",badBrazilCEPAnswer:"The CEP entered is invalid",badBrazilCPFAnswer:"The CPF entered is invalid",badPlPesel:"The PESEL entered is invalid",badPlNip:"The NIP entered is invalid",badPlRegon:"The REGON entered is invalid",badreCaptcha:"Please confirm that you are not a bot",passwordComplexityStart:"Password must contain at least ",passwordComplexitySeparator:", ",passwordComplexityUppercaseInfo:" uppercase letter(s)",passwordComplexityLowercaseInfo:" lowercase letter(s)",passwordComplexitySpecialCharsInfo:" special character(s)",passwordComplexityNumericCharsInfo:" numeric character(s)",passwordComplexityEnd:"."}})}(a,window),function(a){a.formUtils.addValidator({name:"email",validatorFunction:function(b){var c=b.toLowerCase().split("@"),d=c[0],e=c[1];if(d&&e){if(0===d.indexOf('"')){var f=d.length;if(d=d.replace(/\"/g,""),d.length!==f-2)return!1}return a.formUtils.validators.validate_domain.validatorFunction(c[1])&&0!==d.indexOf(".")&&"."!==d.substring(d.length-1,d.length)&&d.indexOf("..")===-1&&!/[^\w\+\.\-\#\-\_\~\!\$\&\'\(\)\*\+\,\;\=\:]/.test(d)}return!1},errorMessage:"",errorMessageKey:"badEmail"}),a.formUtils.addValidator({name:"domain",validatorFunction:function(a){return a.length>0&&a.length<=253&&!/[^a-zA-Z0-9]/.test(a.slice(-2))&&!/[^a-zA-Z0-9]/.test(a.substr(0,1))&&!/[^a-zA-Z0-9\.\-]/.test(a)&&1===a.split("..").length&&a.split(".").length>1},errorMessage:"",errorMessageKey:"badDomain"}),a.formUtils.addValidator({name:"required",validatorFunction:function(b,c,d,e,f){switch(c.attr("type")){case"checkbox":return c.is(":checked");case"radio":return f.find('input[name="'+c.attr("name")+'"]').filter(":checked").length>0;default:return""!==a.trim(b)}},errorMessage:"",errorMessageKey:function(a){return"top"===a.errorMessagePosition||"function"==typeof a.errorMessagePosition?"requiredFields":"requiredField"}}),a.formUtils.addValidator({name:"length",validatorFunction:function(b,c,d,e){var f=c.valAttr("length"),g=c.attr("type");if(void 0===f)return alert('Please add attribute "data-validation-length" to '+c[0].nodeName+" named "+c.attr("name")),!0;var h,i="file"===g&&void 0!==c.get(0).files?c.get(0).files.length:b.length,j=a.formUtils.numericRangeCheck(i,f);switch(j[0]){case"out":this.errorMessage=e.lengthBadStart+f+e.lengthBadEnd,h=!1;break;case"min":this.errorMessage=e.lengthTooShortStart+j[1]+e.lengthBadEnd,h=!1;break;case"max":this.errorMessage=e.lengthTooLongStart+j[1]+e.lengthBadEnd,h=!1;break;default:h=!0}return h},errorMessage:"",errorMessageKey:""}),a.formUtils.addValidator({name:"url",validatorFunction:function(b){var c=/^(https?|ftp):\/\/((((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;if(c.test(b)){var d=b.split("://")[1],e=d.indexOf("/");return e>-1&&(d=d.substr(0,e)),a.formUtils.validators.validate_domain.validatorFunction(d)}return!1},errorMessage:"",errorMessageKey:"badUrl"}),a.formUtils.addValidator({name:"number",validatorFunction:function(a,b,c){if(""!==a){var d,e,f=b.valAttr("allowing")||"",g=b.valAttr("decimal-separator")||c.decimalSeparator,h=!1,i=b.valAttr("step")||"",j=!1,k=b.attr("data-sanitize")||"",l=k.match(/(^|[\s])numberFormat([\s]|$)/i);if(l){if(!window.numeral)throw new ReferenceError("The data-sanitize value numberFormat cannot be used without the numeral library. Please see Data Validation in http://www.formvalidator.net for more information.");a.length&&(a=String(numeral().unformat(a)))}if(f.indexOf("number")===-1&&(f+=",number"),f.indexOf("negative")===-1&&0===a.indexOf("-"))return!1;if(f.indexOf("range")>-1&&(d=parseFloat(f.substring(f.indexOf("[")+1,f.indexOf(";"))),e=parseFloat(f.substring(f.indexOf(";")+1,f.indexOf("]"))),h=!0),""!==i&&(j=!0),","===g){if(a.indexOf(".")>-1)return!1;a=a.replace(",",".")}if(""===a.replace(/[0-9-]/g,"")&&(!h||a>=d&&a<=e)&&(!j||a%i===0))return!0;if(f.indexOf("float")>-1&&null!==a.match(new RegExp("^([0-9-]+)\\.([0-9]+)$"))&&(!h||a>=d&&a<=e)&&(!j||a%i===0))return!0}return!1},errorMessage:"",errorMessageKey:"badInt"}),a.formUtils.addValidator({name:"alphanumeric",validatorFunction:function(b,c,d,e){var f="^([a-zA-Z0-9",g="]+)$",h=c.valAttr("allowing"),i="",j=!1;if(h){i=f+h+g;var k=h.replace(/\\/g,"");k.indexOf(" ")>-1&&(j=!0,k=k.replace(" ",""),k+=e.andSpaces||a.formUtils.LANG.andSpaces),e.badAlphaNumericAndExtraAndSpaces&&e.badAlphaNumericAndExtra?j?this.errorMessage=e.badAlphaNumericAndExtraAndSpaces+k:this.errorMessage=e.badAlphaNumericAndExtra+k+e.badAlphaNumericExtra:this.errorMessage=e.badAlphaNumeric+e.badAlphaNumericExtra+k;
10
+ }else i=f+g,this.errorMessage=e.badAlphaNumeric;return new RegExp(i).test(b)},errorMessage:"",errorMessageKey:""}),a.formUtils.addValidator({name:"custom",validatorFunction:function(a,b){var c=new RegExp(b.valAttr("regexp"));return c.test(a)},errorMessage:"",errorMessageKey:"badCustomVal"}),a.formUtils.addValidator({name:"date",validatorFunction:function(b,c,d){var e=c.valAttr("format")||d.dateFormat||"yyyy-mm-dd",f="false"===c.valAttr("require-leading-zero");return a.formUtils.parseDate(b,e,f)!==!1},errorMessage:"",errorMessageKey:"badDate"}),a.formUtils.addValidator({name:"checkbox_group",validatorFunction:function(b,c,d,e,f){var g=!0,h=c.attr("name"),i=a('input[type=checkbox][name^="'+h+'"]',f),j=i.filter(":checked").length,k=c.valAttr("qty");if(void 0===k){var l=c.get(0).nodeName;alert('Attribute "data-validation-qty" is missing from '+l+" named "+c.attr("name"))}var m=a.formUtils.numericRangeCheck(j,k);switch(m[0]){case"out":this.errorMessage=e.groupCheckedRangeStart+k+e.groupCheckedEnd,g=!1;break;case"min":this.errorMessage=e.groupCheckedTooFewStart+m[1]+(e.groupCheckedTooFewEnd||e.groupCheckedEnd),g=!1;break;case"max":this.errorMessage=e.groupCheckedTooManyStart+m[1]+(e.groupCheckedTooManyEnd||e.groupCheckedEnd),g=!1;break;default:g=!0}if(!g){var n=function(){i.unbind("click",n),i.filter("*[data-validation]").validateInputOnBlur(e,d,!1,"blur")};i.bind("click",n)}return g}})}(a)});
pretty-link.php CHANGED
@@ -3,11 +3,11 @@
3
  Plugin Name: Pretty Links
4
  Plugin URI: https://prettylinks.com/pl/plugin-uri
5
  Description: Shrink, track and share any URL on the Internet from your WordPress website!
6
- Version: 2.1.10
7
  Author: Blair Williams
8
  Author URI: http://blairwilliams.com
9
  Text Domain: pretty-link
10
- Copyright: 2004-2017, Caseproof, LLC
11
 
12
  GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
13
  This program is free software; you can redistribute it and/or modify
@@ -151,7 +151,7 @@ global $prli_options;
151
  $prli_options = PrliOptions::get_options();
152
 
153
  // i18n
154
- add_action('init', 'prli_load_textdomain');
155
  function prli_load_textdomain() {
156
  $plugin_dir = basename(dirname(__FILE__));
157
  load_plugin_textdomain('pretty-link', false, $plugin_dir.'/i18n/');
@@ -167,8 +167,8 @@ $prli_utils = new PrliUtils();
167
 
168
  global $prli_db_version, $plp_db_version;
169
 
170
- $prli_db_version = 18; // this is the version of the database we're moving to
171
- $plp_db_version = 7; // this is the version of the database we're moving to
172
 
173
  global $prli_app_controller;
174
 
3
  Plugin Name: Pretty Links
4
  Plugin URI: https://prettylinks.com/pl/plugin-uri
5
  Description: Shrink, track and share any URL on the Internet from your WordPress website!
6
+ Version: 3.0.0
7
  Author: Blair Williams
8
  Author URI: http://blairwilliams.com
9
  Text Domain: pretty-link
10
+ Copyright: 2004-2019, Caseproof, LLC
11
 
12
  GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
13
  This program is free software; you can redistribute it and/or modify
151
  $prli_options = PrliOptions::get_options();
152
 
153
  // i18n
154
+ add_action('plugins_loaded', 'prli_load_textdomain');
155
  function prli_load_textdomain() {
156
  $plugin_dir = basename(dirname(__FILE__));
157
  load_plugin_textdomain('pretty-link', false, $plugin_dir.'/i18n/');
167
 
168
  global $prli_db_version, $plp_db_version;
169
 
170
+ $prli_db_version = 21; // this is the version of the database we're moving to
171
+ $plp_db_version = 9; // this is the version of the database we're moving to
172
 
173
  global $prli_app_controller;
174
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://prettylinks.com
4
  Tags: links, link, url, urls, affiliate, affiliates, pretty, marketing, redirect, redirection, forward, plugin, twitter, tweet, rewrite, shorturl, hoplink, hop, shortlink, short, shorten, shortening, click, clicks, track, tracking, tiny, tinyurl, budurl, shrinking, domain, shrink, mask, masking, cloak, cloaking, slug, slugs, admin, administration, stats, statistics, stat, statistic, email, ajax, javascript, ui, csv, download, page, post, pages, posts, shortcode, seo, automation, widget, widgets, dashboard
5
  Requires at least: 5.1
6
  Tested up to: 5.2.2
7
- Stable tag: 2.1.10
8
 
9
  Shrink, beautify, track, manage and share any URL on or off of your WordPress website. Create links that look how you want using your own domain name!
10
 
@@ -14,7 +14,7 @@ Shrink, beautify, track, manage and share any URL on or off of your WordPress we
14
 
15
  [Upgrade to Pretty Links Pro](https://prettylinks.com/why-upgrade/ "Upgrade to Pretty Links Pro")
16
 
17
- *Pretty Links Pro* is a **significant upgrade** that adds many tools and redirection types that will allow you to create pretty links automatically, cloak links, replace keywords thoughout your blog with pretty links and much more. You can learn more about *Pretty Links Pro* here:
18
 
19
  [Learn More](https://prettylinks.com/about "Learn More") | [Pricing](https://prettylinks.com/pricing/plans/ "Pricing")
20
 
@@ -51,7 +51,6 @@ http://blairwilliams.com/w7a
51
  * Enables you to send your pretty links via Email directly from your WordPress admin
52
  * Select Temporary (302 or 307) or Permanent (301) redirection for your pretty links
53
  * Cookie based system for tracking visitor activity across clicks
54
- * Organize Links into Groups
55
  * Create nofollow/noindex links
56
  * Turn tracking on / off on each link
57
  * Pretty Links Bookmarklet
@@ -65,6 +64,17 @@ http://blairwilliams.com/w7a
65
  3. Make sure you have changed your permalink Common Settings in Settings -> Permalinks away from "Default" to something else. I prefer using custom and then "/%year%/%month%/%postname%/" for the simplest possible URL slugs with the best performance.
66
 
67
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
68
  = 2.1.10 =
69
  * More security hardening
70
 
4
  Tags: links, link, url, urls, affiliate, affiliates, pretty, marketing, redirect, redirection, forward, plugin, twitter, tweet, rewrite, shorturl, hoplink, hop, shortlink, short, shorten, shortening, click, clicks, track, tracking, tiny, tinyurl, budurl, shrinking, domain, shrink, mask, masking, cloak, cloaking, slug, slugs, admin, administration, stats, statistics, stat, statistic, email, ajax, javascript, ui, csv, download, page, post, pages, posts, shortcode, seo, automation, widget, widgets, dashboard
5
  Requires at least: 5.1
6
  Tested up to: 5.2.2
7
+ Stable tag: 3.0.0
8
 
9
  Shrink, beautify, track, manage and share any URL on or off of your WordPress website. Create links that look how you want using your own domain name!
10
 
14
 
15
  [Upgrade to Pretty Links Pro](https://prettylinks.com/why-upgrade/ "Upgrade to Pretty Links Pro")
16
 
17
+ *Pretty Links Pro* is a **significant upgrade** that adds many tools and redirection types that will allow you to create pretty links automatically, cloak links, replace keywords thoughout your blog with pretty links, categorize & tag your pretty links and much more. You can learn more about *Pretty Links Pro* here:
18
 
19
  [Learn More](https://prettylinks.com/about "Learn More") | [Pricing](https://prettylinks.com/pricing/plans/ "Pricing")
20
 
51
  * Enables you to send your pretty links via Email directly from your WordPress admin
52
  * Select Temporary (302 or 307) or Permanent (301) redirection for your pretty links
53
  * Cookie based system for tracking visitor activity across clicks
 
54
  * Create nofollow/noindex links
55
  * Turn tracking on / off on each link
56
  * Pretty Links Bookmarklet
64
  3. Make sure you have changed your permalink Common Settings in Settings -> Permalinks away from "Default" to something else. I prefer using custom and then "/%year%/%month%/%postname%/" for the simplest possible URL slugs with the best performance.
65
 
66
  == Changelog ==
67
+ = 3.0.0 =
68
+ * Re-designed Admin UI especially the Admin Links UI including links listing, adding new links and editing links
69
+ * Added an Insert Pretty Link button for Gutenberg Paragraph Blocks
70
+ * Security fixes and hardening
71
+ * Fixed Slug is not Available Error
72
+ * Removed Pretty Links Groups (lite users will still be able to access legacy groups on the links listing page but pro users & lite users who upgrade to pro will have their groups migrated to become link categories)
73
+ * PRO ONLY: Added Pretty Link Categories
74
+ * PRO ONLY: Added Pretty Link Tags
75
+ * PRO ONLY: Fixed some issues with Pretty Link Imports and Exports
76
+ * Many other small fixes and enhancements
77
+
78
  = 2.1.10 =
79
  * More security hardening
80
 
vendor/lib/bootstrap/bootstrap-theme.min.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
vendor/lib/bootstrap/bootstrap.min.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{