Skip to:
Content

bbPress.org

Changeset 2668


Ignore:
Timestamp:
12/03/2010 08:03:43 AM (14 years ago)
Author:
johnjamesjacoby
Message:

Add topic subscription ability. Fixes #1366 props GautamGupta va Google Code-in

Location:
branches/plugin
Files:
9 added
14 edited

Legend:

Unmodified
Added
Removed
  • branches/plugin/bbp-admin/bbp-functions.php

    r2652 r2668  
    3838function bbp_recount_list () {
    3939    $recount_list = array(
    40         5  => array( 'bbp-forum-topics',          __( 'Count topics in each forum',                'bbpress' ), 'bbp_recount_forum_topics'          ),
    41         10 => array( 'bbp-forum-replies',         __( 'Count replies in each forum',               'bbpress' ), 'bbp_recount_forum_replies'         ),
    42         15 => array( 'bbp-topic-replies',         __( 'Count replies in each topic',               'bbpress' ), 'bbp_recount_topic_replies'         ),
    43         20 => array( 'bbp-topic-voices',          __( 'Count voices in each topic',                'bbpress' ), 'bbp_recount_topic_voices'          ),
    44         25 => array( 'bbp-topic-trashed-replies', __( 'Count trashed replies in each topic',       'bbpress' ), 'bbp_recount_topic_trashed_replies' ),
    45         30 => array( 'bbp-topics-replied',        __( 'Count replies for each user',               'bbpress' ), 'bbp_recount_user_topics_replied'   ),
    46         35 => array( 'bbp-clean-favorites',       __( 'Remove deleted topics from user favorites', 'bbpress' ), 'bbp_recount_clean_favorites'       )
    47         //40 => array( 'bbp-topic-tag-count',       __( 'Count tags for every topic',                'bbpress' ), 'bbp_recount_topic_tags'            ),
    48         //45 => array( 'bbp-tags-tag-count',        __( 'Count topics for every tag',                'bbpress' ), 'bbp_recount_tag_topics'            ),
    49         //50 => array( 'bbp-tags-delete-empty',     __( 'Delete tags with no topics',                'bbpress' ), 'bbp_recount_tag_delete_empty'      )
     40        5  => array( 'bbp-forum-topics',          __( 'Count topics in each forum',                    'bbpress' ), 'bbp_recount_forum_topics'          ),
     41        10 => array( 'bbp-forum-replies',         __( 'Count replies in each forum',                   'bbpress' ), 'bbp_recount_forum_replies'         ),
     42        15 => array( 'bbp-topic-replies',         __( 'Count replies in each topic',                   'bbpress' ), 'bbp_recount_topic_replies'         ),
     43        20 => array( 'bbp-topic-voices',          __( 'Count voices in each topic',                    'bbpress' ), 'bbp_recount_topic_voices'          ),
     44        25 => array( 'bbp-topic-trashed-replies', __( 'Count trashed replies in each topic',           'bbpress' ), 'bbp_recount_topic_trashed_replies' ),
     45        30 => array( 'bbp-topics-replied',        __( 'Count replies for each user',                   'bbpress' ), 'bbp_recount_user_topics_replied'   ),
     46        35 => array( 'bbp-clean-favorites',       __( 'Remove trashed topics from user favorites',     'bbpress' ), 'bbp_recount_clean_favorites'       ),
     47        40 => array( 'bbp-clean-subscriptions',   __( 'Remove trashed topics from user subscriptions', 'bbpress' ), 'bbp_recount_clean_subscriptions'   )
     48        //45 => array( 'bbp-topic-tag-count',       __( 'Count tags for every topic',                'bbpress' ), 'bbp_recount_topic_tags'            ),
     49        //50 => array( 'bbp-tags-tag-count',        __( 'Count topics for every tag',                'bbpress' ), 'bbp_recount_tag_topics'            ),
     50        //55 => array( 'bbp-tags-delete-empty',     __( 'Delete tags with no topics',                'bbpress' ), 'bbp_recount_tag_delete_empty'      )
    5051    );
    5152
     
    449450    global $wpdb, $bbp;
    450451
    451     $statement = __( 'Removing deleted topics from user favorites… %s', 'bbpress' );
     452    $statement = __( 'Removing trashed topics from user favorites… %s', 'bbpress' );
    452453    $result    = __( 'Failed!', 'bbpress' );
    453454
     
    495496}
    496497
     498function bbp_recount_clean_subscriptions () {
     499    global $wpdb, $bbp;
     500
     501    $statement = __( 'Removing trashed topics from user subscriptions… %s', 'bbpress' );
     502    $result    = __( 'Failed!', 'bbpress' );
     503
     504    $users = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `subscriptions` FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_subscriptions';" );
     505    if ( is_wp_error( $users ) )
     506        return array( 1, sprintf( $statement, $result ) );
     507
     508    $topics = $wpdb->get_col( "SELECT `ID` FROM `$wpdb->posts` WHERE `post_type` = '$bbp->topic_id' AND `post_status` = 'publish';" );
     509    if ( is_wp_error( $topics ) )
     510        return array( 2, sprintf( $statement, $result ) );
     511
     512    $values = array();
     513    foreach ( $users as $user ) {
     514        if ( empty( $user->subscriptions ) || !is_string( $user->subscriptions ) )
     515            continue;
     516
     517        $subscriptions = array_intersect( $topics, (array) explode( ',', $user->subscriptions ) );
     518        if ( empty( $subscriptions ) || !is_array( $subscriptions ) )
     519            continue;
     520
     521        $subscriptions = join( ',', $subscriptions );
     522        $values[] = "('$user->user_id', '_bbp_subscriptions', '$subscriptions')";
     523    }
     524
     525    if ( !count( $values ) ) {
     526        $result = __( 'Nothing to remove!', 'bbpress' );
     527        return array( 0, sprintf( $statement, $result ) );
     528    }
     529
     530    $sql_delete = "DELETE FROM `$wpdb->usermeta` WHERE `meta_key` = '_bbp_subscriptions';";
     531    if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
     532        return array( 4, sprintf( $statement, $result ) );
     533
     534    $values = array_chunk( $values, 10000 );
     535    foreach ( $values as $chunk ) {
     536        $chunk = "\n" . join( ",\n", $chunk );
     537        $sql_insert = "INSERT INTO `$wpdb->usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
     538        if ( is_wp_error( $wpdb->query( $sql_insert ) ) )
     539            return array( 5, sprintf( $statement, $result ) );
     540    }
     541
     542    $result = __( 'Complete!', 'bbpress' );
     543    return array( 0, sprintf( $statement, $result ) );
     544}
     545
    497546?>
  • branches/plugin/bbp-admin/bbp-settings.php

    r2643 r2668  
    33function bbp_admin_settings () {
    44
    5     if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) ) {
    6         check_admin_referer( 'bbpress' );
     5    if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && !empty( $_POST['action'] ) && $_POST['action'] == '_bbp_update_settings' ) {
     6        check_admin_referer( '_bbp_settings' );
     7
     8        $options = array( '_bbp_edit_lock' => 'int', '_bbp_throttle_time' => 'int', '_bbp_enable_subscriptions' => 'bool' );
     9        foreach ( array_keys( $options ) as $option ) {
     10            $$option = trim( @$_POST[$option] );
     11            switch ( $options[$option] ) {
     12                case 'int':
     13                    $$option = intval( $$option );
     14                    break;
     15                case 'bool':
     16                    $$option = intval( $$option ) == 0 ? false : true;
     17                    break;
     18                case 'text':
     19                case 'default':
     20                    $$option = esc_attr( $$option );
     21                    break;
     22            }
     23            update_option( $option, $$option );
     24        }
     25
     26        bbp_admin_notices( __( 'Options successfully saved!' ) );
    727    } ?>
    828
     
    1434        <h2><?php _e( 'bbPress Settings', 'bbpress' ) ?></h2>
    1535
    16         <form name="form1" method="post" action="options.php">
     36        <form name="form1" method="post">
    1737
    1838            <table class="form-table">
    1939                <tr valign="top">
    2040                    <th scope="row"><label for="_bbp_edit_lock"><?php _e( 'Lock post editing after', 'bbpress' ); ?></label></th>
    21                     <td>
    22                         <input name="_bbp_edit_lock" type="text" id="posts_per_page" value="<?php form_option( '_bbp_edit_lock' ); ?>" class="small-text" /> <?php _e( 'minutes', 'bbpress' ); ?>
    23                     </td>
     41                    <td><input name="_bbp_edit_lock" type="text" id="posts_per_page" value="<?php form_option( '_bbp_edit_lock' ); ?>" class="small-text" /> <?php _e( 'minutes', 'bbpress' ); ?></td>
    2442                </tr>
    2543
    2644                <tr valign="top">
    27                     <th scope="row"><label for="_bbp_throttle_time"><?php _e( 'Throttle time' ); ?></label></th>
     45                    <th scope="row"><label for="_bbp_throttle_time"><?php _e( 'Throttle time', 'bbpress' ); ?></label></th>
    2846                    <td><input name="_bbp_throttle_time" type="text" id="posts_per_rss" value="<?php form_option( '_bbp_throttle_time' ); ?>" class="small-text" /> <?php _e( 'seconds', 'bbpress' ); ?></td>
     47                </tr>
     48
     49                <tr valign="top">
     50                    <th scope="row"><label for="_bbp_enable_subscriptions"><?php _e( 'Enable subscriptions', 'bbpress' ); ?></label></th>
     51                    <td><input id="_bbp_enable_subscriptions" name="_bbp_enable_subscriptions" type="checkbox" id="posts_per_rss" value="1" <?php checked( true, bbp_is_subscriptions_active() ); ?> class="small-text" /><label for="_bbp_enable_subscriptions"><?php _e( 'Allow users to subscribe to topics', 'bbpress' ); ?></label></td>
    2952                </tr>
    3053
     
    3255
    3356            <p class="submit">
    34                 <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e( 'Save Changes' ); ?>" />
     57                <?php wp_nonce_field( '_bbp_settings' ); ?>
     58                <input type="hidden" name="action" value="_bbp_update_settings" />
     59                <input type="submit" name="submit" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'bbpress' ); ?>" />
    3560            </p>
    3661        </form>
  • branches/plugin/bbp-includes/bbp-functions.php

    r2660 r2668  
    115115        // Handle Tags
    116116        if ( isset( $_POST['bbp_topic_tags'] ) && !empty( $_POST['bbp_topic_tags'] ) ) {
    117             // Escape tag input
    118             $terms = esc_html( $_POST['bbp_topic_tags'] );
    119 
    120             // Explode by comma
    121             if ( strstr( $terms, ',' ) )
    122                 $terms = explode( ',', $terms );
    123 
    124             // Add topic tag ID as main key
    125             $terms = array( $bbp->topic_tag_id => $terms );
    126 
    127             // @todo - Handle adding of tags from reply
     117            $terms = $_POST['bbp_topic_tags'];
     118            wp_set_post_terms( $topic_id, $terms, $bbp->topic_tag_id, true );
    128119        }
    129120
     
    149140            // Check for missing reply_id or error
    150141            if ( !empty( $reply_id ) && !is_wp_error( $reply_id ) ) {
     142
     143                // Handle Subscription Checkbox
     144                if ( bbp_is_subscriptions_active() ) {
     145                    $subscribed = bbp_is_user_subscribed( $reply_data['post_author'], $topic_id ) ? true : false;
     146                    $subscheck  = ( !empty( $_POST['bbp_topic_subscription'] ) && 'bbp_subscribe' == $_POST['bbp_topic_subscription'] ) ? true : false;
     147
     148                    if ( true == $subscribed && false == $subscheck )
     149                        bbp_remove_user_subscription( $reply_data['post_author'], $topic_id );
     150                    elseif ( false == $subscribed && true == $subscheck )
     151                        bbp_add_user_subscription( $reply_data['post_author'], $topic_id );
     152                }
    151153
    152154                // Redirect back to new reply
     
    233235            if ( !empty( $topic_id ) && !is_wp_error( $topic_id ) ) {
    234236
     237                if ( bbp_is_subscriptions_active() ) {
     238                    if ( !empty( $_POST['bbp_topic_subscription'] ) && 'bbp_subscribe' == $_POST['bbp_topic_subscription'] )
     239                        bbp_add_user_subscription( $topic_data['post_author'], $topic_id );
     240                }
     241
    235242                // Redirect back to new reply
    236243                wp_redirect( bbp_get_topic_permalink( $topic_id ) . '#topic-' . $topic_id );
     
    253260
    254261    // Only proceed if GET is a favorite action
    255     if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['action'] ) && !empty( $_GET['topic_id'] ) ) {
     262    if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'bbp_favorite_add', 'bbp_favorite_remove' ) ) && !empty( $_GET['topic_id'] ) ) {
     263        // What action is taking place?
     264        $action       = $_GET['action'];
    256265
    257266        // Load user info
     
    259268        $user_id      = $current_user->ID;
    260269
    261         // Check users ability to create new reply
     270        // Check current user's ability to edit the user
    262271        if ( !current_user_can( 'edit_user', $user_id ) )
    263272            return false;
    264 
    265         // What action is taking place?
    266         $action       = $_GET['action'];
    267273
    268274        // Load favorite info
     
    296302}
    297303add_action( 'template_redirect', 'bbp_favorites_handler' );
     304
     305/**
     306 * bbp_subscriptions_handler ()
     307 *
     308 * Handles the front end subscribing and unsubscribing topics
     309 */
     310function bbp_subscriptions_handler () {
     311    global $bbp, $current_user;
     312
     313    if ( !bbp_is_subscriptions_active() )
     314        return false;
     315
     316    // Only proceed if GET is a favorite action
     317    if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'bbp_subscribe', 'bbp_unsubscribe' ) ) && !empty( $_GET['topic_id'] ) ) {
     318        // What action is taking place?
     319        $action = $_GET['action'];
     320
     321        // Load user info
     322        $current_user = wp_get_current_user();
     323        $user_id      = $current_user->ID;
     324
     325        // Check current user's ability to edit the user
     326        if ( !current_user_can( 'edit_user', $user_id ) )
     327            return false;
     328
     329        // Load subscription info
     330        $topic_id         = intval( $_GET['topic_id'] );
     331        $is_subscription  = bbp_is_user_subscribed( $user_id, $topic_id );
     332        $success          = false;
     333
     334        if ( !empty( $topic_id ) && !empty( $user_id ) ) {
     335
     336            if ( $is_subscription && 'bbp_unsubscribe' == $action )
     337                $success = bbp_remove_user_subscription( $user_id, $topic_id );
     338            elseif ( !$is_subscription && 'bbp_subscribe' == $action )
     339                $success = bbp_add_user_subscription( $user_id, $topic_id );
     340
     341            // Do additional subscriptions actions
     342            do_action( 'bbp_subscriptions_handler', $success, $user_id, $topic_id, $action );
     343
     344            // Check for missing reply_id or error
     345            if ( true == $success ) {
     346
     347                // Redirect back to new reply
     348                $redirect = bbp_get_topic_permalink( $topic_id );
     349                wp_redirect( $redirect );
     350
     351                // For good measure
     352                exit();
     353            }
     354        }
     355    }
     356}
     357add_action( 'template_redirect', 'bbp_subscriptions_handler' );
    298358
    299359/**
     
    364424 *
    365425 * @package bbPress
    366  * @subpackage Template Tags
     426 * @subpackage Functions
    367427 * @since bbPress (r2628)
    368428 *
     
    390450 *
    391451 * @package bbPress
    392  * @subpackage Template Tags
     452 * @subpackage Functions
    393453 * @since bbPress (r2628)
    394454 *
     
    402462}
    403463
     464/** Favorites *****************************************************************/
     465
    404466/**
    405467 * bbp_remove_topic_from_all_favorites ()
     
    408470 *
    409471 * @package bbPress
    410  * @subpackage Template Tags
     472 * @subpackage Functions
    411473 * @since bbPress (r2652)
    412474 *
     475 * @uses bbp_get_topic_favoriters ()
    413476 * @param int $topic_id Topic ID to remove
    414477 * @return void
    415478 */
    416479function bbp_remove_topic_from_all_favorites ( $topic_id = 0 ) {
    417     global $wpdb;
    418 
    419     if ( $users = $wpdb->get_col( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '_bbp_favorites' and FIND_IN_SET('{$topic_id}', meta_value) > 0" ) )
     480    if ( empty( $topic_id ) )
     481        return;
     482
     483    if ( $users = bbp_get_topic_favoriters( $topic_id ) )
    420484        foreach ( $users as $user )
    421485            bbp_remove_user_favorite( $user, $topic_id );
     
    424488add_action( 'delete_post', 'bbp_remove_topic_from_all_favorites' );
    425489
     490/** Subscriptions *************************************************************/
     491
     492/**
     493 * bbp_remove_topic_from_all_subscriptions ()
     494 *
     495 * Remove a deleted topic from all users' subscriptions
     496 *
     497 * @package bbPress
     498 * @subpackage Functions
     499 * @since bbPress (r2652)
     500 *
     501 * @uses bbp_get_topic_subscribers ()
     502 * @param int $topic_id Topic ID to remove
     503 * @return void
     504 */
     505function bbp_remove_topic_from_all_subscriptions ( $topic_id = 0 ) {
     506    if ( empty( $topic_id ) )
     507        return;
     508
     509    if ( !bbp_is_subscriptions_active() )
     510        return;
     511
     512    if ( $users = bbp_get_topic_subscribers( $topic_id ) ) {
     513        foreach ( $users as $user ) {
     514            bbp_remove_user_subscription( $user, $topic_id );
     515        }
     516    }
     517}
     518add_action( 'trash_post',  'bbp_remove_topic_from_all_subscriptions' );
     519add_action( 'delete_post', 'bbp_remove_topic_from_all_subscriptions' );
     520
     521/**
     522 * bbp_is_subscriptions_active ()
     523 *
     524 * Checks if subscription feature is enabled.
     525 *
     526 * @package bbPress
     527 * @subpackage Functions
     528 * @since bbPress (r2658)
     529 *
     530 * @return bool Is subscription enabled or not
     531 */
     532function bbp_is_subscriptions_active () {
     533    return (bool) get_option( '_bbp_enable_subscriptions' );
     534}
     535
     536/**
     537 * bbp_notify_subscribers ()
     538 *
     539 * Sends notification emails for new posts.
     540 *
     541 * Gets new post's ID and check if there are subscribed
     542 * user to that topic, and if there are, send notifications
     543 *
     544 * @package bbPress
     545 * @subpackage Functions
     546 * @since bbPress (r2668)
     547 *
     548 * @todo When Akismet is made to work with bbPress posts, add a check if the post is spam or not, to avoid sending out spam mails
     549 *
     550 * @param int $reply_id ID of the newly made reply
     551 * @return bool True on success, false on failure
     552 */
     553function bbp_notify_subscribers ( $reply_id = 0 ) {
     554    global $bbp, $wpdb;
     555
     556    if ( !bbp_is_subscriptions_active() )
     557        return false;
     558
     559    if ( !$reply = get_post( $reply_id ) )
     560        return false;
     561
     562    if ( $reply->post_type != $bbp->reply_id || empty( $reply->post_parent ) )
     563        return false;
     564
     565    if ( !$topic = get_post( $post->post_parent ) )
     566        return false;
     567
     568    $reply_id = $reply->ID;
     569    $topic_id = $topic->ID;
     570
     571    if ( !$poster_name = get_the_author_meta( 'display_name', $reply->post_author ) )
     572        return false;
     573
     574    do_action( 'bbp_pre_notify_subscribers', $reply_id, $topic_id );
     575
     576    // Get the users who have favorited the topic and have subscriptions on
     577    if ( !$user_ids = bbp_get_topic_subscribers( $topic_id, true ) )
     578        return false;
     579
     580    foreach ( (array) $user_ids as $user_id ) {
     581
     582        // Don't send notifications to the person who made the post
     583        if ( $user_id == $reply->post_author )
     584            continue;
     585
     586        // For plugins
     587        if ( !$message = apply_filters( 'bbp_subscription_mail_message', __( "%1\$s wrote:\n\n%2\$s\n\nPost Link: %3\$s\n\nYou're getting this mail because you subscribed to the topic, visit the topic and login to unsubscribe." ), $reply_id, $topic_id ) )
     588            continue;
     589
     590        $user = get_userdata( $user_id );
     591
     592        wp_mail(
     593            $user->user_email,
     594            apply_filters( 'bbp_subscription_mail_title', '[' . get_option( 'blogname' ) . '] ' . $topic->post_title, $reply_id, $topic_id ),
     595            sprintf( $message, $poster_name, strip_tags( $reply->post_content ), bbp_get_reply_permalink( $reply_id ) )
     596        );
     597    }
     598
     599    do_action( 'bbp_post_notify_subscribers', $reply_id, $topic_id );
     600
     601    return true;
     602}
     603add_action( 'bbp_new_reply', 'bbp_notify_subscribers' );
     604
    426605?>
  • branches/plugin/bbp-includes/bbp-template.php

    r2667 r2668  
    28272827
    28282828/**
     2829 * bbp_is_subscriptions ()
     2830 *
     2831 * Check if current page is a bbPress user's subscriptions page (author page)
     2832 *
     2833 * @since bbPress (r2652)
     2834 *
     2835 * @return bool
     2836 */
     2837function bbp_is_subscriptions () {
     2838    return (bool) is_author();
     2839}
     2840
     2841/**
    28292842 * bbp_is_user_home ()
    28302843 *
     
    28872900 * bbp_user_favorites_link ()
    28882901 *
    2889  * Output the link to the user's favorites page (author page)
     2902 * Output the link to make a topic favorite/remove a topic from favorites
    28902903 *
    28912904 * @package bbPress
     
    28972910 * @param int $user_id optional
    28982911 *
    2899  * @uses bbp_get_favorites_link()
     2912 * @uses bbp_get_user_favorites_link()
    29002913 */
    29012914function bbp_user_favorites_link ( $add = array(), $rem = array(), $user_id = 0 ) {
     
    29052918     * bbp_get_user_favorites_link ()
    29062919     *
    2907      * Return the link to the user's favorites page (author page)
     2920     * Return the link to make a topic favorite/remove a topic from favorites
    29082921     *
    29092922     * @package bbPress
     
    29162929     *
    29172930     * @uses apply_filters
    2918      * @uses get_author_posts_url
    29192931     * @return string Permanent link to topic
    29202932     */
     
    29642976        }
    29652977
     2978        // Create the link based where the user is and if the topic is already the user's favorite
    29662979        $permalink = bbp_is_favorites() ? bbp_get_favorites_permalink( $user_id ) : bbp_get_topic_permalink( $topic_id );
    29672980        $url       = esc_url( wp_nonce_url( add_query_arg( $favs, $permalink ), 'toggle-favorite_' . $topic_id ) );
    29682981        $is_fav    = $is_fav ? 'is-favorite' : '';
    2969 
    2970         return apply_filters( 'bbp_get_user_favorites_link', "<span id='favorite-toggle'><span id='favorite-$topic_id' class='$is_fav'>$pre<a href='$url' class='dim:favorite-toggle:favorite-$topic_id:is-favorite'>$mid</a>$post</span></span>" );
     2982        $html      = '<span id="favorite-toggle"><span id="favorite-' . $topic_id . '" class="' . $is_fav . '">' . $pre . '<a href="' . $url . '" class="dim:favorite-toggle:favorite-' . $topic_id . ':is-favorite">' . $mid . '</a>' . $post . '</span></span>';
     2983
     2984        // Return the link
     2985        return apply_filters( 'bbp_get_user_favorites_link', $html, $add, $rem, $user_id, $topic_id );
    29712986    }
    29722987
    29732988/** END Favorites Functions ***************************************************/
     2989
     2990/** START Subscriptions Functions *********************************************/
     2991
     2992/**
     2993 * bbp_user_subscribe_link ()
     2994 *
     2995 * Output the link to subscribe/unsubscribe from a topic
     2996 *
     2997 * @package bbPress
     2998 * @subpackage Template Tags
     2999 * @since bbPress (r2668)
     3000 *
     3001 * @param mixed $args
     3002 *
     3003 * @uses bbp_get_user_subscribe_link()
     3004 */
     3005function bbp_user_subscribe_link ( $args = '' ) {
     3006    echo bbp_get_user_subscribe_link( $args );
     3007}
     3008    /**
     3009     * bbp_get_user_subscribe_link ()
     3010     *
     3011     * Return the link to subscribe/unsubscribe from a topic
     3012     *
     3013     * @package bbPress
     3014     * @subpackage Template Tags
     3015     * @since bbPress (r2668)
     3016     *
     3017     * @param mixed $args
     3018     *
     3019     * @uses apply_filters
     3020     * @return string Permanent link to topic
     3021     */
     3022    function bbp_get_user_subscribe_link ( $args = '' ) {
     3023        if ( !bbp_is_subscriptions_active() )
     3024            return;
     3025
     3026        $defaults = array (
     3027            'subscribe'     => __( 'Subscribe',   'bbpress' ),
     3028            'unsubscribe'   => __( 'Unsubscribe', 'bbpress' ),
     3029            'user_id'       => 0,
     3030            'topic_id'      => 0,
     3031            'before'        => '&nbsp;|&nbsp;',
     3032            'after'         => ''
     3033        );
     3034
     3035        $args = wp_parse_args( $args, $defaults );
     3036        extract( $args );
     3037
     3038        // Try to get a user_id from $current_user
     3039        if ( empty( $user_id ) ) {
     3040            global $current_user;
     3041            $current_user = wp_get_current_user();
     3042
     3043            // Return if not logged in
     3044            if ( !$user_id = $current_user->ID ) {
     3045                return false;
     3046            }
     3047        }
     3048
     3049        if ( !current_user_can( 'edit_user', (int) $user_id ) )
     3050            return false;
     3051
     3052        if ( !$topic_id = bbp_get_topic_id( $topic_id ) )
     3053            return false;
     3054
     3055        if ( $is_subscribed = bbp_is_user_subscribed( $user_id, $topic_id ) ) {
     3056            $text = $unsubscribe;
     3057            $query_args  = array( 'action' => 'bbp_unsubscribe', 'topic_id' => $topic_id );
     3058        } else {
     3059            $text = $subscribe;
     3060            $query_args = array( 'action' => 'bbp_subscribe', 'topic_id' => $topic_id );
     3061        }
     3062
     3063        // Create the link based where the user is and if the user is subscribed already
     3064        $permalink     = bbp_is_subscriptions() ? bbp_get_favorites_permalink( $user_id ) : bbp_get_topic_permalink( $topic_id );
     3065        $url           = esc_url( wp_nonce_url( add_query_arg( $query_args, $permalink ), 'toggle-subscription_' . $topic_id ) );
     3066        $is_subscribed = $is_subscribed ? 'is-subscribed' : '';
     3067        $html          = '<span id="subscription-toggle">' . $before . '<span id="subscribe-' . $topic_id . '" class="' . $is_subscribed . '"><a href="' . $url . '" class="dim:subscription-toggle:subscribe-' . $topic_id . ':is-subscribed">' . $text . '</a></span>' . $after . '</span>';
     3068
     3069        // Return the link
     3070        return apply_filters( 'bbp_get_user_subscribe_link', $html, $subscribe, $unsubscribe, $user_id, $topic_id );
     3071    }
     3072
     3073/** END Subscriptions Functions ***********************************************/
    29743074
    29753075/** START User Functions ******************************************************/
  • branches/plugin/bbp-includes/bbp-users.php

    r2660 r2668  
    4141
    4242/**
    43  * bbp_get_user_favorites_topic_ids ()
    44  *
    45  * Get a user's favorite topics' IDs
     43 * bbp_get_topic_favoriters ()
     44 *
     45 * Get the users who have made the topic favorite
     46 *
     47 * @package bbPress
     48 * @subpackage Users
     49 * @since bbPress (r2658)
     50 *
     51 * @param int $topic_id Topic ID
     52 * @return array|bool Results if the topic has any favoriters, otherwise false
     53 */
     54function bbp_get_topic_favoriters ( $topic_id = 0 ) {
     55    if ( empty( $topic_id ) )
     56        return;
     57
     58    global $wpdb;
     59
     60    // Get the users who have favorited the topic
     61    $users = $wpdb->get_col( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '_bbp_favorites' and FIND_IN_SET('{$topic_id}', meta_value) > 0" );
     62    $users = apply_filters( 'bbp_get_topic_favoriters', $users, $topic_id );
     63
     64    if ( !empty( $users ) )
     65        return $users;
     66
     67    return false;
     68}
     69
     70/**
     71 * bbp_get_user_favorites ()
     72 *
     73 * Get a user's favorite topics
    4674 *
    4775 * @package bbPress
     
    4977 * @since bbPress (r2652)
    5078 *
    51  * @param int $user_id User ID
    52  * @return array|bool Results if user has favorites, otherwise false
    53  */
    54 function bbp_get_user_favorites_topic_ids ( $user_id = 0 ) {
    55     if ( empty( $user_id ) )
    56         return;
    57 
    58     $favorites = (string) get_user_meta( $user_id, '_bbp_favorites', true );
    59     $favorites = (array) explode( ',', $favorites );
    60     $favorites = array_filter( $favorites );
    61 
    62     if ( !empty( $favorites ) )
    63         return $favorites;
    64 
    65     return false;
    66 }
    67 
    68 /**
    69  * bbp_get_user_favorites ()
    70  *
    71  * Get a user's favorite topics
    72  *
    73  * @package bbPress
    74  * @subpackage Users
    75  * @since bbPress (r2652)
    76  *
    77  * @todo Pagination
     79 * @uses bbp_get_user_favorites_topic_ids ()
    7880 *
    7981 * @param int $user_id User ID
     
    9597    if ( !empty( $favorites ) ) {
    9698        $query = bbp_has_topics( array( 'post__in' => $favorites, 'posts_per_page' => -1 ) );
    97         return $query;
    98     }
    99 
    100     return false;
    101 }
     99        return apply_filters( 'bbp_get_user_favorites', $query, $user_id );
     100    }
     101
     102    return false;
     103}
     104
     105    /**
     106     * bbp_get_user_favorites_topic_ids ()
     107     *
     108     * Get a user's favorite topics' IDs
     109     *
     110     * @package bbPress
     111     * @subpackage Users
     112     * @since bbPress (r2652)
     113     *
     114     * @param int $user_id User ID
     115     * @return array|bool Results if user has favorites, otherwise false
     116     */
     117    function bbp_get_user_favorites_topic_ids ( $user_id = 0 ) {
     118        if ( empty( $user_id ) )
     119            return;
     120
     121        $favorites = (string) get_user_meta( $user_id, '_bbp_favorites', true );
     122        $favorites = (array) explode( ',', $favorites );
     123        $favorites = array_filter( $favorites );
     124        $favorites = apply_filters( 'bbp_get_user_favorites_topic_ids', $favorites, $user_id );
     125
     126        if ( !empty( $favorites ) )
     127            return $favorites;
     128
     129        return false;
     130    }
    102131
    103132/**
     
    141170
    142171    if ( isset( $favorites ) )
    143         return in_array( $topic_id, $favorites );
     172        return apply_filters( 'bbp_is_user_favorite', (bool) in_array( $topic_id, $favorites ), $user_id, $topic_id, $favorites );
    144173
    145174    return false;
     
    220249/** END - Favorites ***********************************************************/
    221250
     251/** START - Subscriptions *****************************************************/
     252
     253/**
     254 * bbp_get_topic_subscribers ()
     255 *
     256 * Get the users who have subscribed to the topic
     257 *
     258 * @package bbPress
     259 * @subpackage Users
     260 * @since bbPress (r2668)
     261 *
     262 * @param int $topic_id Topic ID
     263 * @return array|bool Results if the topic has any subscribers, otherwise false
     264 */
     265function bbp_get_topic_subscribers ( $topic_id = 0 ) {
     266    if ( empty( $topic_id ) )
     267        return;
     268
     269    global $wpdb;
     270
     271    // Get the users who have favorited the topic
     272    $users = $wpdb->get_col( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '_bbp_subscriptions' and FIND_IN_SET('{$topic_id}', meta_value) > 0" );
     273    $users = apply_filters( 'bbp_get_topic_subscribers', $users );
     274
     275    if ( !empty( $users ) )
     276        return $users;
     277
     278    return false;
     279}
     280
     281/**
     282 * bbp_get_user_subscriptions ()
     283 *
     284 * Get a user's subscribed topics
     285 *
     286 * @package bbPress
     287 * @subpackage Users
     288 * @since bbPress (r2668)
     289 *
     290 * @uses bbp_get_user_subscribed_topic_ids ()
     291 *
     292 * @param int $user_id User ID
     293 * @return array|bool Results if user has subscriptions, otherwise false
     294 */
     295function bbp_get_user_subscriptions ( $user_id = 0 ) {
     296    // Default to author
     297    if ( empty( $user_id ) )
     298        $user_id = get_the_author_meta( 'ID' );
     299
     300    // If nothing passed and not an author page, return nothing
     301    if ( empty( $user_id ) )
     302        return false;
     303
     304    // Get users' subscriptions
     305    $subscriptions = bbp_get_user_subscribed_topic_ids( $user_id );
     306
     307    // If user has subscriptions, load them
     308    if ( !empty( $subscriptions ) ) {
     309        $query = bbp_has_topics( array( 'post__in' => $subscriptions, 'posts_per_page' => -1 ) );
     310        return apply_filters( 'bbp_get_user_subscriptions', $query );
     311    }
     312
     313    return false;
     314}
     315
     316    /**
     317     * bbp_get_user_subscribed_topic_ids ()
     318     *
     319     * Get a user's subscribed topics' IDs
     320     *
     321     * @package bbPress
     322     * @subpackage Users
     323     * @since bbPress (r2668)
     324     *
     325     * @param int $user_id User ID
     326     * @return array|bool Results if user has subscriptions, otherwise false
     327     */
     328    function bbp_get_user_subscribed_topic_ids ( $user_id = 0 ) {
     329        if ( empty( $user_id ) )
     330            return;
     331
     332        $subscriptions = (string) get_user_meta( $user_id, '_bbp_subscriptions', true );
     333        $subscriptions = (array) explode( ',', $subscriptions );
     334        $subscriptions = array_filter( $subscriptions );
     335        $subscriptions = apply_filters( 'bbp_get_user_subscribed_topic_ids', $subscriptions );
     336
     337        if ( !empty( $subscriptions ) )
     338            return $subscriptions;
     339
     340        return false;
     341    }
     342
     343/**
     344 * bbp_is_user_subscribed ()
     345 *
     346 * Check if a topic is in user's subscription list or not
     347 *
     348 * @package bbPress
     349 * @subpackage Users
     350 * @since bbPress (r2668)
     351 *
     352 * @param int $user_id User ID
     353 * @param int $topic_id Topic ID
     354 * @return bool True if the topic is in user's subscriptions, otherwise false
     355 */
     356function bbp_is_user_subscribed ( $user_id = 0, $topic_id = 0 ) {
     357    global $post, $current_user;
     358
     359    if ( empty( $user_id ) ) {
     360        $current_user = wp_get_current_user();
     361        $user_id      = $current_user->ID;
     362    }
     363
     364    if ( empty( $user_id ) )
     365        return false;
     366
     367    $subscriptions = bbp_get_user_subscribed_topic_ids( $user_id );
     368
     369    if ( !empty( $topic_id ) ) {
     370        $post = get_post( $topic_id );
     371        $topic_id = $post->ID;
     372    } elseif ( !$topic_id = bbp_get_topic_id() ) {
     373        if ( empty( $post ) )
     374            return false;
     375
     376        $topic_id = $post->ID;
     377    }
     378
     379    if ( empty( $subscriptions ) || empty( $topic_id ) )
     380        return false;
     381
     382    if ( isset( $subscriptions ) )
     383        return apply_filters( 'bbp_is_user_subscribed', (bool) in_array( $topic_id, $subscriptions ), $user_id, $topic_id, $subscriptions );
     384
     385    return false;
     386}
     387
     388/**
     389 * bbp_add_user_subscription ()
     390 *
     391 * Add a topic to user's subscriptions
     392 *
     393 * @package bbPress
     394 * @subpackage Users
     395 * @since bbPress (r2668)
     396 *
     397 * @param int $user_id User ID
     398 * @param int $topic_id Topic ID
     399 * @return bool True
     400 */
     401function bbp_add_user_subscription ( $user_id = 0, $topic_id = 0 ) {
     402    if ( empty( $user_id ) || empty( $topic_id ) )
     403        return false;
     404
     405    $subscriptions = (array) bbp_get_user_subscribed_topic_ids( $user_id );
     406    $topic         = get_post( $topic_id );
     407
     408    if ( empty( $subscriptions ) || empty( $topic ) )
     409        return false;
     410
     411    if ( !in_array( $topic_id, $subscriptions ) ) {
     412        $subscriptions[] = $topic_id;
     413        $subscriptions   = array_filter( $subscriptions );
     414        $subscriptions   = (string) implode( ',', $subscriptions );
     415        update_user_meta( $user_id, '_bbp_subscriptions', $subscriptions );
     416    }
     417
     418    do_action( 'bbp_add_user_subscription', $user_id, $topic_id );
     419
     420    return true;
     421}
     422
     423/**
     424 * bbp_remove_user_subscription ()
     425 *
     426 * Remove a topic from user's subscriptions
     427 *
     428 * @package bbPress
     429 * @subpackage Users
     430 * @since bbPress (r2668)
     431 *
     432 * @param int $user_id User ID
     433 * @param int $topic_id Topic ID
     434 * @return bool True if the topic was removed from user's subscriptions, otherwise false
     435 */
     436function bbp_remove_user_subscription ( $user_id, $topic_id ) {
     437    if ( empty( $user_id ) || empty( $topic_id ) )
     438        return false;
     439
     440    $subscriptions = (array) bbp_get_user_subscribed_topic_ids( $user_id );
     441
     442    if ( empty( $subscriptions ) )
     443        return false;
     444
     445    if ( is_int( $pos = array_search( $topic_id, $subscriptions ) ) ) {
     446        array_splice( $subscriptions, $pos, 1 );
     447        $subscriptions = array_filter( $subscriptions );
     448
     449        if ( !empty( $subscriptions ) ) {
     450            $subscriptions = implode( ',', $subscriptions );
     451            update_user_meta( $user_id, '_bbp_subscriptions', $subscriptions );
     452        } else {
     453            delete_user_meta( $user_id, '_bbp_subscriptions' );
     454        }
     455    }
     456
     457    do_action( 'bbp_remove_user_subscription', $user_id, $topic_id );
     458
     459    return true;
     460}
     461
     462/** END - Subscriptions *******************************************************/
     463
    222464/**
    223465 * bbp_get_user_topics_started ()
     
    227469 * @package bbPress
    228470 * @subpackage Users
    229  * @since bbPress (r2652)
     471 * @since bbPress (r2660)
    230472 *
    231473 * @param int $user_id User ID
  • branches/plugin/bbp-themes/bbp-twentyten/author.php

    r2665 r2668  
    11<?php
    22/**
    3  * Template Name: bbPress - User Profile
     3 * Template Name: bbPress - Author
    44 *
    55 * @package bbPress
     
    1313            <div id="content" role="main">
    1414
    15                 <?php if ( have_posts() ) the_post(); ?>
     15                <?php
     16                    // Profile details
     17                    get_template_part( 'profile', 'bbp_details' );
    1618
    17                 <span class="page-title author"><?php printf( __( 'Profile: %s', 'twentyten' ), "<span class='vcard'><a class='url fn n' href='" . get_author_posts_url( get_the_author_meta( 'ID' ) ) . "' title='" . esc_attr( get_the_author() ) . "' rel='me'>" . get_the_author() . "</a></span>" ); ?></span>
     19                    // Subsciptions
     20                    get_template_part( 'profile', 'bbp_subscriptions' );
    1821
    19                 <div id="entry-author-info">
    20                     <div id="author-avatar">
     22                    // Favorite topics
     23                    get_template_part( 'profile', 'bbp_favorites' );
    2124
    22                         <?php echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'twentyten_author_bio_avatar_size', 60 ) ); ?>
     25                    // Topics created
     26                    get_template_part( 'profile', 'bbp_topics_created' );
    2327
    24                     </div><!-- #author-avatar -->
    25                     <div id="author-description">
    26                         <h1><?php printf( __( 'About %s', 'twentyten' ), get_the_author() ); ?></h1>
    27 
    28                         <?php the_author_meta( 'description' ); ?>
    29 
    30                     </div><!-- #author-description  -->
    31                 </div><!-- #entry-author-info -->
    32 
    33                 <div id="bbp-author-favorites" class="bbp-author-favorites">
    34                     <hr />
    35                     <h2 class="entry-title"><?php _e( 'Favorite Forum Topics', 'bbpress' ); ?></h2>
    36                     <div class="entry-content">
    37 
    38                         <?php if ( bbp_get_user_favorites() ) :
    39 
    40                             get_template_part( 'loop', 'bbp_topics' );
    41 
    42                         else : ?>
    43 
    44                             <p><?php bbp_is_user_home() ? _e( 'You currently have no favorite topics.', 'bbpress' ) : _e( 'This user has no favorite topics.', 'bbpress' ); ?></p>
    45 
    46                         <?php endif; ?>
    47 
    48                     </div>
    49                 </div><!-- #bbp-author-favorites -->
    50 
    51                 <div id="bbp-author-topics-started" class="bbp-author-topics-started">
    52                     <hr />
    53                     <h2 class="entry-title"><?php _e( 'Forum Topics Created', 'bbpress' ); ?></h2>
    54                     <div class="entry-content">
    55 
    56                         <?php if ( bbp_get_user_topics_started() ) :
    57 
    58                             get_template_part( 'loop', 'bbp_topics' );
    59 
    60                         else : ?>
    61 
    62                             <p><?php bbp_is_user_home() ? _e( 'You have not created any topics.', 'bbpress' ) : _e( 'This user has not created any topics.', 'bbpress' ); ?></p>
    63 
    64                         <?php endif; ?>
    65 
    66                     </div>
    67                 </div><!-- #bbp-author-topics-started -->
    68 
    69 
    70                 <div id="bbp-author-blog-posts" class="bbp-author-blog-posts">
    71                     <hr />
    72                     <h2 class="entry-title"><?php _e( 'Blog Posts', 'bbpress' ); ?></h2>
    73 
    74                     <div class="entry-content">
    75 
    76                     <?php rewind_posts(); ?>
    77 
    78                     <?php get_template_part( 'loop', 'author' ); ?>
    79                     </div>
    80                 </div><!-- #bbp-author-blog-posts -->
     28                    // Blog posts
     29                    get_template_part( 'profile', 'posts' );
     30                ?>
    8131
    8232            </div><!-- #content -->
  • branches/plugin/bbp-themes/bbp-twentyten/form-bbp_reply.php

    r2623 r2668  
    2424                    </p>
    2525
     26                    <?php if ( bbp_is_subscriptions_active() ) : ?>
     27
     28                        <p>
     29                            <input name="bbp_topic_subscription" id="bbp_topic_subscription" type="checkbox" value="bbp_subscribe"<?php checked( true, bbp_is_user_subscribed() ); ?> tabindex="7" />
     30                            <label for="bbp_topic_subscription"><?php _e( 'Notify me of follow-up replies via email', 'bbpress' ); ?></label>
     31                        </p>
     32
     33                    <?php endif; ?>
     34
    2635                    <p align="right">
    27                         <button type="submit" tabindex="6" id="bbp_reply_submit" name="bbp_reply_submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
     36                        <button type="submit" tabindex="9" id="bbp_reply_submit" name="bbp_reply_submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
    2837                    </p>
    2938                </div>
  • branches/plugin/bbp-themes/bbp-twentyten/form-bbp_topic.php

    r2623 r2668  
    3838                    <?php endif; ?>
    3939
     40                    <?php if ( bbp_is_subscriptions_active() ) : ?>
     41
     42                        <p>
     43                            <input name="bbp_topic_subscription" id="bbp_topic_subscription" type="checkbox" value="bbp_subscribe" tabindex="9" />
     44                            <label for="bbp_topic_subscription"><?php _e( 'Notify me of follow-up replies via email', 'bbpress' ); ?></label>
     45                        </p>
     46
     47                    <?php endif; ?>
     48
    4049                    <p align="right">
    41                         <button type="submit" tabindex="7" id="bbp_topic_submit" name="bbp_topic_submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
     50                        <button type="submit" tabindex="11" id="bbp_topic_submit" name="bbp_topic_submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
    4251                    </p>
    4352                </div>
  • branches/plugin/bbp-themes/bbp-twentyten/functions.php

    r2660 r2668  
    11<?php
     2
     3/**
     4 * bbp_twentyten_enqueue_styles ()
     5 *
     6 * Load the theme CSS
     7 */
     8function bbp_twentyten_enqueue_styles () {
     9    // Default styling, taken from twentyten theme
     10    wp_enqueue_style( 'bbp-twentyten-default', get_stylesheet_directory_uri() . '/css/twentyten.css', false, 20100312, 'screen' );
     11
     12    // bbPress specific
     13    wp_enqueue_style( 'bbp-twentyten-bbpress', get_stylesheet_directory_uri() . '/css/bbpress.css', 'bbp-twentyten-default', 20100312, 'screen' );
     14}
     15add_action( 'init', 'bbp_twentyten_enqueue_styles' );
    216
    317/**
     
    721 *
    822 * @package bbPress
    9  * @subpackage Template Tags
     23 * @subpackage bbPress TwentyTen
    1024 * @since bbPress (r2652)
    1125 *
     
    4054
    4155/**
     56 * bbp_twentyten_dim_subscription ()
     57 *
     58 * Subscribe/Unsubscribe a user from a topic
     59 *
     60 * @package bbPress
     61 * @subpackage bbPress TwentyTen
     62 * @since bbPress (r2668)
     63 *
     64 * @return void
     65 */
     66function bbp_twentyten_dim_subscription () {
     67    global $current_user;
     68
     69    if ( !bbp_is_subscriptions_active() )
     70        return;
     71
     72    $current_user = wp_get_current_user();
     73    $user_id      = $current_user->ID;
     74    $id           = intval( $_POST['id'] );
     75
     76    if ( !current_user_can( 'edit_user', $user_id ) )
     77        die( '-1' );
     78
     79    if ( !$topic = get_post( $id ) )
     80        die( '0' );
     81
     82    check_ajax_referer( "toggle-subscription_$topic->ID" );
     83
     84    if ( bbp_is_user_subscribed( $user_id, $topic->ID ) ) {
     85        if ( bbp_remove_user_subscription( $user_id, $topic->ID ) )
     86            die( '1' );
     87    } else {
     88        if ( bbp_add_user_subscription( $user_id, $topic->ID ) )
     89            die( '1' );
     90    }
     91
     92    die( '0' );
     93}
     94add_action( 'wp_ajax_dim-subscription', 'bbp_twentyten_dim_subscription' );
     95
     96/**
    4297 * bbp_twentyten_enqueue_topic_script ()
    4398 *
     
    45100 *
    46101 * @package bbPress
    47  * @subpackage Template Tags
     102 * @subpackage bbPress TwentyTen
    48103 * @since bbPress (r2652)
    49104 *
     
    54109        return;
    55110
    56     wp_enqueue_script( 'bbp_topic', get_stylesheet_directory_uri() . '/js/topic.js', array( 'wp-lists' ), '20101124' );
     111    wp_enqueue_script( 'bbp_topic', get_stylesheet_directory_uri() . '/js/topic.js', array( 'wp-lists' ), '20101202' );
    57112}
    58113add_filter( 'wp_enqueue_scripts', 'bbp_twentyten_enqueue_topic_script' );
     
    64119 *
    65120 * @package bbPress
    66  * @subpackage Template Tags
     121 * @subpackage bbPress TwentyTen
    67122 * @since bbPress (r2652)
    68123 *
     
    91146 *
    92147 * @package bbPress
    93  * @subpackage Template Tags
     148 * @subpackage bbPress TwentyTen
    94149 * @since bbPress (r2652)
    95150 *
     
    102157    global $current_user;
    103158
    104     wp_get_current_user();
    105     $user_id = $current_user->ID;
     159    $current_user = wp_get_current_user();
     160    $user_id      = $current_user->ID;
    106161
    107     wp_localize_script( 'bbp_topic', 'bbpTopicJS', array(
     162    $localizations = array(
    108163        'currentUserId' => $user_id,
    109164        'topicId'       => bbp_get_topic_id(),
     
    116171        'favDel'        => __( '&times;', 'bbpress' ),
    117172        'favAdd'        => __( 'Add this topic to your favorites', 'bbpress' )
    118     ) );
     173    );
     174
     175    if ( bbp_is_subscriptions_active() ) {
     176        $localizations['subsActive']   = 1;
     177        $localizations['isSubscribed'] = (int) bbp_is_user_subscribed( $user_id );
     178        $localizations['subsSub']      = __( 'Subscribe', 'bbpress' );
     179        $localizations['subsUns']      = __( 'Unsubscribe', 'bbpress' );
     180        $localizations['subsLink']     = bbp_get_topic_permalink();
     181    } else {
     182        $localizations['subsActive'] = 0;
     183    }
     184
     185    wp_localize_script( 'bbp_topic', 'bbpTopicJS', $localizations );
    119186}
    120187add_filter( 'wp_enqueue_scripts', 'bbp_twentyten_topic_script_localization' );
  • branches/plugin/bbp-themes/bbp-twentyten/js/topic.js

    r2659 r2668  
    11bbpTopicJS = jQuery.extend( {
     2    // User and Topic
    23    currentUserId: '0',
    34    topicId: '0',
     5
     6    // Favorites
    47    favoritesLink: '',
    58    isFav: 0,
     
    912    favNo: '%favAdd% (%favLinkNo%)',
    1013    favDel: 'x',
    11     favAdd: 'Add this topic to your favorites'
     14    favAdd: 'Add this topic to your favorites',
     15
     16    // Subscriptions
     17    subsLink: '',
     18    subsActive: 0,
     19    isSubscribed: 0,
     20    subsSub: 'Subscribe',
     21    subsUns: 'Unsubscribe'
    1222}, bbpTopicJS );
    1323
    14 bbpTopicJS.isFav = parseInt( bbpTopicJS.isFav );
     24// Topic Global
     25bbpTopicJS.isFav        = parseInt( bbpTopicJS.isFav );
     26bbpTopicJS.subsActive   = parseInt( bbpTopicJS.subsActive );
     27bbpTopicJS.isSubscribed = parseInt( bbpTopicJS.isSubscribed );
    1528
     29// Run it
    1630jQuery( function($) {
    17     // Favorites
    18     var favoritesToggle = $('#favorite-toggle')
     31    /** Favorites *************************************************************/
     32    var favoritesToggle = $( '#favorite-toggle' )
    1933        .addClass( 'list:favorite' )
    2034        .wpList( { alt: '', dimAfter: favLinkSetup } );
     
    3953        favoritesToggle.get(0).wpList.process( favoritesToggle );
    4054    }
     55
     56    /** Subscriptions *********************************************************/
     57    if ( bbpTopicJS.subsActive == 1 ) {
     58        var subscriptionToggle = $( '#subscription-toggle' )
     59            .addClass( 'list:subscription' )
     60            .wpList( { alt: '', dimAfter: subsLinkSetup } );
     61
     62        var subscriptionToggleSpan = subscriptionToggle.children( 'span' )
     63            [bbpTopicJS.isSubscribed ? 'addClass' : 'removeClass' ]( 'is-subscribed' );
     64
     65        function subsLinkSetup() {
     66            bbpTopicJS.isSubscribed = subscriptionToggleSpan.is( '.is-subscribed' );
     67            var aLink = "<a href='" + bbpTopicJS.subsLink + "'>";
     68            var aDim  = "<a href='" + subscriptionToggleSpan.find( 'a[class^="dim:"]' ).attr( 'href' ) + "' class='dim:subscription-toggle:" + subscriptionToggleSpan.attr( 'id' ) + ":is-subscribed'>";
     69
     70            if ( bbpTopicJS.isSubscribed ) {
     71                html = aDim + bbpTopicJS.subsUns + '</a>';
     72            } else {
     73                html = aDim + bbpTopicJS.subsSub + '</a>';
     74            }
     75
     76            subscriptionToggleSpan.html( html );
     77            subscriptionToggle.get(0).wpList.process( subscriptionToggle );
     78        }
     79    }
     80
    4181} );
  • branches/plugin/bbp-themes/bbp-twentyten/pagination-bbp_replies.php

    r2574 r2668  
     1<?php
     2/**
     3 * Pagination for pages of replies (when viewing a topic)
     4 *
     5 * @package bbPress
     6 * @subpackage Twenty Ten
     7 */
     8?>
    19
    210    <div class="bbp-pagination">
  • branches/plugin/bbp-themes/bbp-twentyten/pagination-bbp_topics.php

    r2575 r2668  
     1<?php
     2/**
     3 * Pagination for pages of topics (when viewing a forum)
     4 *
     5 * @package bbPress
     6 * @subpackage Twenty Ten
     7 */
     8?>
    19
    210    <div class="bbp-pagination">
  • branches/plugin/bbp-themes/bbp-twentyten/single-bbp_topic.php

    r2667 r2668  
    2929                                        <th class="bbp-topic-content">
    3030                                            <?php _e( 'Topic', 'bbpress' ); ?>
     31                                            <?php bbp_user_subscribe_link(); ?>
    3132                                            <?php bbp_user_favorites_link(); ?>
    3233                                        </th>
  • branches/plugin/bbp-themes/bbp-twentyten/style.css

    r2667 r2668  
    77 * Template: twentyten
    88 * Tags: bbpress, black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style
    9  */
    10 
    11 /* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html
    12 -------------------------------------------------------------- */
    13 
    14 html, body, div, span, applet, object, iframe,
    15 h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    16 a, abbr, acronym, address, big, cite, code,
    17 del, dfn, em, font, img, ins, kbd, q, s, samp,
    18 small, strike, strong, sub, sup, tt, var,
    19 b, u, i, center,
    20 dl, dt, dd, ol, ul, li,
    21 fieldset, form, label, legend,
    22 table, caption, tbody, tfoot, thead, tr, th, td {
    23     background: transparent;
    24     border: 0;
    25     margin: 0;
    26     padding: 0;
    27     vertical-align: baseline;
    28 }
    29 body {
    30     line-height: 1;
    31 }
    32 h1, h2, h3, h4, h5, h6 {
    33     clear: both;
    34     font-weight: normal;
    35 }
    36 ol, ul {
    37     list-style: none;
    38 }
    39 blockquote {
    40     quotes: none;
    41 }
    42 blockquote:before, blockquote:after {
    43     content: '';
    44     content: none;
    45 }
    46 del {
    47     text-decoration: line-through;
    48 }
    49 /* tables still need 'cellspacing="0"' in the markup */
    50 table {
    51     border-collapse: collapse;
    52     border-spacing: 0;
    53 }
    54 a img {
    55     border: none;
    56 }
    57 
    58 /* =Layout
    59 -------------------------------------------------------------- */
    60 
    61 /*
    62 LAYOUT: Two columns
    63 DESCRIPTION: Two-column fixed layout with one sidebar right of content
    64 */
    65 
    66 #container {
    67     float: left;
    68     margin: 0 -240px 0 0;
    69     width: 100%;
    70 }
    71 #content {
    72     margin: 0 280px 0 20px;
    73 }
    74 #primary,
    75 #secondary {
    76     float: right;
    77     overflow: hidden;
    78     width: 220px;
    79 }
    80 #secondary {
    81     clear: right;
    82 }
    83 #footer {
    84     clear: both;
    85     width: 100%;
    86 }
    87 
    88 /*
    89 LAYOUT: One column, no sidebar
    90 DESCRIPTION: One centered column with no sidebar
    91 */
    92 
    93 .one-column #content {
    94     margin: 0 auto;
    95     width: 640px;
    96 }
    97 
    98 /*
    99 LAYOUT: Full width, no sidebar
    100 DESCRIPTION: Full width content with no sidebar; used for attachment pages
    101 */
    102 
    103 .single-attachment #content {
    104     margin: 0 auto;
    105     width: 900px;
    106 }
    107 
    108 
    109 /* =Fonts
    110 -------------------------------------------------------------- */
    111 body,
    112 input,
    113 textarea,
    114 .page-title span,
    115 .pingback a.url {
    116     font-family: Georgia, "Bitstream Charter", serif;
    117 }
    118 h3#comments-title,
    119 h3#reply-title,
    120 #access .menu,
    121 #access div.menu ul,
    122 #cancel-comment-reply-link,
    123 .form-allowed-tags,
    124 #site-info,
    125 #site-title,
    126 #wp-calendar,
    127 .comment-meta,
    128 .comment-body tr th,
    129 .comment-body thead th,
    130 .entry-content label,
    131 .entry-content tr th,
    132 .entry-content thead th,
    133 .entry-meta,
    134 .entry-title,
    135 .entry-utility,
    136 #respond label,
    137 .navigation,
    138 .page-title,
    139 .pingback p,
    140 .reply,
    141 .widget-title,
    142 .wp-caption-text,
    143 input[type=submit] {
    144     font-family: "Helvetica Neue", Arial, Helvetica, "Nimbus Sans L", sans-serif;
    145 }
    146 pre {
    147     font-family: "Courier 10 Pitch", Courier, monospace;
    148 }
    149 code {
    150     font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;
    151 }
    152 
    153 
    154 /* =Structure
    155 -------------------------------------------------------------- */
    156 
    157 /* The main theme structure */
    158 #access .menu-header,
    159 div.menu,
    160 #colophon,
    161 #branding,
    162 #main,
    163 #wrapper {
    164     margin: 0 auto;
    165     width: 940px;
    166 }
    167 #wrapper {
    168     background: #fff;
    169     margin-top: 20px;
    170     padding: 0 20px;
    171 }
    172 
    173 /* Structure the footer area */
    174 #footer-widget-area {
    175     overflow: hidden;
    176 }
    177 #footer-widget-area .widget-area {
    178     float: left;
    179     margin-right: 20px;
    180     width: 220px;
    181 }
    182 #footer-widget-area #fourth {
    183     margin-right: 0;
    184 }
    185 #site-info {
    186     float: left;
    187     font-size: 14px;
    188     font-weight: bold;
    189     width: 700px;
    190 }
    191 #site-generator {
    192     float: right;
    193     width: 220px;
    194 }
    195 
    196 
    197 /* =Global Elements
    198 -------------------------------------------------------------- */
    199 
    200 /* Main global 'theme' and typographic styles */
    201 body {
    202     background: #f1f1f1;
    203 }
    204 body,
    205 input,
    206 textarea {
    207     color: #666;
    208     font-size: 12px;
    209     line-height: 18px;
    210 }
    211 hr {
    212     background-color: #e7e7e7;
    213     border: 0;
    214     clear: both;
    215     height: 1px;
    216     margin-bottom: 18px;
    217 }
    218 
    219 /* Text elements */
    220 p {
    221     margin-bottom: 18px;
    222 }
    223 ul {
    224     list-style: square;
    225     margin: 0 0 18px 1.5em;
    226 }
    227 ol {
    228     list-style: decimal;
    229     margin: 0 0 18px 1.5em;
    230 }
    231 ol ol {
    232     list-style: upper-alpha;
    233 }
    234 ol ol ol {
    235     list-style: lower-roman;
    236 }
    237 ol ol ol ol {
    238     list-style: lower-alpha;
    239 }
    240 ul ul,
    241 ol ol,
    242 ul ol,
    243 ol ul {
    244     margin-bottom: 0;
    245 }
    246 dl {
    247     margin: 0 0 24px 0;
    248 }
    249 dt {
    250     font-weight: bold;
    251 }
    252 dd {
    253     margin-bottom: 18px;
    254 }
    255 strong {
    256     font-weight: bold;
    257 }
    258 cite,
    259 em,
    260 i {
    261     font-style: italic;
    262 }
    263 big {
    264     font-size: 131.25%;
    265 }
    266 ins {
    267     background: #ffc;
    268     text-decoration: none;
    269 }
    270 blockquote {
    271     font-style: italic;
    272     padding: 0 3em;
    273 }
    274 blockquote cite,
    275 blockquote em,
    276 blockquote i {
    277     font-style: normal;
    278 }
    279 pre {
    280     background: #f7f7f7;
    281     color: #222;
    282     line-height: 18px;
    283     margin-bottom: 18px;
    284     padding: 1.5em;
    285 }
    286 abbr,
    287 acronym {
    288     border-bottom: 1px dotted #666;
    289     cursor: help;
    290 }
    291 sup,
    292 sub {
    293     height: 0;
    294     line-height: 1;
    295     position: relative;
    296     vertical-align: baseline;
    297 }
    298 sup {
    299     bottom: 1ex;
    300 }
    301 sub {
    302     top: .5ex;
    303 }
    304 input[type="text"],
    305 textarea {
    306     background: #f9f9f9;
    307     border: 1px solid #ccc;
    308     box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1);
    309     -moz-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1);
    310     -webkit-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1);
    311     padding: 2px;
    312 }
    313 a:link {
    314     color: #0066cc;
    315 }
    316 a:visited {
    317     color: #743399;
    318 }
    319 a:active,
    320 a:hover {
    321     color: #ff4b33;
    322 }
    323 
    324 /* Text meant only for screen readers */
    325 .screen-reader-text {
    326     position: absolute;
    327     left: -9000px;
    328 }
    329 
    330 
    331 /* =Header
    332 -------------------------------------------------------------- */
    333 
    334 #header {
    335     padding: 30px 0 0 0;
    336 }
    337 #site-title {
    338     float: left;
    339     font-size: 30px;
    340     line-height: 36px;
    341     margin: 0 0 18px 0;
    342     width: 700px;
    343 }
    344 #site-title a {
    345     color: #000;
    346     font-weight: bold;
    347     text-decoration: none;
    348 }
    349 #site-description {
    350     clear: right;
    351     float: right;
    352     font-style: italic;
    353     margin: 14px 0 18px 0;
    354     width: 220px;
    355 }
    356 
    357 /* This is the custom header image */
    358 #branding img {
    359     border-top: 4px solid #000;
    360     border-bottom: 1px solid #000;
    361     clear: both;
    362     display: block;
    363 }
    364 
    365 
    366 /* =Menu
    367 -------------------------------------------------------------- */
    368 
    369 #access {
    370     background: #000;
    371     display: block;
    372     float: left;
    373     margin: 0 auto;
    374     width: 940px;
    375 }
    376 #access .menu-header,
    377 div.menu {
    378     font-size: 13px;
    379     margin-left: 12px;
    380     width: 928px;
    381 }
    382 #access .menu-header ul,
    383 div.menu ul {
    384     list-style: none;
    385     margin: 0;
    386 }
    387 #access .menu-header li,
    388 div.menu li {
    389     float: left;
    390     position: relative;
    391 }
    392 #access a {
    393     color: #aaa;
    394     display: block;
    395     line-height: 38px;
    396     padding: 0 10px;
    397     text-decoration: none;
    398 }
    399 #access ul ul {
    400     box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
    401     -moz-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
    402     -webkit-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
    403     display: none;
    404     position: absolute;
    405     top: 38px;
    406     left: 0;
    407     float: left;
    408     width: 180px;
    409     z-index: 99999;
    410 }
    411 #access ul ul li {
    412     min-width: 180px;
    413 }
    414 #access ul ul ul {
    415     left: 100%;
    416     top: 0;
    417 }
    418 #access ul ul a {
    419     background: #333;
    420     line-height: 1em;
    421     padding: 10px;
    422     width: 160px;
    423     height: auto;
    424 }
    425 #access li:hover > a,
    426 #access ul ul :hover > a {
    427     background: #333;
    428     color: #fff;
    429 }
    430 #access ul li:hover > ul {
    431     display: block;
    432 }
    433 #access ul li.current_page_item > a,
    434 #access ul li.current-menu-ancestor > a,
    435 #access ul li.current-menu-item > a,
    436 #access ul li.current-menu-parent > a {
    437     color: #fff;
    438 }
    439 * html #access ul li.current_page_item a,
    440 * html #access ul li.current-menu-ancestor a,
    441 * html #access ul li.current-menu-item a,
    442 * html #access ul li.current-menu-parent a,
    443 * html #access ul li a:hover {
    444     color: #fff;
    445 }
    446 
    447 
    448 /* =Content
    449 -------------------------------------------------------------- */
    450 
    451 #main {
    452     clear: both;
    453     overflow: hidden;
    454     padding: 40px 0 0 0;
    455 }
    456 #content {
    457     margin-bottom: 36px;
    458 }
    459 #content,
    460 #content input,
    461 #content textarea {
    462     color: #333;
    463     font-size: 16px;
    464     line-height: 24px;
    465 }
    466 #content p,
    467 #content ul,
    468 #content ol,
    469 #content dd,
    470 #content pre,
    471 #content hr {
    472     margin-bottom: 24px;
    473 }
    474 #content ul ul,
    475 #content ol ol,
    476 #content ul ol,
    477 #content ol ul {
    478     margin-bottom: 0;
    479 }
    480 #content pre,
    481 #content kbd,
    482 #content tt,
    483 #content var {
    484     font-size: 15px;
    485     line-height: 21px;
    486 }
    487 #content code {
    488     font-size: 13px;
    489 }
    490 #content dt,
    491 #content th {
    492     color: #000;
    493 }
    494 #content h1,
    495 #content h2,
    496 #content h3,
    497 #content h4,
    498 #content h5,
    499 #content h6 {
    500     color: #000;
    501     line-height: 1.5em;
    502     margin: 0 0 20px 0;
    503 }
    504 #content table {
    505     border: 1px solid #e7e7e7;
    506     margin: 0 -1px 24px 0;
    507     text-align: left;
    508     width: 100%;
    509 }
    510 #content tr th,
    511 #content thead th {
    512     color: #888;
    513     font-size: 12px;
    514     font-weight: bold;
    515     line-height: 18px;
    516     padding: 9px 24px;
    517 }
    518 #content tr td {
    519     border-top: 1px solid #e7e7e7;
    520     padding: 6px 24px;
    521 }
    522 #content tr.odd td {
    523     background: #f2f7fc;
    524 }
    525 .hentry {
    526     margin: 0 0 48px 0;
    527 }
    528 .home .sticky {
    529     background: #f2f7fc;
    530     border-top: 4px solid #000;
    531     margin-left: -20px;
    532     margin-right: -20px;
    533     padding: 18px 20px;
    534 }
    535 .single .hentry {
    536     margin: 0 0 36px 0;
    537 }
    538 .page-title {
    539     color: #000;
    540     font-size: 14px;
    541     font-weight: bold;
    542     margin: 0 0 36px 0;
    543 }
    544 .page-title span {
    545     color: #333;
    546     font-size: 16px;
    547     font-style: italic;
    548     font-weight: normal;
    549 }
    550 .page-title a:link,
    551 .page-title a:visited {
    552     color: #888;
    553     text-decoration: none;
    554 }
    555 .page-title a:active,
    556 .page-title a:hover {
    557     color: #ff4b33;
    558 }
    559 #content .entry-title {
    560     color: #000;
    561     font-size: 21px;
    562     font-weight: bold;
    563     line-height: 1.3em;
    564     margin-bottom: 0;
    565 }
    566 .entry-title a:link,
    567 .entry-title a:visited {
    568     color: #000;
    569     text-decoration: none;
    570 }
    571 .entry-title a:active,
    572 .entry-title a:hover {
    573     color: #ff4b33;
    574 }
    575 .entry-meta {
    576     color: #888;
    577     font-size: 12px;
    578 }
    579 .entry-meta abbr,
    580 .entry-utility abbr {
    581     border: none;
    582 }
    583 .entry-meta abbr:hover,
    584 .entry-utility abbr:hover {
    585     border-bottom: 1px dotted #666;
    586 }
    587 .entry-content,
    588 .entry-summary {
    589     clear: both;
    590     padding: 12px 0 0 0;
    591 }
    592 #content .entry-summary p:last-child {
    593     margin-bottom: 12px;
    594 }
    595 .entry-content fieldset {
    596     border: 1px solid #e7e7e7;
    597     margin: 0 0 24px 0;
    598     padding: 24px;
    599 }
    600 .entry-content fieldset legend {
    601     background: #fff;
    602     color: #000;
    603     font-weight: bold;
    604     padding: 0 4px;
    605 }
    606 .entry-content input {
    607     margin: 0 0 24px 0;
    608 }
    609 .entry-content input.file,
    610 .entry-content input.button {
    611     margin-right: 24px;
    612 }
    613 .entry-content label {
    614     color: #888;
    615     font-size: 12px;
    616 }
    617 .entry-content select {
    618     margin: 0 0 24px 0;
    619 }
    620 .entry-content sup,
    621 .entry-content sub {
    622     font-size: 10px;
    623 }
    624 .entry-content blockquote.left {
    625     float: left;
    626     margin-left: 0;
    627     margin-right: 24px;
    628     text-align: right;
    629     width: 33%;
    630 }
    631 .entry-content blockquote.right {
    632     float: right;
    633     margin-left: 24px;
    634     margin-right: 0;
    635     text-align: left;
    636     width: 33%;
    637 }
    638 .page-link {
    639     color: #000;
    640     font-weight: bold;
    641     margin: 0 0 22px 0;
    642     word-spacing: 0.5em;
    643 }
    644 .page-link a:link,
    645 .page-link a:visited {
    646     background: #f1f1f1;
    647     color: #333;
    648     font-weight: normal;
    649     padding: 0.5em 0.75em;
    650     text-decoration: none;
    651 }
    652 .home .sticky .page-link a {
    653     background: #d9e8f7;
    654 }
    655 .page-link a:active,
    656 .page-link a:hover {
    657     color: #ff4b33;
    658 }
    659 body.page .edit-link {
    660     clear: both;
    661     display: block;
    662 }
    663 #entry-author-info {
    664     background: #f2f7fc;
    665     border-top: 4px solid #000;
    666     clear: both;
    667     font-size: 14px;
    668     line-height: 20px;
    669     margin: 24px 0;
    670     overflow: hidden;
    671     padding: 18px 20px;
    672 }
    673 #entry-author-info #author-avatar {
    674     background: #fff;
    675     border: 1px solid #e7e7e7;
    676     float: left;
    677     height: 60px;
    678     margin: 0 -104px 0 0;
    679     padding: 11px;
    680 }
    681 #entry-author-info #author-description {
    682     float: left;
    683     margin: 0 0 0 104px;
    684 }
    685 #entry-author-info h2 {
    686     color: #000;
    687     font-size: 100%;
    688     font-weight: bold;
    689     margin-bottom: 0;
    690 }
    691 .entry-utility {
    692     clear: both;
    693     color: #888;
    694     font-size: 12px;
    695     line-height: 18px;
    696 }
    697 .entry-meta a,
    698 .entry-utility a {
    699     color: #888;
    700 }
    701 .entry-meta a:hover,
    702 .entry-utility a:hover {
    703     color: #ff4b33;
    704 }
    705 #content .video-player {
    706     padding: 0;
    707 }
    708 
    709 
    710 /* =Asides
    711 -------------------------------------------------------------- */
    712 
    713 .home #content .category-asides p {
    714     font-size: 14px;
    715     line-height: 20px;
    716     margin-bottom: 10px;
    717     margin-top: 0;
    718 }
    719 .home .hentry.category-asides {
    720     padding: 0;
    721 }
    722 .home #content .category-asides .entry-content {
    723     padding-top: 0;
    724 }
    725 
    726 
    727 /* =Gallery listing
    728 -------------------------------------------------------------- */
    729 
    730 .category-gallery .size-thumbnail img {
    731     border: 10px solid #f1f1f1;
    732     margin-bottom: 0;
    733 }
    734 .category-gallery .gallery-thumb {
    735     float: left;
    736     margin-right: 20px;
    737     margin-top: -4px;
    738 }
    739 .home #content .category-gallery .entry-utility {
    740     padding-top: 4px;
    741 }
    742 
    743 
    744 /* =Attachment pages
    745 -------------------------------------------------------------- */
    746 
    747 .attachment .entry-content .entry-caption {
    748     font-size: 140%;
    749     margin-top: 24px;
    750 }
    751 .attachment .entry-content .nav-previous a:before {
    752     content: '\2190\00a0';
    753 }
    754 .attachment .entry-content .nav-next a:after {
    755     content: '\00a0\2192';
    756 }
    757 
    758 
    759 /* =Images
    760 -------------------------------------------------------------- */
    761 
    762 #content img {
    763     margin: 0;
    764     height: auto;
    765     max-width: 640px;
    766     width: auto;
    767 }
    768 #content .attachment img {
    769     max-width: 900px;
    770 }
    771 #content .alignleft,
    772 #content img.alignleft {
    773     display: inline;
    774     float: left;
    775     margin-right: 24px;
    776     margin-top: 4px;
    777 }
    778 #content .alignright,
    779 #content img.alignright {
    780     display: inline;
    781     float: right;
    782     margin-left: 24px;
    783     margin-top: 4px;
    784 }
    785 #content .aligncenter,
    786 #content img.aligncenter {
    787     clear: both;
    788     display: block;
    789     margin-left: auto;
    790     margin-right: auto;
    791 }
    792 #content img.alignleft,
    793 #content img.alignright,
    794 #content img.aligncenter {
    795     margin-bottom: 12px;
    796 }
    797 #content .wp-caption {
    798     background: #f1f1f1;
    799     line-height: 18px;
    800     margin-bottom: 20px;
    801     padding: 4px;
    802     text-align: center;
    803 }
    804 #content .wp-caption img {
    805     margin: 5px 5px 0;
    806 }
    807 #content .wp-caption p.wp-caption-text {
    808     color: #888;
    809     font-size: 12px;
    810     margin: 5px;
    811 }
    812 #content .wp-smiley {
    813     margin: 0;
    814 }
    815 #content .gallery {
    816     margin: 0 auto 18px;
    817 }
    818 #content .gallery .gallery-item {
    819     float: left;
    820     margin-top: 0;
    821     text-align: center;
    822     width: 33%;
    823 }
    824 #content .gallery img {
    825     border: 2px solid #cfcfcf;
    826 }
    827 #content .gallery .gallery-caption {
    828     color: #888;
    829     font-size: 12px;
    830     margin: 0 0 12px;
    831 }
    832 #content .gallery dl {
    833     margin: 0;
    834 }
    835 #content .gallery img {
    836     border: 10px solid #f1f1f1;
    837 }
    838 #content .gallery br+br {
    839     display: none;
    840 }
    841 #content .attachment img { /* single attachment images should be centered */
    842     display: block;
    843     margin: 0 auto;
    844 }
    845 
    846 
    847 /* =Navigation
    848 -------------------------------------------------------------- */
    849 
    850 .navigation {
    851     color: #888;
    852     font-size: 12px;
    853     line-height: 18px;
    854     overflow: hidden;
    855 }
    856 .navigation a:link,
    857 .navigation a:visited {
    858     color: #888;
    859     text-decoration: none;
    860 }
    861 .navigation a:active,
    862 .navigation a:hover {
    863     color: #ff4b33;
    864 }
    865 .nav-previous {
    866     float: left;
    867     width: 50%;
    868 }
    869 .nav-next {
    870     float: right;
    871     text-align: right;
    872     width: 50%;
    873 }
    874 #nav-above {
    875     margin: 0 0 18px 0;
    876 }
    877 #nav-above {
    878     display: none;
    879 }
    880 .paged #nav-above,
    881 .single #nav-above {
    882     display: block;
    883 }
    884 #nav-below {
    885     margin: -18px 0 0 0;
    886 }
    887 
    888 
    889 /* =Comments
    890 -------------------------------------------------------------- */
    891 #comments {
    892     clear: both;
    893 }
    894 #comments .navigation {
    895     padding: 0 0 18px 0;
    896 }
    897 h3#comments-title,
    898 h3#reply-title {
    899     color: #000;
    900     font-size: 20px;
    901     font-weight: bold;
    902     margin-bottom: 0;
    903 }
    904 h3#comments-title {
    905     padding: 24px 0;
    906 }
    907 .commentlist {
    908     list-style: none;
    909     margin: 0;
    910 }
    911 .commentlist li.comment {
    912     border-bottom: 1px solid #e7e7e7;
    913     line-height: 24px;
    914     margin: 0 0 24px 0;
    915     padding: 0 0 0 56px;
    916     position: relative;
    917 }
    918 .commentlist li:last-child {
    919     border-bottom: none;
    920     margin-bottom: 0;
    921 }
    922 #comments .comment-body ul,
    923 #comments .comment-body ol {
    924     margin-bottom: 18px;
    925 }
    926 #comments .comment-body p:last-child {
    927     margin-bottom: 6px;
    928 }
    929 #comments .comment-body blockquote p:last-child {
    930     margin-bottom: 24px;
    931 }
    932 .commentlist ol {
    933     list-style: decimal;
    934 }
    935 .commentlist .avatar {
    936     position: absolute;
    937     top: 4px;
    938     left: 0;
    939 }
    940 .comment-author {
    941 }
    942 .comment-author cite {
    943     color: #000;
    944     font-style: normal;
    945     font-weight: bold;
    946 }
    947 .comment-author .says {
    948     font-style: italic;
    949 }
    950 .comment-meta {
    951     font-size: 12px;
    952     margin: 0 0 18px 0;
    953 }
    954 .comment-meta a:link,
    955 .comment-meta a:visited {
    956     color: #888;
    957     text-decoration: none;
    958 }
    959 .comment-meta a:active,
    960 .comment-meta a:hover {
    961     color: #ff4b33;
    962 }
    963 .commentlist .even {
    964 }
    965 .commentlist .bypostauthor {
    966 }
    967 .reply {
    968     font-size: 12px;
    969     padding: 0 0 24px 0;
    970 }
    971 .reply a,
    972 a.comment-edit-link {
    973     color: #888;
    974 }
    975 .reply a:hover,
    976 a.comment-edit-link:hover {
    977     color: #ff4b33;
    978 }
    979 .commentlist .children {
    980     list-style: none;
    981     margin: 0;
    982 }
    983 .commentlist .children li {
    984     border: none;
    985     margin: 0;
    986 }
    987 .nopassword,
    988 .nocomments {
    989     display: none;
    990 }
    991 #comments .pingback {
    992     border-bottom: 1px solid #e7e7e7;
    993     margin-bottom: 18px;
    994     padding-bottom: 18px;
    995 }
    996 .commentlist li.comment+li.pingback {
    997     margin-top: -6px;
    998 }
    999 #comments .pingback p {
    1000     color: #888;
    1001     display: block;
    1002     font-size: 12px;
    1003     line-height: 18px;
    1004     margin: 0;
    1005 }
    1006 #comments .pingback .url {
    1007     font-size: 13px;
    1008     font-style: italic;
    1009 }
    1010 
    1011 /* Comments form */
    1012 input[type=submit] {
    1013     color: #333;
    1014 }
    1015 #respond {
    1016     border-top: 1px solid #e7e7e7;
    1017     margin: 24px 0;
    1018     overflow: hidden;
    1019     position: relative;
    1020 }
    1021 #respond p {
    1022     margin: 0;
    1023 }
    1024 #respond .comment-notes {
    1025     margin-bottom: 1em;
    1026 }
    1027 .form-allowed-tags {
    1028     line-height: 1em;
    1029 }
    1030 .children #respond {
    1031     margin: 0 48px 0 0;
    1032 }
    1033 h3#reply-title {
    1034     margin: 18px 0;
    1035 }
    1036 #comments-list #respond {
    1037     margin: 0 0 18px 0;
    1038 }
    1039 #comments-list ul #respond {
    1040     margin: 0;
    1041 }
    1042 #cancel-comment-reply-link {
    1043     font-size: 12px;
    1044     font-weight: normal;
    1045     line-height: 18px;
    1046 }
    1047 #respond .required {
    1048     color: #ff4b33;
    1049     font-weight: bold;
    1050 }
    1051 #respond label {
    1052     color: #888;
    1053     font-size: 12px;
    1054 }
    1055 #respond input {
    1056     margin: 0 0 9px;
    1057     width: 98%;
    1058 }
    1059 #respond textarea {
    1060     width: 98%;
    1061 }
    1062 #respond .form-allowed-tags {
    1063     color: #888;
    1064     font-size: 12px;
    1065     line-height: 18px;
    1066 }
    1067 #respond .form-allowed-tags code {
    1068     font-size: 11px;
    1069 }
    1070 #respond .form-submit {
    1071     margin: 12px 0;
    1072 }
    1073 #respond .form-submit input {
    1074     font-size: 14px;
    1075     width: auto;
    1076 }
    1077 
    1078 
    1079 /* =Widget Areas
    1080 -------------------------------------------------------------- */
    1081 
    1082 .widget-area ul {
    1083     list-style: none;
    1084     margin-left: 0;
    1085 }
    1086 .widget-area ul ul {
    1087     list-style: square;
    1088     margin-left: 1.3em;
    1089 }
    1090 .widget_search #s {/* This keeps the search inputs in line */
    1091     width: 60%;
    1092 }
    1093 .widget_search label {
    1094     display: none;
    1095 }
    1096 .widget-container {
    1097     margin: 0 0 18px 0;
    1098 }
    1099 .widget-title {
    1100     color: #222;
    1101     font-weight: bold;
    1102 }
    1103 .widget-area a:link,
    1104 .widget-area a:visited {
    1105     text-decoration: none;
    1106 }
    1107 .widget-area a:active,
    1108 .widget-area a:hover {
    1109     text-decoration: underline;
    1110 }
    1111 .widget-area .entry-meta {
    1112     font-size: 11px;
    1113 }
    1114 #wp_tag_cloud div {
    1115     line-height: 1.6em;
    1116 }
    1117 #wp-calendar {
    1118     width: 100%;
    1119 }
    1120 #wp-calendar caption {
    1121     color: #222;
    1122     font-size: 14px;
    1123     font-weight: bold;
    1124     padding-bottom: 4px;
    1125     text-align: left;
    1126 }
    1127 #wp-calendar thead {
    1128     font-size: 11px;
    1129 }
    1130 #wp-calendar thead th {
    1131 }
    1132 #wp-calendar tbody {
    1133     color: #aaa;
    1134 }
    1135 #wp-calendar tbody td {
    1136     background: #f5f5f5;
    1137     border: 1px solid #fff;
    1138     padding: 3px 0 2px;
    1139     text-align: center;
    1140 }
    1141 #wp-calendar tbody .pad {
    1142     background: none;
    1143 }
    1144 #wp-calendar tfoot #next {
    1145     text-align: right;
    1146 }
    1147 .widget_rss a.rsswidget {
    1148     color: #000;
    1149 }
    1150 .widget_rss a.rsswidget:hover {
    1151     color: #ff4b33;
    1152 }
    1153 .widget_rss .widget-title img {
    1154     width: 11px;
    1155     height: 11px;
    1156 }
    1157 
    1158 /* Main sidebars */
    1159 #main .widget-area ul {
    1160     margin-left: 0;
    1161     padding: 0 20px 0 0;
    1162 }
    1163 #main .widget-area ul ul {
    1164     border: none;
    1165     margin-left: 1.3em;
    1166     padding: 0;
    1167 }
    1168 #primary {
    1169 }
    1170 #secondary {
    1171 }
    1172 
    1173 /* Footer widget areas */
    1174 #footer-widget-area {
    1175 }
    1176 
    1177 
    1178 /* =Footer
    1179 -------------------------------------------------------------- */
    1180 
    1181 #footer {
    1182     margin-bottom: 20px;
    1183 }
    1184 #colophon {
    1185     border-top: 4px solid #000;
    1186     margin-top: -4px;
    1187     overflow: hidden;
    1188     padding: 18px 0;
    1189 }
    1190 #site-info {
    1191     font-weight: bold;
    1192 }
    1193 #site-info a {
    1194     color: #000;
    1195     text-decoration: none;
    1196 }
    1197 #site-generator {
    1198     font-style: italic;
    1199     position: relative;
    1200 }
    1201 #site-generator a {
    1202     background: url(images/wordpress.png) center left no-repeat;
    1203     color: #666;
    1204     display: inline-block;
    1205     line-height: 16px;
    1206     padding-left: 20px;
    1207     text-decoration: none;
    1208 }
    1209 #site-generator a:hover {
    1210     text-decoration: underline;
    1211 }
    1212 img#wpstats {
    1213     display: block;
    1214     margin: 0 auto 10px;
    1215 }
    1216 
    1217 
    1218 /* =Mobile Safari ( iPad, iPhone and iPod Touch )
    1219 -------------------------------------------------------------- */
    1220 
    1221 pre {
    1222     -webkit-text-size-adjust: 140%;
    1223 }
    1224 code {
    1225     -webkit-text-size-adjust: 160%;
    1226 }
    1227 #access,
    1228 .entry-meta,
    1229 .entry-utility,
    1230 .navigation,
    1231 .widget-area {
    1232     -webkit-text-size-adjust: 120%;
    1233 }
    1234 #site-description {
    1235     -webkit-text-size-adjust: none;
    1236 }
    1237 
    1238 
    1239 /* =Print Style
    1240 -------------------------------------------------------------- */
    1241 
    1242 @media print {
    1243     body {
    1244         background: none !important;
    1245     }
    1246     #wrapper {
    1247         clear: both !important;
    1248         display: block !important;
    1249         float: none !important;
    1250         position: relative !important;
    1251     }
    1252     #header {
    1253         border-bottom: 2pt solid #000;
    1254         padding-bottom: 18pt;
    1255     }
    1256     #colophon {
    1257         border-top: 2pt solid #000;
    1258     }
    1259     #site-title,
    1260     #site-description {
    1261         float: none;
    1262         line-height: 1.4em;
    1263         margin: 0;
    1264         padding: 0;
    1265     }
    1266     #site-title {
    1267         font-size: 13pt;
    1268     }
    1269     .entry-content {
    1270         font-size: 14pt;
    1271         line-height: 1.6em;
    1272     }
    1273     .entry-title {
    1274         font-size: 21pt;
    1275     }
    1276     #access,
    1277     #branding img,
    1278     #respond,
    1279     .comment-edit-link,
    1280     .edit-link,
    1281     .navigation,
    1282     .page-link,
    1283     .widget-area {
    1284         display: none !important;
    1285     }
    1286     #container,
    1287     #header,
    1288     #footer {
    1289         margin: 0;
    1290         width: 100%;
    1291     }
    1292     #content,
    1293     .one-column #content {
    1294         margin: 24pt 0 0;
    1295         width: 100%;
    1296     }
    1297     .wp-caption p {
    1298         font-size: 11pt;
    1299     }
    1300     #site-info,
    1301     #site-generator {
    1302         float: none;
    1303         width: auto;
    1304     }
    1305     #colophon {
    1306         width: auto;
    1307     }
    1308     img#wpstats {
    1309         display: none;
    1310     }
    1311     #site-generator a {
    1312         margin: 0;
    1313         padding: 0;
    1314     }
    1315     #entry-author-info {
    1316         border: 1px solid #e7e7e7;
    1317     }
    1318     #main {
    1319         display: inline;
    1320     }
    1321     .home .sticky {
    1322         border: none;
    1323     }
    1324 }
    1325 
    1326 /* bbPress Style
    1327 -------------------------------------------------------------- */
    1328 
    1329 hr { margin: 0 0 24px 0 !important; }
    1330 #entry-author-info {
    1331     margin: 10px 0 0 0;
    1332     border-bottom: 1px solid #fff;
    1333 }
    1334 
    1335 /* tables */
    1336 table.bbp-forums th, table.bbp-topics th,
    1337 table.bbp-topic th, table.bbp-replies th {
    1338     background-color: #f5f5f5;
    1339 }
    1340 table.bbp-forums th span, table.bbp-topics th span,
    1341 table.bbp-topic th span, table.bbp-replies th span {
    1342     float: right;
    1343 }
    1344 table.bbp-forums tfoot td, table.bbp-topics tfoot td,
    1345 table.bbp-topic tfoot td, table.bbp-replies tfoot td,
    1346 tr.bbp-reply-header td, tr.bbp-topic-header td {
    1347     background-color: #fafafa;
    1348     color: #888;
    1349     font-size: 12px;
    1350     font-weight: bold;
    1351     font-family: 'Helvetica Neue', Arial, Helvetica, 'Nimbus Sans L', sans-serif;
    1352 }
    1353 
    1354 .bbp-forum-topic-count, .bbp-forum-topic-replies,
    1355 .bbp-topic-reply-count, .bbp-topic-voice-count, .bbp-topic-action {
    1356     width: 10%;
    1357     text-align: center;
    1358 }
    1359 .bbp-topic-freshness, .bbp-forum-freshness {
    1360     text-align: center;
    1361     width: 20%;
    1362 }
    1363 .bbp-topic-author, .bbp-reply-author {
    1364     width: 90px;
    1365     text-align: center;
    1366     padding: 0 10px;
    1367 }
    1368 
    1369 .bbp-topic-content, .bbp-reply-content {
    1370     vertical-align: top;
    1371 }
    1372 span.bbp-admin-links {
    1373     float: right;
    1374     color: #d0d0d0;
    1375 }
    1376 
    1377 .bbp-topic-action #favorite-toggle a {
    1378     text-decoration: none;
    1379     padding: 0px 3px 1px;
    1380     color: #7c7;
    1381     border: 1px solid #aca;
    1382     background-color: #dfd;
    1383     font-weight: bold;
    1384     font-size: 13px;
    1385     -moz-border-radius: 8px;
    1386     -webkit-border-radius: 8px;
    1387     }
    1388     .bbp-topic-action #favorite-toggle a:hover {
    1389         color: #5a5;
    1390         border-color: #7c7;
    1391         background-color: #beb;
    1392     }
    1393     .bbp-topic-action #favorite-toggle span.is-favorite a {
    1394         color: #faa;
    1395         border: 1px solid #faa;
    1396         background-color: #fee;
    1397         -moz-border-radius: 5px;
    1398         -webkit-border-radius: 5px;
    1399         }
    1400         .bbp-topic-action #favorite-toggle span.is-favorite a:hover {
    1401             color: #c88;
    1402             border-color: #c88;
    1403             background-color: #fdd;
    1404         }
    1405 
    1406 .bbp-reply-header td {
    1407     background-color: #fafafa;
    1408 }
    1409 #content p.bbp-topic-meta {
    1410     margin-bottom: 0;
    1411     font-size: 0.7em;
    1412 }
    1413 
    1414 /* pagination */
    1415 .bbp-pagination-count {
    1416     float: left;
    1417 }
    1418 .bbp-pagination-links {
    1419     float: right;
    1420 }
    1421 .bbp-pagination {
    1422     float: left;
    1423     width: 100%;
    1424     margin-bottom: 20px;
    1425 }
    1426 
    1427 /* forms */
    1428 .bbp-topic-form, .bbp-reply-form {
    1429     clear: left;
    1430 }
     9 *
     10 **
     11 *
     12 * This file intentionally left blank. Styles are enqueued in functions.php
     13 *
     14 * Please see:
     15 *
     16 * - /css/twentyten.css
     17 *
     18 * - /css/bbpress.css
     19 *
     20 **/
Note: See TracChangeset for help on using the changeset viewer.