]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-admin/includes/template.php
Wordpress 2.9.2
[autoinstalls/wordpress.git] / wp-admin / includes / template.php
1 <?php
2 /**
3  * Template WordPress Administration API.
4  *
5  * A Big Mess. Also some neat functions that are nicely written.
6  *
7  * @package WordPress
8  * @subpackage Administration
9  */
10
11 // Ugly recursive category stuff.
12 /**
13  * {@internal Missing Short Description}}
14  *
15  * @since unknown
16  *
17  * @param unknown_type $parent
18  * @param unknown_type $level
19  * @param unknown_type $categories
20  * @param unknown_type $page
21  * @param unknown_type $per_page
22  */
23 function cat_rows( $parent = 0, $level = 0, $categories = 0, $page = 1, $per_page = 20 ) {
24
25         $count = 0;
26
27         if ( empty($categories) ) {
28
29                 $args = array('hide_empty' => 0);
30                 if ( !empty($_GET['s']) )
31                         $args['search'] = $_GET['s'];
32
33                 $categories = get_categories( $args );
34
35                 if ( empty($categories) )
36                         return false;
37         }
38
39         $children = _get_term_hierarchy('category');
40
41         _cat_rows( $parent, $level, $categories, $children, $page, $per_page, $count );
42
43 }
44
45 /**
46  * {@internal Missing Short Description}}
47  *
48  * @since unknown
49  *
50  * @param unknown_type $categories
51  * @param unknown_type $count
52  * @param unknown_type $parent
53  * @param unknown_type $level
54  * @param unknown_type $page
55  * @param unknown_type $per_page
56  * @return unknown
57  */
58 function _cat_rows( $parent = 0, $level = 0, $categories, &$children, $page = 1, $per_page = 20, &$count ) {
59
60         $start = ($page - 1) * $per_page;
61         $end = $start + $per_page;
62         ob_start();
63
64         foreach ( $categories as $key => $category ) {
65                 if ( $count >= $end )
66                         break;
67
68                 if ( $category->parent != $parent && empty($_GET['s']) )
69                         continue;
70
71                 // If the page starts in a subtree, print the parents.
72                 if ( $count == $start && $category->parent > 0 ) {
73
74                         $my_parents = array();
75                         $p = $category->parent;
76                         while ( $p ) {
77                                 $my_parent = get_category( $p );
78                                 $my_parents[] = $my_parent;
79                                 if ( $my_parent->parent == 0 )
80                                         break;
81                                 $p = $my_parent->parent;
82                         }
83
84                         $num_parents = count($my_parents);
85                         while( $my_parent = array_pop($my_parents) ) {
86                                 echo "\t" . _cat_row( $my_parent, $level - $num_parents );
87                                 $num_parents--;
88                         }
89                 }
90
91                 if ( $count >= $start )
92                         echo "\t" . _cat_row( $category, $level );
93
94                 unset( $categories[ $key ] );
95
96                 $count++;
97
98                 if ( isset($children[$category->term_id]) )
99                         _cat_rows( $category->term_id, $level + 1, $categories, $children, $page, $per_page, $count );
100         }
101
102         $output = ob_get_contents();
103         ob_end_clean();
104
105         echo $output;
106 }
107
108 /**
109  * {@internal Missing Short Description}}
110  *
111  * @since unknown
112  *
113  * @param unknown_type $category
114  * @param unknown_type $level
115  * @param unknown_type $name_override
116  * @return unknown
117  */
118 function _cat_row( $category, $level, $name_override = false ) {
119         static $row_class = '';
120
121         $category = get_category( $category, OBJECT, 'display' );
122
123         $default_cat_id = (int) get_option( 'default_category' );
124         $pad = str_repeat( '&#8212; ', max(0, $level) );
125         $name = ( $name_override ? $name_override : $pad . ' ' . $category->name );
126         $edit_link = "categories.php?action=edit&amp;cat_ID=$category->term_id";
127         if ( current_user_can( 'manage_categories' ) ) {
128                 $edit = "<a class='row-title' href='$edit_link' title='" . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $category->name)) . "'>" . esc_attr( $name ) . '</a><br />';
129                 $actions = array();
130                 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
131                 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
132                 if ( $default_cat_id != $category->term_id )
133                         $actions['delete'] = "<a class='delete:the-list:cat-$category->term_id submitdelete' href='" . wp_nonce_url("categories.php?action=delete&amp;cat_ID=$category->term_id", 'delete-category_' . $category->term_id) . "'>" . __('Delete') . "</a>";
134                 $actions = apply_filters('cat_row_actions', $actions, $category);
135                 $action_count = count($actions);
136                 $i = 0;
137                 $edit .= '<div class="row-actions">';
138                 foreach ( $actions as $action => $link ) {
139                         ++$i;
140                         ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
141                         $edit .= "<span class='$action'>$link$sep</span>";
142                 }
143                 $edit .= '</div>';
144         } else {
145                 $edit = $name;
146         }
147
148         $row_class = 'alternate' == $row_class ? '' : 'alternate';
149         $qe_data = get_category_to_edit($category->term_id);
150
151         $category->count = number_format_i18n( $category->count );
152         $posts_count = ( $category->count > 0 ) ? "<a href='edit.php?cat=$category->term_id'>$category->count</a>" : $category->count;
153         $output = "<tr id='cat-$category->term_id' class='iedit $row_class'>";
154
155         $columns = get_column_headers('categories');
156         $hidden = get_hidden_columns('categories');
157         foreach ( $columns as $column_name => $column_display_name ) {
158                 $class = "class=\"$column_name column-$column_name\"";
159
160                 $style = '';
161                 if ( in_array($column_name, $hidden) )
162                         $style = ' style="display:none;"';
163
164                 $attributes = "$class$style";
165
166                 switch ($column_name) {
167                         case 'cb':
168                                 $output .= "<th scope='row' class='check-column'>";
169                                 if ( $default_cat_id != $category->term_id ) {
170                                         $output .= "<input type='checkbox' name='delete[]' value='$category->term_id' />";
171                                 } else {
172                                         $output .= "&nbsp;";
173                                 }
174                                 $output .= '</th>';
175                                 break;
176                         case 'name':
177                                 $output .= "<td $attributes>$edit";
178                                 $output .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
179                                 $output .= '<div class="name">' . $qe_data->name . '</div>';
180                                 $output .= '<div class="slug">' . apply_filters('editable_slug', $qe_data->slug) . '</div>';
181                                 $output .= '<div class="cat_parent">' . $qe_data->parent . '</div></div></td>';
182                                 break;
183                         case 'description':
184                                 $output .= "<td $attributes>$category->description</td>";
185                                 break;
186                         case 'slug':
187                                 $output .= "<td $attributes>" . apply_filters('editable_slug', $category->slug) . "</td>";
188                                 break;
189                         case 'posts':
190                                 $attributes = 'class="posts column-posts num"' . $style;
191                                 $output .= "<td $attributes>$posts_count</td>\n";
192                                 break;
193                         default:
194                                 $output .= "<td $attributes>";
195                                 $output .= apply_filters('manage_categories_custom_column', '', $column_name, $category->term_id);
196                                 $output .= "</td>";
197                 }
198         }
199         $output .= '</tr>';
200
201         return $output;
202 }
203
204 /**
205  * {@internal Missing Short Description}}
206  *
207  * @since 2.7
208  *
209  * Outputs the HTML for the hidden table rows used in Categories, Link Caregories and Tags quick edit.
210  *
211  * @param string $type "tag", "category" or "link-category"
212  * @return
213  */
214 function inline_edit_term_row($type) {
215
216         if ( ! current_user_can( 'manage_categories' ) )
217                 return;
218
219         $is_tag = $type == 'edit-tags';
220         $columns = get_column_headers($type);
221         $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($type) ) );
222         $col_count = count($columns) - count($hidden);
223         ?>
224
225 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">
226         <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">
227
228                 <fieldset><div class="inline-edit-col">
229                         <h4><?php _e( 'Quick Edit' ); ?></h4>
230
231                         <label>
232                                 <span class="title"><?php _e( 'Name' ); ?></span>
233                                 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>
234                         </label>
235
236                         <label>
237                                 <span class="title"><?php _e( 'Slug' ); ?></span>
238                                 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>
239                         </label>
240
241 <?php if ( 'category' == $type ) : ?>
242
243                         <label>
244                                 <span class="title"><?php _e( 'Parent' ); ?></span>
245                                 <?php wp_dropdown_categories(array('hide_empty' => 0, 'name' => 'parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('None'))); ?>
246                         </label>
247
248 <?php endif; // $type ?>
249
250                 </div></fieldset>
251
252 <?php
253
254         $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );
255
256         foreach ( $columns as $column_name => $column_display_name ) {
257                 if ( isset( $core_columns[$column_name] ) )
258                         continue;
259                 do_action( 'quick_edit_custom_box', $column_name, $type );
260         }
261
262 ?>
263
264         <p class="inline-edit-save submit">
265                 <a accesskey="c" href="#inline-edit" title="<?php _e('Cancel'); ?>" class="cancel button-secondary alignleft"><?php _e('Cancel'); ?></a>
266                 <?php $update_text = ( $is_tag ) ? __( 'Update Tag' ) : __( 'Update Category' ); ?>
267                 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>
268                 <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
269                 <span class="error" style="display:none;"></span>
270                 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>
271                 <br class="clear" />
272         </p>
273         </td></tr>
274         </tbody></table></form>
275 <?php
276 }
277
278 /**
279  * {@internal Missing Short Description}}
280  *
281  * @since unknown
282  *
283  * @param unknown_type $category
284  * @param unknown_type $name_override
285  * @return unknown
286  */
287 function link_cat_row( $category, $name_override = false ) {
288         static $row_class = '';
289
290         if ( !$category = get_term( $category, 'link_category', OBJECT, 'display' ) )
291                 return false;
292         if ( is_wp_error( $category ) )
293                 return $category;
294
295         $default_cat_id = (int) get_option( 'default_link_category' );
296         $name = ( $name_override ? $name_override : $category->name );
297         $edit_link = "link-category.php?action=edit&amp;cat_ID=$category->term_id";
298         if ( current_user_can( 'manage_categories' ) ) {
299                 $edit = "<a class='row-title' href='$edit_link' title='" . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $category->name)) . "'>$name</a><br />";
300                 $actions = array();
301                 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
302                 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
303                 if ( $default_cat_id != $category->term_id )
304                         $actions['delete'] = "<a class='delete:the-list:link-cat-$category->term_id submitdelete' href='" . wp_nonce_url("link-category.php?action=delete&amp;cat_ID=$category->term_id", 'delete-link-category_' . $category->term_id) . "'>" . __('Delete') . "</a>";
305                 $actions = apply_filters('link_cat_row_actions', $actions, $category);
306                 $action_count = count($actions);
307                 $i = 0;
308                 $edit .= '<div class="row-actions">';
309                 foreach ( $actions as $action => $link ) {
310                         ++$i;
311                         ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
312                         $edit .= "<span class='$action'>$link$sep</span>";
313                 }
314                 $edit .= '</div>';
315         } else {
316                 $edit = $name;
317         }
318
319         $row_class = 'alternate' == $row_class ? '' : 'alternate';
320         $qe_data = get_term_to_edit($category->term_id, 'link_category');
321
322         $category->count = number_format_i18n( $category->count );
323         $count = ( $category->count > 0 ) ? "<a href='link-manager.php?cat_id=$category->term_id'>$category->count</a>" : $category->count;
324         $output = "<tr id='link-cat-$category->term_id' class='iedit $row_class'>";
325         $columns = get_column_headers('edit-link-categories');
326         $hidden = get_hidden_columns('edit-link-categories');
327         foreach ( $columns as $column_name => $column_display_name ) {
328                 $class = "class=\"$column_name column-$column_name\"";
329
330                 $style = '';
331                 if ( in_array($column_name, $hidden) )
332                         $style = ' style="display:none;"';
333
334                 $attributes = "$class$style";
335
336                 switch ($column_name) {
337                         case 'cb':
338                                 $output .= "<th scope='row' class='check-column'>";
339                                 if ( absint( get_option( 'default_link_category' ) ) != $category->term_id ) {
340                                         $output .= "<input type='checkbox' name='delete[]' value='$category->term_id' />";
341                                 } else {
342                                         $output .= "&nbsp;";
343                                 }
344                                 $output .= "</th>";
345                                 break;
346                         case 'name':
347                                 $output .= "<td $attributes>$edit";
348                                 $output .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
349                                 $output .= '<div class="name">' . $qe_data->name . '</div>';
350                                 $output .= '<div class="slug">' . apply_filters('editable_slug', $qe_data->slug) . '</div>';
351                                 $output .= '<div class="cat_parent">' . $qe_data->parent . '</div></div></td>';
352                                 break;
353                         case 'description':
354                                 $output .= "<td $attributes>$category->description</td>";
355                                 break;
356                         case 'slug':
357                                 $output .= "<td $attributes>" . apply_filters('editable_slug', $category->slug) . "</td>";
358                                 break;
359                         case 'links':
360                                 $attributes = 'class="links column-links num"' . $style;
361                                 $output .= "<td $attributes>$count</td>";
362                                 break;
363                         default:
364                                 $output .= "<td $attributes>";
365                                 $output .= apply_filters('manage_link_categories_custom_column', '', $column_name, $category->term_id);
366                                 $output .= "</td>";
367                 }
368         }
369         $output .= '</tr>';
370
371         return $output;
372 }
373
374 /**
375  * Outputs the html checked attribute.
376  *
377  * Compares the first two arguments and if identical marks as checked
378  *
379  * @since 1.0
380  *
381  * @param any $checked One of the values to compare
382  * @param any $current (true) The other value to compare if not just true
383  * @param bool $echo Whether or not to echo or just return the string
384  */
385 function checked( $checked, $current = true, $echo = true) {
386         return __checked_selected_helper( $checked, $current, $echo, 'checked' );
387 }
388
389 /**
390  * Outputs the html selected attribute.
391  *
392  * Compares the first two arguments and if identical marks as selected
393  *
394  * @since 1.0
395  *
396  * @param any selected One of the values to compare
397  * @param any $current (true) The other value to compare if not just true
398  * @param bool $echo Whether or not to echo or just return the string
399  */
400 function selected( $selected, $current = true, $echo = true) {
401         return __checked_selected_helper( $selected, $current, $echo, 'selected' );
402 }
403
404 /**
405  * Private helper function for checked and selected.
406  *
407  * Compares the first two arguments and if identical marks as $type
408  *
409  * @since 2.8
410  * @access private
411  *
412  * @param any $helper One of the values to compare
413  * @param any $current (true) The other value to compare if not just true
414  * @param bool $echo Whether or not to echo or just return the string
415  * @param string $type The type of checked|selected we are doing.
416  */
417 function __checked_selected_helper( $helper, $current, $echo, $type) {
418         if ( (string) $helper === (string) $current)
419                 $result = " $type='$type'";
420         else
421                 $result = '';
422
423         if ($echo)
424                 echo $result;
425
426         return $result;
427 }
428
429 //
430 // Category Checklists
431 //
432
433 /**
434  * {@internal Missing Short Description}}
435  *
436  * @since unknown
437  * @deprecated Use {@link wp_link_category_checklist()}
438  * @see wp_link_category_checklist()
439  *
440  * @param unknown_type $default
441  * @param unknown_type $parent
442  * @param unknown_type $popular_ids
443  */
444 function dropdown_categories( $default = 0, $parent = 0, $popular_ids = array() ) {
445         global $post_ID;
446         wp_category_checklist($post_ID);
447 }
448
449 /**
450  * {@internal Missing Short Description}}
451  *
452  * @since unknown
453  */
454 class Walker_Category_Checklist extends Walker {
455         var $tree_type = 'category';
456         var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
457
458         function start_lvl(&$output, $depth, $args) {
459                 $indent = str_repeat("\t", $depth);
460                 $output .= "$indent<ul class='children'>\n";
461         }
462
463         function end_lvl(&$output, $depth, $args) {
464                 $indent = str_repeat("\t", $depth);
465                 $output .= "$indent</ul>\n";
466         }
467
468         function start_el(&$output, $category, $depth, $args) {
469                 extract($args);
470
471                 $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
472                 $output .= "\n<li id='category-$category->term_id'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="post_category[]" id="in-category-' . $category->term_id . '"' . (in_array( $category->term_id, $selected_cats ) ? ' checked="checked"' : "" ) . '/> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
473         }
474
475         function end_el(&$output, $category, $depth, $args) {
476                 $output .= "</li>\n";
477         }
478 }
479
480 /**
481  * {@internal Missing Short Description}}
482  *
483  * @since unknown
484  *
485  * @param unknown_type $post_id
486  * @param unknown_type $descendants_and_self
487  * @param unknown_type $selected_cats
488  * @param unknown_type $popular_cats
489  */
490 function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {
491         if ( empty($walker) || !is_a($walker, 'Walker') )
492                 $walker = new Walker_Category_Checklist;
493
494         $descendants_and_self = (int) $descendants_and_self;
495
496         $args = array();
497
498         if ( is_array( $selected_cats ) )
499                 $args['selected_cats'] = $selected_cats;
500         elseif ( $post_id )
501                 $args['selected_cats'] = wp_get_post_categories($post_id);
502         else
503                 $args['selected_cats'] = array();
504
505         if ( is_array( $popular_cats ) )
506                 $args['popular_cats'] = $popular_cats;
507         else
508                 $args['popular_cats'] = get_terms( 'category', array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
509
510         if ( $descendants_and_self ) {
511                 $categories = get_categories( "child_of=$descendants_and_self&hierarchical=0&hide_empty=0" );
512                 $self = get_category( $descendants_and_self );
513                 array_unshift( $categories, $self );
514         } else {
515                 $categories = get_categories('get=all');
516         }
517
518         if ( $checked_ontop ) {
519                 // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
520                 $checked_categories = array();
521                 $keys = array_keys( $categories );
522
523                 foreach( $keys as $k ) {
524                         if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
525                                 $checked_categories[] = $categories[$k];
526                                 unset( $categories[$k] );
527                         }
528                 }
529
530                 // Put checked cats on top
531                 echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
532         }
533         // Then the rest of them
534         echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
535 }
536
537 /**
538  * {@internal Missing Short Description}}
539  *
540  * @since unknown
541  *
542  * @param unknown_type $taxonomy
543  * @param unknown_type $default
544  * @param unknown_type $number
545  * @param unknown_type $echo
546  * @return unknown
547  */
548 function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) {
549         global $post_ID;
550
551         if ( $post_ID )
552                 $checked_categories = wp_get_post_categories($post_ID);
553         else
554                 $checked_categories = array();
555
556         $categories = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) );
557
558         $popular_ids = array();
559         foreach ( (array) $categories as $category ) {
560                 $popular_ids[] = $category->term_id;
561                 if ( !$echo ) // hack for AJAX use
562                         continue;
563                 $id = "popular-category-$category->term_id";
564                 $checked = in_array( $category->term_id, $checked_categories ) ? 'checked="checked"' : '';
565                 ?>
566
567                 <li id="<?php echo $id; ?>" class="popular-category">
568                         <label class="selectit">
569                         <input id="in-<?php echo $id; ?>" type="checkbox" <?php echo $checked; ?> value="<?php echo (int) $category->term_id; ?>" />
570                                 <?php echo esc_html( apply_filters( 'the_category', $category->name ) ); ?>
571                         </label>
572                 </li>
573
574                 <?php
575         }
576         return $popular_ids;
577 }
578
579 /**
580  * {@internal Missing Short Description}}
581  *
582  * @since unknown
583  * @deprecated Use {@link wp_link_category_checklist()}
584  * @see wp_link_category_checklist()
585  *
586  * @param unknown_type $default
587  */
588 function dropdown_link_categories( $default = 0 ) {
589         global $link_id;
590
591         wp_link_category_checklist($link_id);
592 }
593
594 /**
595  * {@internal Missing Short Description}}
596  *
597  * @since unknown
598  *
599  * @param unknown_type $link_id
600  */
601 function wp_link_category_checklist( $link_id = 0 ) {
602         $default = 1;
603
604         if ( $link_id ) {
605                 $checked_categories = wp_get_link_cats($link_id);
606
607                 if ( count( $checked_categories ) == 0 ) {
608                         // No selected categories, strange
609                         $checked_categories[] = $default;
610                 }
611         } else {
612                 $checked_categories[] = $default;
613         }
614
615         $categories = get_terms('link_category', 'orderby=count&hide_empty=0');
616
617         if ( empty($categories) )
618                 return;
619
620         foreach ( $categories as $category ) {
621                 $cat_id = $category->term_id;
622                 $name = esc_html( apply_filters('the_category', $category->name));
623                 $checked = in_array( $cat_id, $checked_categories );
624                 echo '<li id="link-category-', $cat_id, '"><label for="in-link-category-', $cat_id, '" class="selectit"><input value="', $cat_id, '" type="checkbox" name="link_category[]" id="in-link-category-', $cat_id, '"', ($checked ? ' checked="checked"' : "" ), '/> ', $name, "</label></li>";
625         }
626 }
627
628 // Tag stuff
629
630 // Returns a single tag row (see tag_rows below)
631 // Note: this is also used in admin-ajax.php!
632 /**
633  * {@internal Missing Short Description}}
634  *
635  * @since unknown
636  *
637  * @param unknown_type $tag
638  * @param unknown_type $class
639  * @return unknown
640  */
641 function _tag_row( $tag, $class = '', $taxonomy = 'post_tag' ) {
642                 $count = number_format_i18n( $tag->count );
643                 $tagsel = ($taxonomy == 'post_tag' ? 'tag' : $taxonomy);
644                 $count = ( $count > 0 ) ? "<a href='edit.php?$tagsel=$tag->slug'>$count</a>" : $count;
645
646                 $name = apply_filters( 'term_name', $tag->name );
647                 $qe_data = get_term($tag->term_id, $taxonomy, object, 'edit');
648                 $edit_link = "edit-tags.php?action=edit&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id";
649                 $out = '';
650                 $out .= '<tr id="tag-' . $tag->term_id . '"' . $class . '>';
651                 $columns = get_column_headers('edit-tags');
652                 $hidden = get_hidden_columns('edit-tags');
653                 foreach ( $columns as $column_name => $column_display_name ) {
654                         $class = "class=\"$column_name column-$column_name\"";
655
656                         $style = '';
657                         if ( in_array($column_name, $hidden) )
658                                 $style = ' style="display:none;"';
659
660                         $attributes = "$class$style";
661
662                         switch ($column_name) {
663                                 case 'cb':
664                                         $out .= '<th scope="row" class="check-column"> <input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" /></th>';
665                                         break;
666                                 case 'name':
667                                         $out .= '<td ' . $attributes . '><strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $name)) . '">' . $name . '</a></strong><br />';
668                                         $actions = array();
669                                         $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
670                                         $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
671                                         $actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url("edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id) . "'>" . __('Delete') . "</a>";
672                                         $actions = apply_filters('tag_row_actions', $actions, $tag);
673                                         $action_count = count($actions);
674                                         $i = 0;
675                                         $out .= '<div class="row-actions">';
676                                         foreach ( $actions as $action => $link ) {
677                                                 ++$i;
678                                                 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
679                                                 $out .= "<span class='$action'>$link$sep</span>";
680                                         }
681                                         $out .= '</div>';
682                                         $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
683                                         $out .= '<div class="name">' . $qe_data->name . '</div>';
684                                         $out .= '<div class="slug">' . apply_filters('editable_slug', $qe_data->slug) . '</div></div></td>';
685                                         break;
686                                 case 'description':
687                                         $out .= "<td $attributes>$tag->description</td>";
688                                         break;
689                                 case 'slug':
690                                         $out .= "<td $attributes>" . apply_filters('editable_slug', $tag->slug) . "</td>";
691                                         break;
692                                 case 'posts':
693                                         $attributes = 'class="posts column-posts num"' . $style;
694                                         $out .= "<td $attributes>$count</td>";
695                                         break;
696                                 default:
697                                         $out .= "<td $attributes>";
698                                         $out .= apply_filters("manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id);
699                                         $out .= "</td>";
700                         }
701                 }
702
703                 $out .= '</tr>';
704
705                 return $out;
706 }
707
708 // Outputs appropriate rows for the Nth page of the Tag Management screen,
709 // assuming M tags displayed at a time on the page
710 // Returns the number of tags displayed
711 /**
712  * {@internal Missing Short Description}}
713  *
714  * @since unknown
715  *
716  * @param unknown_type $page
717  * @param unknown_type $pagesize
718  * @param unknown_type $searchterms
719  * @return unknown
720  */
721 function tag_rows( $page = 1, $pagesize = 20, $searchterms = '', $taxonomy = 'post_tag' ) {
722
723         // Get a page worth of tags
724         $start = ($page - 1) * $pagesize;
725
726         $args = array('offset' => $start, 'number' => $pagesize, 'hide_empty' => 0);
727
728         if ( !empty( $searchterms ) ) {
729                 $args['search'] = $searchterms;
730         }
731
732         $tags = get_terms( $taxonomy, $args );
733
734         // convert it to table rows
735         $out = '';
736         $count = 0;
737         foreach( $tags as $tag )
738                 $out .= _tag_row( $tag, ++$count % 2 ? ' class="alternate"' : '', $taxonomy );
739
740         // filter and send to screen
741         echo $out;
742         return $count;
743 }
744
745 // define the columns to display, the syntax is 'internal name' => 'display name'
746 /**
747  * {@internal Missing Short Description}}
748  *
749  * @since unknown
750  *
751  * @return unknown
752  */
753 function wp_manage_posts_columns() {
754         $posts_columns = array();
755         $posts_columns['cb'] = '<input type="checkbox" />';
756         /* translators: manage posts column name */
757         $posts_columns['title'] = _x('Post', 'column name');
758         $posts_columns['author'] = __('Author');
759         $posts_columns['categories'] = __('Categories');
760         $posts_columns['tags'] = __('Tags');
761         $post_status = !empty($_REQUEST['post_status']) ? $_REQUEST['post_status'] : 'all';
762         if ( !in_array( $post_status, array('pending', 'draft', 'future') ) )
763                 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
764         $posts_columns['date'] = __('Date');
765         $posts_columns = apply_filters('manage_posts_columns', $posts_columns);
766
767         return $posts_columns;
768 }
769
770 // define the columns to display, the syntax is 'internal name' => 'display name'
771 /**
772  * {@internal Missing Short Description}}
773  *
774  * @since unknown
775  *
776  * @return unknown
777  */
778 function wp_manage_media_columns() {
779         $posts_columns = array();
780         $posts_columns['cb'] = '<input type="checkbox" />';
781         $posts_columns['icon'] = '';
782         /* translators: column name */
783         $posts_columns['media'] = _x('File', 'column name');
784         $posts_columns['author'] = __('Author');
785         //$posts_columns['tags'] = _x('Tags', 'column name');
786         /* translators: column name */
787         $posts_columns['parent'] = _x('Attached to', 'column name');
788         $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
789         //$posts_columns['comments'] = __('Comments');
790         /* translators: column name */
791         $posts_columns['date'] = _x('Date', 'column name');
792         $posts_columns = apply_filters('manage_media_columns', $posts_columns);
793
794         return $posts_columns;
795 }
796
797 /**
798  * {@internal Missing Short Description}}
799  *
800  * @since unknown
801  *
802  * @return unknown
803  */
804 function wp_manage_pages_columns() {
805         $posts_columns = array();
806         $posts_columns['cb'] = '<input type="checkbox" />';
807         $posts_columns['title'] = __('Title');
808         $posts_columns['author'] = __('Author');
809         $post_status = !empty($_REQUEST['post_status']) ? $_REQUEST['post_status'] : 'all';
810         if ( !in_array( $post_status, array('pending', 'draft', 'future') ) )
811                 $posts_columns['comments'] = '<div class="vers"><img alt="" src="images/comment-grey-bubble.png" /></div>';
812         $posts_columns['date'] = __('Date');
813         $posts_columns = apply_filters('manage_pages_columns', $posts_columns);
814
815         return $posts_columns;
816 }
817
818 /**
819  * {@internal Missing Short Description}}
820  *
821  * @since unknown
822  *
823  * @param unknown_type $page
824  * @return unknown
825  */
826 function get_column_headers($page) {
827         global $_wp_column_headers;
828
829         if ( !isset($_wp_column_headers) )
830                 $_wp_column_headers = array();
831
832         // Store in static to avoid running filters on each call
833         if ( isset($_wp_column_headers[$page]) )
834                 return $_wp_column_headers[$page];
835
836         switch ($page) {
837                 case 'edit':
838                          $_wp_column_headers[$page] = wp_manage_posts_columns();
839                          break;
840                 case 'edit-pages':
841                         $_wp_column_headers[$page] = wp_manage_pages_columns();
842                         break;
843                 case 'edit-comments':
844                         $_wp_column_headers[$page] = array(
845                                 'cb' => '<input type="checkbox" />',
846                                 'author' => __('Author'),
847                                 /* translators: column name */
848                                 'comment' => _x('Comment', 'column name'),
849                                 //'date' => __('Submitted'),
850                                 'response' => __('In Response To')
851                         );
852
853                         break;
854                 case 'link-manager':
855                         $_wp_column_headers[$page] = array(
856                                 'cb' => '<input type="checkbox" />',
857                                 'name' => __('Name'),
858                                 'url' => __('URL'),
859                                 'categories' => __('Categories'),
860                                 'rel' => __('Relationship'),
861                                 'visible' => __('Visible'),
862                                 'rating' => __('Rating')
863                         );
864
865                         break;
866                 case 'upload':
867                         $_wp_column_headers[$page] = wp_manage_media_columns();
868                         break;
869                 case 'categories':
870                         $_wp_column_headers[$page] = array(
871                                 'cb' => '<input type="checkbox" />',
872                                 'name' => __('Name'),
873                                 'description' => __('Description'),
874                                 'slug' => __('Slug'),
875                                 'posts' => __('Posts')
876                         );
877
878                         break;
879                 case 'edit-link-categories':
880                         $_wp_column_headers[$page] = array(
881                                 'cb' => '<input type="checkbox" />',
882                                 'name' => __('Name'),
883                                 'description' => __('Description'),
884                                 'slug' => __('Slug'),
885                                 'links' => __('Links')
886                         );
887
888                         break;
889                 case 'edit-tags':
890                         $_wp_column_headers[$page] = array(
891                                 'cb' => '<input type="checkbox" />',
892                                 'name' => __('Name'),
893                                 'description' => __('Description'),
894                                 'slug' => __('Slug'),
895                                 'posts' => __('Posts')
896                         );
897
898                         break;
899                 case 'users':
900                         $_wp_column_headers[$page] = array(
901                                 'cb' => '<input type="checkbox" />',
902                                 'username' => __('Username'),
903                                 'name' => __('Name'),
904                                 'email' => __('E-mail'),
905                                 'role' => __('Role'),
906                                 'posts' => __('Posts')
907                         );
908                         break;
909                 default :
910                         $_wp_column_headers[$page] = array();
911         }
912
913         $_wp_column_headers[$page] = apply_filters('manage_' . $page . '_columns', $_wp_column_headers[$page]);
914         return $_wp_column_headers[$page];
915 }
916
917 /**
918  * {@internal Missing Short Description}}
919  *
920  * @since unknown
921  *
922  * @param unknown_type $type
923  * @param unknown_type $id
924  */
925 function print_column_headers( $type, $id = true ) {
926         $type = str_replace('.php', '', $type);
927         $columns = get_column_headers( $type );
928         $hidden = get_hidden_columns($type);
929         $styles = array();
930 //      $styles['tag']['posts'] = 'width: 90px;';
931 //      $styles['link-category']['links'] = 'width: 90px;';
932 //      $styles['category']['posts'] = 'width: 90px;';
933 //      $styles['link']['visible'] = 'text-align: center;';
934
935         foreach ( $columns as $column_key => $column_display_name ) {
936                 $class = ' class="manage-column';
937
938                 $class .= " column-$column_key";
939
940                 if ( 'cb' == $column_key )
941                         $class .= ' check-column';
942                 elseif ( in_array($column_key, array('posts', 'comments', 'links')) )
943                         $class .= ' num';
944
945                 $class .= '"';
946
947                 $style = '';
948                 if ( in_array($column_key, $hidden) )
949                         $style = 'display:none;';
950
951                 if ( isset($styles[$type]) && isset($styles[$type][$column_key]) )
952                         $style .= ' ' . $styles[$type][$column_key];
953                 $style = ' style="' . $style . '"';
954 ?>
955         <th scope="col" <?php echo $id ? "id=\"$column_key\"" : ""; echo $class; echo $style; ?>><?php echo $column_display_name; ?></th>
956 <?php }
957 }
958
959 /**
960  * Register column headers for a particular screen.  The header names will be listed in the Screen Options.
961  *
962  * @since 2.7.0
963  *
964  * @param string $screen The handle for the screen to add help to.  This is usually the hook name returned by the add_*_page() functions.
965  * @param array $columns An array of columns with column IDs as the keys and translated column names as the values
966  * @see get_column_headers(), print_column_headers(), get_hidden_columns()
967  */
968 function register_column_headers($screen, $columns) {
969         global $_wp_column_headers;
970
971         if ( !isset($_wp_column_headers) )
972                 $_wp_column_headers = array();
973
974         $_wp_column_headers[$screen] = $columns;
975 }
976
977 /**
978  * {@internal Missing Short Description}}
979  *
980  * @since unknown
981  *
982  * @param unknown_type $page
983  */
984 function get_hidden_columns($page) {
985         $page = str_replace('.php', '', $page);
986         return (array) get_user_option( 'manage-' . $page . '-columns-hidden', 0, false );
987 }
988
989 /**
990  * {@internal Missing Short Description}}
991  *
992  * Outputs the quick edit and bulk edit table rows for posts and pages
993  *
994  * @since 2.7
995  *
996  * @param string $type 'post' or 'page'
997  */
998 function inline_edit_row( $type ) {
999         global $current_user, $mode;
1000
1001         $is_page = 'page' == $type;
1002         if ( $is_page ) {
1003                 $screen = 'edit-pages';
1004                 $post = get_default_page_to_edit();
1005         } else {
1006                 $screen = 'edit';
1007                 $post = get_default_post_to_edit();
1008         }
1009
1010         $columns = $is_page ? wp_manage_pages_columns() : wp_manage_posts_columns();
1011         $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($screen) ) );
1012         $col_count = count($columns) - count($hidden);
1013         $m = ( isset($mode) && 'excerpt' == $mode ) ? 'excerpt' : 'list';
1014         $can_publish = current_user_can("publish_{$type}s");
1015         $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true );
1016
1017 ?>
1018
1019 <form method="get" action=""><table style="display: none"><tbody id="inlineedit">
1020         <?php
1021         $bulk = 0;
1022         while ( $bulk < 2 ) { ?>
1023
1024         <tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="inline-edit-row inline-edit-row-<?php echo "$type ";
1025                 echo $bulk ? "bulk-edit-row bulk-edit-row-$type" : "quick-edit-row quick-edit-row-$type";
1026         ?>" style="display: none"><td colspan="<?php echo $col_count; ?>">
1027
1028         <fieldset class="inline-edit-col-left"><div class="inline-edit-col">
1029                 <h4><?php echo $bulk ? ( $is_page ? __( 'Bulk Edit Pages' ) : __( 'Bulk Edit Posts' ) ) : __( 'Quick Edit' ); ?></h4>
1030
1031
1032 <?php if ( $bulk ) : ?>
1033                 <div id="bulk-title-div">
1034                         <div id="bulk-titles"></div>
1035                 </div>
1036
1037 <?php else : // $bulk ?>
1038
1039                 <label>
1040                         <span class="title"><?php _e( 'Title' ); ?></span>
1041                         <span class="input-text-wrap"><input type="text" name="post_title" class="ptitle" value="" /></span>
1042                 </label>
1043
1044 <?php endif; // $bulk ?>
1045
1046
1047 <?php if ( !$bulk ) : ?>
1048
1049                 <label>
1050                         <span class="title"><?php _e( 'Slug' ); ?></span>
1051                         <span class="input-text-wrap"><input type="text" name="post_name" value="" /></span>
1052                 </label>
1053
1054                 <label><span class="title"><?php _e( 'Date' ); ?></span></label>
1055                 <div class="inline-edit-date">
1056                         <?php touch_time(1, 1, 4, 1); ?>
1057                 </div>
1058                 <br class="clear" />
1059
1060 <?php endif; // $bulk
1061
1062                 $authors = get_editable_user_ids( $current_user->id, true, $type ); // TODO: ROLE SYSTEM
1063                 $authors_dropdown = '';
1064                 if ( $authors && count( $authors ) > 1 ) :
1065                         $users_opt = array('include' => $authors, 'name' => 'post_author', 'class'=> 'authors', 'multi' => 1, 'echo' => 0);
1066                         if ( $bulk )
1067                                 $users_opt['show_option_none'] = __('- No Change -');
1068                         $authors_dropdown  = '<label>';
1069                         $authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
1070                         $authors_dropdown .= wp_dropdown_users( $users_opt );
1071                         $authors_dropdown .= '</label>';
1072
1073                 endif; // authors
1074 ?>
1075
1076 <?php if ( !$bulk ) : echo $authors_dropdown; ?>
1077
1078                 <div class="inline-edit-group">
1079                         <label class="alignleft">
1080                                 <span class="title"><?php _e( 'Password' ); ?></span>
1081                                 <span class="input-text-wrap"><input type="text" name="post_password" class="inline-edit-password-input" value="" /></span>
1082                         </label>
1083
1084                         <em style="margin:5px 10px 0 0" class="alignleft">
1085                                 <?php
1086                                 /* translators: Between password field and private checkbox on post quick edit interface */
1087                                 echo __( '&ndash;OR&ndash;' );
1088                                 ?>
1089                         </em>
1090                         <label class="alignleft inline-edit-private">
1091                                 <input type="checkbox" name="keep_private" value="private" />
1092                                 <span class="checkbox-title"><?php echo $is_page ? __('Private page') : __('Private post'); ?></span>
1093                         </label>
1094                 </div>
1095
1096 <?php endif; ?>
1097
1098         </div></fieldset>
1099
1100 <?php if ( !$is_page && !$bulk ) : ?>
1101
1102         <fieldset class="inline-edit-col-center inline-edit-categories"><div class="inline-edit-col">
1103                 <span class="title inline-edit-categories-label"><?php _e( 'Categories' ); ?>
1104                         <span class="catshow"><?php _e('[more]'); ?></span>
1105                         <span class="cathide" style="display:none;"><?php _e('[less]'); ?></span>
1106                 </span>
1107                 <ul class="cat-checklist">
1108                         <?php wp_category_checklist(); ?>
1109                 </ul>
1110         </div></fieldset>
1111
1112 <?php endif; // !$is_page && !$bulk ?>
1113
1114         <fieldset class="inline-edit-col-right"><div class="inline-edit-col">
1115
1116 <?php
1117         if ( $bulk )
1118                 echo $authors_dropdown;
1119 ?>
1120
1121 <?php if ( $is_page ) : ?>
1122
1123                 <label>
1124                         <span class="title"><?php _e( 'Parent' ); ?></span>
1125 <?php
1126         $dropdown_args = array('selected' => $post->post_parent, 'name' => 'post_parent', 'show_option_none' => __('Main Page (no parent)'), 'option_none_value' => 0, 'sort_column'=> 'menu_order, post_title');
1127         if ( $bulk )
1128                 $dropdown_args['show_option_no_change'] =  __('- No Change -');
1129         $dropdown_args = apply_filters('quick_edit_dropdown_pages_args', $dropdown_args);
1130         wp_dropdown_pages($dropdown_args);
1131 ?>
1132                 </label>
1133
1134 <?php   if ( !$bulk ) : ?>
1135
1136                 <label>
1137                         <span class="title"><?php _e( 'Order' ); ?></span>
1138                         <span class="input-text-wrap"><input type="text" name="menu_order" class="inline-edit-menu-order-input" value="<?php echo $post->menu_order ?>" /></span>
1139                 </label>
1140
1141 <?php   endif; // !$bulk ?>
1142
1143                 <label>
1144                         <span class="title"><?php _e( 'Template' ); ?></span>
1145                         <select name="page_template">
1146 <?php   if ( $bulk ) : ?>
1147                                 <option value="-1"><?php _e('- No Change -'); ?></option>
1148 <?php   endif; // $bulk ?>
1149                                 <option value="default"><?php _e( 'Default Template' ); ?></option>
1150                                 <?php page_template_dropdown() ?>
1151                         </select>
1152                 </label>
1153
1154 <?php elseif ( !$bulk ) : // $is_page ?>
1155
1156                 <label class="inline-edit-tags">
1157                         <span class="title"><?php _e( 'Tags' ); ?></span>
1158                         <textarea cols="22" rows="1" name="tags_input" class="tags_input"></textarea>
1159                 </label>
1160
1161 <?php endif; // $is_page  ?>
1162
1163 <?php if ( $bulk ) : ?>
1164
1165                 <div class="inline-edit-group">
1166                 <label class="alignleft">
1167                         <span class="title"><?php _e( 'Comments' ); ?></span>
1168                         <select name="comment_status">
1169                                 <option value=""><?php _e('- No Change -'); ?></option>
1170                                 <option value="open"><?php _e('Allow'); ?></option>
1171                                 <option value="closed"><?php _e('Do not allow'); ?></option>
1172                         </select>
1173                 </label>
1174
1175                 <label class="alignright">
1176                         <span class="title"><?php _e( 'Pings' ); ?></span>
1177                         <select name="ping_status">
1178                                 <option value=""><?php _e('- No Change -'); ?></option>
1179                                 <option value="open"><?php _e('Allow'); ?></option>
1180                                 <option value="closed"><?php _e('Do not allow'); ?></option>
1181                         </select>
1182                 </label>
1183                 </div>
1184
1185 <?php else : // $bulk ?>
1186
1187                 <div class="inline-edit-group">
1188                         <label class="alignleft">
1189                                 <input type="checkbox" name="comment_status" value="open" />
1190                                 <span class="checkbox-title"><?php _e( 'Allow Comments' ); ?></span>
1191                         </label>
1192
1193                         <label class="alignleft">
1194                                 <input type="checkbox" name="ping_status" value="open" />
1195                                 <span class="checkbox-title"><?php _e( 'Allow Pings' ); ?></span>
1196                         </label>
1197                 </div>
1198
1199 <?php endif; // $bulk ?>
1200
1201
1202                 <div class="inline-edit-group">
1203                         <label class="inline-edit-status alignleft">
1204                                 <span class="title"><?php _e( 'Status' ); ?></span>
1205                                 <select name="_status">
1206 <?php if ( $bulk ) : ?>
1207                                         <option value="-1"><?php _e('- No Change -'); ?></option>
1208 <?php endif; // $bulk ?>
1209                                 <?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?>
1210                                         <option value="publish"><?php _e( 'Published' ); ?></option>
1211                                         <option value="future"><?php _e( 'Scheduled' ); ?></option>
1212 <?php if ( $bulk ) : ?>
1213                                         <option value="private"><?php _e('Private') ?></option>
1214 <?php endif; // $bulk ?>
1215                                 <?php endif; ?>
1216                                         <option value="pending"><?php _e( 'Pending Review' ); ?></option>
1217                                         <option value="draft"><?php _e( 'Draft' ); ?></option>
1218                                 </select>
1219                         </label>
1220
1221 <?php if ( !$is_page && $can_publish && current_user_can( 'edit_others_posts' ) ) : ?>
1222
1223 <?php   if ( $bulk ) : ?>
1224
1225                         <label class="alignright">
1226                                 <span class="title"><?php _e( 'Sticky' ); ?></span>
1227                                 <select name="sticky">
1228                                         <option value="-1"><?php _e( '- No Change -' ); ?></option>
1229                                         <option value="sticky"><?php _e( 'Sticky' ); ?></option>
1230                                         <option value="unsticky"><?php _e( 'Not Sticky' ); ?></option>
1231                                 </select>
1232                         </label>
1233
1234 <?php   else : // $bulk ?>
1235
1236                         <label class="alignleft">
1237                                 <input type="checkbox" name="sticky" value="sticky" />
1238                                 <span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
1239                         </label>
1240
1241 <?php   endif; // $bulk ?>
1242
1243 <?php endif; // !$is_page && $can_publish && current_user_can( 'edit_others_posts' ) ?>
1244
1245                 </div>
1246
1247         </div></fieldset>
1248
1249 <?php
1250         foreach ( $columns as $column_name => $column_display_name ) {
1251                 if ( isset( $core_columns[$column_name] ) )
1252                         continue;
1253                 do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $type);
1254         }
1255 ?>
1256         <p class="submit inline-edit-save">
1257                 <a accesskey="c" href="#inline-edit" title="<?php _e('Cancel'); ?>" class="button-secondary cancel alignleft"><?php _e('Cancel'); ?></a>
1258                 <?php if ( ! $bulk ) {
1259                         wp_nonce_field( 'inlineeditnonce', '_inline_edit', false );
1260                         $update_text = ( $is_page ) ? __( 'Update Page' ) : __( 'Update Post' );
1261                         ?>
1262                         <a accesskey="s" href="#inline-edit" title="<?php _e('Update'); ?>" class="button-primary save alignright"><?php echo esc_attr( $update_text ); ?></a>
1263                         <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
1264                 <?php } else {
1265                         $update_text = ( $is_page ) ? __( 'Update Pages' ) : __( 'Update Posts' );
1266                 ?>
1267                         <input accesskey="s" class="button-primary alignright" type="submit" name="bulk_edit" value="<?php echo esc_attr( $update_text ); ?>" />
1268                 <?php } ?>
1269                 <input type="hidden" name="post_view" value="<?php echo $m; ?>" />
1270                 <br class="clear" />
1271         </p>
1272         </td></tr>
1273 <?php
1274         $bulk++;
1275         } ?>
1276         </tbody></table></form>
1277 <?php
1278 }
1279
1280 // adds hidden fields with the data for use in the inline editor for posts and pages
1281 /**
1282  * {@internal Missing Short Description}}
1283  *
1284  * @since unknown
1285  *
1286  * @param unknown_type $post
1287  */
1288 function get_inline_data($post) {
1289
1290         if ( ! current_user_can('edit_' . $post->post_type, $post->ID) )
1291                 return;
1292
1293         $title = esc_attr($post->post_title);
1294
1295         echo '
1296 <div class="hidden" id="inline_' . $post->ID . '">
1297         <div class="post_title">' . $title . '</div>
1298         <div class="post_name">' . apply_filters('editable_slug', $post->post_name) . '</div>
1299         <div class="post_author">' . $post->post_author . '</div>
1300         <div class="comment_status">' . $post->comment_status . '</div>
1301         <div class="ping_status">' . $post->ping_status . '</div>
1302         <div class="_status">' . $post->post_status . '</div>
1303         <div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div>
1304         <div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div>
1305         <div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div>
1306         <div class="hh">' . mysql2date( 'H', $post->post_date, false ) . '</div>
1307         <div class="mn">' . mysql2date( 'i', $post->post_date, false ) . '</div>
1308         <div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
1309         <div class="post_password">' . esc_html( $post->post_password ) . '</div>';
1310
1311         if( $post->post_type == 'page' )
1312                 echo '
1313         <div class="post_parent">' . $post->post_parent . '</div>
1314         <div class="page_template">' . esc_html( get_post_meta( $post->ID, '_wp_page_template', true ) ) . '</div>
1315         <div class="menu_order">' . $post->menu_order . '</div>';
1316
1317         if( $post->post_type == 'post' )
1318                 echo '
1319         <div class="tags_input">' . esc_html( str_replace( ',', ', ', get_tags_to_edit($post->ID) ) ) . '</div>
1320         <div class="post_category">' . implode( ',', wp_get_post_categories( $post->ID ) ) . '</div>
1321         <div class="sticky">' . (is_sticky($post->ID) ? 'sticky' : '') . '</div>';
1322
1323         echo '</div>';
1324 }
1325
1326 /**
1327  * {@internal Missing Short Description}}
1328  *
1329  * @since unknown
1330  *
1331  * @param unknown_type $posts
1332  */
1333 function post_rows( $posts = array() ) {
1334         global $wp_query, $post, $mode;
1335
1336         add_filter('the_title','esc_html');
1337
1338         // Create array of post IDs.
1339         $post_ids = array();
1340
1341         if ( empty($posts) )
1342                 $posts = &$wp_query->posts;
1343
1344         foreach ( $posts as $a_post )
1345                 $post_ids[] = $a_post->ID;
1346
1347         $comment_pending_count = get_pending_comments_num($post_ids);
1348         if ( empty($comment_pending_count) )
1349                 $comment_pending_count = array();
1350
1351         foreach ( $posts as $post ) {
1352                 if ( empty($comment_pending_count[$post->ID]) )
1353                         $comment_pending_count[$post->ID] = 0;
1354
1355                 _post_row($post, $comment_pending_count[$post->ID], $mode);
1356         }
1357 }
1358
1359 /**
1360  * {@internal Missing Short Description}}
1361  *
1362  * @since unknown
1363  *
1364  * @param unknown_type $a_post
1365  * @param unknown_type $pending_comments
1366  * @param unknown_type $mode
1367  */
1368 function _post_row($a_post, $pending_comments, $mode) {
1369         global $post, $current_user;
1370         static $rowclass;
1371
1372         $global_post = $post;
1373         $post = $a_post;
1374         setup_postdata($post);
1375
1376         $rowclass = 'alternate' == $rowclass ? '' : 'alternate';
1377         $post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' );
1378         $edit_link = get_edit_post_link( $post->ID );
1379         $title = _draft_or_post_title();
1380 ?>
1381         <tr id='post-<?php echo $post->ID; ?>' class='<?php echo trim( $rowclass . ' author-' . $post_owner . ' status-' . $post->post_status ); ?> iedit' valign="top">
1382 <?php
1383         $posts_columns = get_column_headers('edit');
1384         $hidden = get_hidden_columns('edit');
1385         foreach ( $posts_columns as $column_name=>$column_display_name ) {
1386                 $class = "class=\"$column_name column-$column_name\"";
1387
1388                 $style = '';
1389                 if ( in_array($column_name, $hidden) )
1390                         $style = ' style="display:none;"';
1391
1392                 $attributes = "$class$style";
1393
1394                 switch ($column_name) {
1395
1396                 case 'cb':
1397                 ?>
1398                 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="post[]" value="<?php the_ID(); ?>" /><?php } ?></th>
1399                 <?php
1400                 break;
1401
1402                 case 'date':
1403                         if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {
1404                                 $t_time = $h_time = __('Unpublished');
1405                                 $time_diff = 0;
1406                         } else {
1407                                 $t_time = get_the_time(__('Y/m/d g:i:s A'));
1408                                 $m_time = $post->post_date;
1409                                 $time = get_post_time('G', true, $post);
1410
1411                                 $time_diff = time() - $time;
1412
1413                                 if ( $time_diff > 0 && $time_diff < 24*60*60 )
1414                                         $h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
1415                                 else
1416                                         $h_time = mysql2date(__('Y/m/d'), $m_time);
1417                         }
1418
1419                         echo '<td ' . $attributes . '>';
1420                         if ( 'excerpt' == $mode )
1421                                 echo apply_filters('post_date_column_time', $t_time, $post, $column_name, $mode);
1422                         else
1423                                 echo '<abbr title="' . $t_time . '">' . apply_filters('post_date_column_time', $h_time, $post, $column_name, $mode) . '</abbr>';
1424                         echo '<br />';
1425                         if ( 'publish' == $post->post_status ) {
1426                                 _e('Published');
1427                         } elseif ( 'future' == $post->post_status ) {
1428                                 if ( $time_diff > 0 )
1429                                         echo '<strong class="attention">' . __('Missed schedule') . '</strong>';
1430                                 else
1431                                         _e('Scheduled');
1432                         } else {
1433                                 _e('Last Modified');
1434                         }
1435                         echo '</td>';
1436                 break;
1437
1438                 case 'title':
1439                         $attributes = 'class="post-title column-title"' . $style;
1440                 ?>
1441                 <td <?php echo $attributes ?>><strong><?php if ( current_user_can('edit_post', $post->ID) && $post->post_status != 'trash' ) { ?><a class="row-title" href="<?php echo $edit_link; ?>" title="<?php echo esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $title)); ?>"><?php echo $title ?></a><?php } else { echo $title; }; _post_states($post); ?></strong>
1442                 <?php
1443                         if ( 'excerpt' == $mode )
1444                                 the_excerpt();
1445
1446                         $actions = array();
1447                         if ( current_user_can('edit_post', $post->ID) && 'trash' != $post->post_status ) {
1448                                 $actions['edit'] = '<a href="' . get_edit_post_link($post->ID, true) . '" title="' . esc_attr(__('Edit this post')) . '">' . __('Edit') . '</a>';
1449                                 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline" title="' . esc_attr(__('Edit this post inline')) . '">' . __('Quick&nbsp;Edit') . '</a>';
1450                         }
1451                         if ( current_user_can('delete_post', $post->ID) ) {
1452                                 if ( 'trash' == $post->post_status )
1453                                         $actions['untrash'] = "<a title='" . esc_attr(__('Restore this post from the Trash')) . "' href='" . wp_nonce_url("post.php?action=untrash&amp;post=$post->ID", 'untrash-post_' . $post->ID) . "'>" . __('Restore') . "</a>";
1454                                 elseif ( EMPTY_TRASH_DAYS )
1455                                         $actions['trash'] = "<a class='submitdelete' title='" . esc_attr(__('Move this post to the Trash')) . "' href='" . get_delete_post_link($post->ID) . "'>" . __('Trash') . "</a>";
1456                                 if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS )
1457                                         $actions['delete'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this post permanently')) . "' href='" . wp_nonce_url("post.php?action=delete&amp;post=$post->ID", 'delete-post_' . $post->ID) . "'>" . __('Delete Permanently') . "</a>";
1458                         }
1459                         if ( in_array($post->post_status, array('pending', 'draft')) ) {
1460                                 if ( current_user_can('edit_post', $post->ID) )
1461                                         $actions['view'] = '<a href="' . get_permalink($post->ID) . '" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('Preview') . '</a>';
1462                         } elseif ( 'trash' != $post->post_status ) {
1463                                 $actions['view'] = '<a href="' . get_permalink($post->ID) . '" title="' . esc_attr(sprintf(__('View &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('View') . '</a>';
1464                         }
1465                         $actions = apply_filters('post_row_actions', $actions, $post);
1466                         $action_count = count($actions);
1467                         $i = 0;
1468                         echo '<div class="row-actions">';
1469                         foreach ( $actions as $action => $link ) {
1470                                 ++$i;
1471                                 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1472                                 echo "<span class='$action'>$link$sep</span>";
1473                         }
1474                         echo '</div>';
1475
1476                         get_inline_data($post);
1477                 ?>
1478                 </td>
1479                 <?php
1480                 break;
1481
1482                 case 'categories':
1483                 ?>
1484                 <td <?php echo $attributes ?>><?php
1485                         $categories = get_the_category();
1486                         if ( !empty( $categories ) ) {
1487                                 $out = array();
1488                                 foreach ( $categories as $c )
1489                                         $out[] = "<a href='edit.php?category_name=$c->slug'> " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . "</a>";
1490                                         echo join( ', ', $out );
1491                         } else {
1492                                 _e('Uncategorized');
1493                         }
1494                 ?></td>
1495                 <?php
1496                 break;
1497
1498                 case 'tags':
1499                 ?>
1500                 <td <?php echo $attributes ?>><?php
1501                         $tags = get_the_tags($post->ID);
1502                         if ( !empty( $tags ) ) {
1503                                 $out = array();
1504                                 foreach ( $tags as $c )
1505                                         $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . "</a>";
1506                                 echo join( ', ', $out );
1507                         } else {
1508                                 _e('No Tags');
1509                         }
1510                 ?></td>
1511                 <?php
1512                 break;
1513
1514                 case 'comments':
1515                 ?>
1516                 <td <?php echo $attributes ?>><div class="post-com-count-wrapper">
1517                 <?php
1518                         $pending_phrase = sprintf( __('%s pending'), number_format( $pending_comments ) );
1519                         if ( $pending_comments )
1520                                 echo '<strong>';
1521                                 comments_number("<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
1522                                 if ( $pending_comments )
1523                                 echo '</strong>';
1524                 ?>
1525                 </div></td>
1526                 <?php
1527                 break;
1528
1529                 case 'author':
1530                 ?>
1531                 <td <?php echo $attributes ?>><a href="edit.php?author=<?php the_author_meta('ID'); ?>"><?php the_author() ?></a></td>
1532                 <?php
1533                 break;
1534
1535                 case 'control_view':
1536                 ?>
1537                 <td><a href="<?php the_permalink(); ?>" rel="permalink" class="view"><?php _e('View'); ?></a></td>
1538                 <?php
1539                 break;
1540
1541                 case 'control_edit':
1542                 ?>
1543                 <td><?php if ( current_user_can('edit_post', $post->ID) ) { echo "<a href='$edit_link' class='edit'>" . __('Edit') . "</a>"; } ?></td>
1544                 <?php
1545                 break;
1546
1547                 case 'control_delete':
1548                 ?>
1549                 <td><?php if ( current_user_can('delete_post', $post->ID) ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $post->ID) . "' class='delete'>" . __('Delete') . "</a>"; } ?></td>
1550                 <?php
1551                 break;
1552
1553                 default:
1554                 ?>
1555                 <td <?php echo $attributes ?>><?php do_action('manage_posts_custom_column', $column_name, $post->ID); ?></td>
1556                 <?php
1557                 break;
1558         }
1559 }
1560 ?>
1561         </tr>
1562 <?php
1563         $post = $global_post;
1564 }
1565
1566 /*
1567  * display one row if the page doesn't have any children
1568  * otherwise, display the row and its children in subsequent rows
1569  */
1570 /**
1571  * {@internal Missing Short Description}}
1572  *
1573  * @since unknown
1574  *
1575  * @param unknown_type $page
1576  * @param unknown_type $level
1577  */
1578 function display_page_row( $page, $level = 0 ) {
1579         global $post;
1580         static $rowclass;
1581
1582         $post = $page;
1583         setup_postdata($page);
1584
1585         if ( 0 == $level && (int)$page->post_parent > 0 ) {
1586                 //sent level 0 by accident, by default, or because we don't know the actual level
1587                 $find_main_page = (int)$page->post_parent;
1588                 while ( $find_main_page > 0 ) {
1589                         $parent = get_page($find_main_page);
1590
1591                         if ( is_null($parent) )
1592                                 break;
1593
1594                         $level++;
1595                         $find_main_page = (int)$parent->post_parent;
1596
1597                         if ( !isset($parent_name) )
1598                                 $parent_name = $parent->post_title;
1599                 }
1600         }
1601
1602         $page->post_title = esc_html( $page->post_title );
1603         $pad = str_repeat( '&#8212; ', $level );
1604         $id = (int) $page->ID;
1605         $rowclass = 'alternate' == $rowclass ? '' : 'alternate';
1606         $posts_columns = get_column_headers('edit-pages');
1607         $hidden = get_hidden_columns('edit-pages');
1608         $title = _draft_or_post_title();
1609 ?>
1610 <tr id="page-<?php echo $id; ?>" class="<?php echo $rowclass; ?> iedit">
1611 <?php
1612
1613 foreach ($posts_columns as $column_name=>$column_display_name) {
1614         $class = "class=\"$column_name column-$column_name\"";
1615
1616         $style = '';
1617         if ( in_array($column_name, $hidden) )
1618                 $style = ' style="display:none;"';
1619
1620         $attributes = "$class$style";
1621
1622         switch ($column_name) {
1623
1624         case 'cb':
1625                 ?>
1626                 <th scope="row" class="check-column"><input type="checkbox" name="post[]" value="<?php the_ID(); ?>" /></th>
1627                 <?php
1628                 break;
1629         case 'date':
1630                 if ( '0000-00-00 00:00:00' == $page->post_date && 'date' == $column_name ) {
1631                         $t_time = $h_time = __('Unpublished');
1632                         $time_diff = 0;
1633                 } else {
1634                         $t_time = get_the_time(__('Y/m/d g:i:s A'));
1635                         $m_time = $page->post_date;
1636                         $time = get_post_time('G', true);
1637
1638                         $time_diff = time() - $time;
1639
1640                         if ( $time_diff > 0 && $time_diff < 24*60*60 )
1641                                 $h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
1642                         else
1643                                 $h_time = mysql2date(__('Y/m/d'), $m_time);
1644                 }
1645                 echo '<td ' . $attributes . '>';
1646                 echo '<abbr title="' . $t_time . '">' . apply_filters('post_date_column_time', $h_time, $page, $column_name, '') . '</abbr>';
1647                 echo '<br />';
1648                 if ( 'publish' == $page->post_status ) {
1649                         _e('Published');
1650                 } elseif ( 'future' == $page->post_status ) {
1651                         if ( $time_diff > 0 )
1652                                 echo '<strong class="attention">' . __('Missed schedule') . '</strong>';
1653                         else
1654                                 _e('Scheduled');
1655                 } else {
1656                         _e('Last Modified');
1657                 }
1658                 echo '</td>';
1659                 break;
1660         case 'title':
1661                 $attributes = 'class="post-title page-title column-title"' . $style;
1662                 $edit_link = get_edit_post_link( $page->ID );
1663                 ?>
1664                 <td <?php echo $attributes ?>><strong><?php if ( current_user_can('edit_page', $page->ID) && $post->post_status != 'trash' ) { ?><a class="row-title" href="<?php echo $edit_link; ?>" title="<?php echo esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $title)); ?>"><?php echo $pad; echo $title ?></a><?php } else { echo $pad; echo $title; }; _post_states($page); echo isset($parent_name) ? ' | ' . __('Parent Page: ') . esc_html($parent_name) : ''; ?></strong>
1665                 <?php
1666                 $actions = array();
1667                 if ( current_user_can('edit_page', $page->ID) && $post->post_status != 'trash' ) {
1668                         $actions['edit'] = '<a href="' . $edit_link . '" title="' . esc_attr(__('Edit this page')) . '">' . __('Edit') . '</a>';
1669                         $actions['inline'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
1670                 }
1671                 if ( current_user_can('delete_page', $page->ID) ) {
1672                         if ( $post->post_status == 'trash' )
1673                                 $actions['untrash'] = "<a title='" . esc_attr(__('Remove this page from the Trash')) . "' href='" . wp_nonce_url("page.php?action=untrash&amp;post=$page->ID", 'untrash-page_' . $page->ID) . "'>" . __('Restore') . "</a>";
1674                         elseif ( EMPTY_TRASH_DAYS )
1675                                 $actions['trash'] = "<a class='submitdelete' title='" . esc_attr(__('Move this page to the Trash')) . "' href='" . get_delete_post_link($page->ID) . "'>" . __('Trash') . "</a>";
1676                         if ( $post->post_status == 'trash' || !EMPTY_TRASH_DAYS )
1677                                 $actions['delete'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this page permanently')) . "' href='" . wp_nonce_url("page.php?action=delete&amp;post=$page->ID", 'delete-page_' . $page->ID) . "'>" . __('Delete Permanently') . "</a>";
1678                 }
1679                 if ( in_array($post->post_status, array('pending', 'draft')) ) {
1680                         if ( current_user_can('edit_page', $page->ID) )
1681                                 $actions['view'] = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('Preview') . '</a>';
1682                 } elseif ( $post->post_status != 'trash' ) {
1683                         $actions['view'] = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr(sprintf(__('View &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('View') . '</a>';
1684                 }
1685                 $actions = apply_filters('page_row_actions', $actions, $page);
1686                 $action_count = count($actions);
1687
1688                 $i = 0;
1689                 echo '<div class="row-actions">';
1690                 foreach ( $actions as $action => $link ) {
1691                         ++$i;
1692                         ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1693                         echo "<span class='$action'>$link$sep</span>";
1694                 }
1695                 echo '</div>';
1696
1697                 get_inline_data($post);
1698                 echo '</td>';
1699                 break;
1700
1701         case 'comments':
1702                 ?>
1703                 <td <?php echo $attributes ?>><div class="post-com-count-wrapper">
1704                 <?php
1705                 $left = get_pending_comments_num( $page->ID );
1706                 $pending_phrase = sprintf( __('%s pending'), number_format( $left ) );
1707                 if ( $left )
1708                         echo '<strong>';
1709                 comments_number("<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
1710                 if ( $left )
1711                         echo '</strong>';
1712                 ?>
1713                 </div></td>
1714                 <?php
1715                 break;
1716
1717         case 'author':
1718                 ?>
1719                 <td <?php echo $attributes ?>><a href="edit-pages.php?author=<?php the_author_meta('ID'); ?>"><?php the_author() ?></a></td>
1720                 <?php
1721                 break;
1722
1723         default:
1724                 ?>
1725                 <td <?php echo $attributes ?>><?php do_action('manage_pages_custom_column', $column_name, $id); ?></td>
1726                 <?php
1727                 break;
1728         }
1729 }
1730 ?>
1731
1732 </tr>
1733
1734 <?php
1735 }
1736
1737 /*
1738  * displays pages in hierarchical order with paging support
1739  */
1740 /**
1741  * {@internal Missing Short Description}}
1742  *
1743  * @since unknown
1744  *
1745  * @param unknown_type $pages
1746  * @param unknown_type $pagenum
1747  * @param unknown_type $per_page
1748  * @return unknown
1749  */
1750 function page_rows($pages, $pagenum = 1, $per_page = 20) {
1751         global $wpdb;
1752
1753         $level = 0;
1754
1755         if ( ! $pages ) {
1756                 $pages = get_pages( array('sort_column' => 'menu_order') );
1757
1758                 if ( ! $pages )
1759                         return false;
1760         }
1761
1762         /*
1763          * arrange pages into two parts: top level pages and children_pages
1764          * children_pages is two dimensional array, eg.
1765          * children_pages[10][] contains all sub-pages whose parent is 10.
1766          * It only takes O(N) to arrange this and it takes O(1) for subsequent lookup operations
1767          * If searching, ignore hierarchy and treat everything as top level
1768          */
1769         if ( empty($_GET['s']) ) {
1770
1771                 $top_level_pages = array();
1772                 $children_pages = array();
1773
1774                 foreach ( $pages as $page ) {
1775
1776                         // catch and repair bad pages
1777                         if ( $page->post_parent == $page->ID ) {
1778                                 $page->post_parent = 0;
1779                                 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_parent = '0' WHERE ID = %d", $page->ID) );
1780                                 clean_page_cache( $page->ID );
1781                         }
1782
1783                         if ( 0 == $page->post_parent )
1784                                 $top_level_pages[] = $page;
1785                         else
1786                                 $children_pages[ $page->post_parent ][] = $page;
1787                 }
1788
1789                 $pages = &$top_level_pages;
1790         }
1791
1792         $count = 0;
1793         $start = ($pagenum - 1) * $per_page;
1794         $end = $start + $per_page;
1795
1796         foreach ( $pages as $page ) {
1797                 if ( $count >= $end )
1798                         break;
1799
1800                 if ( $count >= $start )
1801                         echo "\t" . display_page_row( $page, $level );
1802
1803                 $count++;
1804
1805                 if ( isset($children_pages) )
1806                         _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
1807         }
1808
1809         // if it is the last pagenum and there are orphaned pages, display them with paging as well
1810         if ( isset($children_pages) && $count < $end ){
1811                 foreach( $children_pages as $orphans ){
1812                         foreach ( $orphans as $op ) {
1813                                 if ( $count >= $end )
1814                                         break;
1815                                 if ( $count >= $start )
1816                                         echo "\t" . display_page_row( $op, 0 );
1817                                 $count++;
1818                         }
1819                 }
1820         }
1821 }
1822
1823 /*
1824  * Given a top level page ID, display the nested hierarchy of sub-pages
1825  * together with paging support
1826  */
1827 /**
1828  * {@internal Missing Short Description}}
1829  *
1830  * @since unknown
1831  *
1832  * @param unknown_type $children_pages
1833  * @param unknown_type $count
1834  * @param unknown_type $parent
1835  * @param unknown_type $level
1836  * @param unknown_type $pagenum
1837  * @param unknown_type $per_page
1838  */
1839 function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
1840
1841         if ( ! isset( $children_pages[$parent] ) )
1842                 return;
1843
1844         $start = ($pagenum - 1) * $per_page;
1845         $end = $start + $per_page;
1846
1847         foreach ( $children_pages[$parent] as $page ) {
1848
1849                 if ( $count >= $end )
1850                         break;
1851
1852                 // If the page starts in a subtree, print the parents.
1853                 if ( $count == $start && $page->post_parent > 0 ) {
1854                         $my_parents = array();
1855                         $my_parent = $page->post_parent;
1856                         while ( $my_parent) {
1857                                 $my_parent = get_post($my_parent);
1858                                 $my_parents[] = $my_parent;
1859                                 if ( !$my_parent->post_parent )
1860                                         break;
1861                                 $my_parent = $my_parent->post_parent;
1862                         }
1863                         $num_parents = count($my_parents);
1864                         while( $my_parent = array_pop($my_parents) ) {
1865                                 echo "\t" . display_page_row( $my_parent, $level - $num_parents );
1866                                 $num_parents--;
1867                         }
1868                 }
1869
1870                 if ( $count >= $start )
1871                         echo "\t" . display_page_row( $page, $level );
1872
1873                 $count++;
1874
1875                 _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
1876         }
1877
1878         unset( $children_pages[$parent] ); //required in order to keep track of orphans
1879 }
1880
1881 /**
1882  * {@internal Missing Short Description}}
1883  *
1884  * @since unknown
1885  *
1886  * @param unknown_type $user_object
1887  * @param unknown_type $style
1888  * @param unknown_type $role
1889  * @return unknown
1890  */
1891 function user_row( $user_object, $style = '', $role = '' ) {
1892         global $wp_roles;
1893
1894         $current_user = wp_get_current_user();
1895
1896         if ( !( is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) )
1897                 $user_object = new WP_User( (int) $user_object );
1898         $user_object = sanitize_user_object($user_object, 'display');
1899         $email = $user_object->user_email;
1900         $url = $user_object->user_url;
1901         $short_url = str_replace( 'http://', '', $url );
1902         $short_url = str_replace( 'www.', '', $short_url );
1903         if ('/' == substr( $short_url, -1 ))
1904                 $short_url = substr( $short_url, 0, -1 );
1905         if ( strlen( $short_url ) > 35 )
1906                 $short_url = substr( $short_url, 0, 32 ).'...';
1907         $numposts = get_usernumposts( $user_object->ID );
1908         $checkbox = '';
1909         // Check if the user for this row is editable
1910         if ( current_user_can( 'edit_user', $user_object->ID ) ) {
1911                 // Set up the user editing link
1912                 // TODO: make profile/user-edit determination a seperate function
1913                 if ($current_user->ID == $user_object->ID) {
1914                         $edit_link = 'profile.php';
1915                 } else {
1916                         $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );
1917                 }
1918                 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";
1919
1920                 // Set up the hover actions for this user
1921                 $actions = array();
1922                 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
1923                 if ( $current_user->ID != $user_object->ID )
1924                         $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url("users.php?action=delete&amp;user=$user_object->ID", 'bulk-users') . "'>" . __('Delete') . "</a>";
1925                 $actions = apply_filters('user_row_actions', $actions, $user_object);
1926                 $action_count = count($actions);
1927                 $i = 0;
1928                 $edit .= '<div class="row-actions">';
1929                 foreach ( $actions as $action => $link ) {
1930                         ++$i;
1931                         ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1932                         $edit .= "<span class='$action'>$link$sep</span>";
1933                 }
1934                 $edit .= '</div>';
1935
1936                 // Set up the checkbox (because the user is editable, otherwise its empty)
1937                 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";
1938
1939         } else {
1940                 $edit = '<strong>' . $user_object->user_login . '</strong>';
1941         }
1942         $role_name = isset($wp_roles->role_names[$role]) ? translate_user_role($wp_roles->role_names[$role] ) : __('None');
1943         $r = "<tr id='user-$user_object->ID'$style>";
1944         $columns = get_column_headers('users');
1945         $hidden = get_hidden_columns('users');
1946         $avatar = get_avatar( $user_object->ID, 32 );
1947         foreach ( $columns as $column_name => $column_display_name ) {
1948                 $class = "class=\"$column_name column-$column_name\"";
1949
1950                 $style = '';
1951                 if ( in_array($column_name, $hidden) )
1952                         $style = ' style="display:none;"';
1953
1954                 $attributes = "$class$style";
1955
1956                 switch ($column_name) {
1957                         case 'cb':
1958                                 $r .= "<th scope='row' class='check-column'>$checkbox</th>";
1959                                 break;
1960                         case 'username':
1961                                 $r .= "<td $attributes>$avatar $edit</td>";
1962                                 break;
1963                         case 'name':
1964                                 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";
1965                                 break;
1966                         case 'email':
1967                                 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __('e-mail: %s' ), $email ) . "'>$email</a></td>";
1968                                 break;
1969                         case 'role':
1970                                 $r .= "<td $attributes>$role_name</td>";
1971                                 break;
1972                         case 'posts':
1973                                 $attributes = 'class="posts column-posts num"' . $style;
1974                                 $r .= "<td $attributes>";
1975                                 if ( $numposts > 0 ) {
1976                                         $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";
1977                                         $r .= $numposts;
1978                                         $r .= '</a>';
1979                                 } else {
1980                                         $r .= 0;
1981                                 }
1982                                 $r .= "</td>";
1983                                 break;
1984                         default:
1985                                 $r .= "<td $attributes>";
1986                                 $r .= apply_filters('manage_users_custom_column', '', $column_name, $user_object->ID);
1987                                 $r .= "</td>";
1988                 }
1989         }
1990         $r .= '</tr>';
1991
1992         return $r;
1993 }
1994
1995 /**
1996  * {@internal Missing Short Description}}
1997  *
1998  * @since unknown
1999  *
2000  * @param string $status Comment status (approved, spam, trash, etc)
2001  * @param string $s Term to search for
2002  * @param int $start Offset to start at for pagination
2003  * @param int $num Maximum number of comments to return
2004  * @param int $post Post ID or 0 to return all comments
2005  * @param string $type Comment type (comment, trackback, pingback, etc)
2006  * @return array [0] contains the comments and [1] contains the total number of comments that match (ignoring $start and $num)
2007  */
2008 function _wp_get_comment_list( $status = '', $s = false, $start, $num, $post = 0, $type = '' ) {
2009         global $wpdb;
2010
2011         $start = abs( (int) $start );
2012         $num = (int) $num;
2013         $post = (int) $post;
2014         $count = wp_count_comments();
2015         $index = '';
2016
2017         if ( 'moderated' == $status ) {
2018                 $approved = "c.comment_approved = '0'";
2019                 $total = $count->moderated;
2020         } elseif ( 'approved' == $status ) {
2021                 $approved = "c.comment_approved = '1'";
2022                 $total = $count->approved;
2023         } elseif ( 'spam' == $status ) {
2024                 $approved = "c.comment_approved = 'spam'";
2025                 $total = $count->spam;
2026         } elseif ( 'trash' == $status ) {
2027                 $approved = "c.comment_approved = 'trash'";
2028                 $total = $count->trash;
2029         } else {
2030                 $approved = "( c.comment_approved = '0' OR c.comment_approved = '1' )";
2031                 $total = $count->moderated + $count->approved;
2032                 $index = 'USE INDEX (c.comment_date_gmt)';
2033         }
2034
2035         if ( $post ) {
2036                 $total = '';
2037                 $post = " AND c.comment_post_ID = '$post'";
2038         } else {
2039                 $post = '';
2040         }
2041
2042         $orderby = "ORDER BY c.comment_date_gmt DESC LIMIT $start, $num";
2043
2044         if ( 'comment' == $type )
2045                 $typesql = "AND c.comment_type = ''";
2046         elseif ( 'pings' == $type )
2047                 $typesql = "AND ( c.comment_type = 'pingback' OR c.comment_type = 'trackback' )";
2048         elseif ( 'all' == $type )
2049                 $typesql = '';
2050         elseif ( !empty($type) )
2051                 $typesql = $wpdb->prepare("AND c.comment_type = %s", $type);
2052         else
2053                 $typesql = '';
2054
2055         if ( !empty($type) )
2056                 $total = '';
2057
2058         $query = "FROM $wpdb->comments c LEFT JOIN $wpdb->posts p ON c.comment_post_ID = p.ID WHERE p.post_status != 'trash' ";
2059         if ( $s ) {
2060                 $total = '';
2061                 $s = $wpdb->escape($s);
2062                 $query .= "AND
2063                         (c.comment_author LIKE '%$s%' OR
2064                         c.comment_author_email LIKE '%$s%' OR
2065                         c.comment_author_url LIKE ('%$s%') OR
2066                         c.comment_author_IP LIKE ('%$s%') OR
2067                         c.comment_content LIKE ('%$s%') ) AND
2068                         $approved
2069                         $typesql";
2070         } else {
2071                 $query .= "AND $approved $post $typesql";
2072         }
2073
2074         $comments = $wpdb->get_results("SELECT * $query $orderby");
2075         if ( '' === $total )
2076                 $total = $wpdb->get_var("SELECT COUNT(c.comment_ID) $query");
2077
2078         update_comment_cache($comments);
2079
2080         return array($comments, $total);
2081 }
2082
2083 /**
2084  * {@internal Missing Short Description}}
2085  *
2086  * @since unknown
2087  *
2088  * @param unknown_type $comment_id
2089  * @param unknown_type $mode
2090  * @param unknown_type $comment_status
2091  * @param unknown_type $checkbox
2092  */
2093 function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, $from_ajax = false ) {
2094         global $comment, $post, $_comment_pending_count;
2095         $comment = get_comment( $comment_id );
2096         $post = get_post($comment->comment_post_ID);
2097         $the_comment_status = wp_get_comment_status($comment->comment_ID);
2098         $user_can = current_user_can('edit_post', $post->ID);
2099
2100         $author_url = get_comment_author_url();
2101         if ( 'http://' == $author_url )
2102                 $author_url = '';
2103         $author_url_display = preg_replace('|http://(www\.)?|i', '', $author_url);
2104         if ( strlen($author_url_display) > 50 )
2105                 $author_url_display = substr($author_url_display, 0, 49) . '...';
2106
2107         $ptime = date('G', strtotime( $comment->comment_date ) );
2108         if ( ( abs(time() - $ptime) ) < 86400 )
2109                 $ptime = sprintf( __('%s ago'), human_time_diff( $ptime ) );
2110         else
2111                 $ptime = mysql2date(__('Y/m/d \a\t g:i A'), $comment->comment_date );
2112
2113         if ( $user_can ) {
2114                 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
2115                 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );
2116
2117                 $comment_url = esc_url(get_comment_link($comment->comment_ID));
2118                 $approve_url = esc_url( "comment.php?action=approvecomment&p=$post->ID&c=$comment->comment_ID&$approve_nonce" );
2119                 $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$post->ID&c=$comment->comment_ID&$approve_nonce" );
2120                 $spam_url = esc_url( "comment.php?action=spamcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" );
2121                 $unspam_url = esc_url( "comment.php?action=unspamcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" );
2122                 $trash_url = esc_url( "comment.php?action=trashcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" );
2123                 $untrash_url = esc_url( "comment.php?action=untrashcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" );
2124                 $delete_url = esc_url( "comment.php?action=deletecomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" );
2125         }
2126
2127         echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";
2128         $columns = get_column_headers('edit-comments');
2129         $hidden = get_hidden_columns('edit-comments');
2130         foreach ( $columns as $column_name => $column_display_name ) {
2131                 $class = "class=\"$column_name column-$column_name\"";
2132
2133                 $style = '';
2134                 if ( in_array($column_name, $hidden) )
2135                         $style = ' style="display:none;"';
2136
2137                 $attributes = "$class$style";
2138
2139                 switch ($column_name) {
2140                         case 'cb':
2141                                 if ( !$checkbox ) break;
2142                                 echo '<th scope="row" class="check-column">';
2143                                 if ( $user_can ) echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";
2144                                 echo '</th>';
2145                                 break;
2146                         case 'comment':
2147                                 echo "<td $attributes>";
2148                                 echo '<div id="submitted-on">';
2149                                 printf(__('Submitted on <a href="%1$s">%2$s at %3$s</a>'), $comment_url, get_comment_date(__('Y/m/d')), get_comment_date(__('g:ia')));
2150                                 echo '</div>';
2151                                 comment_text();
2152                                 if ( $user_can ) { ?>
2153                                 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">
2154                                 <textarea class="comment" rows="1" cols="1"><?php echo htmlspecialchars( apply_filters('comment_edit_pre', $comment->comment_content), ENT_QUOTES ); ?></textarea>
2155                                 <div class="author-email"><?php echo esc_attr( $comment->comment_author_email ); ?></div>
2156                                 <div class="author"><?php echo esc_attr( $comment->comment_author ); ?></div>
2157                                 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>
2158                                 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>
2159                                 </div>
2160                                 <?php
2161                                 }
2162
2163                                 if ( $user_can ) {
2164                                         // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash
2165                                         $actions = array(
2166                                                 'approve' => '', 'unapprove' => '',
2167                                                 'reply' => '',
2168                                                 'quickedit' => '',
2169                                                 'edit' => '',
2170                                                 'spam' => '', 'unspam' => '',
2171                                                 'trash' => '', 'untrash' => '', 'delete' => ''
2172                                         );
2173
2174                                         if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments
2175                                                 if ( 'approved' == $the_comment_status )
2176                                                         $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=unapproved vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
2177                                                 else if ( 'unapproved' == $the_comment_status )
2178                                                         $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=approved vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
2179                                         } else {
2180                                                 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
2181                                                 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
2182                                         }
2183
2184                                         if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
2185                                                 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';
2186                                         } elseif ( 'spam' == $the_comment_status ) {
2187                                                 $actions['unspam'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1 vim-z vim-destructive'>" . __( 'Not Spam' ) . '</a>';
2188                                         } elseif ( 'trash' == $the_comment_status ) {
2189                                                 $actions['untrash'] = "<a href='$untrash_url' class='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1 vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';
2190                                         }
2191
2192                                         if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {
2193                                                 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::delete=1 delete vim-d vim-destructive'>" . __('Delete Permanently') . '</a>';
2194                                         } else {
2195                                                 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x('Trash', 'verb') . '</a>';
2196                                         }
2197
2198                                         if ( 'trash' != $the_comment_status ) {
2199                                                 $actions['edit'] = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . esc_attr__('Edit comment') . "'>". __('Edit') . '</a>';
2200                                                 $actions['quickedit'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\');return false;" class="vim-q" title="'.esc_attr__('Quick Edit').'" href="#">' . __('Quick&nbsp;Edit') . '</a>';
2201                                                 if ( 'spam' != $the_comment_status )
2202                                                         $actions['reply'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$post->ID.'\');return false;" class="vim-r" title="'.esc_attr__('Reply to this comment').'" href="#">' . __('Reply') . '</a>';
2203                                         }
2204
2205                                         $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment );
2206
2207                                         $i = 0;
2208                                         echo '<div class="row-actions">';
2209                                         foreach ( $actions as $action => $link ) {
2210                                                 ++$i;
2211                                                 ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
2212
2213                                                 // Reply and quickedit need a hide-if-no-js span when not added with ajax
2214                                                 if ( ('reply' == $action || 'quickedit' == $action) && ! $from_ajax )
2215                                                         $action .= ' hide-if-no-js';
2216                                                 elseif ( ($action == 'untrash' && $the_comment_status == 'trash') || ($action == 'unspam' && $the_comment_status == 'spam') ) {
2217                                                         if ('1' == get_comment_meta($comment_id, '_wp_trash_meta_status', true))
2218                                                                 $action .= ' approve';
2219                                                         else
2220                                                                 $action .= ' unapprove';
2221                                                 }
2222
2223                                                 echo "<span class='$action'>$sep$link</span>";
2224                                         }
2225                                         echo '</div>';
2226                                 }
2227
2228                                 echo '</td>';
2229                                 break;
2230                         case 'author':
2231                                 echo "<td $attributes><strong>"; comment_author(); echo '</strong><br />';
2232                                 if ( !empty($author_url) )
2233                                         echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";
2234                                 if ( $user_can ) {
2235                                         if ( !empty($comment->comment_author_email) ) {
2236                                                 comment_author_email_link();
2237                                                 echo '<br />';
2238                                         }
2239                                         echo '<a href="edit-comments.php?s=';
2240                                         comment_author_IP();
2241                                         echo '&amp;mode=detail';
2242                                         if ( 'spam' == $comment_status )
2243                                                 echo '&amp;comment_status=spam';
2244                                         echo '">';
2245                                         comment_author_IP();
2246                                         echo '</a>';
2247                                 } //current_user_can
2248                                 echo '</td>';
2249                                 break;
2250                         case 'date':
2251                                 echo "<td $attributes>" . get_comment_date(__('Y/m/d \a\t g:ia')) . '</td>';
2252                                 break;
2253                         case 'response':
2254                                 if ( 'single' !== $mode ) {
2255                                         if ( isset( $_comment_pending_count[$post->ID] ) ) {
2256                                                 $pending_comments = absint( $_comment_pending_count[$post->ID] );
2257                                         } else {
2258                                                 $_comment_pending_count_temp = (array) get_pending_comments_num( array( $post->ID ) );
2259                                                 $pending_comments = $_comment_pending_count[$post->ID] = $_comment_pending_count_temp[$post->ID];
2260                                         }
2261                                         if ( $user_can ) {
2262                                                 $post_link = "<a href='" . get_edit_post_link($post->ID) . "'>";
2263                                                 $post_link .= get_the_title($post->ID) . '</a>';
2264                                         } else {
2265                                                 $post_link = get_the_title($post->ID);
2266                                         }
2267                                         echo "<td $attributes>\n";
2268                                         echo '<div class="response-links"><span class="post-com-count-wrapper">';
2269                                         echo $post_link . '<br />';
2270                                         $pending_phrase = esc_attr(sprintf( __('%s pending'), number_format( $pending_comments ) ));
2271                                         if ( $pending_comments )
2272                                                 echo '<strong>';
2273                                         comments_number("<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
2274                                         if ( $pending_comments )
2275                                                 echo '</strong>';
2276                                         echo '</span> ';
2277                                         echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";
2278                                         echo '</div>';
2279                                         if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array(80, 60), true ) ) )
2280                                                 echo $thumb;
2281                                         echo '</td>';
2282                                 }
2283                                 break;
2284                         default:
2285                                 echo "<td $attributes>\n";
2286                                 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );
2287                                 echo "</td>\n";
2288                                 break;
2289                 }
2290         }
2291         echo "</tr>\n";
2292 }
2293
2294 /**
2295  * {@internal Missing Short Description}}
2296  *
2297  * @since unknown
2298  *
2299  * @param unknown_type $position
2300  * @param unknown_type $checkbox
2301  * @param unknown_type $mode
2302  */
2303 function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', $table_row = true) {
2304         global $current_user;
2305
2306         // allow plugin to replace the popup content
2307         $content = apply_filters( 'wp_comment_reply', '', array('position' => $position, 'checkbox' => $checkbox, 'mode' => $mode) );
2308
2309         if ( ! empty($content) ) {
2310                 echo $content;
2311                 return;
2312         }
2313
2314         $columns = get_column_headers('edit-comments');
2315         $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns('edit-comments') ) );
2316         $col_count = count($columns) - count($hidden);
2317
2318 ?>
2319 <form method="get" action="">
2320 <?php if ( $table_row ) : ?>
2321 <table style="display:none;"><tbody id="com-reply"><tr id="replyrow" style="display:none;"><td colspan="<?php echo $col_count; ?>">
2322 <?php else : ?>
2323 <div id="com-reply" style="display:none;"><div id="replyrow" style="display:none;">
2324 <?php endif; ?>
2325         <div id="replyhead" style="display:none;"><?php _e('Reply to Comment'); ?></div>
2326
2327         <div id="edithead" style="display:none;">
2328                 <div class="inside">
2329                 <label for="author"><?php _e('Name') ?></label>
2330                 <input type="text" name="newcomment_author" size="50" value="" tabindex="101" id="author" />
2331                 </div>
2332
2333                 <div class="inside">
2334                 <label for="author-email"><?php _e('E-mail') ?></label>
2335                 <input type="text" name="newcomment_author_email" size="50" value="" tabindex="102" id="author-email" />
2336                 </div>
2337
2338                 <div class="inside">
2339                 <label for="author-url"><?php _e('URL') ?></label>
2340                 <input type="text" id="author-url" name="newcomment_author_url" size="103" value="" tabindex="103" />
2341                 </div>
2342                 <div style="clear:both;"></div>
2343         </div>
2344
2345         <div id="replycontainer"><textarea rows="8" cols="40" name="replycontent" tabindex="104" id="replycontent"></textarea></div>
2346
2347         <p id="replysubmit" class="submit">
2348         <a href="#comments-form" class="cancel button-secondary alignleft" tabindex="106"><?php _e('Cancel'); ?></a>
2349         <a href="#comments-form" class="save button-primary alignright" tabindex="104">
2350         <span id="savebtn" style="display:none;"><?php _e('Update Comment'); ?></span>
2351         <span id="replybtn" style="display:none;"><?php _e('Submit Reply'); ?></span></a>
2352         <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
2353         <span class="error" style="display:none;"></span>
2354         <br class="clear" />
2355         </p>
2356
2357         <input type="hidden" name="user_ID" id="user_ID" value="<?php echo $current_user->ID; ?>" />
2358         <input type="hidden" name="action" id="action" value="" />
2359         <input type="hidden" name="comment_ID" id="comment_ID" value="" />
2360         <input type="hidden" name="comment_post_ID" id="comment_post_ID" value="" />
2361         <input type="hidden" name="status" id="status" value="" />
2362         <input type="hidden" name="position" id="position" value="<?php echo $position; ?>" />
2363         <input type="hidden" name="checkbox" id="checkbox" value="<?php echo $checkbox ? 1 : 0; ?>" />
2364         <input type="hidden" name="mode" id="mode" value="<?php echo esc_attr($mode); ?>" />
2365         <?php wp_nonce_field( 'replyto-comment', '_ajax_nonce', false ); ?>
2366         <?php wp_comment_form_unfiltered_html_nonce(); ?>
2367 <?php if ( $table_row ) : ?>
2368 </td></tr></tbody></table>
2369 <?php else : ?>
2370 </div></div>
2371 <?php endif; ?>
2372 </form>
2373 <?php
2374 }
2375
2376 /**
2377  * Output 'undo move to trash' text for comments
2378  *
2379  * @since 2.9.0
2380  */
2381 function wp_comment_trashnotice() {
2382 ?>
2383 <div class="hidden" id="trash-undo-holder">
2384         <div class="trash-undo-inside"><?php printf(__('Comment by %s moved to the trash.'), '<strong></strong>'); ?> <span class="undo untrash"><a href="#"><?php _e('Undo'); ?></a></span></div>
2385 </div>
2386 <div class="hidden" id="spam-undo-holder">
2387         <div class="spam-undo-inside"><?php printf(__('Comment by %s marked as spam.'), '<strong></strong>'); ?> <span class="undo unspam"><a href="#"><?php _e('Undo'); ?></a></span></div>
2388 </div>
2389 <?php
2390 }
2391
2392 /**
2393  * {@internal Missing Short Description}}
2394  *
2395  * @since unknown
2396  *
2397  * @param unknown_type $currentcat
2398  * @param unknown_type $currentparent
2399  * @param unknown_type $parent
2400  * @param unknown_type $level
2401  * @param unknown_type $categories
2402  * @return unknown
2403  */
2404 function wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) {
2405         if (!$categories )
2406                 $categories = get_categories( array('hide_empty' => 0) );
2407
2408         if ( $categories ) {
2409                 foreach ( $categories as $category ) {
2410                         if ( $currentcat != $category->term_id && $parent == $category->parent) {
2411                                 $pad = str_repeat( '&#8211; ', $level );
2412                                 $category->name = esc_html( $category->name );
2413                                 echo "\n\t<option value='$category->term_id'";
2414                                 if ( $currentparent == $category->term_id )
2415                                         echo " selected='selected'";
2416                                 echo ">$pad$category->name</option>";
2417                                 wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories );
2418                         }
2419                 }
2420         } else {
2421                 return false;
2422         }
2423 }
2424
2425 /**
2426  * {@internal Missing Short Description}}
2427  *
2428  * @since unknown
2429  *
2430  * @param unknown_type $meta
2431  */
2432 function list_meta( $meta ) {
2433         // Exit if no meta
2434         if ( ! $meta ) {
2435                 echo '
2436 <table id="list-table" style="display: none;">
2437         <thead>
2438         <tr>
2439                 <th class="left">' . __( 'Name' ) . '</th>
2440                 <th>' . __( 'Value' ) . '</th>
2441         </tr>
2442         </thead>
2443         <tbody id="the-list" class="list:meta">
2444         <tr><td></td></tr>
2445         </tbody>
2446 </table>'; //TBODY needed for list-manipulation JS
2447                 return;
2448         }
2449         $count = 0;
2450 ?>
2451 <table id="list-table">
2452         <thead>
2453         <tr>
2454                 <th class="left"><?php _e( 'Name' ) ?></th>
2455                 <th><?php _e( 'Value' ) ?></th>
2456         </tr>
2457         </thead>
2458         <tbody id='the-list' class='list:meta'>
2459 <?php
2460         foreach ( $meta as $entry )
2461                 echo _list_meta_row( $entry, $count );
2462 ?>
2463         </tbody>
2464 </table>
2465 <?php
2466 }
2467
2468 /**
2469  * {@internal Missing Short Description}}
2470  *
2471  * @since unknown
2472  *
2473  * @param unknown_type $entry
2474  * @param unknown_type $count
2475  * @return unknown
2476  */
2477 function _list_meta_row( $entry, &$count ) {
2478         static $update_nonce = false;
2479         if ( !$update_nonce )
2480                 $update_nonce = wp_create_nonce( 'add-meta' );
2481
2482         $r = '';
2483         ++ $count;
2484         if ( $count % 2 )
2485                 $style = 'alternate';
2486         else
2487                 $style = '';
2488         if ('_' == $entry['meta_key'] { 0 } )
2489                 $style .= ' hidden';
2490
2491         if ( is_serialized( $entry['meta_value'] ) ) {
2492                 if ( is_serialized_string( $entry['meta_value'] ) ) {
2493                         // this is a serialized string, so we should display it
2494                         $entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );
2495                 } else {
2496                         // this is a serialized array/object so we should NOT display it
2497                         --$count;
2498                         return;
2499                 }
2500         }
2501
2502         $entry['meta_key'] = esc_attr($entry['meta_key']);
2503         $entry['meta_value'] = htmlspecialchars($entry['meta_value']); // using a <textarea />
2504         $entry['meta_id'] = (int) $entry['meta_id'];
2505
2506         $delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] );
2507
2508         $r .= "\n\t<tr id='meta-{$entry['meta_id']}' class='$style'>";
2509         $r .= "\n\t\t<td class='left'><label class='screen-reader-text' for='meta[{$entry['meta_id']}][key]'>" . __( 'Key' ) . "</label><input name='meta[{$entry['meta_id']}][key]' id='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' />";
2510
2511         $r .= "\n\t\t<div class='submit'><input name='deletemeta[{$entry['meta_id']}]' type='submit' ";
2512         $r .= "class='delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce deletemeta' tabindex='6' value='". esc_attr__( 'Delete' ) ."' />";
2513         $r .= "\n\t\t<input name='updatemeta' type='submit' tabindex='6' value='". esc_attr__( 'Update' ) ."' class='add:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$update_nonce updatemeta' /></div>";
2514         $r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false );
2515         $r .= "</td>";
2516
2517         $r .= "\n\t\t<td><label class='screen-reader-text' for='meta[{$entry['meta_id']}][value]'>" . __( 'Value' ) . "</label><textarea name='meta[{$entry['meta_id']}][value]' id='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>\n\t</tr>";
2518         return $r;
2519 }
2520
2521 /**
2522  * {@internal Missing Short Description}}
2523  *
2524  * @since unknown
2525  */
2526 function meta_form() {
2527         global $wpdb;
2528         $limit = (int) apply_filters( 'postmeta_form_limit', 30 );
2529         $keys = $wpdb->get_col( "
2530                 SELECT meta_key
2531                 FROM $wpdb->postmeta
2532                 GROUP BY meta_key
2533                 HAVING meta_key NOT LIKE '\_%'
2534                 ORDER BY LOWER(meta_key)
2535                 LIMIT $limit" );
2536         if ( $keys )
2537                 natcasesort($keys);
2538 ?>
2539 <p><strong><?php _e( 'Add new custom field:' ) ?></strong></p>
2540 <table id="newmeta">
2541 <thead>
2542 <tr>
2543 <th class="left"><label for="metakeyselect"><?php _e( 'Name' ) ?></label></th>
2544 <th><label for="metavalue"><?php _e( 'Value' ) ?></label></th>
2545 </tr>
2546 </thead>
2547
2548 <tbody>
2549 <tr>
2550 <td id="newmetaleft" class="left">
2551 <?php if ( $keys ) { ?>
2552 <select id="metakeyselect" name="metakeyselect" tabindex="7">
2553 <option value="#NONE#"><?php _e( '- Select -' ); ?></option>
2554 <?php
2555
2556         foreach ( $keys as $key ) {
2557                 $key = esc_attr( $key );
2558                 echo "\n<option value='" . esc_attr($key) . "'>$key</option>";
2559         }
2560 ?>
2561 </select>
2562 <input class="hide-if-js" type="text" id="metakeyinput" name="metakeyinput" tabindex="7" value="" />
2563 <a href="#postcustomstuff" class="hide-if-no-js" onclick="jQuery('#metakeyinput, #metakeyselect, #enternew, #cancelnew').toggle();return false;">
2564 <span id="enternew"><?php _e('Enter new'); ?></span>
2565 <span id="cancelnew" class="hidden"><?php _e('Cancel'); ?></span></a>
2566 <?php } else { ?>
2567 <input type="text" id="metakeyinput" name="metakeyinput" tabindex="7" value="" />
2568 <?php } ?>
2569 </td>
2570 <td><textarea id="metavalue" name="metavalue" rows="2" cols="25" tabindex="8"></textarea></td>
2571 </tr>
2572
2573 <tr><td colspan="2" class="submit">
2574 <input type="submit" id="addmetasub" name="addmeta" class="add:the-list:newmeta" tabindex="9" value="<?php esc_attr_e( 'Add Custom Field' ) ?>" />
2575 <?php wp_nonce_field( 'add-meta', '_ajax_nonce', false ); ?>
2576 </td></tr>
2577 </tbody>
2578 </table>
2579 <?php
2580
2581 }
2582
2583 /**
2584  * {@internal Missing Short Description}}
2585  *
2586  * @since unknown
2587  *
2588  * @param unknown_type $edit
2589  * @param unknown_type $for_post
2590  * @param unknown_type $tab_index
2591  * @param unknown_type $multi
2592  */
2593 function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) {
2594         global $wp_locale, $post, $comment;
2595
2596         if ( $for_post )
2597                 $edit = ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ) ? false : true;
2598
2599         $tab_index_attribute = '';
2600         if ( (int) $tab_index > 0 )
2601                 $tab_index_attribute = " tabindex=\"$tab_index\"";
2602
2603         // echo '<label for="timestamp" style="display: block;"><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp"'.$tab_index_attribute.' /> '.__( 'Edit timestamp' ).'</label><br />';
2604
2605         $time_adj = time() + (get_option( 'gmt_offset' ) * 3600 );
2606         $post_date = ($for_post) ? $post->post_date : $comment->comment_date;
2607         $jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );
2608         $mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );
2609         $aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );
2610         $hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj );
2611         $mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj );
2612         $ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj );
2613
2614         $cur_jj = gmdate( 'd', $time_adj );
2615         $cur_mm = gmdate( 'm', $time_adj );
2616         $cur_aa = gmdate( 'Y', $time_adj );
2617         $cur_hh = gmdate( 'H', $time_adj );
2618         $cur_mn = gmdate( 'i', $time_adj );
2619
2620         $month = "<select " . ( $multi ? '' : 'id="mm" ' ) . "name=\"mm\"$tab_index_attribute>\n";
2621         for ( $i = 1; $i < 13; $i = $i +1 ) {
2622                 $month .= "\t\t\t" . '<option value="' . zeroise($i, 2) . '"';
2623                 if ( $i == $mm )
2624                         $month .= ' selected="selected"';
2625                 $month .= '>' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) ) . "</option>\n";
2626         }
2627         $month .= '</select>';
2628
2629         $day = '<input type="text" ' . ( $multi ? '' : 'id="jj" ' ) . 'name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2630         $year = '<input type="text" ' . ( $multi ? '' : 'id="aa" ' ) . 'name="aa" value="' . $aa . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" />';
2631         $hour = '<input type="text" ' . ( $multi ? '' : 'id="hh" ' ) . 'name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2632         $minute = '<input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2633
2634         echo '<div class="timestamp-wrap">';
2635         /* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */
2636         printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute);
2637
2638         echo '</div><input type="hidden" id="ss" name="ss" value="' . $ss . '" />';
2639
2640         if ( $multi ) return;
2641
2642         echo "\n\n";
2643         foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit ) {
2644                 echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $$timeunit . '" />' . "\n";
2645                 $cur_timeunit = 'cur_' . $timeunit;
2646                 echo '<input type="hidden" id="'. $cur_timeunit . '" name="'. $cur_timeunit . '" value="' . $$cur_timeunit . '" />' . "\n";
2647         }
2648 ?>
2649
2650 <p>
2651 <a href="#edit_timestamp" class="save-timestamp hide-if-no-js button"><?php _e('OK'); ?></a>
2652 <a href="#edit_timestamp" class="cancel-timestamp hide-if-no-js"><?php _e('Cancel'); ?></a>
2653 </p>
2654 <?php
2655 }
2656
2657 /**
2658  * {@internal Missing Short Description}}
2659  *
2660  * @since unknown
2661  *
2662  * @param unknown_type $default
2663  */
2664 function page_template_dropdown( $default = '' ) {
2665         $templates = get_page_templates();
2666         ksort( $templates );
2667         foreach (array_keys( $templates ) as $template )
2668                 : if ( $default == $templates[$template] )
2669                         $selected = " selected='selected'";
2670                 else
2671                         $selected = '';
2672         echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
2673         endforeach;
2674 }
2675
2676 /**
2677  * {@internal Missing Short Description}}
2678  *
2679  * @since unknown
2680  *
2681  * @param unknown_type $default
2682  * @param unknown_type $parent
2683  * @param unknown_type $level
2684  * @return unknown
2685  */
2686 function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) {
2687         global $wpdb, $post_ID;
2688         $items = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' ORDER BY menu_order", $parent) );
2689
2690         if ( $items ) {
2691                 foreach ( $items as $item ) {
2692                         // A page cannot be its own parent.
2693                         if (!empty ( $post_ID ) ) {
2694                                 if ( $item->ID == $post_ID ) {
2695                                         continue;
2696                                 }
2697                         }
2698                         $pad = str_repeat( '&nbsp;', $level * 3 );
2699                         if ( $item->ID == $default)
2700                                 $current = ' selected="selected"';
2701                         else
2702                                 $current = '';
2703
2704                         echo "\n\t<option class='level-$level' value='$item->ID'$current>$pad " . esc_html($item->post_title) . "</option>";
2705                         parent_dropdown( $default, $item->ID, $level +1 );
2706                 }
2707         } else {
2708                 return false;
2709         }
2710 }
2711
2712 /**
2713  * {@internal Missing Short Description}}
2714  *
2715  * @since unknown
2716  */
2717 function browse_happy() {
2718         $getit = __( 'WordPress recommends a better browser' );
2719         echo '
2720                 <div id="bh"><a href="http://browsehappy.com/" title="'.$getit.'"><img src="images/browse-happy.gif" alt="Browse Happy" /></a></div>
2721 ';
2722 }
2723
2724 /**
2725  * {@internal Missing Short Description}}
2726  *
2727  * @since unknown
2728  *
2729  * @param unknown_type $id
2730  * @return unknown
2731  */
2732 function the_attachment_links( $id = false ) {
2733         $id = (int) $id;
2734         $post = & get_post( $id );
2735
2736         if ( $post->post_type != 'attachment' )
2737                 return false;
2738
2739         $icon = get_attachment_icon( $post->ID );
2740         $attachment_data = wp_get_attachment_metadata( $id );
2741         $thumb = isset( $attachment_data['thumb'] );
2742 ?>
2743 <form id="the-attachment-links">
2744 <table>
2745         <col />
2746         <col class="widefat" />
2747         <tr>
2748                 <th scope="row"><?php _e( 'URL' ) ?></th>
2749                 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><?php echo wp_get_attachment_url(); ?></textarea></td>
2750         </tr>
2751 <?php if ( $icon ) : ?>
2752         <tr>
2753                 <th scope="row"><?php $thumb ? _e( 'Thumbnail linked to file' ) : _e( 'Image linked to file' ); ?></th>
2754                 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>"><?php echo $icon ?></a></textarea></td>
2755         </tr>
2756         <tr>
2757                 <th scope="row"><?php $thumb ? _e( 'Thumbnail linked to page' ) : _e( 'Image linked to page' ); ?></th>
2758                 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID; ?>"><?php echo $icon ?></a></textarea></td>
2759         </tr>
2760 <?php else : ?>
2761         <tr>
2762                 <th scope="row"><?php _e( 'Link to file' ) ?></th>
2763                 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>" class="attachmentlink"><?php echo basename( wp_get_attachment_url() ); ?></a></textarea></td>
2764         </tr>
2765         <tr>
2766                 <th scope="row"><?php _e( 'Link to page' ) ?></th>
2767                 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
2768         </tr>
2769 <?php endif; ?>
2770 </table>
2771 </form>
2772 <?php
2773 }
2774
2775
2776 /**
2777  * Print out <option> html elements for role selectors based on $wp_roles
2778  *
2779  * @package WordPress
2780  * @subpackage Administration
2781  * @since 2.1
2782  *
2783  * @uses $wp_roles
2784  * @param string $default slug for the role that should be already selected
2785  */
2786 function wp_dropdown_roles( $selected = false ) {
2787         global $wp_roles;
2788         $p = '';
2789         $r = '';
2790
2791         $editable_roles = get_editable_roles();
2792
2793         foreach( $editable_roles as $role => $details ) {
2794                 $name = translate_user_role($details['name'] );
2795                 if ( $selected == $role ) // Make default first in list
2796                         $p = "\n\t<option selected='selected' value='" . esc_attr($role) . "'>$name</option>";
2797                 else
2798                         $r .= "\n\t<option value='" . esc_attr($role) . "'>$name</option>";
2799         }
2800         echo $p . $r;
2801 }
2802
2803 /**
2804  * {@internal Missing Short Description}}
2805  *
2806  * @since unknown
2807  *
2808  * @param unknown_type $size
2809  * @return unknown
2810  */
2811 function wp_convert_hr_to_bytes( $size ) {
2812         $size = strtolower($size);
2813         $bytes = (int) $size;
2814         if ( strpos($size, 'k') !== false )
2815                 $bytes = intval($size) * 1024;
2816         elseif ( strpos($size, 'm') !== false )
2817                 $bytes = intval($size) * 1024 * 1024;
2818         elseif ( strpos($size, 'g') !== false )
2819                 $bytes = intval($size) * 1024 * 1024 * 1024;
2820         return $bytes;
2821 }
2822
2823 /**
2824  * {@internal Missing Short Description}}
2825  *
2826  * @since unknown
2827  *
2828  * @param unknown_type $bytes
2829  * @return unknown
2830  */
2831 function wp_convert_bytes_to_hr( $bytes ) {
2832         $units = array( 0 => 'B', 1 => 'kB', 2 => 'MB', 3 => 'GB' );
2833         $log = log( $bytes, 1024 );
2834         $power = (int) $log;
2835         $size = pow(1024, $log - $power);
2836         return $size . $units[$power];
2837 }
2838
2839 /**
2840  * {@internal Missing Short Description}}
2841  *
2842  * @since unknown
2843  *
2844  * @return unknown
2845  */
2846 function wp_max_upload_size() {
2847         $u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );
2848         $p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );
2849         $bytes = apply_filters( 'upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes );
2850         return $bytes;
2851 }
2852
2853 /**
2854  * Outputs the form used by the importers to accept the data to be imported
2855  *
2856  * @since 2.0
2857  *
2858  * @param string $action The action attribute for the form.
2859  */
2860 function wp_import_upload_form( $action ) {
2861         $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
2862         $size = wp_convert_bytes_to_hr( $bytes );
2863         $upload_dir = wp_upload_dir();
2864         if ( ! empty( $upload_dir['error'] ) ) :
2865                 ?><div class="error"><p><?php _e('Before you can upload your import file, you will need to fix the following error:'); ?></p>
2866                 <p><strong><?php echo $upload_dir['error']; ?></strong></p></div><?php
2867         else :
2868 ?>
2869 <form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo esc_attr(wp_nonce_url($action, 'import-upload')); ?>">
2870 <p>
2871 <label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)
2872 <input type="file" id="upload" name="import" size="25" />
2873 <input type="hidden" name="action" value="save" />
2874 <input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
2875 </p>
2876 <p class="submit">
2877 <input type="submit" class="button" value="<?php esc_attr_e( 'Upload file and import' ); ?>" />
2878 </p>
2879 </form>
2880 <?php
2881         endif;
2882 }
2883
2884 /**
2885  * {@internal Missing Short Description}}
2886  *
2887  * @since unknown
2888  */
2889 function wp_remember_old_slug() {
2890         global $post;
2891         $name = esc_attr($post->post_name); // just in case
2892         if ( strlen($name) )
2893                 echo '<input type="hidden" id="wp-old-slug" name="wp-old-slug" value="' . $name . '" />';
2894 }
2895
2896 /**
2897  * Add a meta box to an edit form.
2898  *
2899  * @since 2.5.0
2900  *
2901  * @param string $id String for use in the 'id' attribute of tags.
2902  * @param string $title Title of the meta box.
2903  * @param string $callback Function that fills the box with the desired content. The function should echo its output.
2904  * @param string $page The type of edit page on which to show the box (post, page, link).
2905  * @param string $context The context within the page where the boxes should show ('normal', 'advanced').
2906  * @param string $priority The priority within the context where the boxes should show ('high', 'low').
2907  */
2908 function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args=null) {
2909         global $wp_meta_boxes;
2910
2911         if ( !isset($wp_meta_boxes) )
2912                 $wp_meta_boxes = array();
2913         if ( !isset($wp_meta_boxes[$page]) )
2914                 $wp_meta_boxes[$page] = array();
2915         if ( !isset($wp_meta_boxes[$page][$context]) )
2916                 $wp_meta_boxes[$page][$context] = array();
2917
2918         foreach ( array_keys($wp_meta_boxes[$page]) as $a_context ) {
2919         foreach ( array('high', 'core', 'default', 'low') as $a_priority ) {
2920                 if ( !isset($wp_meta_boxes[$page][$a_context][$a_priority][$id]) )
2921                         continue;
2922
2923                 // If a core box was previously added or removed by a plugin, don't add.
2924                 if ( 'core' == $priority ) {
2925                         // If core box previously deleted, don't add
2926                         if ( false === $wp_meta_boxes[$page][$a_context][$a_priority][$id] )
2927                                 return;
2928                         // If box was added with default priority, give it core priority to maintain sort order
2929                         if ( 'default' == $a_priority ) {
2930                                 $wp_meta_boxes[$page][$a_context]['core'][$id] = $wp_meta_boxes[$page][$a_context]['default'][$id];
2931                                 unset($wp_meta_boxes[$page][$a_context]['default'][$id]);
2932                         }
2933                         return;
2934                 }
2935                 // If no priority given and id already present, use existing priority
2936                 if ( empty($priority) ) {
2937                         $priority = $a_priority;
2938                 // else if we're adding to the sorted priortiy, we don't know the title or callback. Glab them from the previously added context/priority.
2939                 } elseif ( 'sorted' == $priority ) {
2940                         $title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title'];
2941                         $callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback'];
2942                         $callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args'];
2943                 }
2944                 // An id can be in only one priority and one context
2945                 if ( $priority != $a_priority || $context != $a_context )
2946                         unset($wp_meta_boxes[$page][$a_context][$a_priority][$id]);
2947         }
2948         }
2949
2950         if ( empty($priority) )
2951                 $priority = 'low';
2952
2953         if ( !isset($wp_meta_boxes[$page][$context][$priority]) )
2954                 $wp_meta_boxes[$page][$context][$priority] = array();
2955
2956         $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args);
2957 }
2958
2959 /**
2960  * {@internal Missing Short Description}}
2961  *
2962  * @since unknown
2963  *
2964  * @param unknown_type $page
2965  * @param unknown_type $context
2966  * @param unknown_type $object
2967  * @return int number of meta_boxes
2968  */
2969 function do_meta_boxes($page, $context, $object) {
2970         global $wp_meta_boxes;
2971         static $already_sorted = false;
2972
2973         //do_action('do_meta_boxes', $page, $context, $object);
2974
2975         $hidden = get_hidden_meta_boxes($page);
2976
2977         echo "<div id='$context-sortables' class='meta-box-sortables'>\n";
2978
2979         $i = 0;
2980         do {
2981                 // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose
2982                 if ( !$already_sorted && $sorted = get_user_option( "meta-box-order_$page", 0, false ) ) {
2983                         foreach ( $sorted as $box_context => $ids )
2984                                 foreach ( explode(',', $ids) as $id )
2985                                         if ( $id )
2986                                                 add_meta_box( $id, null, null, $page, $box_context, 'sorted' );
2987                 }
2988                 $already_sorted = true;
2989
2990                 if ( !isset($wp_meta_boxes) || !isset($wp_meta_boxes[$page]) || !isset($wp_meta_boxes[$page][$context]) )
2991                         break;
2992
2993                 foreach ( array('high', 'sorted', 'core', 'default', 'low') as $priority ) {
2994                         if ( isset($wp_meta_boxes[$page][$context][$priority]) ) {
2995                                 foreach ( (array) $wp_meta_boxes[$page][$context][$priority] as $box ) {
2996                                         if ( false == $box || ! $box['title'] )
2997                                                 continue;
2998                                         $i++;
2999                                         $style = '';
3000                                         if ( in_array($box['id'], $hidden) )
3001                                                 $style = 'style="display:none;"';
3002                                         echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes($box['id'], $page) . '" ' . $style . '>' . "\n";
3003                                         echo '<div class="handlediv" title="' . __('Click to toggle') . '"><br /></div>';
3004                                         echo "<h3 class='hndle'><span>{$box['title']}</span></h3>\n";
3005                                         echo '<div class="inside">' . "\n";
3006                                         call_user_func($box['callback'], $object, $box);
3007                                         echo "</div>\n";
3008                                         echo "</div>\n";
3009                                 }
3010                         }
3011                 }
3012         } while(0);
3013
3014         echo "</div>";
3015
3016         return $i;
3017
3018 }
3019
3020 /**
3021  * Remove a meta box from an edit form.
3022  *
3023  * @since 2.6.0
3024  *
3025  * @param string $id String for use in the 'id' attribute of tags.
3026  * @param string $page The type of edit page on which to show the box (post, page, link).
3027  * @param string $context The context within the page where the boxes should show ('normal', 'advanced').
3028  */
3029 function remove_meta_box($id, $page, $context) {
3030         global $wp_meta_boxes;
3031
3032         if ( !isset($wp_meta_boxes) )
3033                 $wp_meta_boxes = array();
3034         if ( !isset($wp_meta_boxes[$page]) )
3035                 $wp_meta_boxes[$page] = array();
3036         if ( !isset($wp_meta_boxes[$page][$context]) )
3037                 $wp_meta_boxes[$page][$context] = array();
3038
3039         foreach ( array('high', 'core', 'default', 'low') as $priority )
3040                 $wp_meta_boxes[$page][$context][$priority][$id] = false;
3041 }
3042
3043 /**
3044  * {@internal Missing Short Description}}
3045  *
3046  * @since unknown
3047  *
3048  * @param unknown_type $page
3049  */
3050 function meta_box_prefs($page) {
3051         global $wp_meta_boxes;
3052
3053         if ( empty($wp_meta_boxes[$page]) )
3054                 return;
3055
3056         $hidden = get_hidden_meta_boxes($page);
3057
3058         foreach ( array_keys($wp_meta_boxes[$page]) as $context ) {
3059                 foreach ( array_keys($wp_meta_boxes[$page][$context]) as $priority ) {
3060                         foreach ( $wp_meta_boxes[$page][$context][$priority] as $box ) {
3061                                 if ( false == $box || ! $box['title'] )
3062                                         continue;
3063                                 // Submit box cannot be hidden
3064                                 if ( 'submitdiv' == $box['id'] || 'linksubmitdiv' == $box['id'] )
3065                                         continue;
3066                                 $box_id = $box['id'];
3067                                 echo '<label for="' . $box_id . '-hide">';
3068                                 echo '<input class="hide-postbox-tog" name="' . $box_id . '-hide" type="checkbox" id="' . $box_id . '-hide" value="' . $box_id . '"' . (! in_array($box_id, $hidden) ? ' checked="checked"' : '') . ' />';
3069                                 echo "{$box['title']}</label>\n";
3070                         }
3071                 }
3072         }
3073 }
3074
3075 function get_hidden_meta_boxes($page) {
3076         $hidden = (array) get_user_option( "meta-box-hidden_$page", 0, false );
3077
3078         // Hide slug boxes by default
3079         if ( empty($hidden[0]) ) {
3080                 $hidden = array('slugdiv');
3081         }
3082
3083         return $hidden;
3084 }
3085
3086 /**
3087  * Add a new section to a settings page.
3088  *
3089  * @since 2.7.0
3090  *
3091  * @param string $id String for use in the 'id' attribute of tags.
3092  * @param string $title Title of the section.
3093  * @param string $callback Function that fills the section with the desired content. The function should echo its output.
3094  * @param string $page The type of settings page on which to show the section (general, reading, writing, ...).
3095  */
3096 function add_settings_section($id, $title, $callback, $page) {
3097         global $wp_settings_sections;
3098
3099         if ( !isset($wp_settings_sections) )
3100                 $wp_settings_sections = array();
3101         if ( !isset($wp_settings_sections[$page]) )
3102                 $wp_settings_sections[$page] = array();
3103         if ( !isset($wp_settings_sections[$page][$id]) )
3104                 $wp_settings_sections[$page][$id] = array();
3105
3106         $wp_settings_sections[$page][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback);
3107 }
3108
3109 /**
3110  * Add a new field to a settings page.
3111  *
3112  * @since 2.7.0
3113  *
3114  * @param string $id String for use in the 'id' attribute of tags.
3115  * @param string $title Title of the field.
3116  * @param string $callback Function that fills the field with the desired content. The function should echo its output.
3117  * @param string $page The type of settings page on which to show the field (general, reading, writing, ...).
3118  * @param string $section The section of the settingss page in which to show the box (default, ...).
3119  * @param array $args Additional arguments
3120  */
3121 function add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) {
3122         global $wp_settings_fields;
3123
3124         if ( !isset($wp_settings_fields) )
3125                 $wp_settings_fields = array();
3126         if ( !isset($wp_settings_fields[$page]) )
3127                 $wp_settings_fields[$page] = array();
3128         if ( !isset($wp_settings_fields[$page][$section]) )
3129                 $wp_settings_fields[$page][$section] = array();
3130
3131         $wp_settings_fields[$page][$section][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $args);
3132 }
3133
3134 /**
3135  * {@internal Missing Short Description}}
3136  *
3137  * @since unknown
3138  *
3139  * @param unknown_type $page
3140  */
3141 function do_settings_sections($page) {
3142         global $wp_settings_sections, $wp_settings_fields;
3143
3144         if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) )
3145                 return;
3146
3147         foreach ( (array) $wp_settings_sections[$page] as $section ) {
3148                 echo "<h3>{$section['title']}</h3>\n";
3149                 call_user_func($section['callback'], $section);
3150                 if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) )
3151                         continue;
3152                 echo '<table class="form-table">';
3153                 do_settings_fields($page, $section['id']);
3154                 echo '</table>';
3155         }
3156 }
3157
3158 /**
3159  * {@internal Missing Short Description}}
3160  *
3161  * @since unknown
3162  *
3163  * @param unknown_type $page
3164  * @param unknown_type $section
3165  */
3166 function do_settings_fields($page, $section) {
3167         global $wp_settings_fields;
3168
3169         if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section]) )
3170                 return;
3171
3172         foreach ( (array) $wp_settings_fields[$page][$section] as $field ) {
3173                 echo '<tr valign="top">';
3174                 if ( !empty($field['args']['label_for']) )
3175                         echo '<th scope="row"><label for="' . $field['args']['label_for'] . '">' . $field['title'] . '</label></th>';
3176                 else
3177                         echo '<th scope="row">' . $field['title'] . '</th>';
3178                 echo '<td>';
3179                 call_user_func($field['callback'], $field['args']);
3180                 echo '</td>';
3181                 echo '</tr>';
3182         }
3183 }
3184
3185 /**
3186  * {@internal Missing Short Description}}
3187  *
3188  * @since unknown
3189  *
3190  * @param unknown_type $page
3191  */
3192 function manage_columns_prefs($page) {
3193         $columns = get_column_headers($page);
3194
3195         $hidden = get_hidden_columns($page);
3196
3197         foreach ( $columns as $column => $title ) {
3198                 // Can't hide these
3199                 if ( 'cb' == $column || 'title' == $column || 'name' == $column || 'username' == $column || 'media' == $column || 'comment' == $column )
3200                         continue;
3201                 if ( empty($title) )
3202                         continue;
3203
3204                 if ( 'comments' == $column )
3205                         $title = __('Comments');
3206                 $id = "$column-hide";
3207                 echo '<label for="' . $id . '">';
3208                 echo '<input class="hide-column-tog" name="' . $id . '" type="checkbox" id="' . $id . '" value="' . $column . '"' . (! in_array($column, $hidden) ? ' checked="checked"' : '') . ' />';
3209                 echo "$title</label>\n";
3210         }
3211 }
3212
3213 /**
3214  * {@internal Missing Short Description}}
3215  *
3216  * @since unknown
3217  *
3218  * @param unknown_type $found_action
3219  */
3220 function find_posts_div($found_action = '') {
3221 ?>
3222         <div id="find-posts" class="find-box" style="display:none;">
3223                 <div id="find-posts-head" class="find-box-head"><?php _e('Find Posts or Pages'); ?></div>
3224                 <div class="find-box-inside">
3225                         <div class="find-box-search">
3226                                 <?php if ( $found_action ) { ?>
3227                                         <input type="hidden" name="found_action" value="<?php echo esc_attr($found_action); ?>" />
3228                                 <?php } ?>
3229
3230                                 <input type="hidden" name="affected" id="affected" value="" />
3231                                 <?php wp_nonce_field( 'find-posts', '_ajax_nonce', false ); ?>
3232                                 <label class="screen-reader-text" for="find-posts-input"><?php _e( 'Search' ); ?></label>
3233                                 <input type="text" id="find-posts-input" name="ps" value="" />
3234                                 <input type="button" onclick="findPosts.send();" value="<?php esc_attr_e( 'Search' ); ?>" class="button" /><br />
3235
3236                                 <input type="radio" name="find-posts-what" id="find-posts-posts" checked="checked" value="posts" />
3237                                 <label for="find-posts-posts"><?php _e( 'Posts' ); ?></label>
3238                                 <input type="radio" name="find-posts-what" id="find-posts-pages" value="pages" />
3239                                 <label for="find-posts-pages"><?php _e( 'Pages' ); ?></label>
3240                         </div>
3241                         <div id="find-posts-response"></div>
3242                 </div>
3243                 <div class="find-box-buttons">
3244                         <input type="button" class="button alignleft" onclick="findPosts.close();" value="<?php esc_attr_e('Close'); ?>" />
3245                         <input id="find-posts-submit" type="submit" class="button-primary alignright" value="<?php esc_attr_e('Select'); ?>" />
3246                 </div>
3247         </div>
3248 <?php
3249 }
3250
3251 /**
3252  * Display the post password.
3253  *
3254  * The password is passed through {@link esc_attr()} to ensure that it
3255  * is safe for placing in an html attribute.
3256  *
3257  * @uses attr
3258  * @since 2.7.0
3259  */
3260 function the_post_password() {
3261         global $post;
3262         if ( isset( $post->post_password ) ) echo esc_attr( $post->post_password );
3263 }
3264
3265 /**
3266  * {@internal Missing Short Description}}
3267  *
3268  * @since unknown
3269  */
3270 function favorite_actions( $screen = null ) {
3271         switch ( $screen ) {
3272                 case 'post-new.php':
3273                         $default_action = array('edit.php' => array(__('Edit Posts'), 'edit_posts'));
3274                         break;
3275                 case 'edit-pages.php':
3276                         $default_action = array('page-new.php' => array(__('New Page'), 'edit_pages'));
3277                         break;
3278                 case 'page-new.php':
3279                         $default_action = array('edit-pages.php' => array(__('Edit Pages'), 'edit_pages'));
3280                         break;
3281                 case 'upload.php':
3282                         $default_action = array('media-new.php' => array(__('New Media'), 'upload_files'));
3283                         break;
3284                 case 'media-new.php':
3285                         $default_action = array('upload.php' => array(__('Edit Media'), 'upload_files'));
3286                         break;
3287                 case 'link-manager.php':
3288                         $default_action = array('link-add.php' => array(__('New Link'), 'manage_links'));
3289                         break;
3290                 case 'link-add.php':
3291                         $default_action = array('link-manager.php' => array(__('Edit Links'), 'manage_links'));
3292                         break;
3293                 case 'users.php':
3294                         $default_action = array('user-new.php' => array(__('New User'), 'create_users'));
3295                         break;
3296                 case 'user-new.php':
3297                         $default_action = array('users.php' => array(__('Edit Users'), 'edit_users'));
3298                         break;
3299                 case 'plugins.php':
3300                         $default_action = array('plugin-install.php' => array(__('Install Plugins'), 'install_plugins'));
3301                         break;
3302                 case 'plugin-install.php':
3303                         $default_action = array('plugins.php' => array(__('Manage Plugins'), 'activate_plugins'));
3304                         break;
3305                 case 'themes.php':
3306                         $default_action = array('theme-install.php' => array(__('Install Themes'), 'install_themes'));
3307                         break;
3308                 case 'theme-install.php':
3309                         $default_action = array('themes.php' => array(__('Manage Themes'), 'switch_themes'));
3310                         break;
3311                 default:
3312                         $default_action = array('post-new.php' => array(__('New Post'), 'edit_posts'));
3313                         break;
3314         }
3315
3316         $actions = array(
3317                 'post-new.php' => array(__('New Post'), 'edit_posts'),
3318                 'edit.php?post_status=draft' => array(__('Drafts'), 'edit_posts'),
3319                 'page-new.php' => array(__('New Page'), 'edit_pages'),
3320                 'media-new.php' => array(__('Upload'), 'upload_files'),
3321                 'edit-comments.php' => array(__('Comments'), 'moderate_comments')
3322                 );
3323
3324         $default_key = array_keys($default_action);
3325         $default_key = $default_key[0];
3326         if ( isset($actions[$default_key]) )
3327                 unset($actions[$default_key]);
3328         $actions = array_merge($default_action, $actions);
3329         $actions = apply_filters('favorite_actions', $actions);
3330
3331         $allowed_actions = array();
3332         foreach ( $actions as $action => $data ) {
3333                 if ( current_user_can($data[1]) )
3334                         $allowed_actions[$action] = $data[0];
3335         }
3336
3337         if ( empty($allowed_actions) )
3338                 return;
3339
3340         $first = array_keys($allowed_actions);
3341         $first = $first[0];
3342         echo '<div id="favorite-actions">';
3343         echo '<div id="favorite-first"><a href="' . $first . '">' . $allowed_actions[$first] . '</a></div><div id="favorite-toggle"><br /></div>';
3344         echo '<div id="favorite-inside">';
3345
3346         array_shift($allowed_actions);
3347
3348         foreach ( $allowed_actions as $action => $label) {
3349                 echo "<div class='favorite-action'><a href='$action'>";
3350                 echo $label;
3351                 echo "</a></div>\n";
3352         }
3353         echo "</div></div>\n";
3354 }
3355
3356 /**
3357  * Get the post title.
3358  *
3359  * The post title is fetched and if it is blank then a default string is
3360  * returned.
3361  *
3362  * @since 2.7.0
3363  * @param int $id The post id. If not supplied the global $post is used.
3364  *
3365  */
3366 function _draft_or_post_title($post_id = 0)
3367 {
3368         $title = get_the_title($post_id);
3369         if ( empty($title) )
3370                 $title = __('(no title)');
3371         return $title;
3372 }
3373
3374 /**
3375  * Display the search query.
3376  *
3377  * A simple wrapper to display the "s" parameter in a GET URI. This function
3378  * should only be used when {@link the_search_query()} cannot.
3379  *
3380  * @uses attr
3381  * @since 2.7.0
3382  *
3383  */
3384 function _admin_search_query() {
3385         echo isset($_GET['s']) ? esc_attr( stripslashes( $_GET['s'] ) ) : '';
3386 }
3387
3388 /**
3389  * Generic Iframe header for use with Thickbox
3390  *
3391  * @since 2.7.0
3392  * @param string $title Title of the Iframe page.
3393  * @param bool $limit_styles Limit styles to colour-related styles only (unless others are enqueued).
3394  *
3395  */
3396 function iframe_header( $title = '', $limit_styles = false ) {
3397 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3398 <html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
3399 <head>
3400 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
3401 <title><?php bloginfo('name') ?> &rsaquo; <?php echo $title ?> &#8212; <?php _e('WordPress'); ?></title>
3402 <?php
3403 wp_enqueue_style( 'global' );
3404 if ( ! $limit_styles )
3405         wp_enqueue_style( 'wp-admin' );
3406 wp_enqueue_style( 'colors' );
3407 ?>
3408 <script type="text/javascript">
3409 //<![CDATA[
3410 addLoadEvent = function(func){if(typeof jQuery!="undefined")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
3411 function tb_close(){var win=window.dialogArguments||opener||parent||top;win.tb_remove();}
3412 //]]>
3413 </script>
3414 <?php
3415 do_action('admin_print_styles');
3416 do_action('admin_print_scripts');
3417 do_action('admin_head');
3418 ?>
3419 </head>
3420 <body<?php if ( isset($GLOBALS['body_id']) ) echo ' id="' . $GLOBALS['body_id'] . '"'; ?>>
3421 <?php
3422 }
3423
3424 /**
3425  * Generic Iframe footer for use with Thickbox
3426  *
3427  * @since 2.7.0
3428  *
3429  */
3430 function iframe_footer() {
3431         //We're going to hide any footer output on iframe pages, but run the hooks anyway since they output Javascript or other needed content. ?>
3432         <div class="hidden">
3433 <?php
3434         do_action('admin_footer', '');
3435         do_action('admin_print_footer_scripts'); ?>
3436         </div>
3437 <script type="text/javascript">if(typeof wpOnload=="function")wpOnload();</script>
3438 </body>
3439 </html>
3440 <?php
3441 }
3442
3443 function _post_states($post) {
3444         $post_states = array();
3445         if ( isset($_GET['post_status']) )
3446                 $post_status = $_GET['post_status'];
3447         else
3448                 $post_status = '';
3449
3450         if ( !empty($post->post_password) )
3451                 $post_states[] = __('Password protected');
3452         if ( 'private' == $post->post_status && 'private' != $post_status )
3453                 $post_states[] = __('Private');
3454         if ( 'draft' == $post->post_status && 'draft' != $post_status )
3455                 $post_states[] = __('Draft');
3456         if ( 'pending' == $post->post_status && 'pending' != $post_status )
3457                 /* translators: post state */
3458                 $post_states[] = _x('Pending', 'post state');
3459         if ( is_sticky($post->ID) )
3460                 $post_states[] = __('Sticky');
3461
3462         $post_states = apply_filters( 'display_post_states', $post_states );
3463
3464         if ( ! empty($post_states) ) {
3465                 $state_count = count($post_states);
3466                 $i = 0;
3467                 echo ' - ';
3468                 foreach ( $post_states as $state ) {
3469                         ++$i;
3470                         ( $i == $state_count ) ? $sep = '' : $sep = ', ';
3471                         echo "<span class='post-state'>$state$sep</span>";
3472                 }
3473         }
3474 }
3475
3476 function screen_meta($screen) {
3477         global $wp_meta_boxes, $_wp_contextual_help;
3478
3479         $screen = str_replace('.php', '', $screen);
3480         $screen = str_replace('-new', '', $screen);
3481         $screen = str_replace('-add', '', $screen);
3482         $screen = apply_filters('screen_meta_screen', $screen);
3483
3484         $column_screens = get_column_headers($screen);
3485         $meta_screens = array('index' => 'dashboard');
3486
3487         if ( isset($meta_screens[$screen]) )
3488                 $screen = $meta_screens[$screen];
3489         $show_screen = false;
3490         $show_on_screen = false;
3491         if ( !empty($wp_meta_boxes[$screen]) || !empty($column_screens) ) {
3492                 $show_screen = true;
3493                 $show_on_screen = true;
3494         }
3495
3496         $screen_options = screen_options($screen);
3497         if ( $screen_options )
3498                 $show_screen = true;
3499
3500         if ( !isset($_wp_contextual_help) )
3501                 $_wp_contextual_help = array();
3502
3503         $settings = '';
3504
3505         switch ( $screen ) {
3506                 case 'post':
3507                         if ( !isset($_wp_contextual_help['post']) ) {
3508                                 $help = drag_drop_help();
3509                                 $help .= '<p>' . __('<a href="http://codex.wordpress.org/Writing_Posts" target="_blank">Writing Posts</a>') . '</p>';
3510                                 $_wp_contextual_help['post'] = $help;
3511                         }
3512                         break;
3513                 case 'page':
3514                         if ( !isset($_wp_contextual_help['page']) ) {
3515                                 $help = drag_drop_help();
3516                                 $_wp_contextual_help['page'] = $help;
3517                         }
3518                         break;
3519                 case 'dashboard':
3520                         if ( !isset($_wp_contextual_help['dashboard']) ) {
3521                                 $help = '<p>' . __('The modules on this screen can be arranged in several columns. You can select the number of columns from the Screen Options tab.') . "</p>\n";
3522                                 $help .= drag_drop_help();
3523                                 $_wp_contextual_help['dashboard'] = $help;
3524                         }
3525                         break;
3526                 case 'link':
3527                         if ( !isset($_wp_contextual_help['link']) ) {
3528                                 $help = drag_drop_help();
3529                                 $_wp_contextual_help['link'] = $help;
3530                         }
3531                         break;
3532                 case 'options-general':
3533                         if ( !isset($_wp_contextual_help['options-general']) )
3534                                 $_wp_contextual_help['options-general'] = __('<a href="http://codex.wordpress.org/Settings_General_SubPanel" target="_blank">General Settings</a>');
3535                         break;
3536                 case 'theme-install':
3537                 case 'plugin-install':
3538                         if ( ( !isset($_GET['tab']) || 'dashboard' == $_GET['tab'] ) && !isset($_wp_contextual_help[$screen]) ) {
3539                                 $help = plugins_search_help();
3540                                 $_wp_contextual_help[$screen] = $help;
3541                         }
3542                         break;
3543                 case 'widgets':
3544                         if ( !isset($_wp_contextual_help['widgets']) ) {
3545                                 $help = widgets_help();
3546                                 $_wp_contextual_help['widgets'] = $help;
3547                         }
3548                         $settings = '<p><a id="access-on" href="widgets.php?widgets-access=on">' . __('Enable accessibility mode') . '</a><a id="access-off" href="widgets.php?widgets-access=off">' . __('Disable accessibility mode') . "</a></p>\n";
3549                         $show_screen = true;
3550                         break;
3551         }
3552 ?>
3553 <div id="screen-meta">
3554 <?php
3555         if ( $show_screen ) :
3556 ?>
3557 <div id="screen-options-wrap" class="hidden">
3558         <form id="adv-settings" action="" method="post">
3559 <?php if ( $show_on_screen ) : ?>
3560         <h5><?php _e('Show on screen') ?></h5>
3561         <div class="metabox-prefs">
3562 <?php
3563         if ( !meta_box_prefs($screen) && isset($column_screens) ) {
3564                 manage_columns_prefs($screen);
3565         }
3566 ?>
3567         <br class="clear" />
3568         </div>
3569 <?php endif; ?>
3570 <?php echo screen_layout($screen); ?>
3571 <?php echo $screen_options; ?>
3572 <?php echo $settings; ?>
3573 <div><?php wp_nonce_field( 'screen-options-nonce', 'screenoptionnonce', false ); ?></div>
3574 </form>
3575 </div>
3576
3577 <?php
3578         endif;
3579
3580         global $title;
3581
3582         $_wp_contextual_help = apply_filters('contextual_help_list', $_wp_contextual_help, $screen);
3583         ?>
3584         <div id="contextual-help-wrap" class="hidden">
3585         <?php
3586         $contextual_help = '';
3587         if ( isset($_wp_contextual_help[$screen]) ) {
3588                 if ( !empty($title) )
3589                         $contextual_help .= '<h5>' . sprintf(__('Get help with &#8220;%s&#8221;'), $title) . '</h5>';
3590                 else
3591                         $contextual_help .= '<h5>' . __('Get help with this page') . '</h5>';
3592                 $contextual_help .= '<div class="metabox-prefs">' . $_wp_contextual_help[$screen] . "</div>\n";
3593
3594                 $contextual_help .= '<h5>' . __('Other Help') . '</h5>';
3595         } else {
3596                 $contextual_help .= '<h5>' . __('Help') . '</h5>';
3597         }
3598
3599         $contextual_help .= '<div class="metabox-prefs">';
3600         $default_help = __('<a href="http://codex.wordpress.org/" target="_blank">Documentation</a>');
3601         $default_help .= '<br />';
3602         $default_help .= __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>');
3603         $contextual_help .= apply_filters('default_contextual_help', $default_help);
3604         $contextual_help .= "</div>\n";
3605         echo apply_filters('contextual_help', $contextual_help, $screen);
3606         ?>
3607         </div>
3608
3609 <div id="screen-meta-links">
3610 <div id="contextual-help-link-wrap" class="hide-if-no-js screen-meta-toggle">
3611 <a href="#contextual-help" id="contextual-help-link" class="show-settings"><?php _e('Help') ?></a>
3612 </div>
3613 <?php if ( $show_screen ) { ?>
3614 <div id="screen-options-link-wrap" class="hide-if-no-js screen-meta-toggle">
3615 <a href="#screen-options" id="show-settings-link" class="show-settings"><?php _e('Screen Options') ?></a>
3616 </div>
3617 <?php } ?>
3618 </div>
3619 </div>
3620 <?php
3621 }
3622
3623 /**
3624  * Add contextual help text for a page
3625  *
3626  * @since 2.7.0
3627  *
3628  * @param string $screen The handle for the screen to add help to.  This is usually the hook name returned by the add_*_page() functions.
3629  * @param string $help Arbitrary help text
3630  */
3631 function add_contextual_help($screen, $help) {
3632         global $_wp_contextual_help;
3633
3634         if ( !isset($_wp_contextual_help) )
3635                 $_wp_contextual_help = array();
3636
3637         $_wp_contextual_help[$screen] = $help;
3638 }
3639
3640 function drag_drop_help() {
3641         return '
3642         <p>' .  __('Most of the modules on this screen can be moved. If you hover your mouse over the title bar of a module you&rsquo;ll notice the 4 arrow cursor appears to let you know it is movable. Click on it, hold down the mouse button and start dragging the module to a new location. As you drag the module, notice the dotted gray box that also moves. This box indicates where the module will be placed when you release the mouse button.') . '</p>
3643         <p>' . __('The same modules can be expanded and collapsed by clicking once on their title bar and also completely hidden from the Screen Options tab.') . '</p>
3644 ';
3645 }
3646
3647 function plugins_search_help() {
3648         return '
3649         <p><strong>' . __('Search help') . '</strong></p>' .
3650         '<p>' . __('You may search based on 3 criteria:') . '<br />' .
3651         __('<strong>Term:</strong> Searches theme names and descriptions for the specified term.') . '<br />' .
3652         __('<strong>Tag:</strong> Searches for themes tagged as such.') . '<br />' .
3653         __('<strong>Author:</strong> Searches for themes created by the Author, or which the Author contributed to.') . '</p>
3654 ';
3655 }
3656
3657 function widgets_help() {
3658         return '
3659         <p>' . __('Widgets are added and arranged by simple drag &#8217;n&#8217; drop. If you hover your mouse over the titlebar of a widget, you&#8217;ll see a 4-arrow cursor which indicates that the widget is movable.  Click on the titlebar, hold down the mouse button and drag the widget to a sidebar. As you drag, you&#8217;ll see a dotted box that also moves. This box shows where the widget will go once you drop it.') . '</p>
3660         <p>' . __('To remove a widget from a sidebar, drag it back to Available Widgets or click on the arrow on its titlebar to reveal its settings, and then click Remove.') . '</p>
3661         <p>' . __('To remove a widget from a sidebar <em>and keep its configuration</em>, drag it to Inactive Widgets.') . '</p>
3662         <p>' . __('The Inactive Widgets area stores widgets that are configured but not curently used. If you change themes and the new theme has fewer sidebars than the old, all extra widgets will be stored to Inactive Widgets automatically.') . '</p>
3663 ';
3664 }
3665
3666 function screen_layout($screen) {
3667         global $screen_layout_columns;
3668
3669         $columns = array('dashboard' => 4, 'post' => 2, 'page' => 2, 'link' => 2);
3670         $columns = apply_filters('screen_layout_columns', $columns, $screen);
3671
3672         if ( !isset($columns[$screen]) ) {
3673                 $screen_layout_columns = 0;
3674                 return '';
3675         }
3676
3677         $screen_layout_columns = get_user_option("screen_layout_$screen");
3678         $num = $columns[$screen];
3679
3680         if ( ! $screen_layout_columns )
3681                         $screen_layout_columns = 2;
3682
3683         $i = 1;
3684         $return = '<h5>' . __('Screen Layout') . "</h5>\n<div class='columns-prefs'>" . __('Number of Columns:') . "\n";
3685         while ( $i <= $num ) {
3686                 $return .= "<label><input type='radio' name='screen_columns' value='$i'" . ( ($screen_layout_columns == $i) ? " checked='checked'" : "" ) . " /> $i</label>\n";
3687                 ++$i;
3688         }
3689         $return .= "</div>\n";
3690         return $return;
3691 }
3692
3693 function screen_options($screen) {
3694         switch ( $screen ) {
3695                 case 'edit':
3696                         $per_page_label = __('Posts per page:');
3697                         break;
3698                 case 'edit-pages':
3699                         $per_page_label = __('Pages per page:');
3700                         break;
3701                 case 'edit-comments':
3702                         $per_page_label = __('Comments per page:');
3703                         break;
3704                 case 'upload':
3705                         $per_page_label = __('Media items per page:');
3706                         break;
3707                 case 'categories':
3708                         $per_page_label = __('Categories per page:');
3709                         break;
3710                 case 'edit-tags':
3711                         $per_page_label = __('Tags per page:');
3712                         break;
3713                 case 'plugins':
3714                         $per_page_label = __('Plugins per page:');
3715                         break;
3716                 default:
3717                         return '';
3718         }
3719
3720         $option = str_replace( '-', '_', "${screen}_per_page" );
3721         $per_page = (int) get_user_option( $option, 0, false );
3722         if ( empty( $per_page ) || $per_page < 1 ) {
3723                 if ( 'plugins' == $screen )
3724                         $per_page = 999;
3725                 else
3726                         $per_page = 20;
3727         }
3728         if ( 'edit_comments_per_page' == $option )
3729                 $per_page = apply_filters( 'comments_per_page', $per_page, isset($_REQUEST['comment_status']) ? $_REQUEST['comment_status'] : 'all' );
3730         elseif ( 'categories' == $option )
3731                 $per_page = apply_filters( 'edit_categories_per_page', $per_page );
3732         else
3733                 $per_page = apply_filters( $option, $per_page );
3734
3735         $return = '<h5>' . __('Options') . "</h5>\n";
3736         $return .= "<div class='screen-options'>\n";
3737         if ( !empty($per_page_label) )
3738                 $return .= "<label for='$option'>$per_page_label</label> <input type='text' class='screen-per-page' name='wp_screen_options[value]' id='$option' maxlength='3' value='$per_page' />\n";
3739         $return .= "<input type='submit' class='button' value='" . esc_attr__('Apply') . "' />";
3740         $return .= "<input type='hidden' name='wp_screen_options[option]' value='" . esc_attr($option) . "' />";
3741         $return .= "</div>\n";
3742         return $return;
3743 }
3744
3745 function screen_icon($name = '') {
3746         global $parent_file, $hook_suffix;
3747
3748         if ( empty($name) ) {
3749                 if ( isset($parent_file) && !empty($parent_file) )
3750                         $name = substr($parent_file, 0, -4);
3751                 else
3752                         $name = str_replace(array('.php', '-new', '-add'), '', $hook_suffix);
3753         }
3754 ?>
3755         <div id="icon-<?php echo $name; ?>" class="icon32"><br /></div>
3756 <?php
3757 }
3758
3759 /**
3760  * Test support for compressing JavaScript from PHP
3761  *
3762  * Outputs JavaScript that tests if compression from PHP works as expected
3763  * and sets an option with the result. Has no effect when the current user
3764  * is not an administrator. To run the test again the option 'can_compress_scripts'
3765  * has to be deleted.
3766  *
3767  * @since 2.8.0
3768  */
3769 function compression_test() {
3770 ?>
3771         <script type="text/javascript">
3772         /* <![CDATA[ */
3773         var testCompression = {
3774                 get : function(test) {
3775                         var x;
3776                         if ( window.XMLHttpRequest ) {
3777                                 x = new XMLHttpRequest();
3778                         } else {
3779                                 try{x=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{x=new ActiveXObject('Microsoft.XMLHTTP');}catch(e){};}
3780                         }
3781
3782                         if (x) {
3783                                 x.onreadystatechange = function() {
3784                                         var r, h;
3785                                         if ( x.readyState == 4 ) {
3786                                                 r = x.responseText.substr(0, 18);
3787                                                 h = x.getResponseHeader('Content-Encoding');
3788                                                 testCompression.check(r, h, test);
3789                                         }
3790                                 }
3791
3792                                 x.open('GET', 'admin-ajax.php?action=wp-compression-test&test='+test+'&'+(new Date()).getTime(), true);
3793                                 x.send('');
3794                         }
3795                 },
3796
3797                 check : function(r, h, test) {
3798                         if ( ! r && ! test )
3799                                 this.get(1);
3800
3801                         if ( 1 == test ) {
3802                                 if ( h && ( h.match(/deflate/i) || h.match(/gzip/i) ) )
3803                                         this.get('no');
3804                                 else
3805                                         this.get(2);
3806
3807                                 return;
3808                         }
3809
3810                         if ( 2 == test ) {
3811                                 if ( '"wpCompressionTest' == r )
3812                                         this.get('yes');
3813                                 else
3814                                         this.get('no');
3815                         }
3816                 }
3817         };
3818         testCompression.check();
3819         /* ]]> */
3820         </script>
3821 <?php
3822 }
3823
3824 ?>