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