PluginProbe
FeedWordPress / 2013.0503
FeedWordPress v2013.0503
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
feedwordpress / admin-ui.php

admin-ui.php in FeedWordPress 2013.0503, at admin-ui.php

1,258 lines 40.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 class FeedWordPressAdminPage {
3 var $context;
4 var $updated = false;
5 var $mesg = NULL;
6
7 var $link = NULL;
8 var $dispatch = NULL;
9 var $filename = NULL;
10 var $pagenames = array();
11
12 /**
13 * Construct the admin page object.
14 *
15 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
16 */
17 function FeedWordPressAdminPage ($page = 'feedwordpressadmin', $link = NULL) {
18 $this->link = $link;
19
20 // Set meta-box context name
21 $this->context = $page;
22 if ($this->for_feed_settings()) :
23 $this->context .= 'forfeed';
24 endif;
25 } /* FeedWordPressAdminPage constructor */
26
27 function pageslug () {
28 $slug = preg_replace('/FeedWordPress(.*)Page/', '$1', get_class($this));
29 return strtolower($slug);
30 }
31
32 function pagename ($context = NULL) {
33 if (is_null($context)) :
34 $context = 'default';
35 endif;
36
37 if (isset($this->pagenames[$context])) :
38 $name = $this->pagenames[$context];
39 elseif (isset($tis->pagenames['default'])) :
40 $name = $this->pagenames['default'];
41 else :
42 $name = $this->pageslug();
43 endif;
44 return __($name);
45 } /* FeedWordPressAdminPage::pagename () */
46
47 function accept_POST ($post) {
48 if ($this->for_feed_settings() and $this->update_requested_in($post)) :
49 $this->update_feed();
50 elseif ($this->save_requested_in($post)) : // User mashed Save Changes
51 $this->save_settings($post);
52 endif;
53 do_action($this->dispatch.'_post', $post, $this);
54 }
55
56 function update_feed () {
57 global $feedwordpress;
58
59 add_action('feedwordpress_check_feed', 'update_feeds_mention');
60 add_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
61
62 print '<div class="updated">';
63 print "<ul>";
64 $uri = $this->link->uri();
65 $delta = $feedwordpress->update($uri);
66 print "</ul>";
67
68 if (!is_null($delta)) :
69 $mesg = array();
70 if (isset($delta['new'])) : $mesg[] = ' '.$delta['new'].' new posts were syndicated'; endif;
71 if (isset($delta['updated'])) : $mesg[] = ' '.$delta['updated'].' existing posts were updated'; endif;
72 echo "<p><strong>Update complete.</strong>".implode(' and', $mesg)."</p>";
73 echo "\n"; flush();
74 else :
75 $uri = esc_html($uri);
76 echo "<p><strong>Error:</strong> There was a problem updating <a href=\"$uri\">$uri</a></p>\n";
77 endif;
78 print "</div>\n";
79 remove_action('feedwordpress_check_feed', 'update_feeds_mention');
80 remove_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
81 }
82
83 function save_settings ($post) {
84 do_action($this->dispatch.'_save', $post, $this);
85
86 if ($this->for_feed_settings()) :
87 // Save settings
88 $this->link->save_settings(/*reload=*/ true);
89 $this->updated = true;
90
91 // Reset, reload
92 $link_id = $this->link->id;
93 unset($this->link);
94 $this->link = new SyndicatedLink($link_id);
95 else :
96 $this->updated = true;
97 endif;
98 } /* FeedWordPressAdminPage::save_settings () */
99
100 function for_feed_settings () { return (is_object($this->link) and method_exists($this->link, 'found') and $this->link->found()); }
101 function for_default_settings () { return !$this->for_feed_settings(); }
102
103 function setting ($names, $fallback_value = NULL, $params = array()) {
104 if (!is_array($params)) :
105 $params = array('default' => $params);
106 endif;
107 $params = shortcode_atts(array(
108 'default' => 'default',
109 'fallback' => true,
110 ), $params);
111
112 if (is_string($names)) :
113 $feed_name = $names;
114 $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
115 else :
116 $feed_name = $names['feed'];
117 $global_name = 'feedwordpress_'.$names['global'];
118 endif;
119
120 if ($this->for_feed_settings()) : // Check feed-specific setting first; fall back to global
121 if (!$params['fallback']) : $global_name = NULL; endif;
122 $ret = $this->link->setting($feed_name, $global_name, $fallback_value, $params['default']);
123 else : // Check global setting
124 $ret = get_option($global_name, $fallback_value);
125 endif;
126 return $ret;
127 }
128
129 function update_setting ($names, $value, $default = 'default') {
130 if (is_string($names)) :
131 $feed_name = $names;
132 $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
133 else :
134 $feed_name = $names['feed'];
135 $global_name = 'feedwordpress_'.$names['global'];
136 endif;
137
138 if ($this->for_feed_settings()) : // Update feed-specific setting
139 $this->link->update_setting($feed_name, $value, $default);
140 else : // Update global setting
141 update_option($global_name, $value);
142 endif;
143 } /* FeedWordPressAdminPage::update_setting () */
144
145 function save_requested_in ($post) {
146 return (isset($post['save']) or isset($post['submit']));
147 }
148 function update_requested_in ($post) {
149 return (isset($post['update']) and (strlen($post['update']) > 0));
150 }
151
152 /*static*/ function submitted_link_id () {
153 global $fwp_post;
154
155 // Presume global unless we get a specific link ID
156 $link_id = NULL;
157
158 $submit_buttons = array(
159 'save',
160 'submit',
161 'fix_mismatch',
162 'feedfinder',
163 );
164 foreach ($submit_buttons as $field) :
165 if (isset($fwp_post[$field])) :
166 $link_id = MyPHP::request('save_link_id');
167 endif;
168 endforeach;
169
170 if (is_null($link_id) and isset($_REQUEST['link_id'])) :
171 $link_id = MyPHP::request('link_id');
172 endif;
173
174 return $link_id;
175 } /* FeedWordPressAdminPage::submitted_link_id() */
176
177 /*static*/ function submitted_link () {
178 $link_id = FeedWordPressAdminPage::submitted_link_id();
179 if (is_numeric($link_id) and $link_id) :
180 $link = new SyndicatedLink($link_id);
181 else :
182 $link = NULL;
183 endif;
184 return $link;
185 } /* FeedWordPressAdminPage::submitted_link () */
186
187 function stamp_link_id ($field = null) {
188 if (is_null($field)) : $field = 'save_link_id'; endif;
189 ?>
190 <input type="hidden" name="<?php print esc_attr($field); ?>" value="<?php print ($this->for_feed_settings() ? $this->link->id : '*'); ?>" />
191 <?php
192 } /* FeedWordPressAdminPage::stamp_link_id () */
193
194 function these_posts_phrase () {
195 if ($this->for_feed_settings()) :
196 $phrase = __('posts from this feed');
197 else :
198 $phrase = __('syndicated posts');
199 endif;
200 return $phrase;
201 } /* FeedWordPressAdminPage::these_posts_phrase() */
202
203 /**
204 * Provides a uniquely identifying name for the interface context for
205 * use with add_meta_box() and do_meta_boxes(),
206 *
207 * @return string the context name
208 *
209 * @see add_meta_box()
210 * @see do_meta_boxes()
211 */
212 function meta_box_context () {
213 return $this->context;
214 } /* FeedWordPressAdminPage::meta_box_context () */
215
216 /**
217 * Outputs JavaScript to fix AJAX toggles settings.
218 *
219 * @uses FeedWordPressAdminPage::meta_box_context()
220 */
221 function fix_toggles () {
222 FeedWordPressSettingsUI::fix_toggles_js($this->meta_box_context());
223 } /* FeedWordPressAdminPage::fix_toggles() */
224
225 function ajax_interface_js () {
226 ?>
227 function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
228 if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
229
230 var rollup=document.getElementById(item);
231 if (rollup) {
232 if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
233 jQuery('#'+disappear).hide();
234 jQuery('#'+appear).show(600);
235 } else {
236 jQuery('#'+appear).hide();
237 jQuery('#'+disappear).show(600);
238 }
239 }
240 }
241 <?php
242 } /* FeedWordPressAdminPage::ajax_interface_js () */
243
244 function display_feed_settings_page_links ($params = array()) {
245 global $fwp_path;
246
247 $params = wp_parse_args($params, array(
248 'before' => '',
249 'between' => ' | ',
250 'after' => '',
251 'long' => false,
252 'subscription' => $this->link,
253 ));
254 $sub = $params['subscription'];
255
256 $links = array(
257 "Feed" => array('page' => 'feeds-page.php', 'long' => 'Feeds & Updates'),
258 "Posts" => array('page' => 'posts-page.php', 'long' => 'Posts & Links'),
259 "Authors" => array('page' => 'authors-page.php', 'long' => 'Authors'),
260 'Categories' => array('page' => 'categories-page.php', 'long' => 'Categories & Tags'),
261 );
262
263 $hrefPrefix = 'admin.php?';
264
265 $link_id = NULL;
266 if (is_object($sub)) :
267 if (method_exists($sub, 'found')) :
268 if ($sub->found()) :
269 $link_id = $sub->link->link_id;
270 endif;
271 else :
272 $link_id = $sub->link_id;
273 endif;
274 endif;
275
276 if (!is_null($link_id)) :
277 $urlParam = "link_id={$link_id}";
278 $hrefPrefix .= $urlParam."&";
279 $urlSuffix = "&".$urlParam;
280 else :
281 $urlParam = '';
282 endif;
283 $hrefPrefix .= "page=${fwp_path}/";
284
285 print $params['before']; $first = true;
286 foreach ($links as $label => $link) :
287 if (!$first) : print $params['between']; endif;
288
289 if (isset($link['url'])) : $url = $link['url'].$urlSuffix;
290 else : $url = $hrefPrefix.$link['page'];
291 endif;
292 $url = esc_html($url);
293
294 if ($link['page']==basename($this->filename)) :
295 print "<strong>";
296 else :
297 print "<a href=\"${url}\">";
298 endif;
299
300 if ($params['long']) : print esc_html(__($link['long']));
301 else : print esc_html(__($label));
302 endif;
303
304 if ($link['page']==basename($this->filename)) :
305 print "</strong>";
306 else :
307 print "</a>";
308 endif;
309
310 $first = false;
311 endforeach;
312 print $params['after'];
313 } /* FeedWordPressAdminPage::display_feed_settings_page_links */
314
315 function display_feed_select_dropdown() {
316 $links = FeedWordPress::syndicated_links();
317
318 ?>
319 <div id="fwpfs-container"><ul class="subsubsub">
320 <li><select name="link_id" class="fwpfs" style="max-width: 20.0em;">
321 <option value="*"<?php if ($this->for_default_settings()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
322 <?php if ($links) : foreach ($links as $ddlink) : ?>
323 <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($this->link) and ($this->link->id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print esc_html($ddlink->link_name); ?></option>
324 <?php endforeach; endif; ?>
325 </select>
326 <input id="fwpfs-button" class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" /></li>
327
328 <?php
329 $this->display_feed_settings_page_links(array(
330 'before' => '<li>',
331 'between' => "</li>\n<li>",
332 'after' => '</li>',
333 'subscription' => $this->link,
334 ));
335
336 if ($this->for_feed_settings()) :
337 ?>
338 <li><input class="button" type="submit" name="update" value="Update Now" /></li>
339 <?php
340 endif;
341 ?>
342 </ul>
343 </div>
344 <?php
345 } /* FeedWordPressAdminPage::display_feed_select_dropdown() */
346
347 function display_sheet_header ($pagename = 'Syndication', $all = false) {
348 ?>
349 <div class="icon32"><img src="<?php print esc_html(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png'); ?>" alt="" /></div>
350 <h2><?php print esc_html(__($pagename.($all ? '' : ' Settings'))); ?><?php if ($this->for_feed_settings()) : ?>: <?php echo esc_html($this->link->name(/*from feed=*/ false)); ?><?php endif; ?></h2>
351 <?php
352 }
353
354 function display_update_notice_if_updated ($pagename = 'Syndication', $mesg = NULL) {
355 if (!is_null($mesg)) :
356 $this->mesg = $mesg;
357 endif;
358
359 if ($this->updated) :
360 if ($this->updated === true) :
361 $this->mesg = $pagename . ' settings updated.';
362 else :
363 $this->mesg = $this->updated;
364 endif;
365 endif;
366
367 if (!is_null($this->mesg)) :
368 ?>
369 <div class="updated">
370 <p><?php print esc_html($this->mesg); ?></p>
371 </div>
372 <?php
373 endif;
374 } /* FeedWordPressAdminPage::display_update_notice_if_updated() */
375
376 function display_settings_scope_message () {
377 if ($this->for_feed_settings()) :
378 ?>
379 <p>These settings only affect posts syndicated from
380 <strong><?php echo esc_html($this->link->link->link_name); ?></strong>.</p>
381 <?php
382 else :
383 ?>
384 <p>These settings affect posts syndicated from any feed unless they are overridden
385 by settings for that specific feed.</p>
386 <?php
387 endif;
388 } /* FeedWordPressAdminPage::display_settings_scope_message () */
389
390 /*static*/ function has_link () { return true; }
391
392 function form_action ($filename = NULL) {
393 global $fwp_path;
394
395 if (is_null($filename)) :
396 $filename = basename($this->filename);
397 endif;
398 return "admin.php?page=${fwp_path}/".$filename;
399 } /* FeedWordPressAdminPage::form_action () */
400
401 function update_message () {
402 return $this->mesg;
403 }
404
405 function display () {
406 if (FeedWordPress::needs_upgrade()) :
407 fwp_upgrade_page();
408 return;
409 endif;
410
411 FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
412
413 ////////////////////////////////////////////////
414 // Process POST request, if any ////////////////
415 ////////////////////////////////////////////////
416 if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
417 $this->accept_POST($GLOBALS['fwp_post']);
418 else :
419 $this->updated = false;
420 endif;
421
422 ////////////////////////////////////////////////
423 // Prepare settings page ///////////////////////
424 ////////////////////////////////////////////////
425
426 $this->display_update_notice_if_updated(
427 $this->pagename('settings-update'),
428 $this->update_message()
429 );
430
431 $this->open_sheet($this->pagename('open-sheet'));
432 ?>
433 <div id="post-body">
434 <?php
435 foreach ($this->boxes_by_methods as $method => $row) :
436 if (is_array($row)) :
437 $id = $row['id'];
438 $title = $row['title'];
439 else :
440 $id = 'feedwordpress_'.$method;
441 $title = $row;
442 endif;
443
444 add_meta_box(
445 /*id=*/ $id,
446 /*title=*/ $title,
447 /*callback=*/ array($this, $method),
448 /*page=*/ $this->meta_box_context(),
449 /*context=*/ $this->meta_box_context()
450 );
451 endforeach;
452 do_action($this->dispatch.'_meta_boxes', $this);
453 ?>
454 <div class="metabox-holder">
455 <?php
456 fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
457 ?>
458 </div> <!-- class="metabox-holder" -->
459 </div> <!-- id="post-body" -->
460 <?php $this->close_sheet(); ?>
461 <?php
462 }
463
464 function open_sheet ($header) {
465 // Set up prepatory AJAX stuff
466 ?>
467 <script type="text/javascript">
468 <?php
469 $this->ajax_interface_js();
470 ?>
471 </script>
472
473 <?php
474 add_action(
475 FeedWordPressCompatibility::bottom_script_hook($this->filename),
476 /*callback=*/ array($this, 'fix_toggles'),
477 /*priority=*/ 10000
478 );
479 FeedWordPressSettingsUI::ajax_nonce_fields();
480
481 ?>
482 <div class="wrap feedwordpress-admin" id="feedwordpress-admin-<?php print $this->pageslug(); ?>">
483 <?php
484 if (!is_null($header)) :
485 $this->display_sheet_header($header);
486 endif;
487
488 if (!is_null($this->dispatch)) :
489 ?>
490 <form action="<?php print $this->form_action(); ?>" method="post">
491 <div><?php
492 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
493 $this->stamp_link_id();
494 ?></div>
495 <?php
496 endif;
497
498 if ($this->has_link()) :
499 $this->display_settings_scope_message();
500 endif;
501
502 ?><div class="tablenav"><?php
503 if (!is_null($this->dispatch)) :
504 ?><div class="alignright"><?php
505 $this->save_button();
506 ?></div><?php
507 endif;
508
509 if ($this->has_link()) :
510 $this->display_feed_select_dropdown();
511 endif;
512 ?>
513 </div>
514
515 <div id="poststuff">
516 <?php
517 } /* FeedWordPressAdminPage::open_sheet () */
518
519 function close_sheet () {
520 ?>
521
522 </div> <!-- id="poststuff" -->
523 <?php
524 if (!is_null($this->dispatch)) :
525 $this->save_button();
526 print "</form>\n";
527 endif;
528 ?>
529 </div> <!-- class="wrap" -->
530
531 <?php
532 } /* FeedWordPressAdminPage::close_sheet () */
533
534 function setting_radio_control ($localName, $globalName, $options, $params = array()) {
535 global $fwp_path;
536
537 if (isset($params['filename'])) : $filename = $params['filename'];
538 else : $filename = basename($this->filename);
539 endif;
540
541 if (isset($params['site-wide-url'])) : $href = $params['site-wide-url'];
542 else : $href = "admin.php?page=${fwp_path}/${filename}";
543 endif;
544
545 if (isset($params['setting-default'])) : $settingDefault = $params['setting-default'];
546 else : $settingDefault = NULL;
547 endif;
548
549 if (isset($params['global-setting-default'])) : $globalSettingDefault = $params['global-setting-default'];
550 else : $globalSettingDefault = $settingDefault;
551 endif;
552
553 $globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
554 if ($this->for_feed_settings()) :
555 $setting = $this->link->setting($localName, NULL, $settingDefault);
556 else :
557 $setting = $globalSetting;
558 endif;
559
560 if (isset($params['offer-site-wide'])) : $offerSiteWide = $params['offer-site-wide'];
561 else : $offerSiteWide = $this->for_feed_settings();
562 endif;
563
564 // This allows us to provide an alternative set of human-readable
565 // labels for each potential value. For use in Currently: line.
566 if (isset($params['labels'])) : $labels = $params['labels'];
567 elseif (is_callable($options)) : $labels = NULL;
568 else : $labels = $options;
569 endif;
570
571 if (isset($params['input-name'])) : $inputName = $params['input-name'];
572 else : $inputName = $globalName;
573 endif;
574
575 if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
576 else : $defaultInputId = NULL;
577 endif;
578
579 if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
580 elseif (!is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
581 else : $defaultInputIdNo = NULL;
582 endif;
583
584 // This allows us to either include the site-default setting as
585 // one of the options within the radio box, or else as a simple
586 // yes/no toggle that controls whether or not to check another
587 // set of inputs.
588 if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
589 else : $defaultInputName = $inputName;
590 endif;
591
592 if ($defaultInputName != $inputName) :
593 $defaultInputValue = 'yes';
594 else :
595 $defaultInputValue = (
596 isset($params['default-input-value'])
597 ? $params['default-input-value']
598 : 'site-default'
599 );
600 endif;
601
602 $settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
603
604 if (!is_callable($options)) :
605 $checked = array();
606 if ($settingDefaulted) :
607 $checked[$defaultInputValue] = ' checked="checked"';
608 endif;
609
610 foreach ($options as $value => $label) :
611 if ($setting == $value) :
612 $checked[$value] = ' checked="checked"';
613 else :
614 $checked[$value] = '';
615 endif;
616 endforeach;
617 endif;
618
619 $defaulted = array();
620 if ($defaultInputName != $inputName) :
621 $defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
622 $defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
623 else :
624 $defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
625 endif;
626
627 if (isset($params['defaulted'])) :
628 $defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
629 $defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
630 endif;
631
632 if ($offerSiteWide) :
633 ?>
634 <table class="twofer">
635 <tbody>
636 <tr><td class="equals first inactive">
637 <ul class="options">
638 <li><label><input type="radio"
639 name="<?php print $defaultInputName; ?>"
640 value="<?php print $defaultInputValue; ?>"
641 <?php if (!is_null($defaultInputId)) : ?>id="<?php print $defaultInputId; ?>" <?php endif; ?>
642 <?php print $defaulted['yes']; ?> />
643 Use the site-wide setting</label>
644 <span class="current-setting">Currently:
645 <strong><?php if (is_callable($labels)) :
646 print call_user_func($labels, $globalSetting, $defaulted, $params);
647 elseif (is_null($labels)) :
648 print $globalSetting;
649 else :
650 print $labels[$globalSetting];
651 endif; ?></strong> (<a href="<?php print $href; ?>">change</a>)</span></li>
652 </ul></td>
653
654 <td class="equals second inactive">
655 <?php if ($defaultInputName != $inputName) : ?>
656 <ul class="options">
657 <li><label><input type="radio"
658 name="<?php print $defaultInputName; ?>"
659 value="no"
660 <?php if (!is_null($defaultInputIdNo)) : ?>id="<?php print $defaultInputIdNo; ?>" <?php endif; ?>
661 <?php print $defaulted['no']; ?> />
662 <?php _e('Do something different with this feed.'); ?></label>
663 <?php endif;
664 endif;
665
666 // Let's spit out the controls here.
667 if (is_callable($options)) :
668 // Method call to print out options list
669 call_user_func($options, $setting, $defaulted, $params);
670 else :
671 ?>
672 <ul class="options">
673 <?php foreach ($options as $value => $label) : ?>
674 <li><label><input type="radio" name="<?php print $inputName; ?>"
675 value="<?php print $value; ?>"
676 <?php print $checked[$value]; ?> />
677 <?php print $label; ?></label></li>
678 <?php endforeach; ?>
679 </ul> <!-- class="options" -->
680 <?php
681 endif;
682
683 if ($offerSiteWide) :
684 if ($defaultInputName != $inputName) :
685 // Close the <li> and <ul class="options"> we opened above
686 ?>
687 </li>
688 </ul> <!-- class="options" -->
689 <?php
690 endif;
691
692 // Close off the twofer table that we opened up above.
693 ?>
694 </td></tr>
695 </tbody>
696 </table>
697 <?php
698 endif;
699 } /* FeedWordPressAdminPage::setting_radio_control () */
700
701 function save_button ($caption = NULL) {
702 if (is_null($caption)) : $caption = __('Save Changes'); endif;
703 ?>
704 <p class="submit">
705 <input class="button-primary" type="submit" name="save" value="<?php print $caption; ?>" />
706 </p>
707 <?php
708 }
709 } /* class FeedWordPressAdminPage */
710
711 function fwp_authors_single_submit ($link = NULL) {
712 ?>
713 <div class="submitbox" id="submitlink">
714 <div id="previewview">
715 </div>
716 <div class="inside">
717 </div>
718
719 <p class="submit">
720 <input type="submit" name="save" value="<?php _e('Save') ?>" />
721 </p>
722 </div>
723 <?php
724 }
725
726 function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
727 ?>
728 <div id="<?php print $id; ?>" class="<?php print $class; ?>">
729 <h3><?php print htmlspecialchars($legend); ?></h3>
730 <div class="inside">
731 <?php
732 }
733
734 function fwp_option_box_closer () {
735 ?>
736 </div> <!-- class="inside" -->
737 </div> <!-- class="stuffbox" -->
738 <?php
739 }
740
741 function fwp_tags_box ($tags, $object, $params = array()) {
742 $params = wp_parse_args($params, array( // Default values
743 'taxonomy' => 'post_tag',
744 'textarea_name' => NULL,
745 'textarea_id' => NULL,
746 'input_id' => NULL,
747 'input_name' => NULL,
748 'id' => NULL,
749 'box_title' => __('Post Tags'),
750 ));
751
752 if (!is_array($tags)) : $tags = array(); endif;
753
754 $tax_name = $params['taxonomy'];
755 $taxonomy = get_taxonomy($params['taxonomy']);
756 $disabled = (!current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '');
757
758 $desc = "<p style=\"font-size:smaller;font-style:bold;margin:0\">Tag $object as...</p>";
759
760 if (is_null($params['textarea_name'])) :
761 $params['textarea_name'] = "tax_input[$tax_name]";
762 endif;
763 if (is_null($params['textarea_id'])) :
764 $params['textarea_id'] = "tax-input-${tax_name}";
765 endif;
766 if (is_null($params['input_id'])) :
767 $params['input_id'] = "new-tag-${tax_name}";
768 endif;
769 if (is_null($params['input_name'])) :
770 $params['input_name'] = "newtag[$tax_name]";
771 endif;
772
773 if (is_null($params['id'])) :
774 $params['id'] = $tax_name;
775 endif;
776
777 print $desc;
778 $helps = __('Separate tags with commas.');
779 $box['title'] = __('Tags');
780 ?>
781 <div class="tagsdiv" id="<?php echo $params['id']; ?>">
782 <div class="jaxtag">
783 <div class="nojs-tags hide-if-js">
784 <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
785 <textarea name="<?php echo $params['textarea_name']; ?>" class="the-tags" id="<?php echo $params['textarea_id']; ?>"><?php echo esc_attr(implode(",", $tags)); ?></textarea></div>
786
787 <?php if ( current_user_can($taxonomy->cap->assign_terms) ) :?>
788 <div class="ajaxtag hide-if-no-js">
789 <label class="screen-reader-text" for="<?php echo $params['input_id']; ?>"><?php echo $params['box_title']; ?></label>
790 <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
791 <p><input type="text" id="<?php print $params['input_id']; ?>" name="<?php print $params['input_name']; ?>" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
792 <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
793 </div>
794 <p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p>
795 <?php endif; ?>
796 </div>
797
798 <div class="tagchecklist"></div>
799 </div>
800 <?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?>
801 <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
802 <?php endif;
803
804 }
805
806 function fwp_category_box ($checked, $object, $tags = array(), $params = array()) {
807 global $wp_db_version;
808
809 if (is_string($params)) :
810 $prefix = $params;
811 $taxonomy = 'category';
812 elseif (is_array($params)) :
813 $prefix = (isset($params['prefix']) ? $params['prefix'] : '');
814 $taxonomy = (isset($params['taxonomy']) ? $params['taxonomy'] : 'category');
815 endif;
816 $tax = get_taxonomy($taxonomy);
817
818 if (strlen($prefix) > 0) :
819 $idPrefix = $prefix.'-';
820 $idSuffix = "-".$prefix;
821 $namePrefix = $prefix . '_';
822 else :
823 $idPrefix = 'feedwordpress-';
824 $idSuffix = "-feedwordpress";
825 $namePrefix = 'feedwordpress_';
826 endif;
827
828 ?>
829 <div id="<?php print $idPrefix; ?>taxonomy-<?php print $taxonomy; ?>" class="feedwordpress-category-div">
830 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-tabs" class="category-tabs">
831 <li class="ui-tabs-selected tabs"><a href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
832 <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these <?php print $tax->labels->name; ?></p>
833 </li>
834 </ul>
835
836 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" class="tabs-panel">
837 <input type="hidden" value="0" name="tax_input[<?php print $taxonomy; ?>][]" />
838 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist" class="list:<?php print $taxonomy; ?> categorychecklist form-no-clear">
839 <?php fwp_category_checklist(NULL, false, $checked, $params) ?>
840 </ul>
841 </div>
842
843 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-adder" class="<?php print $taxonomy; ?>-adder wp-hidden-children">
844 <h4><a id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-toggle" class="category-add-toggle" href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
845 <p id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="category-add wp-hidden-child">
846 <?php
847 $newcat = 'new'.$taxonomy;
848
849 ?>
850 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"><?php _e('Add New Category'); ?></label>
851 <input
852 id="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"
853 class="new<?php print $taxonomy; ?> form-required form-input-tip"
854 aria-required="true"
855 tabindex="3"
856 type="text" name="<?php print $newcat; ?>"
857 value="<?php _e( 'New category name' ); ?>"
858 />
859 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>-parent"><?php _e('Parent Category:'); ?></label>
860 <?php wp_dropdown_categories( array(
861 'taxonomy' => $taxonomy,
862 'hide_empty' => 0,
863 'id' => $idPrefix.'new'.$taxonomy.'-parent',
864 'class' => 'new'.$taxonomy.'-parent',
865 'name' => $newcat.'_parent',
866 'orderby' => 'name',
867 'hierarchical' => 1,
868 'show_option_none' => __('Parent category'),
869 'tab_index' => 3,
870 ) ); ?>
871 <input type="button" id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-sumbit" class="add:<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist:<?php print $idPrefix.$taxonomy; ?>-add add-categorychecklist-category-add button category-add-submit" value="<?php _e( 'Add' ); ?>" tabindex="3" />
872 <?php /* wp_nonce_field currently doesn't let us set an id different from name, but we need a non-unique name and a unique id */ ?>
873 <input type="hidden" id="_ajax_nonce<?php print esc_html($idSuffix); ?>" name="_ajax_nonce" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
874 <input type="hidden" id="_ajax_nonce-add-<?php print $taxonomy; ?><?php print esc_html($idSuffix); ?>" name="_ajax_nonce-add-<?php print $taxonomy; ?>" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
875 <span id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-ajax-response" class="<?php print $taxonomy; ?>-ajax-response"></span>
876 </p>
877 </div>
878
879 </div>
880 <?php
881 }
882
883 function update_feeds_mention ($feed) {
884 echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
885 .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...";
886 flush();
887 }
888 function update_feeds_finish ($feed, $added, $dt) {
889 if (is_wp_error($added)) :
890 $mesgs = $added->get_error_messages();
891 foreach ($mesgs as $mesg) :
892 echo "<br/><strong>Feed error:</strong> <code>$mesg</code>";
893 endforeach;
894 echo "</li>\n";
895 else :
896 echo " completed in $dt second".(($dt==1)?'':'s')."</li>\n";
897 endif;
898 flush();
899 }
900
901 function fwp_author_list () {
902 global $wpdb;
903 $ret = array();
904
905 $users = get_users_of_blog();
906 if (is_array($users)) :
907 foreach ($users as $user) :
908 $id = (int) $user->ID;
909 $ret[$id] = $user->display_name;
910 if (strlen(trim($ret[$id])) == 0) :
911 $ret[$id] = $user->user_login;
912 endif;
913 endforeach;
914 endif;
915 return $ret;
916 }
917
918 class FeedWordPressSettingsUI {
919 function is_admin () {
920 global $fwp_path;
921
922 $admin_page = false; // Innocent until proven guilty
923 if (isset($_REQUEST['page'])) :
924 $admin_page = (
925 is_admin()
926 and preg_match("|^{$fwp_path}/|", $_REQUEST['page'])
927 );
928 endif;
929 return $admin_page;
930 }
931
932 function admin_scripts () {
933 global $fwp_path;
934
935 wp_enqueue_script('post'); // for magic tag and category boxes
936 wp_enqueue_script('admin-forms'); // for checkbox selection
937
938 wp_register_script('feedwordpress-elements', WP_PLUGIN_URL.'/'.$fwp_path.'/feedwordpress-elements.js');
939 wp_enqueue_script('feedwordpress-elements');
940 }
941
942 function admin_styles () {
943 ?>
944 <style type="text/css">
945 #feedwordpress-admin-feeds .link-rss-params-remove .x, .feedwordpress-admin .remove-it .x {
946 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll 0 0 transparent;
947 }
948
949 #feedwordpress-admin-feeds .link-rss-params-remove:hover .x, .feedwordpress-admin .remove-it:hover .x {
950 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll -10px 0 transparent;
951 }
952
953 .fwpfs {
954 background-image: url(<?php print admin_url('images/fav.png'); ?>);
955 background-repeat: repeat-x;
956 background-position: left center;
957 background-attachment: scroll;
958 }
959 .fwpfs.slide-down {
960 background-image:url(<?php print admin_url('images/fav-top.png'); ?>);
961 background-position:0 top;
962 background-repeat:repeat-x;
963 }
964
965 .update-results {
966 max-width: 100%;
967 overflow: auto;
968 }
969
970 </style>
971 <?php
972 } /* FeedWordPressSettingsUI::admin_styles () */
973
974 /*static*/ function ajax_nonce_fields () {
975 if (function_exists('wp_nonce_field')) :
976 echo "<form style='display: none' method='get' action=''>\n<p>\n";
977 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
978 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
979 echo "</p>\n</form>\n";
980 endif;
981 } /* FeedWordPressSettingsUI::ajax_nonce_fields () */
982
983 /*static*/ function fix_toggles_js ($context) {
984 ?>
985 <script type="text/javascript">
986 jQuery(document).ready( function($) {
987 // In case someone got here first...
988 $('.postbox h3, .postbox .handlediv').unbind('click');
989 $('.postbox h3 a').unbind('click');
990 $('.hide-postbox-tog').unbind('click');
991 $('.columns-prefs input[type="radio"]').unbind('click');
992 $('.meta-box-sortables').sortable('destroy');
993
994 postboxes.add_postbox_toggles('<?php print $context; ?>');
995 } );
996 </script>
997 <?php
998 } /* FeedWordPressSettingsUI::fix_toggles_js () */
999
1000 function magic_input_tip_js ($id) {
1001 if (!preg_match('/^[.#]/', $id)) :
1002 $id = '#'.$id;
1003 endif;
1004 ?>
1005 <script type="text/javascript">
1006 jQuery(document).ready( function () {
1007 var inputBox = jQuery("<?php print $id; ?>");
1008 var boxEl = inputBox.get(0);
1009 if (boxEl.value==boxEl.defaultValue) { inputBox.addClass('form-input-tip'); }
1010 inputBox.focus(function() {
1011 if ( this.value == this.defaultValue )
1012 jQuery(this).val( '' ).removeClass( 'form-input-tip' );
1013 });
1014 inputBox.blur(function() {
1015 if ( this.value == '' )
1016 jQuery(this).val( this.defaultValue ).addClass( 'form-input-tip' );
1017 });
1018 } );
1019 </script>
1020 <?php
1021 } /* FeedWordPressSettingsUI::magic_input_tip_js () */
1022 } /* class FeedWordPressSettingsUI */
1023
1024 function fwp_insert_new_user ($newuser_name) {
1025 global $wpdb;
1026
1027 $ret = null;
1028 if (strlen($newuser_name) > 0) :
1029 $userdata = array();
1030 $userdata['ID'] = NULL;
1031 $userdata['user_login'] = apply_filters('pre_user_login', sanitize_user($newuser_name));
1032 $userdata['user_nicename'] = apply_filters('pre_user_nicename', sanitize_title($newuser_name));
1033 $userdata['display_name'] = $newuser_name;
1034 $userdata['user_pass'] = substr(md5(uniqid(microtime())), 0, 6); // just something random to lock it up
1035
1036 $blahUrl = get_bloginfo('url'); $url = parse_url($blahUrl);
1037 $userdata['user_email'] = substr(md5(uniqid(microtime())), 0, 6).'@'.$url['host'];
1038
1039 $newuser_id = wp_insert_user($userdata);
1040 $ret = $newuser_id; // Either a numeric ID or a WP_Error object
1041 else :
1042 // TODO: Add some error reporting
1043 endif;
1044 return $ret;
1045 } /* fwp_insert_new_user () */
1046
1047 /**
1048 * fwp_add_meta_box
1049 *
1050 * This function is no longer necessary, since no versions of WordPress that FWP
1051 * still supports lack add_meta_box(). But I've left it in place for the time
1052 * being for add-on modules that may have used it in setting up their UI.
1053 */
1054 function fwp_add_meta_box ($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args = null) {
1055 return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
1056 } /* function fwp_add_meta_box () */
1057
1058 function fwp_do_meta_boxes($page, $context, $object) {
1059 $ret = do_meta_boxes($page, $context, $object);
1060
1061 // Avoid JavaScript error from WordPress 2.5 bug
1062 ?>
1063 <div style="display: none">
1064 <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
1065 </div>
1066 <?php
1067 return $ret;
1068 } /* function fwp_do_meta_boxes() */
1069
1070 function fwp_remove_meta_box($id, $page, $context) {
1071 return remove_meta_box($id, $page, $context);
1072 } /* function fwp_remove_meta_box() */
1073
1074 function fwp_syndication_manage_page_links_table_rows ($links, $page, $visible = 'Y') {
1075 global $fwp_path;
1076
1077 $subscribed = ('Y' == strtoupper($visible));
1078 if ($subscribed or (count($links) > 0)) :
1079 ?>
1080 <table class="widefat<?php if (!$subscribed) : ?> unsubscribed<?php endif; ?>">
1081 <thead>
1082 <tr>
1083 <th class="check-column" scope="col"><input type="checkbox" /></th>
1084 <th scope="col"><?php _e('Name'); ?></th>
1085 <th scope="col"><?php _e('Feed'); ?></th>
1086 <th scope="col"><?php _e('Updated'); ?></th>
1087 </tr>
1088 </thead>
1089
1090 <tbody>
1091 <?php
1092 $alt_row = true;
1093 if (count($links) > 0):
1094 foreach ($links as $link):
1095 $trClass = array();
1096
1097 // Prep: Get last updated timestamp
1098 $sLink = new SyndicatedLink($link->link_id);
1099 if (!is_null($sLink->setting('update/last'))) :
1100 $lastUpdated = 'Last checked '. fwp_time_elapsed($sLink->setting('update/last'));
1101 else :
1102 $lastUpdated = __('None yet');
1103 endif;
1104
1105 // Prep: get last error timestamp, if any
1106 $fileSizeLines = array();
1107 if (is_null($sLink->setting('update/error'))) :
1108 $errorsSince = '';
1109 if (!is_null($sLink->setting('link/item count'))) :
1110 $N = $sLink->setting('link/item count');
1111 $fileSizeLines[] = sprintf((($N==1) ? __('%d item') : __('%d items')), $N);
1112 endif;
1113
1114 if (!is_null($sLink->setting('link/filesize'))) :
1115 $fileSizeLines[] = size_format($sLink->setting('link/filesize')). ' total';
1116 endif;
1117 else :
1118 $trClass[] = 'feed-error';
1119
1120 $theError = unserialize($sLink->setting('update/error'));
1121
1122 $errorsSince = "<div class=\"returning-errors\">"
1123 ."<p><strong>Returning errors</strong> since "
1124 .fwp_time_elapsed($theError['since'])
1125 ."</p>"
1126 ."<p>Most recent ("
1127 .fwp_time_elapsed($theError['ts'])
1128 ."):<br/><code>"
1129 .implode("</code><br/><code>", $theError['object']->get_error_messages())
1130 ."</code></p>"
1131 ."</div>\n";
1132 endif;
1133
1134 $nextUpdate = "<div style='max-width: 30.0em; font-size: 0.9em;'><div style='font-style:italic;'>";
1135
1136 $ttl = $sLink->setting('update/ttl');
1137 if (is_numeric($ttl)) :
1138 $next = $sLink->setting('update/last') + $sLink->setting('update/fudge') + ((int) $ttl * 60);
1139 if ('automatically'==$sLink->setting('update/timed')) :
1140 if ($next < time()) :
1141 $nextUpdate .= 'Ready and waiting to be updated since ';
1142 else :
1143 $nextUpdate .= 'Scheduled for next update ';
1144 endif;
1145 $nextUpdate .= fwp_time_elapsed($next);
1146 if (FEEDWORDPRESS_DEBUG) : $nextUpdate .= " [".(($next-time())/60)." minutes]"; endif;
1147 else :
1148 $lastUpdated .= " &middot; Next ";
1149 if ($next < time()) :
1150 $lastUpdated .= 'ASAP';
1151 elseif ($next - time() < 60) :
1152 $lastUpdated .= fwp_time_elapsed($next);
1153 elseif ($next - time() < 60*60*24) :
1154 $lastUpdated .= gmdate('g:ia', $next + (get_option('gmt_offset') * 3600));
1155 else :
1156 $lastUpdated .= gmdate('F j', $next + (get_option('gmt_offset') * 3600));
1157 endif;
1158
1159 $nextUpdate .= "Scheduled to be checked for updates every ".$ttl." minute".(($ttl!=1)?"s":"")."</div><div style='size:0.9em; margin-top: 0.5em'> This update schedule was requested by the feed provider";
1160 if ($sLink->setting('update/xml')) :
1161 $nextUpdate .= " using a standard <code style=\"font-size: inherit; padding: 0; background: transparent\">&lt;".$sLink->setting('update/xml')."&gt;</code> element";
1162 endif;
1163 $nextUpdate .= ".";
1164 endif;
1165 else:
1166 $nextUpdate .= "Scheduled for update as soon as possible";
1167 endif;
1168 $nextUpdate .= "</div></div>";
1169
1170 $fileSize = '';
1171 if (count($fileSizeLines) > 0) :
1172 $fileSize = '<div>'.implode(" / ", $fileSizeLines)."</div>";
1173 endif;
1174
1175 unset($sLink);
1176
1177 $alt_row = !$alt_row;
1178
1179 if ($alt_row) :
1180 $trClass[] = 'alternate';
1181 endif;
1182 ?>
1183 <tr<?php echo ((count($trClass) > 0) ? ' class="'.implode(" ", $trClass).'"':''); ?>>
1184 <th class="check-column" scope="row"><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></th>
1185 <?php
1186 $hrefPrefix = "admin.php?link_id={$link->link_id}&amp;page=${fwp_path}/";
1187 $caption = (
1188 (strlen($link->link_rss) > 0)
1189 ? __('Switch Feed')
1190 : $caption=__('Find Feed')
1191 );
1192 ?>
1193 <td>
1194 <strong><a href="<?php print $hrefPrefix; ?>feeds-page.php"><?php print esc_html($link->link_name); ?></a></strong>
1195 <div class="row-actions"><?php if ($subscribed) :
1196 $page->display_feed_settings_page_links(array(
1197 'before' => '<div><strong>Settings &gt;</strong> ',
1198 'after' => '</div>',
1199 'subscription' => $link,
1200 ));
1201 endif; ?>
1202
1203 <div><strong>Actions &gt;</strong>
1204 <?php if ($subscribed) : ?>
1205 <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=feedfinder"><?php echo $caption; ?></a>
1206 <?php else : ?>
1207 <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=<?php print FWP_RESUB_CHECKED; ?>"><?php _e('Re-subscribe'); ?></a>
1208 <?php endif; ?>
1209 | <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=Unsubscribe"><?php _e(($subscribed ? 'Unsubscribe' : 'Delete permanently')); ?></a>
1210 | <a href="<?php print esc_html($link->link_url); ?>"><?php _e('View')?></a></div>
1211 </div>
1212 </td>
1213 <?php if (strlen($link->link_rss) > 0): ?>
1214 <td><a href="<?php echo esc_html($link->link_rss); ?>"><?php echo esc_html(feedwordpress_display_url($link->link_rss, 32)); ?></a></td>
1215 <?php else: ?>
1216 <td class="feed-missing"><p><strong>no feed assigned</strong></p></td>
1217 <?php endif; ?>
1218
1219 <td><div style="float: right; padding-left: 10px">
1220 <input type="submit" class="button" name="update_uri[<?php print esc_html($link->link_rss); ?>]" value="<?php _e('Update Now'); ?>" />
1221 </div>
1222 <?php print $lastUpdated; ?>
1223 <?php print $fileSize; ?>
1224 <?php print $errorsSince; ?>
1225 <?php print $nextUpdate; ?>
1226 </td>
1227 </tr>
1228 <?php
1229 endforeach;
1230 else :
1231 ?>
1232 <tr><td colspan="4"><p>There are no websites currently listed for syndication.</p></td></tr>
1233 <?php
1234 endif;
1235 ?>
1236 </tbody>
1237 </table>
1238 <?php
1239 endif;
1240 } /* function fwp_syndication_manage_page_links_table_rows () */
1241
1242 function fwp_syndication_manage_page_links_subsubsub ($sources, $showInactive) {
1243 global $fwp_path;
1244 $hrefPrefix = "admin.php?page=${fwp_path}/syndication.php";
1245 ?>
1246 <ul class="subsubsub">
1247 <li><a <?php if (!$showInactive) : ?>class="current" <?php endif; ?>href="<?php print $hrefPrefix; ?>&amp;visibility=Y">Subscribed
1248 <span class="count">(<?php print count($sources['Y']); ?>)</span></a></li>
1249 <?php if ($showInactive or (count($sources['N']) > 0)) : ?>
1250 <li><a <?php if ($showInactive) : ?>class="current" <?php endif; ?>href="<?php print $hrefPrefix; ?>&amp;visibility=N">Inactive</a>
1251 <span class="count">(<?php print count($sources['N']); ?>)</span></a></li>
1252 <?php endif; ?>
1253
1254 </ul> <!-- class="subsubsub" -->
1255 <?php
1256 }
1257
1258