1. <?php
  2. $content_width = '691';
  3.  
  4. add_filter( 'the_content', 'make_clickable' );
  5.  
  6. add_action( 'wp_ajax_prologue_ajax_tag_search', 'prologue_ajax_tag_search' ); //Tag suggestion
  7. add_action( 'wp_ajax_prologue_load_post', 'prologue_load_post' ); // Load posts for inline editing
  8. add_action( 'wp_ajax_prologue_load_comment', 'prologue_load_comment' ); // Load comments for inline editing
  9. add_action( 'wp_ajax_prologue_inline_save', 'prologue_inline_save' ); // Save post  after inline editing
  10. add_action( 'wp_ajax_prologue_inline_comment_save', 'prologue_inline_comment_save' ); // Save comment   after inline editing
  11. add_action( 'wp_ajax_prologue_latest_posts', 'prologue_latest_posts' ); // Load new posts
  12. add_action( 'wp_ajax_prologue_latest_comments', 'prologue_latest_comments' ); //check for new comments and loads comments into widget
  13. add_action( 'wp_ajax_prologue_new_post', 'prologue_new_post' ); //Ajax posting
  14. add_action( 'wp_ajax_prologue_new_comment', 'prologue_new_comment' ); //Ajax Commenting
  15. add_action( 'wp_head', 'prologue_widget_recent_comments_avatar_style'); //Load styles for recent comments avatar widget
  16.  
  17. if( !class_exists('Services_JSON') ) include (TEMPLATEPATH . '/inc/JSON.php');
  18.  
  19. if (!is_admin()) add_action( 'wp_print_scripts', 'prologue_javascript' );
  20.  
  21. function prologue_init() {
  22.     load_theme_textdomain( 'p2', get_template_directory() . '/languages' );
  23. }
  24. add_action( 'init', 'prologue_init' );
  25.  
  26. function prologue_javascript() {
  27.     $prologue_tagsuggest = true;
  28.     $prologue_inlineedit = true;
  29.    
  30.     wp_enqueue_script( 'jquery-color' );
  31.     wp_enqueue_script( 'comment-reply' );
  32.  
  33.     if ( is_front_page() && $prologue_tagsuggest && is_user_logged_in() )
  34.         wp_enqueue_script( 'suggest' );
  35.        
  36.     wp_enqueue_script( 'p2js', get_bloginfo('template_directory' ).'/inc/p2.js', array( 'jquery' ), '200903301' );
  37.     wp_localize_script( 'p2js', 'p2txt', array(
  38.         'tagit' => __('Tag it', 'p2'),
  39.         'goto_homepage' => __('Go to homepage', 'p2'),
  40.         // the number is calculated in the javascript in a complex way, so we can't use ngettext
  41.         'n_new_updates' => __('%d new update(s)', 'p2'),
  42.         'n_new_comments' => __('%d new comment(s)', 'p2'),
  43.         'jump_to_top' => __('Jump to top', 'p2'),
  44.         'not_posted_error' => __('An error has occured, your post was not posted', 'p2'),
  45.         'update_posted' => __('You update has been posted', 'p2'),
  46.         'loading' => __('Loading...', 'p2'),
  47.         'cancel' => __('Cancel', 'p2'),
  48.         'save' => __('Save', 'p2'),
  49.         'hide_threads' => __('Hide threads', 'p2'),
  50.         'show_threads' => __('Show threads', 'p2'),
  51.         'unsaved_changes' => __('Your comments or posts will be lost if you continue.', 'p2'),
  52.     ));
  53.    
  54.     if ( ( $prologue_inlineedit ) && is_user_logged_in() )
  55.         wp_enqueue_script( 'jeditable', get_bloginfo('template_directory').'/inc/jquery.jeditable.js', array( 'jquery' )  );
  56.  
  57.     wp_enqueue_script( 'scrollit', get_bloginfo('template_directory').'/inc/jquery.scrollTo-min.js', array( 'jquery' )  );
  58. }
  59.  
  60. function prologue_pageoptions_init() {
  61.     global $page_options;
  62.     get_currentuserinfo();
  63.     $page_options['nonce']= wp_create_nonce( 'ajaxnonce' );
  64.     $page_options['prologue_updates'] = 1;
  65.     $page_options['prologue_comments_updates'] = 1;
  66.     $page_options['prologue_tagsuggest'] = 1;
  67.     $page_options['prologue_inlineedit'] = 1;
  68.     $page_options['prologue_comments_inlineedit'] = 1;
  69.     $page_options['is_single'] = (int)is_single();
  70.     $page_options['is_page'] = (int)is_page();
  71.     $page_options['is_front_page'] = (int)is_front_page();
  72.     $page_options['is_first_front_page'] = (int)(is_front_page() && !is_paged() );
  73.     $page_options['is_user_logged_in'] = (int)is_user_logged_in();
  74. }
  75. add_action('wp_head', 'prologue_pageoptions_init');
  76.  
  77. function prologue_pageoptions_js() {
  78.     global $page_options;
  79. ?><script type='text/javascript'>
  80. // <![CDATA[
  81. //Prologue Configuration
  82. var ajaxUrl = "<?php echo js_escape( get_bloginfo( 'wpurl' ) . '/wp-admin/admin-ajax.php' ); ?>";
  83. var updateRate = "30000";
  84. var nonce = "<?php echo js_escape( $page_options['nonce'] ); ?>";
  85. var templateDir  = "<?php js_escape( bloginfo('template_directory') ); ?>";
  86. var isFirstFrontPage = <?php echo $page_options['is_first_front_page'] ?>;
  87. var isFrontPage = <?php echo $page_options['is_front_page'] ?>;
  88. var isSingle = <?php echo $page_options['is_single'] ?>;
  89. var isPage = <?php echo $page_options['is_page'] ?>;
  90. var isUserLoggedIn = <?php echo $page_options['is_user_logged_in'] ?>;
  91. var prologueTagsuggest = <?php echo $page_options['prologue_tagsuggest'] ?>;
  92. var prologuePostsUpdates = <?php echo $page_options['prologue_updates'] ?>;
  93. var prologueCommentsUpdates = <?php echo $page_options['prologue_comments_updates']; ?>;
  94. var getPostsUpdate = 0;
  95. var getCommentsUpdate = 0;
  96. var inlineEditPosts =  <?php echo $page_options['prologue_inlineedit'] ?>;
  97. var inlineEditComments =  <?php echo $page_options['prologue_comments_inlineedit'] ?>;
  98. var wpUrl = "<?php echo js_escape( get_bloginfo( 'wpurl' ) ); ?>";
  99. var rssUrl = "<?php js_escape( get_bloginfo( 'rss_url' ) ); ?>";
  100. var pageLoadTime = "<?php echo gmdate( 'Y-m-d H:i:s' ); ?>";
  101. var latestPermalink = "<?php echo js_escape( latest_post_permalink() ); ?>";
  102. var original_title = document.title;
  103. var commentsOnPost = new Array;
  104. var postsOnPage = new Array;
  105. var postsOnPageQS = '';
  106. var currPost = -1;
  107. var currComment = -1;
  108. var commentLoop = false;
  109. var lcwidget = false;
  110. var hidecomments = false;
  111. var commentsLists = '';
  112. var newUnseenUpdates = 0;
  113.  // ]]>
  114. </script> <?php
  115. }
  116. add_action('wp_head', 'prologue_pageoptions_js');
  117.  
  118.  
  119. add_action('admin_menu', 'prologue_plugin_menu');
  120.  
  121. function prologue_plugin_menu() {
  122.   add_theme_page('Prologue Options', 'Prologue Options', 8, __FILE__, 'prologue_options_page');
  123. }
  124.  
  125.  
  126. function prologue_options_page() {
  127.  
  128.     // variables for the field and option names
  129.     $opt_name = 'prologue_show_titles';
  130.     $hidden_field_name = 'prologue_submit_hidden';
  131.     $data_field_name = 'prologue_titles';
  132.  
  133.     // Read in existing option value from database
  134.     $opt_val = get_option( $opt_name );
  135.  
  136.     // See if the user has posted us some information
  137.     // If they did, this hidden field will be set to 'Y'
  138.     if( $_POST[ $hidden_field_name ] == 'Y' ) {
  139.         // Read their posted value
  140.         $opt_val = 0;
  141.         if($_POST[ $data_field_name ] == 1) {
  142.             $opt_val = 1;
  143.         }
  144.  
  145.         // Save the posted value in the database
  146.         update_option( $opt_name, $opt_val );
  147.  
  148.         // Put an options updated message on the screen
  149. ?>
  150. <div class="updated"><p><strong><?php _e('Options saved.', 'p2' ); ?></strong></p></div>
  151. <?php
  152.  
  153.     }
  154.  
  155.     // Now display the options editing screen
  156.  
  157.     echo '<div class="wrap">';
  158.  
  159.     // header
  160.  
  161.     echo "<h2>" . __( 'Prologue Options', 'p2' ) . "</h2>";
  162.  
  163.     // options form
  164.    
  165.     ?>
  166.  
  167. <form name="form1" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>">
  168. <input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y" />
  169.  
  170. <p>
  171.     <input id="prologue-display-titles" type="checkbox" name="<?php echo $data_field_name; ?>" <?php if($opt_val == 1) echo 'checked="checked"'; ?> value="1" />
  172.     <label for="prologue-display-titles"><?php _e("Display titles", 'p2' ); ?></label>
  173. </p>
  174.  
  175. <p class="submit">
  176. <input type="submit" name="Submit" value="<?php _e('Update Options', 'p2' ) ?>" />
  177. </p>
  178.  
  179. </form>
  180. </div>
  181.  
  182. <?php
  183.  
  184. }
  185.  
  186.  
  187. function prologue_recent_projects_widget( $args ) {
  188.     extract( $args );
  189.     $options = get_option( 'prologue_recent_projects' );
  190.  
  191.     $title = empty( $options['title'] ) ? __( 'Recent Tags' , 'p2') : $options['title'];
  192.     $num_to_show = empty( $options['num_to_show'] ) ? 35 : $options['num_to_show'];
  193.  
  194.     $num_to_show = (int) $num_to_show;
  195.  
  196.     $before = $before_widget;
  197.     $before .= $before_title . wp_specialchars( $title ) . $after_title;
  198.  
  199.     $after = $after_widget;
  200.  
  201.     echo prologue_recent_projects( $num_to_show, $before, $after );
  202. }
  203.  
  204. function prologue_recent_projects( $num_to_show = 35, $before = '', $after = '' ) {
  205.     $cache = wp_cache_get( 'prologue_theme_tag_list', '' );
  206.     if( !empty( $cache[$num_to_show] ) ) {
  207.         $recent_tags = $cache[$num_to_show];
  208.     } else {
  209.         $all_tags = (array) get_tags( array( 'get' => 'all' ) );
  210.  
  211.         $recent_tags = array();
  212.        
  213.         foreach( $all_tags as $tag ) {
  214.             if( $tag->count < 1 )
  215.                 continue;
  216.  
  217.             $tag_posts = get_objects_in_term( $tag->term_id, 'post_tag' );
  218.             $recent_post_id = max( $tag_posts );
  219.             $recent_tags[$tag->term_id] = $recent_post_id;
  220.         }
  221.  
  222.         arsort( $recent_tags );
  223.  
  224.         $num_tags = count( $recent_tags );
  225.         if( $num_tags > $num_to_show ) {
  226.             $reduce_by = (int) $num_tags - $num_to_show;
  227.  
  228.             for( $i = 0; $i < $reduce_by; $i++ ) {
  229.                 array_pop( $recent_tags );
  230.             }
  231.         }
  232.  
  233.         wp_cache_set( 'prologue_theme_tag_list', array( $num_to_show => $recent_tags ) );
  234.     }
  235.  
  236.     echo $before;
  237.     echo "<ul>\n";
  238.  
  239.     foreach( $recent_tags as $term_id => $post_id ) {
  240.         $tag = get_term( $term_id, 'post_tag' );
  241.         $tag_link = get_tag_link( $tag->term_id );
  242. ?>
  243.  
  244. <li>
  245. <a class="rss" href="<?php echo get_tag_feed_link( $tag->term_id ); ?>">RSS</a>&nbsp;<a href="<?php echo $tag_link; ?>"><?php echo wp_specialchars( $tag->name ); ?></a>&nbsp;(&nbsp;<?php echo number_format_i18n( $tag->count ); ?>&nbsp;)
  246. </li>
  247.  
  248. <?php
  249.     } // foreach $recent_tags
  250. ?>
  251.  
  252.     </ul>
  253.  
  254. <p><a class="allrss" href="<?php bloginfo( 'rss2_url' ); ?>"><?php _e('All Updates RSS', 'p2'); ?></a></p>
  255.  
  256. <?php
  257.     echo $after;
  258. }
  259.  
  260. function prologue_flush_tag_cache() {
  261.     wp_cache_delete( 'prologue_theme_tag_list' );
  262. }
  263. add_action( 'save_post', 'prologue_flush_tag_cache' );
  264.  
  265. function prologue_recent_projects_control() {
  266.     $options = $newoptions = get_option( 'prologue_recent_projects' );
  267.  
  268.     if( $_POST['prologue_submit'] ) {
  269.         $newoptions['title'] = strip_tags( stripslashes( $_POST['prologue_title'] ) );
  270.         $newoptions['num_to_show'] = (int) strip_tags( stripslashes( $_POST['prologue_num_to_show'] ) );
  271.     }
  272.  
  273.     if( $options != $newoptions ) {
  274.         $options = $newoptions;
  275.         update_option( 'prologue_recent_projects', $options );
  276.     }
  277.  
  278.     $title = $options['title'];
  279.     $num_to_show = (int) $options['num_to_show'];
  280. ?>
  281.  
  282. <input type="hidden" name="prologue_submit" id="prologue_submit" value="1" />
  283.  
  284. <p><label for="prologue_title"><?php _e('Title:', 'p2') ?>
  285. <input type="text" class="widefat" id="prologue_title" name="prologue_title" value="<?php echo attribute_escape($title); ?>" />
  286. </label></p>
  287.  
  288. <p><label for="prologue_num_to_show"><?php _e('Num of tags to show:', 'p2') ?>
  289. <input type="text" class="widefat" id="prologue_num_to_show" name="prologue_num_to_show" value="<?php echo $num_to_show ?>" />
  290. </label></p>
  291.  
  292. <?php
  293. }
  294. wp_register_sidebar_widget( 'prologue_recent_projects_widget', __( 'Recent Tags' , 'p2'), 'prologue_recent_projects_widget' );
  295. wp_register_widget_control( 'prologue_recent_projects_widget', __( 'Recent Tags' , 'p2'), 'prologue_recent_projects_control' );
  296.  
  297. if( function_exists('register_sidebar') )
  298.     register_sidebar();
  299.  
  300. function prologue_get_avatar( $user_id, $email, $size ) {
  301.     if ( $user_id )
  302.         return get_avatar( $user_id, $size );
  303.     else
  304.         return get_avatar( $email, $size );
  305. }
  306.  
  307. function prologue_comment( $comment, $args, $depth ) {
  308.     $GLOBALS['comment'] = $comment;
  309. ?>
  310. <li <?php comment_class(); ?> id="comment-<?php comment_ID( ); ?>">
  311.     <?php echo prologue_get_avatar( $comment->user_id, $comment->comment_author_email, 32 ); ?>
  312.     <h4>
  313.         <?php comment_author_link( ); ?>
  314.         <span class="meta"><?php comment_time(); ?> <?php _e('on', 'p2'); ?> <?php comment_date(); ?> <span class="actions"><a href="#comment-<?php comment_ID( ); ?>"><?php _e('Permalink', 'p2'); ?></a><?php echo comment_reply_link(array('depth' => $depth, 'max_depth' => $args['max_depth'], 'before' => ' | ')) ?><?php edit_comment_link( __( 'Edit' , 'p2'), ' | ',''); ?></span><br /></span>
  315.     </h4>
  316.     <div class="commentcontent<?php if (current_user_can('edit_post', $comment->comment_post_ID)) echo(' comment-edit') ?>"  id="commentcontent-<?php comment_ID( ); ?>">
  317.             <?php comment_text( ); ?>
  318.     <?php if ( $comment->comment_approved == '0' ) : ?>
  319.     <p><em><?php _e('Your comment is awaiting moderation.', 'p2') ?></em></p>
  320.     <?php endif; ?>
  321.     </div>
  322. <?php  
  323. }
  324.  
  325. function whatchat_up_to() {
  326.     return (false === get_option('prologue_greeting')) ? __('Whatcha up to?') : get_option('prologue_greeting');
  327. }
  328.  
  329. function prologue_the_title($before = '<h2>', $after = '</h2>') {
  330.    
  331.     global $post, $looping;
  332.     $t = $post->post_title;
  333.    
  334.     if($looping == 0)
  335.         return $t;
  336.     $pos = 0;
  337.    
  338.     if(get_option('prologue_show_titles') != 1)
  339.         return false;
  340.        
  341.     $post->post_content = trim($post->post_content);
  342.     $post->post_title = trim($post->post_title);
  343.     $post->post_title = preg_replace('/\.\.\.$/','',$post->post_title);
  344.     $post->post_title = str_replace("\n", ' ', $post->post_title );
  345.     $post->post_title = str_replace('  ',' ', $post->post_title);
  346.     $post->post_content = str_replace("\n", ' ', strip_tags($post->post_content) );
  347.     $post->post_content = str_replace('  ',' ', $post->post_content);
  348.     $post->post_content = trim($post->post_content);
  349.     $post->post_title = trim($post->post_title);
  350.    
  351.     if( is_int( strpos($post->post_title, 'http') ) )  {
  352.         $split = str_split( $post->post_content, strpos($post->post_content, 'http'));
  353.         $post->post_content = $split[0];
  354.         $split2 = str_split( $post->post_title, strpos($post->post_title, 'http'));
  355.         $post->post_title = $split2[0];
  356.     }
  357.     $pos = @strpos( $post->post_content, $post->post_title );
  358.    
  359.     // these are for debugging
  360.     /*
  361.     error_log('content '.$post->post_content);
  362.     error_log('title '.$post->post_title);
  363.     error_log($pos);*/
  364.  
  365.     if( (false === $pos or $pos > 0) && $post->post_title != '')
  366.         echo (is_single()) ? $before.$t.$after : $before.'<a href="'.get_permalink( $post->id ).'">'.$t.'</a>'.$after;
  367. }
  368.  
  369. function prologue_loop() {
  370.     global $looping;
  371.     $looping = ($looping === 1 ) ? 0 : 1;
  372. }
  373. add_action('loop_start', 'prologue_loop');
  374. add_action('loop_end', 'prologue_loop');
  375.  
  376. function prologue_comment_widget_html( $comment, $size, $tdclass, $echocomment = true ) {
  377.     if ( !$size = (int) $size )
  378.         $size = 32;
  379.  
  380.     if ( $comment->comment_author == '' )
  381.         $comment->comment_author = __('Anonymous', 'p2');
  382.     $author = $comment->comment_author;
  383.     $excerpt = wp_html_excerpt( $author, 20 );
  384.     if ( $author != $excerpt )
  385.         $author = $excerpt.'&hellip;';
  386.  
  387.     $avatar = get_avatar( $comment, $size );
  388.  
  389.     if ( $comment_author_url = $comment->comment_author_url ? clean_url( $comment->comment_author_url ) : '' ) {
  390.         $avatar = "<a href='$comment_author_url' rel='nofollow'>$avatar</a>";
  391.         // entitities in comment author are kept escaped in the db and tags are not allowed, so
  392.         // no need of HTML escaping here
  393.         $author = "<a href='$comment_author_url' rel='nofollow'>$author</a>";
  394.     }
  395.  
  396.     $thiscomment  = '<tr><td title="' . attribute_escape( $comment->comment_author ) . '" class="recentcommentsavatar' . $tdclass . '" style="height:' . $size . 'px; width:' . $size . 'px">' . $avatar . '</td>';
  397.     $thiscomment .= '<td class="recentcommentstext' . $tdclass . '">';
  398.  
  399.     $post_title = wp_specialchars( strip_tags( get_the_title( $comment->comment_post_ID ) ) );
  400.     $excerpt = wp_html_excerpt( $post_title, 30 );
  401.     if ( $post_title != $excerpt )
  402.         $post_title = $excerpt.'&hellip;';
  403.  
  404.     $comment_content = strip_tags( $comment->comment_content );
  405.     $excerpt = wp_html_excerpt( $comment_content, 50 );
  406.     if ( $comment_content != $excerpt )
  407.         $comment_content = $excerpt.'&hellip;';
  408.  
  409.     $comment_url = get_comment_link( $comment );
  410.  
  411.     // Only use the URL's #fragment if the comment is visible on the pgae.
  412.     // Works by detecting if the comment's post is visible on the page... may break if P2 decides to do clever stuff with comments when paginated
  413.     if ( @constant( 'DOING_AJAX' ) && isset( $_GET['vp'] ) && is_array( $_GET['vp'] ) && in_array( $comment->comment_post_ID, $_GET['vp'] ) ) {
  414.         $comment_url = "#comment-{$comment->comment_ID}";
  415.     } else {
  416.         static $posts_on_page = false;
  417.         if ( false === $posts_on_page ) {
  418.             global $wp_query;
  419.  
  420.             $posts_on_page = array();
  421.             foreach ( array_keys( $wp_query->posts ) as $k )
  422.                 $posts_on_page[$wp_query->posts[$k]->ID] = true;
  423.         }
  424.  
  425.         if ( isset( $posts_on_page[$comment->comment_post_ID] ) )
  426.             $comment_url = "#comment-{$comment->comment_ID}";
  427.     }
  428.  
  429.     $thiscomment .= sprintf( __( "%s on <a href='%s' class='tooltip' title='%s'>%s</a>" , 'p2') . '</td></tr>', $author, $comment_url, attribute_escape($comment_content), $post_title );
  430.    
  431.     if ($echocomment)
  432.         echo $thiscomment;
  433.     else
  434.         return $thiscomment;
  435. }
  436.  
  437. function prologue_comment_frontpage( $comment, $args, $echocomment = true ) {
  438.     $GLOBALS['comment'] = $comment;
  439.    
  440.     $depth = prologue_get_comment_depth( get_comment_ID() );
  441.     $comment_text =  apply_filters( 'comment_text', $comment->comment_content );
  442.     $comment_class = comment_class( $class = '', $comment_id = null, $post_id = null, $echo = false );
  443.     $comment_time = get_comment_time();
  444.     $comment_date = get_comment_date();
  445.     $id = get_comment_ID();
  446.     $avatar = prologue_get_avatar( $comment->user_id, $comment->comment_author_email, 32 );
  447.     $author_link = get_comment_author_link();
  448.     $reply_link = prologue_get_comment_reply_link(
  449.         array('depth' => $depth, 'max_depth' => $args['max_depth'], 'before' => ' | ', 'reply_text' => __('Reply', 'p2') ),
  450.         $comment->comment_ID, $comment->comment_post_ID );
  451.     $can_edit = current_user_can( 'edit_post', $comment->comment_post_ID );
  452.     $edit_comment_url = get_edit_comment_link( $comment->comment_ID );
  453.     $edit_link = $can_edit? " | <a class='comment-edit-link' href='$edit_comment_url' title='".attribute_escape(__('Edit comment', 'p2'))."'>".__('Edit', 'p2')."</a>" : '';
  454.     $content_class = $can_edit? 'commentcontent comment-edit' : 'commentcontent';
  455.     $awaiting_message = $comment->comment_approved == '0'? '<p><em>'.__('Your comment is awaiting moderation.', 'p2').'</em></p>' : '';
  456.     $permalink = clean_url( get_comment_link() );
  457.     $permalink_text = __('Permalink', 'p2');
  458.     $date_time = sprintf( __('%s <em>on</em> %s', 'p2'),  get_comment_time(), get_comment_date() );
  459.     $html = <<<HTML
  460. <li $comment_class id="comment-$id">
  461.     $avatar
  462.     <h4>
  463.         $author_link
  464.         <span class="meta">
  465.             $date_time
  466.             <span class="actions"><a href="$permalink">$permalink_text</a> $reply_link $edit_link</span><br />
  467.         </span>
  468.     </h4>
  469.     <div class="$content_class" id="commentcontent-$id">
  470.         $comment_text
  471.     </div>
  472. HTML;
  473.     if(get_comment_type() != 'comment')
  474.         return false;
  475.        
  476.     if ($echocomment)
  477.         echo $html;
  478.     else
  479.         return $html;
  480. }
  481.  
  482. function tags_with_count( $format = 'list', $before = '', $sep = '', $after = '' ) {
  483.     global $post;
  484.     $posttags = get_the_tags($post->ID, 'post_tag');
  485.    
  486.     if ( !$posttags )
  487.         return;
  488.    
  489.     foreach ( $posttags as $tag ) {
  490.         if ( $tag->count > 1 && !is_tag($tag->slug) ) {
  491.             $tag_link = '<a href="' . get_term_link($tag, 'post_tag') . '" rel="tag">' . $tag->name . ' (' . number_format_i18n( $tag->count ) . ')</a>';
  492.         } else {
  493.             $tag_link = $tag->name;
  494.         }
  495.        
  496.         if ( $format == 'list' )
  497.             $tag_link = '<li>' . $tag_link . '</li>';
  498.        
  499.         $tag_links[] = $tag_link;
  500.     }
  501.    
  502.     echo $before . join( $sep, $tag_links ) . $after;
  503. }
  504.  
  505. function latest_post_permalink() {
  506.     global $wpdb;
  507.     $sql = "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1";
  508.     $last_post_id = $wpdb->get_var($sql);
  509.     $permalink = get_permalink($last_post_id);
  510.     return $permalink;
  511. }
  512.  
  513. function prologue_ajax_tag_search() {
  514.     global $wpdb;
  515.     $s = $_GET['q'];
  516.     if ( false !== strpos( $s, ',' ) ) {
  517.         $s = explode( ',', $s );
  518.         $s = $s[count( $s ) - 1];
  519.     }
  520.     $s = trim( $s );
  521.     if ( strlen( $s ) < 2 )
  522.         die; // require 2 chars for matching
  523.    
  524.     $results = $wpdb->get_col( "SELECT t.name FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = 'post_tag' AND t.name LIKE ('%". like_escape( $wpdb->escape( $s ) ) . "%')" );
  525.     echo join( $results, "\n" );
  526.     exit;
  527. }
  528.  
  529. function prologue_title_from_content( $content ) {
  530.    
  531.     static $strlen =  null;
  532.     if ( !$strlen ) {
  533.         $strlen = function_exists('mb_strlen')? 'mb_strlen' : 'strlen';
  534.     }
  535.     $max_len = 40;
  536.     $title = $strlen( $content ) > $max_len? wp_html_excerpt( $content, $max_len ) . '...' : $content;
  537.     $title = trim( strip_tags( $title ) );
  538.     $title = str_replace("\n", " ", $title);
  539.  
  540.     //Try to detect image or video only posts, and set post title accordingly
  541.     if ( !$title ) {
  542.         if ( preg_match("/<object|<embed/", $content ) )
  543.             $title = __('Video Post', 'p2');
  544.         elseif ( preg_match( "/<img/", $content ) )
  545.             $title = __('Image Post', 'p2');
  546.         else
  547.             $title = __('No Title', 'p2');
  548.     }
  549.     return $title;
  550. }
  551. if ( is_admin() && ( false === get_option('prologue_show_titles') ) ) add_option('prologue_show_titles', 1);
  552.  
  553. function prologue_inline_save() {
  554.     check_ajax_referer( 'ajaxnonce', '_inline_edit' );
  555.     if ( !is_user_logged_in() ) {
  556.         die('<p>'.__('Error: not logged in.', 'p2').'</p>');
  557.     }
  558.  
  559.     $post_id = $_POST['post_ID'];
  560.     $post_id = substr( $post_id, strpos( $post_id, '-' ) + 1 );
  561.    
  562.     if ( !current_user_can( 'edit_post', $post_id )) {
  563.         die('<p>'.__('Error: not allowed to edit post.', 'p2').'</p>');
  564.     }
  565.    
  566.     $user_id = $current_user->ID;
  567.     $post_content   = $_POST['content'];
  568.    
  569.     // preserve custom "big" titles
  570.  
  571.     $thepost = get_post($post_id);
  572.    
  573.     $clean_title = str_replace('&hellip;', '', $thepost->post_title);
  574.  
  575.     if( strpos($thepost->post_content, $clean_title ) !== 0 ) {
  576.         $post_title = $thepost->post_title;
  577.     } else {
  578.         $post_title = prologue_title_from_content( $post_content );
  579.     }
  580.  
  581.     $post = wp_update_post( array(
  582.         'post_title'    => $post_title,
  583.         'post_content'  => $post_content,
  584.         'post_modified' => current_time('mysql'),
  585.         'post_modified_gmt' => current_time('mysql', 1),
  586.         'ID' => $post_id
  587.     ));
  588.    
  589.     $thepost = get_post( $post );
  590.  
  591.     echo apply_filters( 'the_content', $thepost->post_content );
  592.     exit;
  593. }
  594.  
  595. function prologue_inline_comment_save() {
  596.     check_ajax_referer( 'ajaxnonce', '_inline_edit' );
  597.     if ( !is_user_logged_in() ) {
  598.         die('<p>'.__('Error: not logged in.', 'p2').'</p>');
  599.     }
  600.  
  601.     $comment_id = $_POST['comment_ID'];
  602.     $comment_id = substr( $comment_id, strpos( $comment_id, '-' ) + 1);
  603.     $this_comment = get_comment( $comment_id );
  604.    
  605.     if ( !current_user_can( 'edit_post', $this_comment->comment_post_ID ) ) {
  606.         die('<p>'.__('Error: not allowed to edit this comment.', 'p2').'</p>');
  607.     }
  608.    
  609.     $user_id = $current_user->ID;
  610.     $comment_content = $_POST['comment_content'];
  611.    
  612.     $comment = wp_update_comment( array(
  613.         'comment_content'   => $comment_content,
  614.         'comment_ID' => $comment_id
  615.     ));
  616.    
  617.     $thecomment = get_comment( $comment_id );
  618.     echo apply_filters( 'comment_text', $thecomment->comment_content );
  619.     exit;
  620. }
  621.  
  622. function prologue_load_post() {
  623.     check_ajax_referer( 'ajaxnonce', '_inline_edit' );
  624.     if ( !is_user_logged_in() ) {
  625.         die('<p>'.__('Error: not logged in.', 'p2').'</p>');
  626.     }
  627.     $post_id = $_GET['post_ID'];
  628.     $post_id = substr( $post_id, strpos( $post_id, '-' ) + 1 );
  629.     if ( !current_user_can( 'edit_post', $post_id ) ) {
  630.         die('<p>'.__('Error: not allowed to edit post.', 'p2').'</p>');
  631.     }
  632.     $this_post = get_post( $post_id );
  633.     echo $this_post->post_content ;
  634.     exit;
  635. }
  636.  
  637. function prologue_load_comment() {
  638.     check_ajax_referer( 'ajaxnonce', '_inline_edit' );
  639.     if ( !is_user_logged_in() ) {
  640.         die('<p>'.__('Error: not logged in.', 'p2').'</p>');
  641.     }
  642.     $comment_id = attribute_escape($_GET['comment_ID']);
  643.     $comment_id = substr( $comment_id, strpos( $comment_id, '-' ) + 1);
  644.     $this_comment = get_comment($comment_id);
  645.     $comment_content = $this_comment->comment_content;
  646.     echo $comment_content;
  647.     exit;
  648. }
  649.  
  650. function prologue_new_post() {
  651.     if( 'POST' != $_SERVER['REQUEST_METHOD'] || empty( $_POST['action'] ) || $_POST['action'] != 'prologue_new_post' ) {
  652.         die();
  653.     }
  654.     if ( !is_user_logged_in() ) {
  655.         die('<p>'.__('Error: not logged in.', 'p2').'</p>');
  656.     }
  657.     if( !current_user_can( 'publish_posts' ) ) {
  658.         die('<p>'.__('Error: not allowed to post.', 'p2').'</p>');
  659.     }
  660.     check_ajax_referer( 'ajaxnonce', '_ajax_post' );
  661.     $user_id        = $current_user->user_id;
  662.     $post_content   = $_POST['posttext'];
  663.     $tags           = trim( $_POST['tags'] );
  664.     if ( $tags == __('Tag it', 'p2') || $tags == 'Tag it' ) $tags = '';
  665.    
  666.     $post_title = prologue_title_from_content( $post_content );
  667.  
  668.     $post_id = wp_insert_post( array(
  669.         'post_author'   => $user_id,
  670.         'post_title'    => $post_title,
  671.         'post_content'  => $post_content,
  672.         'tags_input'    => $tags,
  673.         'post_status'   => 'publish'
  674.     ) );
  675.     echo $post_id? $post_id : '0';
  676.     exit;
  677. }
  678.  
  679.  
  680. function prologue_new_post_noajax() {
  681.     if( 'POST' != $_SERVER['REQUEST_METHOD'] || empty( $_POST['action'] ) || $_POST['action'] != 'post' ) {
  682.         return;
  683.     }
  684.     if ( ! is_user_logged_in() )
  685.         auth_redirect();
  686.     if( !current_user_can( 'publish_posts' ) ) {
  687.         wp_redirect( get_bloginfo( 'url' ) . '/' );
  688.         exit;
  689.     }
  690.  
  691.     check_admin_referer( 'new-post' );
  692.  
  693.     $user_id        = $current_user->user_id;
  694.     $post_content   = $_POST['posttext'];
  695.     $tags           = $_POST['tags'];
  696.  
  697.     $title = prologue_title_from_content( $post_content );
  698.  
  699.     $post_id = wp_insert_post( array(
  700.         'post_author'   => $user_id,
  701.         'post_title'    => $post_title,
  702.         'post_content'  => $post_content,
  703.         'tags_input'    => $tags,
  704.         'post_status'   => 'publish'
  705.     ) );
  706.  
  707.     wp_redirect( get_bloginfo( 'url' ) . '/' );
  708.     exit;
  709. }
  710.  
  711.  
  712. function prologue_new_comment() {
  713.     if( 'POST' != $_SERVER['REQUEST_METHOD'] || empty( $_POST['action'] ) || $_POST['action'] != 'prologue_new_comment' ) {
  714.         die();
  715.     }
  716.    
  717.     check_ajax_referer( 'ajaxnonce', '_ajax_post' );
  718.    
  719.     $comment_content = isset( $_POST['comment'] )? trim( $_POST['comment'] ) : null;
  720.     $comment_post_ID = isset( $_POST['comment_post_ID'] )? trim( $_POST['comment_post_ID'] ) : null;
  721.     $user = wp_get_current_user();
  722.     if ( $user->ID ) {
  723.         if ( empty( $user->display_name ) )
  724.             $user->display_name = $user->user_login;
  725.         $comment_author       = $user->display_name;
  726.         $comment_author_email = $user->user_email;
  727.         $comment_author_url   = $user->user_url;
  728.         $comment_author_url   = $user->user_url;
  729.         $user_ID              = $user->ID;
  730.         if ( current_user_can( 'unfiltered_html' ) ) {
  731.             $unfiltered_html = isset($_POST['_wp_unfiltered_html_comment'])? $_POST['_wp_unfiltered_html_comment'] : '';
  732.             if ( wp_create_nonce( 'unfiltered-html-comment_' . $comment_post_ID) != $unfiltered_html ) {
  733.                 kses_remove_filters(); // start with a clean slate
  734.                 kses_init_filters(); // set up the filters
  735.             }
  736.         }
  737.     } else {
  738.         if ( get_option('comment_registration') ) {
  739.             die('<p>'.__('Error: you must be logged in to post a comment.', 'p2').'</p>');
  740.         }
  741.     }
  742.  
  743.     $comment_type = '';
  744.  
  745.     if ( get_option( 'require_name_email' ) && !$user->ID ) {
  746.         if ( strlen($comment_author_email) < 6 || '' == $comment_author ) {
  747.             die('<p>'.__('Error: please fill the required fields (name, email).', 'p2').'</p>');
  748.         } elseif ( !is_email( $comment_author_email ) ) {
  749.             die('<p>'.__('Error: please enter a valid email address.', 'p2').'</p>');
  750.         }
  751.     }
  752.  
  753.     if ( '' == $comment_content ) {
  754.         die('<p>'.__('Error: Please type a comment.', 'p2').'</p>');
  755.     }
  756.    
  757.     $comment_parent = isset( $_POST['comment_parent'] ) ? absint( $_POST['comment_parent'] ) : 0;
  758.  
  759.     $commentdata = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID' );
  760.  
  761.     $comment_id = wp_new_comment( $commentdata );
  762.     $comment = get_comment( $comment_id );
  763.     if ( !$user->ID ) {
  764.         setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
  765.         setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
  766.         setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
  767.     }
  768.     if ($comment)
  769.         echo $comment_id;
  770.     else
  771.         echo __("Error: Unknown error occured. Comment not posted.", 'p2');
  772.     exit;
  773. }
  774.  
  775. function prologue_latest_comments() {
  776.     global $wpdb, $comments, $comment, $max_depth, $depth, $user_login, $user_ID, $user_identity;
  777.    
  778.     $number = 10; //max amount of comments to load
  779.     $load_time = $_GET['load_time'];
  780.     $lc_widget = $_GET['lcwidget'];
  781.     $visible_posts =  (array)$_GET['vp'];
  782.    
  783.     if ( get_option('thread_comments') )
  784.         $max_depth = get_option('thread_comments_depth');
  785.     else
  786.         $max_depth = -1;
  787.  
  788.     //Widget info
  789.     if ( !isset($options) )
  790.         $options = get_option('widget_recent_comments');
  791.     $size = $options[ 'avatar_size' ] ? $options[ 'avatar_size' ] : 32;
  792.    
  793.     //get new comments
  794.     if ($user_ID) {
  795.         $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE (comment_approved = '1' OR ( user_id = %d AND comment_approved = '0' ))  AND comment_date_gmt > %s ORDER BY comment_date_gmt DESC LIMIT $number", $user_ID, $load_time));
  796.     } else if ( empty($comment_author) ) {
  797.         $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' AND comment_date_gmt > %s ORDER BY comment_date_gmt DESC LIMIT $number", $load_time));
  798.     } else {
  799.         $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE (comment_approved = '1' OR ( comment_author = %s AND comment_author_email = %s AND comment_approved = '0' ) ) AND comment_date_gmt > %s ORDER BY comment_date_gmt DESC LIMIT $number", $comment_author, $comment_author_email, $load_time));
  800.     }
  801.     $number_of_new_comments = count($comments);
  802.  
  803.     $prepare_comments = array();
  804.     if ($number_of_new_comments > 0) {
  805.         foreach ($comments as $comment) {
  806.  
  807.             // Setup comment html if post is visible
  808.             $comment_html = '';
  809.             if ( in_array( $comment->comment_post_ID, $visible_posts ) ) {
  810.                 $comment_html = prologue_comment_frontpage($comment, array('max_depth' => $max_depth, 'before' => ' | '), $depth, false);
  811.             }
  812.  
  813.             // Setup widget html if widget is visible
  814.             $comment_widget_html = '';
  815.             if ( $lc_widget ) {
  816.                 $comment_widget_html = prologue_comment_widget_html( $comment, $size, 'top', false );
  817.             }
  818.            
  819.             $prepare_comments[] = array( "id" => $comment->comment_ID, "postID" => $comment->comment_post_ID, "commentParent" =>  $comment->comment_parent,
  820.                 "html" => $comment_html, "widgetHtml" => $comment_widget_html );
  821.         }
  822.        
  823.         $json_data = array("numberofnewcomments" => $number_of_new_comments, "comments" => $prepare_comments, "lastcommenttime" => gmdate( 'Y-m-d H:i:s' ));
  824.         echo json_encode( $json_data );
  825.     } else { // No new comments
  826.         echo('0');
  827.     }
  828.     exit;
  829. }
  830.  
  831. function prologue_latest_posts() {
  832.     $load_time = $_GET['load_time'];
  833.     $frontpage = $_GET['frontpage'];
  834.     $num_posts = 10; //max amount of posts to load
  835.     $number_of_new_posts = 0;
  836.     $prologue_query = new WP_Query('showposts=' . $num_posts . '&post_status=publish');
  837.     ob_start();
  838.     while ($prologue_query->have_posts()) : $prologue_query->the_post();
  839.         $current_user_id = get_the_author_ID( );
  840.         if ( get_gmt_from_date( get_the_time( 'Y-m-d H:i:s' ) ) <=  $load_time ) continue;
  841.         $number_of_new_posts++;
  842.         if ( $frontpage ) {
  843. ?>
  844. <li id="prologue-<?php the_ID(); ?>" class="newupdates user_id_<?php the_author_ID( ); ?>">
  845.     <?php echo prologue_get_avatar( $current_user_id, get_the_author_email( ), 48 ); ?>
  846.     <h4>
  847.         <?php the_author_posts_link( ); ?>
  848.         <span class="meta">
  849.             <?php printf( __('%s <em>on</em> %s', 'p2'),  get_the_time(), get_the_time( get_option('date_format') ) ); ?> |
  850.             <?php comments_popup_link( '0', '1', '%' ); ?>
  851.            
  852.             <span class="actions">
  853.                 <a href="<?php the_permalink( ); ?>" class="thepermalink"><?php _e('Permalink', 'p2'); ?></a>
  854.             <?php if (function_exists('post_reply_link'))
  855.                 echo post_reply_link(array('before' => ' | ', 'reply_text' => __('Reply', 'p2'), 'add_below' => 'prologue'), get_the_id()); ?>
  856.             <?php if (current_user_can('edit_post', get_the_id())) { ?>
  857.             |  <a href="<?php echo (get_edit_post_link( get_the_id() ))?>" class="post-edit-link" rel="<?php the_ID(); ?>"><?php _e('Edit', 'p2'); ?></a>
  858.             <?php } ?>
  859.             </span>
  860.             <br />
  861.             <?php tags_with_count( '', __( 'Tags:' , 'p2').' ', ', ', ' ' ); ?>
  862.         </span>
  863.     </h4>
  864.     <div class="postcontent<?php if (current_user_can( 'edit_post', get_the_id() )) {?> editarea<?php } ?>" id="content-<?php the_ID(); ?>"><?php the_content( __( '(More ...)' , 'p2') ); ?></div> <!-- // postcontent -->
  865.     <div class="bottom_of_entry">&nbsp;</div>
  866. </li>
  867. <?php
  868. }
  869.     endwhile;
  870.     $posts_html = ob_get_contents();
  871.     ob_end_clean();
  872.     if ( $number_of_new_posts == 0 ) {
  873.         echo '0';
  874.     } else {
  875.         $json_data = array("numberofnewposts" =>$number_of_new_posts, "html" => $posts_html, "lastposttime" => gmdate( 'Y-m-d H:i:s' ));
  876.         echo json_encode( $json_data );
  877.     }
  878.     exit;
  879. }
  880.  
  881. /* Recent comments with avatars */
  882. function prologue_widget_recent_comments_avatar( $args ) {
  883.     global $wpdb, $comments, $comment;
  884.     extract($args, EXTR_SKIP);
  885.     if ( !isset($options) )
  886.         $options = get_option('widget_recent_comments');
  887.     $title = empty($options['title']) ? __('Recent Comments', 'p2') : $options['title'];
  888.     if ( !$number = (int) $options['number'] )
  889.         $number = 5;
  890.     else if ( $number < 1 )
  891.         $number = 1;
  892.     else if ( $number > 15 )
  893.         $number = 15;
  894.  
  895.     if ( !$comments = wp_cache_get( 'recent_avatar_comments', 'widget' ) ) {
  896.         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT $number");
  897.         wp_cache_add( 'recent_avatar_comments', $comments, 'widget' );
  898.     }
  899.     $size = $options[ 'avatar_size' ] ? $options[ 'avatar_size' ] : 24;
  900.     ?>
  901.     <?php echo $before_widget; ?>
  902.         <?php echo $before_title . wp_specialchars( $title ) . $after_title; ?>
  903.         <table class='recentcommentsavatar' cellspacing='0' cellpadding='0' border='0' id="recentcommentstable"><?php
  904.         $tdclass = 'top';
  905.         if ( $comments ) : foreach ($comments as $comment) :
  906.             prologue_comment_widget_html($comment, $size, $tdclass, true);
  907.         endforeach; endif;?></table>
  908.     <?php echo $after_widget; ?>
  909. <?php
  910. }
  911.  
  912. if(!function_exists('wp_delete_recent_comments_avatar_cache')) {
  913.     function wp_delete_recent_comments_avatar_cache() {
  914.         wp_cache_delete( 'recent_avatar_comments', 'widget' );
  915.     }
  916.     add_action( 'comment_post', 'wp_delete_recent_comments_avatar_cache' );
  917.     add_action( 'wp_set_comment_status', 'wp_delete_recent_comments_avatar_cache' );
  918. }
  919.  
  920. function prologue_widget_recent_comments_avatar_control() {
  921.     $options = $newoptions = get_option('widget_recent_comments');
  922.     if ( $_POST["recent-comments-submit"] ) {
  923.         $newoptions['title'] = strip_tags(stripslashes($_POST["recent-comments-title"]));
  924.         $newoptions['number'] = (int) $_POST["recent-comments-number"];
  925.         $newoptions['avatar_size'] = (int) $_POST["recent-comments-avatar-size"];
  926.         $newoptions['avatar_bg'] = preg_replace('/[^a-z0-9#]/', '', $_POST["recent-comments-avatar-bg"] );
  927.         $newoptions['text_bg'] = preg_replace('/[^a-z0-9#]/i', '', $_POST["recent-comments-text-bg"] );
  928.     }
  929.     if ( print_r( $options, 1 ) != print_r( $newoptions, 1 ) ) {
  930.         $options = $newoptions;
  931.         update_option('widget_recent_comments', $options);
  932.         wp_delete_recent_comments_cache(); // If user selects "No Avatars", the core recent comments widget is used, so we need to clear that cache too.
  933.         wp_delete_recent_comments_avatar_cache();
  934.     }
  935.     $title = $options['title'];
  936.     $avatar_bg = $options[ 'avatar_bg' ];
  937.     $text_bg   = $options[ 'text_bg' ];
  938.     $avatar_size = $options[ 'avatar_size' ] == '' ? '48' : (int) $options[ 'avatar_size' ];
  939.     if ( !$number = (int) $options['number'] )
  940.         $number = 5;
  941.     else if ( $number < 1 )
  942.         $number = 1;
  943.     else if ( $number > 15 )
  944.         $number = 15;
  945. ?>
  946.             <p><label for="recent-comments-title"><?php _e('Title:', 'p2'); ?> <input id="recent-comments-title" name="recent-comments-title" type="text" class="widefat" value="<?php echo attribute_escape($title); ?>" /></label></p>
  947.             <p><label for="recent-comments-number"><?php _e('Number of comments to show:', 'p2'); ?> <input style="width: 25px; text-align: center;" id="recent-comments-number" name="recent-comments-number" type="text" value="<?php echo $number; ?>" /></label> <small><?php _e('(at most 15)', 'p2'); ?></small></p>
  948.             <p><label for="recent-comments-avatar-size"><?php _e('Avatar Size (px):', 'p2'); ?> <select name='recent-comments-avatar-size'>
  949.             <option value='1'<?php echo 1 == $avatar_size ? ' selected' : ''; ?>><?php _e( 'No Avatars' , 'p2'); ?></option>
  950.             <option value='16'<?php echo 16 == $avatar_size ? ' selected' : ''; ?>>16x16</option>
  951.             <option svalue='32'<?php echo 32 == $avatar_size ? ' selected' : ''; ?>>32x32</option>
  952.             <option value='48'<?php echo 48 == $avatar_size ? ' selected' : ''; ?>>48x48</option>
  953.             <option value='96'<?php echo 96 == $avatar_size ? ' selected' : ''; ?>>96x96</option>
  954.             <option value='128'<?php echo 128 == $avatar_size ? ' selected' : ''; ?>>128x128</option>
  955.             </select></label></p>
  956.             <p><label for="recent-comments-avatar-bg"><?php _e('Avatar background color:', 'p2'); ?> <input style="width: 50px;" id="recent-comments-avatar-bg" name="recent-comments-avatar-bg" type="text" value="<?php echo $avatar_bg; ?>" /></label></p>
  957.             <p><label for="recent-comments-text-bg"><?php _e('Text background color:', 'p2'); ?> <input style="width: 50px;" id="recent-comments-text-bg" name="recent-comments-text-bg" type="text" value="<?php echo attribute_escape($text_bg); ?>" /></label></p>
  958.  
  959.             <input type="hidden" id="recent-comments-submit" name="recent-comments-submit" value="1" />
  960. <?php
  961. }
  962.  
  963. function prologue_widget_recent_comments_avatar_style() {
  964.     $options = get_option('widget_recent_comments');
  965.     $avatar_bg = $options[ 'avatar_bg' ] == '' ? '' : 'background: ' . $options[ 'avatar_bg' ] . ';';
  966.     $text_bg = $options[ 'text_bg' ] == '' ? '' : 'background: ' . $options[ 'text_bg' ] . ';';
  967.     $style = "
  968. <style type='text/css'>
  969. table.recentcommentsavatar img.avatar { border: 0px; margin:0; }
  970. table.recentcommentsavatar a {border: 0px !important; background-color: transparent !important}
  971. td.recentcommentsavatartop {padding:0px 0px 1px 0px;
  972.                             margin:   0px;
  973.                             {$avatar_bg} }
  974. td.recentcommentsavatarend {padding:0px 0px 1px 0px;
  975.                             margin:0px;
  976.                             {$avatar_bg} }
  977. td.recentcommentstexttop {
  978.                             {$text_bg} border: none !important; padding:0px 0px 0px 10px;}
  979. td.recentcommentstextend {
  980.                             {$text_bg} border: none !important; padding:0px 0px 2px 10px;}
  981. </style>";
  982.     echo $style;
  983. }
  984.  
  985. function prologue_widget_recent_comments_avatar_register() {
  986.     $options = get_option('widget_recent_comments');
  987.     if( isset( $options[ 'avatar_size' ] ) && $options[ 'avatar_size' ] == 1 && is_admin() == false )
  988.         return;
  989.     $class = array('classname' => 'widget_recent_comments');
  990.     wp_register_sidebar_widget('recent-comments', __('Recent Comments', 'p2'), 'prologue_widget_recent_comments_avatar', $class);
  991.     wp_register_widget_control('recent-comments', __('Recent Comments', 'p2'), 'prologue_widget_recent_comments_avatar_control' );
  992.  
  993.     if ( is_active_widget('prologue_widget_recent_comments_avatar') )
  994.         add_action('wp_head', 'prologue_widget_recent_comments_avatar_style');
  995. }
  996. add_action('init', 'prologue_widget_recent_comments_avatar_register', 10);
  997.  
  998. //Search related Functions
  999.  
  1000. function search_comments_distinct( $distinct ) {
  1001.     global $wp_query;
  1002.     if (!empty($wp_query->query_vars['s'])) {
  1003.         return 'DISTINCT';
  1004.     }
  1005. }
  1006. add_filter('posts_distinct', 'search_comments_distinct');
  1007.  
  1008. function search_comments_where( $where ) {
  1009.     global $wp_query, $wpdb;
  1010.     if (!empty($wp_query->query_vars['s'])) {
  1011.             $or = " OR ( comment_post_ID = ".$wpdb->posts . ".ID  AND comment_approved =  '1' AND comment_content LIKE '%" . like_escape( $wpdb->escape($wp_query->query_vars['s'] ) ) . "%') ";
  1012.             $where = preg_replace( "/\bor\b/i", $or." OR", $where, 1 );
  1013.     }
  1014.     return $where;
  1015. }
  1016. add_filter('posts_where', 'search_comments_where');
  1017.  
  1018. function search_comments_join( $join ) {
  1019.     global $wp_query, $wpdb, $request;
  1020.     if (!empty($wp_query->query_vars['s'])) {
  1021.         $join .= " LEFT JOIN $wpdb->comments ON ( comment_post_ID = ID  AND comment_approved =  '1')";
  1022.     }
  1023.     return $join;
  1024. }
  1025. add_filter('posts_join', 'search_comments_join');
  1026.  
  1027. function get_search_query_terms() {
  1028.     $search = get_query_var('s');
  1029.     $search_terms = get_query_var('search_terms');
  1030.     if ( !empty($search_terms) ) {
  1031.         return $search_terms;
  1032.     } else if ( !empty($search) ) {
  1033.         return array($search);
  1034.     }
  1035.     return array();
  1036. }
  1037.  
  1038. function hilite( $text ) {
  1039.     $query_terms = array_filter( array_map('trim', get_search_query_terms() ) );
  1040.     foreach ( $query_terms as $term ) {
  1041.         $term = preg_quote( $term, '/' );
  1042.         if ( !preg_match( '/<.+>/', $text ) ) {
  1043.             $text = preg_replace( '/(\b'.$term.'\b)/i','<span class="hilite">$1</span>', $text );
  1044.         } else {
  1045.             $text = preg_replace( '/(?<=>)([^<]+)?(\b'.$term.'\b)/i','$1<span class="hilite">$2</span>', $text );
  1046.         }
  1047.     }
  1048.     return $text;
  1049. }
  1050.  
  1051. function hilite_tags( $tags ) {
  1052.     $query_terms = array_filter( array_map('trim', get_search_query_terms() ) );
  1053.     // tags are kept escaped in the db
  1054.     $query_terms = array_map( 'wp_specialchars', $query_terms );
  1055.     foreach( array_filter((array)$tags) as $tag ) {
  1056.         if ( in_array( trim($tag->name), $query_terms ) ) {
  1057.             $tag->name ="<span class='hilite'>". $tag->name . "</span>";
  1058.         }
  1059.     }
  1060.     return $tags;
  1061. }
  1062.  
  1063. // Highlight text and comments:
  1064. add_filter('the_content', 'hilite');
  1065. add_filter('get_the_tags', 'hilite_tags');
  1066. add_filter('the_excerpt', 'hilite');
  1067. add_filter('comment_text', 'hilite');
  1068.  
  1069. function iphone_css() {
  1070. if ( strstr( $_SERVER['HTTP_USER_AGENT'], 'iPhone' ) or isset($_GET['iphone']) && $_GET['iphone'] ) { ?>
  1071. <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
  1072. <style type="text/css">
  1073. #header_img img, #sidebar, #postbox .avatar {
  1074.     display: none;
  1075. }
  1076. #header {
  1077.     margin: 0;
  1078.     padding: 0;
  1079. }
  1080. #header .sleeve {
  1081.     padding: 0;
  1082.     margin: 0;
  1083.     width: 100%;
  1084. }
  1085. #header h1, #header small {
  1086.     display: block;
  1087.     width: 100%;
  1088. }
  1089. #header h1 {
  1090.     padding-left: 16px;
  1091.     margin-bottom: 2px;
  1092. }
  1093.  
  1094. #main h2 .controls {
  1095.     display: none;
  1096. }
  1097. .actions {
  1098.     clear: both;
  1099.     display: block;
  1100.     position: static !important;
  1101.     text-align: right;
  1102.     height: 1.1em;
  1103.     top: 0px !important;
  1104.     margin-top: 6px;
  1105.     margin-bottom: -1.8em;
  1106. }
  1107. .actions a { font-size: 1.2em; padding: 6px; }
  1108. .meta {
  1109.     margin-top: 6px;
  1110.     line-height: .8em;
  1111.     width: 100%;
  1112. }
  1113. div.postcontent, div.commentcontent {
  1114.     margin-left: 30px;
  1115. }
  1116. #main h4 {
  1117.     line-height: 1.1em;
  1118.     clear: both;
  1119.     margin-bottom: .5em;
  1120. }
  1121. .avatar {
  1122. position: relative;
  1123. left: 0px;
  1124. top: 5px;
  1125. margin-bottom: -20px;
  1126. }
  1127. #main #respond.replying, #main .commentlist li #respond.replying  {
  1128. position: absolute;
  1129. width: 100%;
  1130. height: 100%;  
  1131.     margin-left: 0 !important;
  1132.     z-index: 1000;
  1133.     left: 0px !important;
  1134. }
  1135. .single #main .postcontent {
  1136.     clear: both;
  1137.     margin: 0;
  1138.     padding: 0;
  1139. }
  1140. li #respond textarea {
  1141.     width: 80%;
  1142.     height: 80%;
  1143. }
  1144. #main h4 {
  1145.     position: relative;
  1146.     margin-left: 30px;
  1147. }
  1148. h1 a {
  1149.     display: block;
  1150.     width: 295px;
  1151.     font-family: Helvetica;
  1152. }
  1153. #footer {
  1154.     width: 100%;
  1155.     font-size: 8px;
  1156.     min-width: 0;
  1157. }
  1158. #main ul.commentlist, #main ul.commentlist ul {
  1159.     margin-left: 20px !important;
  1160. }
  1161.  
  1162. #wrapper {
  1163. width: 100%;
  1164.    
  1165.     min-width: 0;
  1166.     margin: 0;
  1167.     padding: 0;
  1168.     overflow: visible;
  1169.     position: static;
  1170. }
  1171. .avatar {
  1172.     width: 20px;
  1173.     height: 20px;
  1174. }
  1175. .sleeve_main {
  1176. width: 100%;
  1177.     margin: 0;
  1178. }
  1179. #header {
  1180.     padding: 0;
  1181.     margin: 0;
  1182.     width: 100%;
  1183. }
  1184.  
  1185. #main {
  1186.     margin: 0 10px;
  1187.     padding: 0;
  1188.     float: none;
  1189. }
  1190. #main ul#postlist ul li {
  1191.     margin-left: 0;
  1192. }
  1193. h1 {
  1194.     font-size: 2em;
  1195.     font-family: Georgia, "Times New Roman", serif;
  1196.     margin-left: 0;
  1197.     margin-top: 5px;
  1198.     margin-bottom: 10px;
  1199.     padding: 0;
  1200. }
  1201.  
  1202. h2 {
  1203.     font-size: 1.2em;
  1204.     font-weight: bold;
  1205.     color: #555;
  1206. }
  1207.  
  1208. #postbox form {
  1209.     padding: 5px;
  1210. }
  1211.  
  1212. #postbox textarea#posttext {
  1213.     height: 50px;
  1214.     border: 1px solid #c6d9e9;
  1215.     margin-bottom: 10px;
  1216.     padding: 2px;
  1217.     font: 1.4em/1.2em "Lucida Grande",Verdana,"Bitstream Vera Sans",Arial,sans-serif;
  1218. }
  1219. #postbox input#tags,  #commentform #comment {
  1220.     font-size: 1.2em;
  1221.     padding: 2px;
  1222.     border: 1px solid #c6d9e9;
  1223.     width: 300px;
  1224.     margin-left: 0;
  1225. }
  1226. #postbox {
  1227.     margin: 0;
  1228.     padding: 0;
  1229. }
  1230. #postbox label {
  1231.     color: #333;
  1232.     display: block;
  1233.     font-size: 1.2em;
  1234.     margin-bottom: 4px;
  1235.     margin-left: 0;
  1236.     font-weight: bold;
  1237. }
  1238. #postbox .inputarea {
  1239.     padding-left: 0;
  1240. }
  1241.  
  1242. #notify {
  1243.     width: 70%;
  1244. left: 15%;
  1245. top: 30%;
  1246. }
  1247. #postbox input#submit {
  1248.     font-size: 1.2em;
  1249.  
  1250.     margin-top: 5px;
  1251. }
  1252.  
  1253. #main ul {
  1254.     list-style: none;
  1255.     margin-top: 16px;
  1256.     margin-left: 0;
  1257. }
  1258.  
  1259. #wpcombar {
  1260.     display: none;
  1261. }
  1262. body {
  1263.     padding-top: 0 !important;
  1264. }
  1265. </style>
  1266. <?php } }
  1267. add_action('wp_head', 'iphone_css');
  1268.  
  1269. /*
  1270.     Modified to replace query string with blog url in output string
  1271. */
  1272. function prologue_get_comment_reply_link( $args = array(), $comment = null, $post = null ) {
  1273.     global $user_ID;
  1274.  
  1275.     $defaults = array('add_below' => 'comment', 'respond_id' => 'respond', 'reply_text' => __('Reply', 'p2'),
  1276.         'login_text' => __('Log in to Reply', 'p2'), 'depth' => 0, 'before' => '', 'after' => '');
  1277.  
  1278.     $args = wp_parse_args($args, $defaults);
  1279.     if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] )
  1280.         return;
  1281.  
  1282.     extract($args, EXTR_SKIP);
  1283.  
  1284.     $comment = get_comment($comment);
  1285.     $post = get_post($post);
  1286.  
  1287.     if ( 'open' != $post->comment_status )
  1288.         return false;
  1289.  
  1290.     $link = '';
  1291.  
  1292.     $reply_text = wp_specialchars( $reply_text );
  1293.  
  1294.     if ( get_option('comment_registration') && !$user_ID )
  1295.         $link = '<a rel="nofollow" href="' . site_url('wp-login.php?redirect_to=' . urlencode( get_permalink() ) ) . '">' . wp_specialchars( $login_text ) . '</a>';
  1296.     else
  1297.         $link = "<a rel='nofollow' class='comment-reply-link' href='". get_permalink($post). "#" . urlencode( $respond_id ) . "' onclick='return addComment.moveForm(\"" . js_escape( "$add_below-$comment->comment_ID" ) . "\", \"$comment->comment_ID\", \"" . js_escape( $respond_id ) . "\", \"$post->ID\")'>$reply_text</a>";
  1298.     return apply_filters('comment_reply_link', $before . $link . $after, $args, $comment, $post);
  1299. }
  1300.  
  1301. function prologue_comment_depth_loop( $comment_id, $depth )  {
  1302.     $comment = get_comment( $comment_id );
  1303.     if ( $comment->comment_parent != 0 ) {
  1304.         return prologue_comment_depth_loop( $comment->comment_parent, $depth + 1 );
  1305.     }
  1306.     return $depth;
  1307. }
  1308.  
  1309. function prologue_get_comment_depth( $comment_id ) {
  1310.     return prologue_comment_depth_loop( $comment_id, 1 );
  1311. }
  1312.  
  1313. function prologue_comment_depth( $comment_id ) {
  1314.     echo prologue_get_comment_depth( $comment_id );
  1315. }
  1316.  
  1317. function prologue_navigation() { ?>
  1318.     <div class="navigation"><p>
  1319.     <?php if(!is_single()) { ?>
  1320.         <?php posts_nav_link(' | ', __('&larr;&nbsp;Newer&nbsp;Posts', 'p2'), __('Older&nbsp;Posts&nbsp;&rarr;', 'p2')); ?>
  1321.     <?php } else { ?>
  1322.         <?php previous_post_link('%link', __('&larr;&nbsp;Older&nbsp;Posts', 'p2') ) ?> | <?php next_post_link('%link', __('Newer&nbsp;Posts&nbsp;&rarr;', 'p2')) ?>
  1323.     <?php } ?>
  1324. </p></div>
  1325. <?php }
  1326.  
  1327. function prologue_poweredby_link() {
  1328.     return apply_filters( 'prologue_poweredby_link',
  1329.         sprintf( __('<strong>%1$s</strong> is proudly powered by %2$s.', 'p2'),
  1330.         get_bloginfo('name'), '<a href="http://wordpress.org/" rel="generator">WordPress</a>' ) );
  1331. }
  1332.  
  1333. if ( defined('IS_WPCOM') && IS_WPCOM ) {
  1334.     add_filter( 'prologue_poweredby_link', returner('<a href="http://wordpress.com/">'.__('Blog at WordPress.com', 'p2').'.</a>') );
  1335. }