ThirstyAffiliates Affiliate Link Manager - Version 2.7.0

Version Description

  • Feature: Wildcard replace segments of links based on query string parameters
  • Feature: Show the link category name on the link picker search box
  • Improvement: Auto remove Yoast SEO meta box on link edit screen
  • Bug Fix: 307 global redirect option doesn't seem to be working properly
  • Bug Fix: On brand new installs the permalinks sometimes need flushing again
  • Bug Fix: Link categories dropdown on Quick Add form not working
  • Bug Fix: Description of imported images from amazon is not positioned properly
Download this release

Release Info

Developer jkohlbach
Plugin Icon 128x128 ThirstyAffiliates Affiliate Link Manager
Version 2.7.0
Comparing to
See all releases

Version 2.7.0

Files changed (47) hide show
  1. .htaccess +2 -0
  2. ThirstyAddonPage.php +147 -0
  3. ThirstyAdminPage.php +558 -0
  4. ThirstyShortcode.php +111 -0
  5. css/thirstystyle.css +276 -0
  6. images/deleteImg.png +0 -0
  7. images/detailsbg.jpg +0 -0
  8. images/icon-aff.png +0 -0
  9. images/icon-images-disabled.png +0 -0
  10. images/icon-images.png +0 -0
  11. images/icon-link.png +0 -0
  12. images/icon-shortcode.png +0 -0
  13. images/license +18 -0
  14. images/lightgreytransparent.png +0 -0
  15. images/lightgreytransparentalt.png +0 -0
  16. images/linkpickerlogo.png +0 -0
  17. images/media-button.png +0 -0
  18. images/search-load-more.png +0 -0
  19. images/thirsty-loader.gif +0 -0
  20. images/thirstylogo.png +0 -0
  21. images/white-grad.png +0 -0
  22. js/ThirstyLinkPicker.js +168 -0
  23. js/ThirstyQuickAddLinkPicker.js +263 -0
  24. js/lib/chosen/chosen-sprite.png +0 -0
  25. js/lib/chosen/chosen-sprite@2x.png +0 -0
  26. js/lib/chosen/chosen.jquery.min.js +2 -0
  27. js/lib/chosen/chosen.min.css +3 -0
  28. js/thirstyPickerHelper.js +43 -0
  29. js/thirstyhelper.js +390 -0
  30. languages/thirstyaffiliates-de_DE.mo +0 -0
  31. languages/thirstyaffiliates-de_DE.po +587 -0
  32. languages/thirstyaffiliates-es_ES.mo +0 -0
  33. languages/thirstyaffiliates-es_ES.po +581 -0
  34. languages/thirstyaffiliates-id_ID.mo +0 -0
  35. languages/thirstyaffiliates-id_ID.po +547 -0
  36. languages/thirstyaffiliates-it_IT.mo +0 -0
  37. languages/thirstyaffiliates-it_IT.po +584 -0
  38. languages/thirstyaffiliates-pt_BR.mo +0 -0
  39. languages/thirstyaffiliates-pt_BR.po +584 -0
  40. languages/thirstyaffiliates-ru_RU.mo +0 -0
  41. languages/thirstyaffiliates-ru_RU.po +581 -0
  42. readme.txt +301 -0
  43. thirstyaffiliates.php +2441 -0
  44. thirstymce/editor_plugin.js +1 -0
  45. thirstymce/editor_plugin_src.js +64 -0
  46. thirstymce/img/aff-new.gif +0 -0
  47. thirstymce/img/aff.gif +0 -0
.htaccess ADDED
@@ -0,0 +1,2 @@
1
+ Options -Indexes
2
+
ThirstyAddonPage.php ADDED
@@ -0,0 +1,147 @@
1
+ <?php
2
+
3
+ /*******************************************************************************
4
+ ** thirstySetupAddonsMenu()
5
+ ** Setup the plugin options menu
6
+ ** @since 2.0
7
+ *******************************************************************************/
8
+ function thirstySetupAddonsMenu() {
9
+ if (is_admin()) {
10
+ add_submenu_page('edit.php?post_type=thirstylink', __('Add-ons', 'thirstyaffiliates'), __('Add-ons', 'thirstyaffiliates'), 'manage_options', 'thirsty-addons', 'thirstyAddonsPage');
11
+ }
12
+ }
13
+
14
+ /*******************************************************************************
15
+ ** thirstyAddonsPage()
16
+ ** Create the add-ons page
17
+ ** @since 2.0
18
+ *******************************************************************************/
19
+ function thirstyAddonsPage() {
20
+
21
+ if (!current_user_can('manage_options')) {
22
+ wp_die( __('You do not have suffifient permissions to access this page.', 'thirstyaffiliates') );
23
+ }
24
+
25
+ echo '<div class="wrap">';
26
+ echo '<img id="thirstylogo" src="' . plugins_url('thirstyaffiliates/images/thirstylogo.png') . '" alt="ThirstyAffiliates" />';
27
+
28
+ echo '<h2>'.__('Turbo Charge ThirstyAffiliates With These Add-ons', 'thirstyaffiliates').'</h2>';
29
+
30
+ // get the products list from the RSS feed on thirstyaffiliates.com and
31
+ // print them into the page nicely
32
+ $products = thirstyAddonsPageGetProducts();
33
+
34
+ if (!empty($products)) {
35
+ echo '<ul id="thirstyaddonscontainer" class="columns-2">';
36
+
37
+ foreach ($products as $product) {
38
+ $productUrl = str_replace('utm_source=rss' , 'utm_source=plugin', $product['url']);
39
+ $productUrl = str_replace('utm_medium=rss' , 'utm_medium=addonpage', $productUrl);
40
+ $productTitle = str_replace('ThirstyAffiliates ', '', $product['title']);
41
+ $productTitle = str_replace(' Add-on', '', $productTitle);
42
+
43
+ echo '<li class="thirstyaddon">';
44
+ echo '<h3>' . $productTitle . '</h3>';
45
+ echo '<div class="thirstyaddondescription">' . $product['description'] . '</div>';
46
+ echo '<a class="button-primary" href="' . $productUrl . '" target="_blank">'.__('Visit Add-on Page &rarr;', 'thirstyaffiliates').'</a>';
47
+ echo '</li>';
48
+ }
49
+
50
+ echo '</ul>';
51
+
52
+ echo '<script type="text/javascript">
53
+ jQuery(document).ready(function() {
54
+ var addonBoxHeight = 0;
55
+ jQuery(".thirstyaddon").each(function() {
56
+ if (jQuery(this).height() > addonBoxHeight) {
57
+ addonBoxHeight = jQuery(this).height();
58
+ }
59
+ });
60
+ jQuery(".thirstyaddon").height(addonBoxHeight);
61
+ });
62
+ </script>';
63
+ }
64
+
65
+ echo '</div>';
66
+ }
67
+
68
+ /*******************************************************************************
69
+ ** thirstyAddonsPageGetProducts()
70
+ ** Get the add-ons feed
71
+ ** @since 2.0
72
+ *******************************************************************************/
73
+ function thirstyAddonsPageGetProducts($forceNew = false) {
74
+ $thirstyAddonsRSS = get_option('thirstyAddonsRSS');
75
+ $expired = false;
76
+
77
+ /* If the timestamp hasn't been set or if it is expired or if we're forcing
78
+ ** make sure we fetch a new feed */
79
+ if (isset($thirstyAddonsRSS) && !empty($thirstyAddonsRSS) && !$forceNew) {
80
+
81
+ $oneDayAgo = current_time('timestamp', 0) - (24 * 60 * 60); // current time minus 1 day
82
+
83
+ if (!isset($thirstyAddonsRSS['timestamp']) ||
84
+ empty($thirstyAddonsRSS['timestamp']) ||
85
+ $oneDayAgo > $thirstyAddonsRSS['timestamp']) {
86
+
87
+ $expired = true;
88
+ }
89
+
90
+ } else {
91
+ $expired = true;
92
+ }
93
+
94
+ // Check if we need to get a new RSS feed
95
+ if (!isset($thirstyAddonsRSS['products']) || empty($thirstyAddonsRSS['products']) || $expired) {
96
+
97
+ $rssXMLString = '';
98
+ $rssUrl = 'http://thirstyaffiliates.com/feed?post_type=product';
99
+
100
+ if (function_exists('curl_init')) { // cURL is installed on the server so use this preferably
101
+ $ch = curl_init();
102
+ curl_setopt($ch, CURLOPT_HEADER, false);
103
+ curl_setopt($ch, CURLOPT_URL, $rssUrl);
104
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml")); // provide a http header to please some curl setups
105
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
106
+ curl_setopt($ch, CURLOPT_AUTOREFERER, true);
107
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
108
+ $rssXMLString = curl_exec($ch);
109
+ curl_close($ch);
110
+ } else { // try using file_get_contents, though this causes some issues on some servers
111
+ $rssXMLString = file_get_contents($rssUrl, true);
112
+ }
113
+
114
+ // DEFAULT BEHAVIOUR: if we can't get the country XML file return false
115
+ if (empty($rssXMLString))
116
+ return false;
117
+
118
+ // Create XML object for transversing
119
+ $rssXML = new SimpleXMLElement($rssXMLString);
120
+
121
+ // Check against each bot we have on record
122
+ if (!empty($rssXML)) {
123
+
124
+ $products = array();
125
+ foreach ($rssXML->channel->item as $product) {
126
+ $title = (string)$product->title;
127
+ $description = (string)$product->description;
128
+ $url = (string)$product->link;
129
+
130
+ $products[] = array(
131
+ 'title' => $title,
132
+ 'description' => $description,
133
+ 'url' => $url
134
+ );
135
+ }
136
+
137
+ $timestamp = current_time('timestamp', 0);
138
+ update_option('thirstyAddonsRSS', array('products' => $products, 'timestamp' => $timestamp));
139
+ }
140
+
141
+ }
142
+
143
+ // Return products array
144
+ return $thirstyAddonsRSS['products'];
145
+ }
146
+
147
+ add_action('admin_menu', 'thirstySetupAddonsMenu', 90);
ThirstyAdminPage.php ADDED
@@ -0,0 +1,558 @@
1
+ <?php
2
+
3
+ /*******************************************************************************
4
+ ** thirstySetupMenu()
5
+ ** Setup the plugin options menu
6
+ ** @since 1.0
7
+ *******************************************************************************/
8
+ function thirstySetupMenu() {
9
+ if (is_admin()) {
10
+ register_setting('thirstyOptions', 'thirstyOptions');
11
+ add_submenu_page('edit.php?post_type=thirstylink', __('Settings', 'thirstyaffiliates'), __('Settings', 'thirstyaffiliates'), 'manage_options', 'thirsty-settings', 'thirstyAdminOptions');
12
+ }
13
+ }
14
+
15
+ /*******************************************************************************
16
+ ** thirstyAdminOptions
17
+ ** Present the options page
18
+ ** @since 1.0
19
+ *******************************************************************************/
20
+ function thirstyAdminOptions() {
21
+ if (!current_user_can('manage_options')) {
22
+ wp_die( __('You do not have suffifient permissions to access this page.', 'thirstyaffiliates') );
23
+ }
24
+
25
+ $thirstyOptions = get_option('thirstyOptions');
26
+
27
+ $linksRebuilt = false;
28
+ if (isset($thirstyOptions['rebuildlinks']) && $thirstyOptions['rebuildlinks'] == 'true') {
29
+ $thirstyOptions['rebuildlinks'] = 'false';
30
+ update_option('thirstyOptions', $thirstyOptions);
31
+ $thirstyOptions = get_option('thirstyOptions');
32
+ thirstyResaveAllLinks();
33
+ flush_rewrite_rules();
34
+ $linksRebuilt = true;
35
+ }
36
+
37
+ // Sanity check on link prefix
38
+ if (empty($thirstyOptions['linkprefix'])) {
39
+ $thirstyOptions['linkprefix'] = 'recommends';
40
+ update_option('thirstyOptions', $thirstyOptions);
41
+ }
42
+
43
+ $redirectTypes = thirstyGetRedirectTypes();
44
+
45
+ // Sanity check on link redirect type
46
+ if (empty($thirstyOptions['linkredirecttype'])) {
47
+ $thirstyOptions['linkredirecttype'] = '301';
48
+ update_option('thirstyOptions', $thirstyOptions);
49
+ }
50
+
51
+ $thirstyOptions['nofollow'] = isset($thirstyOptions['nofollow']) ? 'checked="checked"' : '';
52
+ $thirstyOptions['newwindow'] = isset($thirstyOptions['newwindow']) ? 'checked="checked"' : '';
53
+ $thirstyOptions['showcatinslug'] = isset($thirstyOptions['showcatinslug']) ? 'checked="checked"' : '';
54
+ $thirstyOptions['disablecatautoselect'] = isset($thirstyOptions['disablecatautoselect']) ? 'checked="checked"' : '';
55
+ $thirstyOptions['legacyuploader'] = isset($thirstyOptions['legacyuploader']) ? 'checked="checked"' : '';
56
+ $thirstyOptions['disabletitleattribute'] = isset($thirstyOptions['disabletitleattribute']) ? 'checked="checked"' : '';
57
+ $thirstyOptions['disablethirstylinkclass'] = isset($thirstyOptions['disablethirstylinkclass']) ? 'checked="checked"' : '';
58
+ $thirstyOptions['disableslugshortening'] = isset($thirstyOptions['disableslugshortening']) ? 'checked="checked"' : '';
59
+ $thirstyOptions['disablevisualeditorbuttons'] = isset($thirstyOptions['disablevisualeditorbuttons']) ? 'checked="checked"' : '';
60
+ $thirstyOptions['disabletexteditorbuttons'] = isset($thirstyOptions['disabletexteditorbuttons']) ? 'checked="checked"' : '';
61
+
62
+ echo '<script type="text/javascript">var thirstyPluginDir = "' .
63
+ plugins_url('thirstyaffiliates/') . '";
64
+ var thirstyJSEnable = true;
65
+ </script>';
66
+
67
+ echo '<div class="wrap">';
68
+
69
+ echo '<img id="thirstylogo" src="' . plugins_url('thirstyaffiliates/images/thirstylogo.png') . '" alt="ThirstyAffiliates" />';
70
+
71
+ echo '<form id="thirstySettingsForm" method="post" action="options.php">';
72
+
73
+ wp_nonce_field('update-options');
74
+ settings_fields('thirstyOptions');
75
+
76
+ if (!empty($_GET['settings-updated'])) {
77
+ echo '<div id="message" class="updated below-h2"><p>'.__('Settings updated.', 'thirstyaffiliates').'</p>' .
78
+ ($linksRebuilt ? '<p>'.__('Links rebuilt.', 'thirstyaffiliates').'</p>' : '') . '</div>';
79
+ }
80
+
81
+ echo '
82
+ <table class="thirstyTable form-table" cellspacing="0" cellpadding="0">
83
+
84
+ <tr><td><h3 style="margin-top: 0;">'.__('General Settings', 'thirstyaffiliates').'</h3></td></tr>
85
+
86
+ <tr>
87
+ <th>
88
+ <label for="thirstyOptions[linkprefix]">'.__('Link Prefix:', 'thirstyaffiliates').'</label>
89
+ </th>
90
+ <td>
91
+ <select id="thirstyOptionsLinkPrefix" name="thirstyOptions[linkprefix]">
92
+ <option value="custom"' . (!empty($thirstyOptions['linkprefix']) && $thirstyOptions['linkprefix'] == 'custom' ? ' selected' : '') . '>-- ' . __('Custom', 'thirstyaffiliates') . ' --</option>';
93
+
94
+ thirstyGenerateSelectOptions(array("recommends", "link", "go", "review",
95
+ "product", "suggests", "follow", "endorses", "proceed", "fly", "goto",
96
+ "get", "find", "act", "click", "move", "offer", "run"), true);
97
+
98
+ echo '</select><br />
99
+ <input type="text" id="thirstyCustomLinkPrefix" value="' . (isset($thirstyOptions['linkprefixcustom']) ? $thirstyOptions['linkprefixcustom'] : '') . '" name="thirstyOptions[linkprefixcustom]" />';
100
+
101
+ if (isset($thirstyOptions['linkprefix']) && $thirstyOptions['linkprefix'] == 'custom') {
102
+ echo '<script type="text/javascript">
103
+ jQuery("#thirstyCustomLinkPrefix").css("display", "block");
104
+ jQuery("#thirstyCustomLinkPrefix").show();
105
+ </script>';
106
+ }
107
+
108
+ echo '</td>
109
+ <td>
110
+ <span class="description">'.__('The prefix that comes before your cloaked link\'s slug.<br />eg. ', 'thirstyaffiliates') .
111
+ trailingslashit(get_bloginfo('url')) . '<span style="font-weight: bold;">' . thirstyGetCurrentSlug() . '</span>/your-affiliate-link-name</span>
112
+ <br /><span class="description"><b>'.__('Warning:', 'thirstyaffiliates').'</b> '.__('Changing this setting after you\'ve used links in a post could break those links. Be careful!', 'thirstyaffiliates').'</span>
113
+ </td>
114
+ </tr>
115
+
116
+ <tr>
117
+ <th>
118
+ <label for="thirstyOptions[showcatinslug]">'.__('Show Link Category in URL?', 'thirstyaffiliates').'</label>
119
+ <td>
120
+ <input type="checkbox" name="thirstyOptions[showcatinslug]" id="thirstyOptionsShowCatInSlug" ' .
121
+ $thirstyOptions['showcatinslug'] . ' />
122
+ </td>
123
+ <td>
124
+ <span class="description">'.__('Show the selected category in the url. eg. ', 'thirstyaffiliates') .
125
+ trailingslashit(get_bloginfo('url')) . '' . thirstyGetCurrentSlug() . '/<span style="font-weight: bold;">link-category</span>/your-affiliate-link-name</span></span>
126
+ <br /><span class="description"><b>'.__('Warning:', 'thirstyaffiliates').'</b> '.__('Changing this setting after you\'ve used links in a post could break those links. Be careful!', 'thirstyaffiliates').'</span>
127
+ </td>
128
+ </tr>
129
+
130
+ <tr>
131
+ <th>
132
+ <label for="thirstyOptions[disablecatautoselect]">'.__('Disable "uncategorized" category on save?', 'thirstyaffiliates').'</label>
133
+ <td>
134
+ <input type="checkbox" name="thirstyOptions[disablecatautoselect]" id="thirstyOptionsDisableCatAutoSelect" ' .
135
+ $thirstyOptions['disablecatautoselect'] . ' />
136
+ </td>
137
+ <td>
138
+ <span class="description">'.__('If the "Show the selected category in the url" option above is selected, by default ThirstyAffiliates will add an "uncategorized" category to apply to non-categorised links during save. If you disable this, it allows you to have some links with categories in the URL and some without.', 'thirstyaffiliates').'</span>
139
+ </td>
140
+ </tr>
141
+
142
+ <tr>
143
+ <th>
144
+ <label for="thirstyOptions[linkredirecttype]">'.__('Link Redirect Type:', 'thirstyaffiliates').'</label>
145
+ <td>';
146
+
147
+ foreach ($redirectTypes as $redirectTypeCode => $redirectTypeDesc) {
148
+
149
+ $linkTypeSelected = false;
150
+ if (strcasecmp($thirstyOptions['linkredirecttype'], $redirectTypeCode) == 0)
151
+ $linkTypeSelected = true;
152
+
153
+ echo '<input type="radio" name="thirstyOptions[linkredirecttype]" id="thirstyOptionsLinkRedirectType' . $redirectTypeCode .'" ' .
154
+ ($linkTypeSelected ? 'checked="checked" ' : '') . 'value="' . $redirectTypeCode . '" /> <label for="thirstyOptionsLinkRedirectType' . $redirectTypeCode .'">' . $redirectTypeDesc . '</label><br />';
155
+
156
+ }
157
+
158
+ $additionalreltags = isset($thirstyOptions['additionalreltags']) ? $thirstyOptions['additionalreltags'] : "";
159
+
160
+ echo '
161
+ </td>
162
+ <td>
163
+ <span class="description">'.__('This is the type of redirect ThirstyAffiliates will use to redirect the user to your affiliate link.', 'thirstyaffiliates').'</span>
164
+ </td>
165
+ </tr>
166
+
167
+ <tr>
168
+ <th>
169
+ <label for="thirstyOptions[nofollow]">'.__('Use no follow on links?', 'thirstyaffiliates').'</label>
170
+ <td>
171
+ <input type="checkbox" name="thirstyOptions[nofollow]" id="thirstyOptionsNofollow" ' .
172
+ $thirstyOptions['nofollow'] . ' />
173
+ </td>
174
+ <td>
175
+ <span class="description">'.__('Add the nofollow attribute to links so search engines don\'t index them', 'thirstyaffiliates').'</span>
176
+ </td>
177
+ </tr>
178
+
179
+ <tr>
180
+ <th>
181
+ <label for="thirstyOptions[newwindow]">'.__('Open links in new window?', 'thirstyaffiliates').'</label>
182
+ <td>
183
+ <input type="checkbox" name="thirstyOptions[newwindow]" id="thirstyOptionsNewwindow" ' .
184
+ $thirstyOptions['newwindow'] . ' />
185
+ </td>
186
+ <td>
187
+ <span class="description">'.__('Force the user to open links in a new window or tab', 'thirstyaffiliates').'</span>
188
+ </td>
189
+ </tr>
190
+
191
+ <tr>
192
+ <th>
193
+ <label for="thirstyOptions[legacyuploader]">'.__('Revert to legacy image uploader?', 'thirstyaffiliates').'</label>
194
+ <td>
195
+ <input type="checkbox" name="thirstyOptions[legacyuploader]" id="thirstyOptionsLegacyUploader" ' .
196
+ $thirstyOptions['legacyuploader'] . ' />
197
+ </td>
198
+ <td>
199
+ <span class="description">'.__('Disable the new media uploader in favour of the old style uploader', 'thirstyaffiliates').'</span>
200
+ </td>
201
+ </tr>
202
+
203
+ <tr>
204
+ <th>
205
+ <label for="thirstyOptions[disabletitleattribute]">'.__('Disable title attribute output on link insertion?', 'thirstyaffiliates').'</label>
206
+ <td>
207
+ <input type="checkbox" name="thirstyOptions[disabletitleattribute]" id="thirstyOptionsDisableTitleAttribute" ' .
208
+ $thirstyOptions['disabletitleattribute'] . ' />
209
+ </td>
210
+ <td>
211
+ <span class="description">'.__('Links are automatically output with a title html attribute (by default this shows the text
212
+ that you have linked), this option lets you disable the output of the title attribute on your links.', 'thirstyaffiliates').'</span>
213
+ </td>
214
+ </tr>
215
+
216
+ <tr>
217
+ <th>
218
+ <label for="thirstyOptions[disablethirstylinkclass]">'.__('Disable automatic output of ThirstyAffiliates CSS classes?', 'thirstyaffiliates').'</label>
219
+ <td>
220
+ <input type="checkbox" name="thirstyOptions[disablethirstylinkclass]" id="thirstyOptionsDisableThirstylinkClass" ' .
221
+ $thirstyOptions['disablethirstylinkclass'] . ' />
222
+ </td>
223
+ <td>
224
+ <span class="description">'.__('To help with styling your affiliate links a CSS class called "thirstylink" is added
225
+ to the link and a CSS class called "thirstylinkimg" is added to images (when inserting image affiliate links),
226
+ this option disables the addition of both of these CSS classes.', 'thirstyaffiliates').'</span>
227
+ </td>
228
+ </tr>
229
+
230
+ <tr>
231
+ <th>
232
+ <label for="thirstyOptions[disableslugshortening]">'.__('Disable slug shortening?', 'thirstyaffiliates').'</label>
233
+ <td>
234
+ <input type="checkbox" name="thirstyOptions[disableslugshortening]" id="thirstyOptionsDisableSlugShortening" ' .
235
+ $thirstyOptions['disableslugshortening'] . ' />
236
+ </td>
237
+ <td>
238
+ <span class="description">'.__('By default, ThirstyAffiliates removes superfluous words from your cloaked link URLs, this option turns that feature off.', 'thirstyaffiliates').'</span>
239
+ </td>
240
+ </tr>
241
+
242
+ <tr>
243
+ <th>
244
+ <label for="thirstyOptions[disablevisualeditorbuttons]">'.__('Disable buttons on the Visual editor?', 'thirstyaffiliates').'</label>
245
+ <td>
246
+ <input type="checkbox" name="thirstyOptions[disablevisualeditorbuttons]" id="thirstyOptionsDisableVisualEditorButtons" ' .
247
+ $thirstyOptions['disablevisualeditorbuttons'] . ' />
248
+ </td>
249
+ <td>
250
+ <span class="description">'.__('Hide the ThirstyAffiliates buttons on the Visual editor.', 'thirstyaffiliates').'</span>
251
+ </td>
252
+ </tr>
253
+
254
+ <tr>
255
+ <th>
256
+ <label for="thirstyOptions[disabletexteditorbuttons]">'.__('Disable buttons on the Text/Quicktags editor?', 'thirstyaffiliates').'</label>
257
+ <td>
258
+ <input type="checkbox" name="thirstyOptions[disabletexteditorbuttons]" id="thirstyOptionsDisableTextEditorButtons" ' .
259
+ $thirstyOptions['disabletexteditorbuttons'] . ' />
260
+ </td>
261
+ <td>
262
+ <span class="description">'.__('Hide the ThirstyAffiliates buttons on the Text editor.', 'thirstyaffiliates').'</span>
263
+ </td>
264
+ </tr>
265
+
266
+ <tr>
267
+ <th>
268
+ <label for="thirstyOptions[additionalreltags]">'.__('Additional rel attribute tags to add during link insertion: ', 'thirstyaffiliates').'</label>
269
+ <td>
270
+ <input type="text" name="thirstyOptions[additionalreltags]" id="thirstyOptionsAdditionalRelTags" value="' .
271
+ $additionalreltags . '" />
272
+ </td>
273
+ <td>
274
+ <span class="description">'.__('Allows you to add extra tags into the rel= attribute when links are inserted.', 'thirstyaffiliates').'</span>
275
+ </td>
276
+ </tr>';
277
+
278
+ do_action('thirstyAffiliatesAfterMainSettings');
279
+
280
+ echo '
281
+ </table>
282
+
283
+ <input type="hidden" name="thirstyOptions[rebuildlinks]" id="thirstyHiddenRebuildFlag" value="false" />
284
+
285
+ <input type="hidden" name="page_options" value="thirstyOptions" />
286
+
287
+ <p class="submit">
288
+ <input type="submit" class="button-primary" value="'.__('Save All Changes', 'thirstyaffiliates').'" />
289
+ <input type="submit" id="thirstyForceLinkRebuild" class="button-secondary" value="'.__('Save & Force Link Rebuild').'" />
290
+ </p>
291
+
292
+ </form>
293
+
294
+ <div class="thirstyWhiteBox">
295
+
296
+ <h3>'.__('Plugin Information', 'thirstyaffiliates').'</h3>'.
297
+
298
+ 'ThirstyAffiliates Version: '. THIRSTY_VERSION .'<br />';
299
+
300
+ do_action('thirstyAffiliatesPluginInformation');
301
+
302
+ echo '</div><!-- /.thirstyWhiteBox -->';
303
+
304
+ do_action('thirstyAffiliatesAfterPluginInformation');
305
+
306
+ echo '
307
+ <div class="thirstyWhiteBox">
308
+ <h3>Join The Community</h3>
309
+ <ul id="thirstyCommunityLinks"><li><a href="http://thirstyaffiliates.com">'.__('Visit Our Website', 'thirstyaffiliates').'</a></li>
310
+ <li><a href="' . admin_url('edit.php?post_type=thirstylink&page=thirsty-addons') . '">'.__('Browse ThirstyAffiliates Add-ons', 'thirstyaffiliates').'</a></li>
311
+ <li><a href="http://thirstyaffiliates.com/affiliates">'.__('Join Our Affiliate Program', 'thirstyaffiliates').'</a> '.__('(up to 50% commissions)' ,'thirstyaffiliates').'</li>
312
+ <li><a href="http://facebook.com/thirstyaffiliates" style="margin-right: 10px;">'.__('Like us on Facebook', 'thirstyaffiliates').'</a><iframe src="//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2Fthirstyaffiliates&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;font=arial&amp;colorscheme=light&amp;action=like&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:21px; vertical-align: bottom;" allowTransparency="true"></iframe></li>
313
+ <li><a href="http://twitter.com/thirstyaff" style="margin-right: 10px;">'.__('Follow us on Twitter', 'thirstyaffiliates').'</a> <a href="https://twitter.com/thirstyaff" class="twitter-follow-button" data-show-count="true" style="vertical-align: bottom;">Follow @thirstyaff</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?"http":"https";if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document, "script", "twitter-wjs");</script></li>
314
+ </ul>
315
+ </div><!-- /.thirstyWhiteBox -->
316
+
317
+ </div><!-- /.wrap -->';
318
+
319
+ // Provide debug output for diagnostics and support use
320
+ if(isset($_GET['debug'])){
321
+ if ($_GET['debug'] == 'true') {
322
+ $thirstyOptions = get_option('thirstyOptions'); // re-retrieve options in case any of the filters/actions messed with it
323
+ echo '<pre>'.__('DEBUG: ','thirstyaffiliates') . print_r($thirstyOptions, true) . '</pre>';
324
+ }
325
+ }
326
+ }
327
+
328
+ /*******************************************************************************
329
+ ** thirstyResaveAllLinks
330
+ ** Resave all ThirstyAffiliates links in the system. Allows us to regenerate the
331
+ ** slug and permalink after big settings changes.
332
+ ** @since 2.1
333
+ *******************************************************************************/
334
+ function thirstyResaveAllLinks() {
335
+
336
+ $thirstyLinkQuery = new WP_Query(array(
337
+ 'post_type' => 'thirstylink',
338
+ 'post_status' => 'publish',
339
+ 'posts_per_page' => -1,
340
+ 'ignore_sticky_posts'=> 1
341
+ ));
342
+
343
+ if($thirstyLinkQuery->have_posts()) {
344
+ while ($thirstyLinkQuery->have_posts()) {
345
+ $thirstyLinkQuery->the_post();
346
+
347
+ $thirstyLink['ID'] = get_the_ID();
348
+ wp_update_post($thirstyLink);
349
+ }
350
+ }
351
+ }
352
+
353
+ /*******************************************************************************
354
+ ** thirstyGenerateSelectOptions
355
+ ** Helper function to generate selection boxes for admin page
356
+ ** @since 1.0
357
+ *******************************************************************************/
358
+ function thirstyGenerateSelectOptions($selectNames, $echo = false) {
359
+ $thirstyOptions = get_option('thirstyOptions');
360
+ $html = '';
361
+
362
+ foreach ($selectNames as $selectName) {
363
+ $html .= '<option value="' . $selectName . '"' . ($thirstyOptions['linkprefix'] == $selectName ? ' selected' : '') . '>' . $selectName . '</option>';
364
+ }
365
+
366
+ if ($echo)
367
+ echo $html;
368
+ else
369
+ return $html;
370
+ }
371
+
372
+ add_action('admin_menu', 'thirstySetupMenu', 99);
373
+
374
+ /*******************************************************************************
375
+ ** thirstyGlobalAdminNotices
376
+ ** This should only be added to for really critical configuration problems that
377
+ ** the admin should know about. In most cases this shows a notice to the admin
378
+ ** explaining about the config problem and what they have to do to fix it.
379
+ ** @since 2.4.6
380
+ *******************************************************************************/
381
+ function thirstyGlobalAdminNotices() {
382
+ // Check for pretty permalinks
383
+ global $wp_rewrite;
384
+ if (empty($wp_rewrite->permalink_structure)) {
385
+ echo '<div class="error">
386
+ <p>'.__('ThirstyAffiliates requires pretty permalinks, please change
387
+ your', 'thirstyaffiliates').' <a href="' . admin_url('options-permalink.php') . '">'.__('Permalink settings', 'thirstyaffiliates').'</a> '.__('to something other than default.', 'thirstyaffiliates').'<a href="#" style="float: right;" id="thirstyDismissPermalinksMessage">'.__('Dismiss', 'thirstyaffiliates').'</a></p>
388
+ </div>';
389
+ }
390
+ }
391
+
392
+ add_action('admin_notices', 'thirstyGlobalAdminNotices');
393
+
394
+ /**
395
+ * Render export/import controls.
396
+ *
397
+ * @contributor J++
398
+ * @since 2.5
399
+ */
400
+ function renderExportImportControls(){
401
+ ?>
402
+ <style>
403
+ .export_import_settings_instruction {
404
+ margin-bottom: 30px;
405
+ }
406
+ .export_import_settings_instruction dt {
407
+ font-weight: bold;
408
+ margin-bottom: 10px;
409
+ }
410
+ .export_import_settings_instruction dd {
411
+ margin-bottom: 20px;
412
+ }
413
+ .export_import_settings_instruction dd ul {
414
+ list-style-type: disc;
415
+ }
416
+ </style>
417
+ <div id="export_import_controls_container" class="thirstyWhiteBox">
418
+ <h3><?php _e('Export/Import Global Settings', 'thirstyaffiliates'); ?></h3>
419
+
420
+ <dl class="export_import_settings_instruction">
421
+ <dt><?php _e('Exporting Settings', 'thirstyaffiliates'); ?></dt>
422
+ <dd>
423
+ <ul>
424
+ <li><?php _e('Click export settings button', 'thirstyaffiliates'); ?></li>
425
+ <li><?php _e('Copy the settings text code', 'thirstyaffiliates'); ?></li>
426
+ <li><?php _e('Paste in the settings code to the destination site', 'thirstyaffiliates'); ?></li>
427
+ </ul>
428
+ </dd>
429
+
430
+ <dt><?php _e('Importing Settings', 'thirstyaffiliates'); ?></dt>
431
+ <dd>
432
+ <ul>
433
+ <li><?php _e('Click import settings button', 'thirstyaffiliates'); ?></li>
434
+ <li><?php _e('Paste the settings text code ( From other site )', 'thirstyaffiliates'); ?></li>
435
+ <li><?php _e('Click import global settings button', 'thirstyaffiliates'); ?></li>
436
+ </ul>
437
+ </dd>
438
+ </dl>
439
+
440
+ <input type="button" class="button button-primary" id="export_global_settings" value="<?php _e('Export Settings', 'thirstyaffiliates'); ?>" />
441
+ <input type="button" class="button button-primary" id="import_global_settings" value="<?php _e('Import Settings', 'thirstyaffiliates'); ?>" />
442
+
443
+ <div id="textarea_container">
444
+ <textarea id="global_settings_string" cols="40" rows="10"></textarea>
445
+ </div>
446
+ <input type="button" class="button button-primary" id="import_global_settings_action" value="<?php _e('Import Global Settings', 'thirstyaffiliates'); ?>"/>
447
+ </div>
448
+ <?php
449
+ }
450
+
451
+ add_action( 'thirstyAffiliatesAfterPluginInformation' , 'renderExportImportControls' );
452
+
453
+ /**
454
+ * Export global settings.
455
+ *
456
+ * @param null $dummyArg
457
+ * @param bool $ajaxCall
458
+ *
459
+ * @contributor J++
460
+ * @return bool
461
+ * @since 2.5
462
+ */
463
+ function thirstyExportGlobalSettings( $dummyArg = null , $ajaxCall = true ){
464
+ if (!current_user_can(apply_filters('thirstyAjaxOptionsCapability', 'manage_options')))
465
+ die('Cheatin\', Huh?');
466
+
467
+ $thirstyOption = base64_encode( serialize( get_option('thirstyOptions') ) );
468
+
469
+ if($ajaxCall === true){
470
+
471
+ header('Content-Type: application/json'); // specify we return json
472
+ echo json_encode(array(
473
+ 'status' => 'success',
474
+ 'thirstyOption' => $thirstyOption
475
+ ));
476
+ die();
477
+
478
+ }else{
479
+
480
+ return true;
481
+
482
+ }
483
+
484
+ }
485
+
486
+ add_action( "wp_ajax_thirstyExportGlobalSettings" , 'thirstyExportGlobalSettings' );
487
+
488
+ /**
489
+ * Import global settings.
490
+ *
491
+ * @param null $thirstyOptions
492
+ * @param bool $ajaxCall
493
+ *
494
+ * @contributor J++
495
+ * @return bool
496
+ * @since 2.5
497
+ */
498
+ function thirstyImportGlobalSettings( $thirstyOptions = null , $ajaxCall = true ){
499
+ if (!current_user_can(apply_filters('thirstyAjaxOptionsCapability', 'manage_options')))
500
+ die('Cheatin\', Huh?');
501
+
502
+ // We do this coz unserialize issues E_NOTICE on failure.
503
+ error_reporting( E_ERROR | E_PARSE );
504
+
505
+ if ( $ajaxCall === true )
506
+ $thirstyOptions = $_POST[ 'thirstyOptions' ];
507
+
508
+ $err = null;
509
+ $thirstyOptions = base64_decode( $thirstyOptions );
510
+
511
+ if ( !$thirstyOptions )
512
+ $err = __("Failed to decode settings string", "thirstyaffiliates");
513
+
514
+ if ( is_null( $err ) ) {
515
+
516
+ $thirstyOptions = maybe_unserialize( $thirstyOptions );
517
+
518
+ if ( !$thirstyOptions )
519
+ $err = __("Failed to unserialize settings string", "thirstyaffiliates");
520
+
521
+ }
522
+
523
+ if ( is_null( $err ) )
524
+ update_option( 'thirstyOptions' , $thirstyOptions );
525
+
526
+ if($ajaxCall === true){
527
+
528
+ if ( is_null( $err ) ) {
529
+
530
+ header('Content-Type: application/json'); // specify we return json
531
+ echo json_encode(array(
532
+ 'status' => 'success'
533
+ ));
534
+ die();
535
+
536
+ } else {
537
+
538
+ header('Content-Type: application/json'); // specify we return json
539
+ echo json_encode(array(
540
+ 'status' => 'fail',
541
+ 'error_message' => $err
542
+ ));
543
+ die();
544
+
545
+ }
546
+
547
+ }else{
548
+
549
+ if ( is_null( $err ) )
550
+ return true;
551
+ else
552
+ return false;
553
+
554
+ }
555
+
556
+ }
557
+
558
+ add_action( "wp_ajax_thirstyImportGlobalSettings" , 'thirstyImportGlobalSettings' );
ThirstyShortcode.php ADDED
@@ -0,0 +1,111 @@
1
+ <?php
2
+ /*******************************************************************************
3
+ ** thirstyLinkByShortcode
4
+ ** Allows user to specify a shortcode in the page/post to include a thirstylink
5
+ *******************************************************************************/
6
+ function thirstyLinkByShortcode($atts) {
7
+ extract($atts);
8
+
9
+ $output = '';
10
+
11
+ // Sanity check, if the linkid attribute is empty we can't retrieve the link
12
+ if (!empty($linkid)) {
13
+ // Remove linkid, linktext and linkclass to get final link attributes
14
+ $linkAttributes = array_diff_assoc(
15
+ $atts,
16
+ array(
17
+ 'linkid' => (isset($linkid) ? $linkid : ''),
18
+ 'linktext' => (isset($linktext) ? $linktext : ''),
19
+ 'linkclass' => (isset($linkclass) ? $linkclass : '')
20
+ )
21
+ );
22
+
23
+ // Backwards compatibility for linkclass shortcode attribute, should add this to the "class" link attribute
24
+ if (isset($linkclass))
25
+ $linkAttributes['class'] = $linkAttributes['class'] . ' ' . (isset($linkclass) ? $linkclass : '');
26
+
27
+ // Retrieving via the link ID
28
+ if (is_numeric($linkid)) {
29
+
30
+ // Get the link and global options
31
+ $thirstyOptions = get_option('thirstyOptions');
32
+ $link = get_post($linkid);
33
+ // Check if the link is set
34
+ if (!isset($link))
35
+ return;
36
+
37
+ $linkData = unserialize(get_post_meta($link->ID, 'thirstyData', true));
38
+
39
+ // Check if the link data is set
40
+ if (!isset($linkData))
41
+ return;
42
+
43
+ // Get the link URL
44
+ $linkAttributes['href'] = get_post_permalink($linkid);
45
+
46
+ // If the link text is empty, use the link name instead
47
+ if (empty($linktext)) {
48
+ $linktext = $link->post_title;
49
+ }
50
+
51
+ // Check for no follow defaults if not specified in the shortcode attributes
52
+ if (empty($linkAttributes['rel'])) {
53
+ $linkAttributes['rel'] = (!empty($thirstyOptions['nofollow']) ? 'nofollow' : '');
54
+
55
+ // Set the link's nofollow if global setting is not set
56
+ if (empty($linkAttributes['rel']))
57
+ $linkAttributes['rel'] = (isset($linkData['nofollow']) && $linkData['nofollow'] == 'on' ? 'nofollow' : '');
58
+ }
59
+
60
+ // Check for no follow defaults if not specified in the shortcode attributes
61
+ if (empty($linkAttributes['target'])) {
62
+ $linkAttributes['target'] = (!empty($thirstyOptions['newwindow']) ? '_blank' : '');
63
+
64
+ // Set the link's target value if global setting is not set
65
+ if (empty($linkAttributes['target']))
66
+ $linkAttributes['target'] = (isset($linkData['newwindow']) && $linkData['newwindow'] == 'on' ? '_blank' : '');
67
+ }
68
+
69
+ // Provide a default value for link class when attribute is not given in shortcode
70
+ if (empty($linkAttributes['class'])) {
71
+ $linkAttributes['class'] = 'thirstylink';
72
+ }
73
+
74
+ // Disable class output if global option set
75
+ if (!empty($thirstyOptions['disablethirstylinkclass']))
76
+ unset($linkAttributes['class']);
77
+
78
+ // Provide a default value for the title attribute when attribute is not given in shortcode
79
+ if (empty($linkAttributes['title'])) {
80
+ $linkAttributes['title'] = $link->post_title;
81
+ }
82
+
83
+ // Disable title attribute if global option set
84
+ if (!empty($thirstyOptions['disabletitleattribute']))
85
+ unset($linkAttributes['title']);
86
+
87
+ // Build the link ready for output
88
+ $output .= '<a';
89
+
90
+ foreach ($linkAttributes as $name => $value) {
91
+ // Handle square bracket escaping (used for some addons, eg. Google Analytics click tracking)
92
+ $value = html_entity_decode($value);
93
+ $value = preg_replace('/&#91;/', '[', $value);
94
+ $value = preg_replace('/&#93;/', ']', $value);
95
+ $output .= (!empty($value) ? ' ' . $name . '="' . $value . '"' : '');
96
+ }
97
+
98
+ $output .= '>' . $linktext . '</a>';
99
+
100
+ } else {
101
+ $output .= '<span style="color: #0000ff;">'.__('SHORTCODE ERROR: ThirstyAffiliates did not detect a valid link id, please check your short code!').'</span>';
102
+ }
103
+
104
+ }
105
+
106
+ return $output;
107
+ }
108
+
109
+ // Add a shortcode for thirsty affiliate links
110
+ add_shortcode('thirstylink', 'thirstyLinkByShortcode', 1);
111
+ ?>
css/thirstystyle.css ADDED
@@ -0,0 +1,276 @@
1
+ /*******************************************************************************
2
+ ** File: thirstystyle.css
3
+ ** Description: Admin styles for ThirstyAffiliates plugin
4
+ *******************************************************************************/
5
+
6
+ .infolabel {
7
+ padding-bottom: 5px;
8
+ }
9
+
10
+ #thirsty_linkname, #thirsty_linkurl, #thirsty_linkslug, .infotext, #thirsty_cloakedurl {
11
+ height: 31px;
12
+ font-size: 14px;
13
+ border: 1px solid #DFDFDF;
14
+ width: 100%;
15
+ margin: 0;
16
+ padding: 5px;
17
+ }
18
+
19
+ .infotext {
20
+ height: 16px;
21
+ }
22
+
23
+ #thirsty_linkslug, #thirstySaveSlug {
24
+ display: none;
25
+ }
26
+
27
+
28
+ #thirstyEditSlug, #thirstyVisitLink {
29
+ display: inline-block;
30
+ margin-top: 5px;
31
+ }
32
+
33
+ #thirstySaveSlug {
34
+ margin-top: 5px;
35
+ }
36
+
37
+ #thirstyEditSlug:hover, #thirstyVisitLink:hover {
38
+ border: 1px solid #666666;
39
+ }
40
+
41
+ .thirstySaveMe {
42
+ display: none;
43
+ color: #0000ff;
44
+ }
45
+
46
+ #thirstylink-main-meta div.inside {
47
+ background: #ffffff;
48
+ margin: 0;
49
+ padding: 0 0 30px 0;
50
+ }
51
+
52
+ #thirsty_upload_insert_img {
53
+ font-size: 12px;
54
+ font-family: Arial, sans serif;
55
+ }
56
+
57
+ .thirsty_description {
58
+ color: #909090;
59
+ padding-left: 2px;
60
+ font-style: italic;
61
+ font-size: 10px !important;
62
+ }
63
+
64
+ #thirsty_logo {
65
+ margin: 25px 0 15px 30px;
66
+ float: left;
67
+ width: 100%;
68
+ }
69
+
70
+ #thirsty_add_images {
71
+ cursor: pointer;
72
+ vertical-align: middle;
73
+ }
74
+
75
+ #thirsty_upload_insert_img {
76
+ margin-top: 15px;
77
+ }
78
+
79
+ #thirsty_image_holder {
80
+ background: white;
81
+ overflow: hidden;
82
+ padding: 0px 0px 20px 0px;
83
+ margin: 0;
84
+ border: 1px solid #DFDFDF;
85
+ text-align: center;
86
+ }
87
+
88
+ .thirstyImg img {
89
+ }
90
+
91
+ #thirsty_cloakedurl {
92
+ display: inline;
93
+ }
94
+
95
+ #publish {
96
+ margin-top: 8px;
97
+ margin-bottom: 5px;
98
+ }
99
+
100
+ .submitdelete {
101
+ color: #ff0000;
102
+ font-weight: normal;
103
+ text-decoration: underline;
104
+ }
105
+
106
+ .thirstyImgHolder {
107
+ border: 1px solid #eee;
108
+ border-radius: 5px;
109
+ -webkit-border-radius: 5px;
110
+ -moz-border-radius: 5px;
111
+ padding: 5px;
112
+ margin-left: 20px;
113
+ margin-top: 20px;
114
+ float: left;
115
+ }
116
+
117
+ .thirstyRemoveImg {
118
+ float: right;
119
+ background: transparent url('../images/deleteImg.png') no-repeat left top;
120
+ height: 17px;
121
+ width: 17px;
122
+ margin-top: -14px;
123
+ margin-right: -24px;
124
+ padding: 5px;
125
+ cursor: pointer;
126
+ }
127
+
128
+ #thirstyaddonscontainer {
129
+ margin-top: 20px;
130
+ }
131
+
132
+ .thirstyaddon {
133
+ display: inline-block;
134
+ margin: 0 1% 1% 0;
135
+ position: relative;
136
+ width: 28.5%;
137
+ padding: 0 20px 20px 20px;
138
+ vertical-align: top;
139
+ border: 1px solid #CCC;
140
+ border-radius: 5px;
141
+ -webkit-border-radius: 5px;
142
+ -moz-border-radius: 5px;
143
+ background: #ffffff;
144
+ }
145
+
146
+ .thirstyaddonlinkpage {
147
+ margin: 0 1% 1% 0;
148
+ position: relative;
149
+ width: auto;
150
+ padding: 0 10px 10px 10px;
151
+ vertical-align: top;
152
+ border: 1px solid #CCC;
153
+ border-radius: 5px;
154
+ -webkit-border-radius: 5px;
155
+ -moz-border-radius: 5px;
156
+ background: #ffffff;
157
+ }
158
+
159
+ .thirstyaddon:nth-child(3n) {
160
+ margin-right: 0;
161
+ }
162
+
163
+ .thirstyaddon h3, .thirstyaddonlinkpage h3 {
164
+ font-size: 12pt;
165
+ margin-top: 0px;
166
+ margin-left: -20px;
167
+ margin-right: -20px;
168
+ background: #EEE;
169
+ padding: 1em;
170
+ border-bottom: 1px solid #CCC;
171
+ border-top-left-radius: 5px;
172
+ border-top-right-radius: 5px;
173
+ }
174
+
175
+ .thirstyaddonlinkpage h3 {
176
+ margin-top: 0px !important;
177
+ margin-left: -10px !important;
178
+ margin-right: -10px !important;
179
+ margin-bottom: 10px !important;
180
+ }
181
+
182
+ .thirstyaddondescription {
183
+ margin-bottom: 15px;
184
+ }
185
+
186
+ #thirstyCustomLinkPrefix {
187
+ display: none;
188
+ width: 130px;
189
+ }
190
+
191
+ #thirstySettingsForm {
192
+ padding: 2%;
193
+ background: #ffffff;
194
+ margin-top: 1em;
195
+ margin-bottom: 1em;
196
+ }
197
+
198
+ #thirstySettingsForm .description {
199
+ color: #808080;
200
+ }
201
+
202
+ #thirstySettingsForm td {
203
+ vertical-align: top;
204
+ }
205
+
206
+ #thirstyCustomLinkPrefix, #thirstyOptionsLinkPrefix {
207
+ width: 120px;
208
+ }
209
+
210
+ #thirstyCommunityLinks li {
211
+ height: 28px;
212
+ }
213
+
214
+ .thirstyWhiteBox {
215
+ padding: 2%;
216
+ background: #ffffff;
217
+ margin-bottom: 1em;
218
+ }
219
+
220
+ @media handheld, only screen and (max-width: 959px) {
221
+ .thirstyaddon {
222
+ width: 45.5%;
223
+ }
224
+
225
+ .thirstyaddon:nth-child(3n) {
226
+ margin-right: 1%;
227
+ }
228
+
229
+ .thirstyaddon:nth-child(2n) {
230
+ margin-right: 0;
231
+ }
232
+ }
233
+
234
+ @media handheld, only screen and (max-width: 599px) {
235
+ .thirstyaddon {
236
+ width: 97%;
237
+ }
238
+
239
+ .thirstyaddon:nth-child(3n) {
240
+ margin-right: 1%;
241
+ }
242
+
243
+ .thirstyaddon:nth-child(2n) {
244
+ margin-right: 1%;
245
+ }
246
+ }
247
+
248
+
249
+ /*
250
+ Export/Import Settings Styling
251
+ */
252
+ #export_import_controls_container textarea {
253
+ margin-top: 20px;
254
+ display: none;
255
+ }
256
+
257
+ #import_global_settings_action {
258
+ display: none;
259
+ margin-top: 20px;
260
+ }
261
+
262
+ /*
263
+ */
264
+ }
265
+ float: none;
266
+ padding: 10px 15px;
267
+ word-break: break-word;
268
+ }
269
+ body.post-type-thirstylink #TB_secondLine {
270
+ display: block;
271
+ margin-top: 10px;
272
+ font-size: 12px;
273
+ }
274
+ body.post-type-thirstylink #TB_window img#TB_Image {
275
+ margin: 15px auto 0;
276
+ }
images/deleteImg.png ADDED
Binary file
images/detailsbg.jpg ADDED
Binary file
images/icon-aff.png ADDED
Binary file
images/icon-images-disabled.png ADDED
Binary file
images/icon-images.png ADDED
Binary file
images/icon-link.png ADDED
Binary file
images/icon-shortcode.png ADDED
Binary file
images/license ADDED
@@ -0,0 +1,18 @@
1
+ icon-images.png, icon-shortcode.png and icon-link.png are all licensed under GPL,
2
+ they are free software: you can redistribute it and/or modify
3
+ it under the terms of the GNU General Public License as published by
4
+ the Free Software Foundation, either version 3 of the License, or
5
+ (at your option) any later version.
6
+
7
+ These images are distributed in the hope that it will be useful,
8
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ GNU General Public License for more details.
11
+
12
+ You should have received a copy of the GNU General Public License
13
+ along with Foobar. If not, see <http://www.gnu.org/licenses/>.
14
+
15
+ Images were obtained from the oxygen icon set and WooCons #1 icon set, both
16
+ licensed under GPL, see below links for more info:
17
+ http://www.oxygen-icons.org/
18
+ http://www.woothemes.com/2010/08/woocons1/
images/lightgreytransparent.png ADDED
Binary file
images/lightgreytransparentalt.png ADDED
Binary file
images/linkpickerlogo.png ADDED
Binary file
images/media-button.png ADDED
Binary file
images/search-load-more.png ADDED
Binary file
images/thirsty-loader.gif ADDED
Binary file
images/thirstylogo.png ADDED
Binary file
images/white-grad.png ADDED
Binary file
js/ThirstyLinkPicker.js ADDED
@@ -0,0 +1,168 @@
1
+ var search_offset = 0;
2
+
3
+ function thirstyPerformSearch(searchQueryText) {
4
+ var catsQueryIDs = '';
5
+
6
+ if (searchQueryText && searchQueryText.length > 0) {
7
+ jQuery('#show_more').fadeOut(200);
8
+ } else {
9
+ jQuery('#show_more').delay(500).fadeIn(400);
10
+ search_offset = 0;
11
+ }
12
+
13
+ jQuery.post(
14
+ thirstyAjaxLink,
15
+ {
16
+ action: 'thirstyLinkPickerSearch',
17
+ search_query: searchQueryText
18
+ },
19
+ replaceSearchResults
20
+ );
21
+ }
22
+
23
+ function showImages() {
24
+ jQuery(this).next('.img_choices').slideDown();
25
+ jQuery(this).unbind();
26
+ jQuery(this).click(hideImages);
27
+ jQuery(this).html('Insert Image &laquo;');
28
+ }
29
+
30
+ function hideImages() {
31
+ jQuery(this).next('.img_choices').slideUp();
32
+ jQuery(this).unbind();
33
+ jQuery(this).click(showImages);
34
+ jQuery(this).html('Insert Image &raquo;');
35
+ }
36
+
37
+ thirstyPerformSearch();
38
+
39
+ jQuery('input#search_input').keyup(function() {
40
+ thirstyPerformSearch(jQuery(this).val());
41
+ });
42
+
43
+ jQuery(document).ready(function() {
44
+ jQuery('input#search_input').focus();
45
+
46
+ jQuery('#show_more').click(function() {
47
+ search_offset = search_offset + 10;
48
+ jQuery('#show_more_loader').show();
49
+ jQuery.post(
50
+ thirstyAjaxLink,
51
+ {
52
+ action: 'thirstyLinkPickerSearch',
53
+ search_offset: search_offset
54
+ },
55
+ appendSearchResults
56
+ );
57
+ });
58
+ });
59
+
60
+ function appendSearchResults(html) { jQuery('#show_more_loader').hide(); printSearchResults(html, false); }
61
+ function replaceSearchResults(html) { printSearchResults(html, true); }
62
+
63
+ function printSearchResults(html, replace) {
64
+ if (replace == true)
65
+ jQuery('#picker_content').html(html);
66
+ else
67
+ jQuery('#picker_content').append(html);
68
+
69
+ jQuery('.insert_shortcode_link').unbind();
70
+ jQuery('.insert_link').unbind();
71
+
72
+ jQuery('.insert_link').click(function() {
73
+
74
+ var linkID = jQuery(this).attr('linkID');
75
+ var copiedText = thirstyGetCopiedText();
76
+
77
+ // Check if there are anything selected on the editor
78
+ // If none, use the linkname
79
+ if((copiedText == "") || (jQuery.trim(copiedText) == "")){
80
+
81
+ // Select the image control with appropriate linkid
82
+ // Go up to the closest table row
83
+ // Go down to that particular row's span with a class of linkname
84
+ // Get the text
85
+ var linkname = jQuery("img[linkid='"+linkID+"']").closest("tr").find(".linkname").text();
86
+ copiedText = linkname;
87
+ }
88
+
89
+ // Make ajax call to get the link code
90
+ jQuery.post(
91
+ thirstyAjaxLink,
92
+ {
93
+ action: 'thirstyGetLinkCode',
94
+ linkType: 'link',
95
+ linkID: linkID,
96
+ copiedText: copiedText
97
+ },
98
+ function(linkCode) {
99
+ parent.thirstyInsertLink(linkCode);
100
+ parent.thirstyDismissLinkPicker();
101
+ }
102
+ );
103
+
104
+ });
105
+
106
+ jQuery('.insert_shortcode_link').click(function() {
107
+ var linkID = jQuery(this).attr('linkID');
108
+ var copiedText = thirstyGetCopiedText();
109
+
110
+ // Make ajax call to get the link code
111
+ jQuery.post(
112
+ thirstyAjaxLink,
113
+ {
114
+ action: 'thirstyGetLinkCode',
115
+ linkType: 'shortcode',
116
+ linkID: linkID,
117
+ copiedText: copiedText
118
+ },
119
+ function(linkCode) {
120
+ parent.thirstyInsertLink(linkCode);
121
+ parent.thirstyDismissLinkPicker();
122
+ }
123
+ );
124
+ });
125
+
126
+ jQuery('.thirstyImg').click(function() {
127
+ var linkID = jQuery(this).attr('linkID');
128
+ var imageID = jQuery(this).attr('imageID');
129
+ var copiedText = thirstyGetCopiedText();
130
+
131
+ // Make ajax call to get the link code
132
+ jQuery.post(
133
+ thirstyAjaxLink,
134
+ {
135
+ action: 'thirstyGetLinkCode',
136
+ linkType: 'image',
137
+ linkID: linkID,
138
+ copiedText: copiedText,
139
+ imageID: imageID
140
+ },
141
+ function(linkCode) {
142
+ parent.thirstyInsertLink(linkCode);
143
+ parent.thirstyDismissLinkPicker();
144
+ }
145
+ );
146
+
147
+ });
148
+
149
+ jQuery('.insert_img_link').click(showImages);
150
+ }
151
+
152
+ function thirstyGetCopiedText() {
153
+ var copiedText = '';
154
+
155
+ var richEditorActive = false;
156
+ if (parent.thirstyMCE != null && !parent.thirstyMCE.isHidden()) {
157
+ richEditorActive = true;
158
+ }
159
+
160
+ if (!richEditorActive) {
161
+ var selectedText = parent.thirstyGetHTMLEditorSelection();
162
+ copiedText = selectedText.text;
163
+ } else {
164
+ copiedText = parent.thirstyMCE.selection.getContent();
165
+ }
166
+
167
+ return copiedText;
168
+ }
js/ThirstyQuickAddLinkPicker.js ADDED
@@ -0,0 +1,263 @@
1
+ jQuery(document).ready(function($) {
2
+
3
+ /*========================================
4
+ = Global Variables =
5
+ ========================================*/
6
+ var quick_add_link_container = $("#quick-add-link-container"),
7
+ allClear = true,
8
+ errList = {};
9
+
10
+
11
+ /*=========================================
12
+ = Utility Functions =
13
+ =========================================*/
14
+
15
+ // Initialize form
16
+ function initializeForm(){
17
+
18
+ // Clear all error related stuff
19
+ quick_add_link_container
20
+ .find("input[type='text']")
21
+ .removeClass('err')
22
+ .siblings('.errmsg')
23
+ .css("display","none")
24
+ .text('')
25
+ .closest("#quick-add-link-container")
26
+ .find("#error-bulletin")
27
+ .css("display","none")
28
+ .text('');
29
+
30
+ // Re initialize checkpoint flag
31
+ allClear = true;
32
+
33
+ // Re initialize error list object
34
+ errList = {};
35
+ }
36
+
37
+ // Validate Link Name
38
+ function validateLinkName(linkname) {
39
+ if(linkname == ""){
40
+ allClear = false;
41
+ errList["#qal_link_name"] = "Required Field, Can't be empty";
42
+ }
43
+ }
44
+
45
+ // Validate Destination URL
46
+ function validateDestinationURL(linkurl){
47
+ if(linkurl == ""){
48
+ allClear = false;
49
+ errList["#qal_destination_url"] = "Required Field, Can't be empty";
50
+ }else{
51
+ var urlRegex = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
52
+ if(!urlRegex.test(linkurl)){
53
+ allClear = false;
54
+ errList["#qal_destination_url"] = "Invalid URL Supplied";
55
+ }
56
+ }
57
+ }
58
+
59
+ // Prompt Error Message
60
+ function promptErrorMessage(){
61
+ $.each(errList, function( id, errmsg ) {
62
+ quick_add_link_container
63
+ .find(id)
64
+ .addClass('err')
65
+ .siblings('.errmsg')
66
+ .css("display","block")
67
+ .text(errmsg);
68
+ });
69
+ }
70
+
71
+
72
+ /*=======================================================================
73
+ = Add New Affiliate Link and Insert to Post Editor =
74
+ =======================================================================*/
75
+ $('#quick-add-link').click(function() {
76
+
77
+ /*========== Init ==========*/
78
+ initializeForm();
79
+
80
+ /*========== Data Sanitation ==========*/
81
+ // Note: JS Validation should not be relied on
82
+ // Just for user convenience purposes
83
+ var linkname = $.trim(quick_add_link_container.find("#qal_link_name").val()),
84
+ nonce = quick_add_link_container.find("#quick_add_aff_link_nonce").val(),
85
+ linkurl = $.trim(quick_add_link_container.find("#qal_destination_url").val()),
86
+ nofollow = $.trim(quick_add_link_container.find("#qal_no_follow_link:checked").val()),
87
+ newwindow = $.trim(quick_add_link_container.find("#qal_new_window:checked").val()),
88
+ linkredirecttype = $.trim(quick_add_link_container.find("input[name='qal_redirect_type']:checked").val()),
89
+ linkCategory = $.trim(quick_add_link_container.find("#qal_link_categories").val());
90
+
91
+ // Link Name
92
+ validateLinkName(linkname);
93
+
94
+ // Link URL
95
+ validateDestinationURL(linkurl);
96
+
97
+ // Checkpoint
98
+ if(allClear){
99
+
100
+ /*========== Ajax Call ==========*/
101
+ // TODO: Refactor this ajax call to another function
102
+ $.post(
103
+ thirstyAjaxLink,
104
+ {
105
+ action : 'quickCreateAffiliateLink',
106
+ nonce : nonce,
107
+ linkname : linkname,
108
+ linkurl : linkurl,
109
+ nofollow : nofollow,
110
+ newwindow : newwindow,
111
+ linkredirecttype : linkredirecttype,
112
+ linkCategory : linkCategory
113
+ },
114
+ function(data){
115
+
116
+ if(!isNaN(data)){
117
+
118
+ // Success
119
+ var linkID = data;
120
+ var copiedText = thirstyGetCopiedText();
121
+
122
+ // Check if there are anything selected on the editor
123
+ // If none, use the linkname
124
+ if((copiedText == "") || ($.trim(copiedText) == "")){
125
+ copiedText = linkname;
126
+ }
127
+
128
+ // Make ajax call to get the link code
129
+ jQuery.post(
130
+ thirstyAjaxLink,
131
+ {
132
+ action: 'thirstyGetLinkCode',
133
+ linkType: 'link',
134
+ linkID: linkID,
135
+ copiedText: copiedText
136
+ },
137
+ function(linkCode) {
138
+ parent.thirstyInsertLink(linkCode);
139
+ parent.thirstyDismissLinkPicker();
140
+ }
141
+ );
142
+
143
+ }else{
144
+
145
+ // Failure
146
+ quick_add_link_container
147
+ .find("#error-bulletin")
148
+ .text(data)
149
+ .css("display","block");
150
+
151
+ }
152
+
153
+ }
154
+ );
155
+
156
+ }else{
157
+
158
+ // Prompt Message
159
+ promptErrorMessage();
160
+
161
+ }
162
+
163
+ // Prevent evernt bubbling
164
+ return false;
165
+
166
+ });//$('#quick-add-link').click
167
+
168
+
169
+ /*==============================================
170
+ = Add New Affiliate Link =
171
+ ==============================================*/
172
+ $("#add-link").click(function(){
173
+
174
+ /*========== Init ==========*/
175
+ initializeForm();
176
+
177
+ /*========== Data Sanitation ==========*/
178
+ // Note: JS Validation should not be relied on
179
+ // Just for user convenience purposes
180
+ var linkname = $.trim(quick_add_link_container.find("#qal_link_name").val()),
181
+ nonce = quick_add_link_container.find("#quick_add_aff_link_nonce").val(),
182
+ linkurl = $.trim(quick_add_link_container.find("#qal_destination_url").val()),
183
+ nofollow = $.trim(quick_add_link_container.find("#qal_no_follow_link:checked").val()),
184
+ newwindow = $.trim(quick_add_link_container.find("#qal_new_window:checked").val()),
185
+ linkredirecttype = $.trim(quick_add_link_container.find("input[name='qal_redirect_type']:checked").val()),
186
+ linkCategory = $.trim(quick_add_link_container.find("#qal_link_categories").val());
187
+
188
+ // Link Name
189
+ validateLinkName(linkname);
190
+
191
+ // Link URL
192
+ validateDestinationURL(linkurl);
193
+
194
+ // Checkpoint
195
+ if(allClear){
196
+
197
+ /*========== Ajax Call ==========*/
198
+ // TODO: Refactor this ajax call to another function
199
+ $.post(
200
+ thirstyAjaxLink,
201
+ {
202
+ action : 'quickCreateAffiliateLink',
203
+ nonce : nonce,
204
+ linkname : linkname,
205
+ linkurl : linkurl,
206
+ nofollow : nofollow,
207
+ newwindow : newwindow,
208
+ linkredirecttype : linkredirecttype,
209
+ linkCategory : linkCategory
210
+ },
211
+ function(data){
212
+
213
+ if(!isNaN(data)){
214
+
215
+ // Success
216
+ parent.thirstyDismissLinkPicker();
217
+
218
+ }else{
219
+
220
+ // Failure
221
+ quick_add_link_container
222
+ .find("#error-bulletin")
223
+ .text(data)
224
+ .css("display","block");
225
+
226
+ }
227
+
228
+ }
229
+ );
230
+
231
+ }else{
232
+
233
+ // Prompt Message
234
+ promptErrorMessage();
235
+
236
+ }
237
+
238
+ // Prevent evernt bubbling
239
+ return false;
240
+
241
+ });//$('#quick-add-link').click
242
+
243
+ });//document ready
244
+
245
+
246
+
247
+ // TODO: Suggest to move this function from ThirstyLinkPicker.js To thistyPickerHelper.js
248
+ function thirstyGetCopiedText() {
249
+ var copiedText = '';
250
+
251
+ var richEditorActive = false;
252
+ if (parent.thirstyMCE != null && !parent.thirstyMCE.isHidden()) {
253
+ richEditorActive = true;
254
+ }
255
+ if (!richEditorActive) {
256
+ var selectedText = parent.thirstyGetHTMLEditorSelection();
257
+ copiedText = selectedText.text;
258
+ } else {
259
+ copiedText = parent.thirstyMCE.selection.getContent();
260
+ }
261
+
262
+ return copiedText;
263
+ }
js/lib/chosen/chosen-sprite.png ADDED
Binary file
js/lib/chosen/chosen-sprite@2x.png ADDED
Binary file
js/lib/chosen/chosen.jquery.min.js ADDED
@@ -0,0 +1,2 @@
1
+ /* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
2
+ !function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled,classes:a.className}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&amp;"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.style.cssText=a.style,c.setAttribute("data-option-array-index",a.array_index),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.result_add_group=function(a){var b,c;return a.search_match||a.group_match?a.active_options>0?(b=[],b.push("group-result"),a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(this.no_results_clear(),d=0,f=this.get_search_text(),a=f.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\amp;"),i=new RegExp(a,"i"),c=this.get_search_regex(a),l=this.results_data,j=0,k=l.length;k>j;j++)b=l[j],b.search_match=!1,e=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(e=this.results_data[b.group_array_index],0===e.active_options&&e.search_match&&(d+=1),e.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.text,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(d+=1),b.search_match?(f.length&&(g=b.search_text.search(i),h=b.search_text.substr(0,g+f.length)+"</em>"+b.search_text.substr(g+f.length),b.search_text=h.substr(0,g)+"<em>"+h.substr(g)),null!=e&&(e.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>d&&f.length?(this.update_results_content(""),this.no_results(f)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.get_search_regex=function(a){var b;return b=this.search_contains?"":"^",new RegExp(b+a,"i")},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement("div"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d instanceof Chosen?d.destroy():d instanceof Chosen||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("<div />",c),this.is_multiple?this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'):this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},Chosen.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("touchstart.chosen",function(b){a.container_mousedown(b)}),this.container.bind("touchend.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.search_results.bind("touchstart.chosen",function(b){a.search_results_touchstart(b)}),this.search_results.bind("touchmove.chosen",function(b){a.search_results_touchmove(b)}),this.search_results.bind("touchend.chosen",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.form_field_jq.bind("chosen:close.chosen",function(b){a.input_blur(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.search_field.bind("cut.chosen",function(b){a.clipboard_event_checker(b)}),this.search_field.bind("paste.chosen",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=a.originalEvent.deltaY||-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(".chosen-container"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("<li />",{"class":"search-choice"}).html("<span>"+b.html+"</span>"),b.disabled?c.addClass("search-choice-disabled"):(d=a("<a />",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):this.reset_single_select_options(),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>'),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),c.find("span").first().html(b),this.search_results.append(c),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:this.results_showing&&a.preventDefault();break;case 32:this.disable_search&&a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("<div />",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}.call(this);
js/lib/chosen/chosen.min.css ADDED
@@ -0,0 +1,3 @@
1
+ /* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
2
+
3
+ .chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;*display:inline;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:#fff url(chosen-sprite.png) no-repeat 100% -20px;background:url(chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:transparent!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:transparent}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single-nosearch .chosen-search,.chosen-rtl .chosen-drop{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:#fff url(chosen-sprite.png) no-repeat -30px -20px;background:url(chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-rtl .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-container-single .chosen-search input[type=text],.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}}
js/thirstyPickerHelper.js ADDED
@@ -0,0 +1,43 @@
1
+ var thirstyMCE;
2
+ function thirstyOpenLinkPicker(ed) {
3
+ thirstyMCE = ed;
4
+
5
+ tb_show("Add an Affiliate Link", thirstyAjaxLink + '?action=thirstyGetThickboxContent&height=640&width=640&TB_iframe=true');
6
+ }
7
+
8
+ function thirstyOpenQuickAddLinkPicker(ed){
9
+ thirstyMCE = ed;
10
+
11
+ tb_show("Quick Add Affiliate Link", thirstyAjaxLink + '?action=thirstyGetQuickAddLinkThickboxContent&height=640&width=640&TB_iframe=true');
12
+ }
13
+
14
+ function thirstyInsertLink(linkcode) {
15
+ var richEditorActive = false;
16
+ if (typeof(parent.thirstyMCE) !== 'undefined' && parent.thirstyMCE != null && !parent.thirstyMCE.isHidden()) {
17
+ richEditorActive = true;
18
+ }
19
+
20
+ if (richEditorActive) { // Visual editor replacement
21
+ parent.thirstyMCE.focus();
22
+ parent.thirstyMCE.selection.setContent(linkcode);
23
+ parent.thirstyMCE.execCommand('mceRepaint');
24
+ } else { // HTML editor replacement
25
+ thirstyReplaceHTMLEditorSelectedText(linkcode);
26
+ }
27
+ }
28
+
29
+ function thirstyReplaceHTMLEditorSelectedText(text) {
30
+ var el;
31
+ el = parent.document.getElementById("replycontent");
32
+ if (typeof el == "undefined" || !jQuery(el).is(":visible")) // is not a comment reply
33
+ el = parent.document.getElementById("content");
34
+
35
+ var sel = parent.thirstyGetHTMLEditorSelection();
36
+ var val = el.value;
37
+ el.value = val.slice(0, sel.start) + text + val.slice(sel.end);
38
+ jQuery(el).trigger('change'); // some addons require notice that something has changed
39
+ }
40
+
41
+ function thirstyDismissLinkPicker() {
42
+ tb_remove();
43
+ }
js/thirstyhelper.js ADDED
@@ -0,0 +1,390 @@
1
+ var frame;
2
+
3
+ jQuery(document).ready(function($) {
4
+ if (thirstyJSEnable == true) {
5
+ jQuery('#thirstyOptionsLinkPrefix').change(function() {
6
+
7
+ thirstySetRebuildFlag();
8
+
9
+ if (jQuery(this).val() == 'custom') {
10
+ jQuery('#thirstyCustomLinkPrefix').val("");
11
+ jQuery('#thirstyCustomLinkPrefix').fadeIn(400);
12
+ } else {
13
+ jQuery('#thirstyCustomLinkPrefix').val("");
14
+ jQuery('#thirstyCustomLinkPrefix').fadeOut(400);
15
+ }
16
+ });
17
+
18
+ jQuery('.submit input[type=submit]').click(function() {
19
+ if (jQuery('#thirstyOptionsLinkPrefix').val() == 'custom' &&
20
+ jQuery('#thirstyCustomLinkPrefix').val() == '') {
21
+ jQuery('#thirstyOptionsLinkPrefix').val('recommends');
22
+ jQuery('#thirstyCustomLinkPrefix').fadeOut(400);
23
+ }
24
+ });
25
+ jQuery('#post_name').remove();
26
+ jQuery('#post-body-content').remove();
27
+
28
+ jQuery('#thirstyEditSlug').click(thirstyEditSlug);
29
+
30
+ jQuery('#thirsty_upload_insert_img').click(thirstyAddImagesClicked);
31
+ jQuery('#thirsty_upload_media_manager').click(thirstyMediaManagerAddImagesClicked);
32
+ jQuery('.thirstyRemoveImg').click(thirstyRemoveImageClicked);
33
+
34
+ jQuery('#thirstyOptionsShowCatInSlug').click(thirstySetRebuildFlag);
35
+ jQuery('#thirstyForceLinkRebuild').click(thirstySetRebuildFlag);
36
+
37
+
38
+ $("#export_global_settings").click(function(){
39
+
40
+ var $this = $(this),
41
+ settings_textarea = $("#global_settings_string"),
42
+ import_settings = $("#import_global_settings_action");
43
+
44
+ $this.attr('disabled','disabled');
45
+
46
+ settings_textarea.val("");
47
+
48
+ if ( !settings_textarea.is(":visible") )
49
+ settings_textarea.slideDown("fast");
50
+
51
+ if ( import_settings.is(":visible") )
52
+ import_settings.slideUp("fast");
53
+
54
+ jQuery
55
+ .ajax({
56
+ url : ajaxurl,
57
+ type : "POST",
58
+ data : { action : "thirstyExportGlobalSettings" },
59
+ dataType : "json"
60
+ })
61
+ .done( function( data , textStatus , jqXHR ) {
62
+
63
+ if(data.status == 'success'){
64
+
65
+ settings_textarea.val(data.thirstyOption);
66
+
67
+ }
68
+
69
+ })
70
+ .fail( function( jqXHR , textStatus , errorThrown ) {
71
+
72
+ alert( 'Failed to get global settings string' );
73
+
74
+ console.log( 'Failed to create lead pages' );
75
+ console.log( jqXHR );
76
+ console.log( '----------' );
77
+
78
+ })
79
+ .always( function(){
80
+
81
+ $this.removeAttr('disabled');
82
+
83
+ });
84
+
85
+ });
86
+
87
+ $("#import_global_settings").click(function(){
88
+
89
+ var $this = $(this),
90
+ settings_textarea = $("#global_settings_string"),
91
+ import_settings = $("#import_global_settings_action");
92
+
93
+ settings_textarea.val("");
94
+
95
+ if ( !settings_textarea.is(":visible") )
96
+ settings_textarea.slideDown("fast");
97
+
98
+ if ( !import_settings.is(":visible") )
99
+ import_settings.slideDown("fast");
100
+
101
+ });
102
+
103
+ $("#import_global_settings_action").click(function(){
104
+
105
+ var $this = $(this),
106
+ settings_textarea = $("#global_settings_string"),
107
+ thirstyOptions = $.trim(settings_textarea.val());
108
+
109
+ $this.attr( 'disabled' , 'disabled' );