WordPress.org

Plugin Directory

Changeset 549997


Ignore:
Timestamp:
05/28/12 20:38:05 (2 years ago)
Author:
taylorde
Message:

tagging and releasing 0.5

Location:
tdd-progress-bar/trunk
Files:
36 added
6 edited

Legend:

Unmodified
Added
Removed
  • tdd-progress-bar/trunk/css/default.css

    r499559 r549997  
    1 .tdd_pb_global_container { 
    2     max-width: 900px; 
    3     width: 400px; 
    4 } 
    5  
    61.tdd_pb_bar_container { 
    72    position: relative; 
    83    background-color: #333; 
    94    overflow: hidden; 
     5    border: 1px solid black; 
    106    height: 50px; 
    11     border: 1px solid black; 
    127 
    138    -webkit-box-shadow: inset 0 0 4px #000000; 
     
    1914 
    2015.tdd_pb_red { 
    21     background-position: 0px 0; 
    22 } 
    23  
    24 .tdd_pb_race .tdd_pb_red { 
    25     background-position: 0px -12px; 
     16    background-color: #ec0d0d; 
    2617} 
    2718 
    2819.tdd_pb_orange { 
    29     background-position: 0px -50px; 
    30 } 
    31  
    32 .tdd_pb_race .tdd_pb_orange { 
    33     background-position: 0px -62px; 
     20    background-color: #e67200; 
    3421} 
    3522 
    3623.tdd_pb_yellow { 
    37     background-position: 0px -100px; 
    38 } 
    39  
    40 .tdd_pb_race .tdd_pb_yellow { 
    41     background-position: 0px -112px; 
     24    background-color: #d6e418; 
    4225} 
    4326 
    4427.tdd_pb_green { 
    45     background-position: 0px -150px; 
    46 } 
    47  
    48 .tdd_pb_race .tdd_pb_green { 
    49     background-position: 0px -162px; 
     28    background-color: #7cd824; 
    5029} 
    5130 
    5231.tdd_pb_teal { 
    53     background-position: 0px -200px; 
    54 } 
    55  
    56 .tdd_pb_race .tdd_pb_teal { 
    57     background-position: 0px -212px; 
     32    background-color: #28d575; 
    5833} 
    5934 
    6035.tdd_pb_lightblue { 
    61     background-position: 0px -250px; 
    62 } 
    63  
    64 .tdd_pb_race .tdd_pb_lightblue { 
    65     background-position: 0px -262px; 
     36    background-color: #2eb0b1; 
    6637} 
    6738 
    6839.tdd_pb_blue { 
    69     background-position: 0px -300px; 
    70 } 
    71  
    72 .tdd_pb_race .tdd_pb_blue { 
    73     background-position: 0px -312px; 
     40    background-color: #003486; 
    7441} 
    7542 
    7643.tdd_pb_purple { 
    77     background-position: 0px -350px; 
    78 } 
    79  
    80 .tdd_pb_race .tdd_pb_purple { 
    81     background-position: 0px -362px; 
     44    background-color: #7400e9; 
    8245} 
    8346 
    8447.tdd_pb_fuchsia { 
    85     background-position: 0px -400px; 
    86 } 
    87  
    88 .tdd_pb_race .tdd_pb_fuchsia { 
    89     background-position: 0px -415px; 
     48    background-color: #aa00a9; 
    9049} 
    9150 
    9251.tdd_pb_strawberry { 
    93     background-position: 0px -450px; 
    94 } 
    95  
    96 .tdd_pb_race .tdd_pb_strawberry { 
    97     background-position: 0px -465px; 
     52    background-color: #980041; 
    9853} 
    9954 
    10055.tdd_pb_black { 
    101     background-position: 0px -500px; 
    102 } 
    103  
    104 .tdd_pb_race .tdd_pb_black { 
    105     background-position: 0px -515px; 
     56    background-color: #121212; 
    10657} 
    10758 
    10859.tdd_pb_silver { 
    109     background-position: 0px -550px; 
    110 } 
    111  
    112 .tdd_pb_race .tdd_pb_silver { 
    113     background-position: 0px -565px; 
     60    background-color: #c0c0c0; 
    11461} 
    11562 
    11663.tdd_pb_bar { 
    117     background-image: url(../images/bars.png); 
     64    background-image: url(../images/bars_overlay.png); 
    11865    width: 0; 
    11966    height: 100%; 
     67    position: relative; 
    12068 
    12169    -webkit-box-shadow: 1px 0 4px #000; 
    12270    -moz-box-shadow: 1px 0 4px #000; 
    12371    box-shadow: 1px 0 4px #000; 
    124     z-index: 2; 
     72    z-index: 1; 
     73    border-top-right-radius: 15px 100px; 
     74    border-bottom-right-radius: 15px 100px; 
     75    overflow: hidden; 
     76} 
     77 
     78/* Applies a "shine" effect */ 
     79.tdd_pb_bar:before { 
     80    content: ' '; 
     81    position: absolute; 
     82    height: 100%; 
     83    width: 100%; 
     84 
     85    background: -webkit-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); 
     86    background: -moz-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); 
     87    background: -o-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); 
     88    background: -ms-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); 
     89    background: linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); /* W3C */ 
     90    -image  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#80ffffff', endColorstr='#00ffffff',GradientType=0 ); /* IE6-9 */ 
     91 
    12592    border-top-right-radius: 15px 100px; 
    12693    border-bottom-right-radius: 15px 100px; 
     
    139106    text-shadow: -1px -1px 1px #000; 
    140107    font-size: 30px; 
    141     margin-top: 7px; 
    142     margin-right: 10px; 
     108    margin: 7px 10px 0; 
    143109    color: #ececec; 
    144110    position: absolute; 
    145111    right: 0; 
    146112    line-height: 1em; 
     113    z-index: 2; 
    147114} 
  • tdd-progress-bar/trunk/css/default.min.css

    r499602 r549997  
    1 .tdd_pb_global_container{max-width:900px;width:400px;}.tdd_pb_bar_container{position:relative;background-color:#333;overflow:hidden;height:50px;border:1px solid black;-webkit-box-shadow:inset 0 0 4px #000000;-moz-box-shadow:inset 0 0 4px #000000;box-shadow:inset 0 0 4px #000000;border-top-right-radius:15px 100px;border-bottom-right-radius:15px 100px;}.tdd_pb_red{background-position:0px 0;}.tdd_pb_race .tdd_pb_red{background-position:0px -12px;}.tdd_pb_orange{background-position:0px -50px;}.tdd_pb_race .tdd_pb_orange{background-position:0px -62px;}.tdd_pb_yellow{background-position:0px -100px;}.tdd_pb_race .tdd_pb_yellow{background-position:0px -112px;}.tdd_pb_green{background-position:0px -150px;}.tdd_pb_race .tdd_pb_green{background-position:0px -162px;}.tdd_pb_teal{background-position:0px -200px;}.tdd_pb_race .tdd_pb_teal{background-position:0px -212px;}.tdd_pb_lightblue{background-position:0px -250px;}.tdd_pb_race .tdd_pb_lightblue{background-position:0px -262px;}.tdd_pb_blue{background-position:0px -300px;}.tdd_pb_race .tdd_pb_blue{background-position:0px -312px;}.tdd_pb_purple{background-position:0px -350px;}.tdd_pb_race .tdd_pb_purple{background-position:0px -362px;}.tdd_pb_fuchsia{background-position:0px -400px;}.tdd_pb_race .tdd_pb_fuchsia{background-position:0px -415px;}.tdd_pb_strawberry{background-position:0px -450px;}.tdd_pb_race .tdd_pb_strawberry{background-position:0px -465px;}.tdd_pb_black{background-position:0px -500px;}.tdd_pb_race .tdd_pb_black{background-position:0px -515px;}.tdd_pb_silver{background-position:0px -550px;}.tdd_pb_race .tdd_pb_silver{background-position:0px -565px;}.tdd_pb_bar{background-image:url(../images/bars.png);width:0;height:100%;-webkit-box-shadow:1px 0 4px #000;-moz-box-shadow:1px 0 4px #000;box-shadow:1px 0 4px #000;z-index:2;border-top-right-radius:15px 100px;border-bottom-right-radius:15px 100px;}.tdd_pb_race .tdd_pb_bar_container{height:25px;}.tdd_pb_race .tdd_pb_bar_container .tdd_pb_numbers{font-size:15px;margin-top:4px;}.tdd_pb_numbers{text-shadow:-1px -1px 1px #000;font-size:30px;margin-top:7px;margin-right:10px;color:#ececec;position:absolute;right:0;line-height:1em;} 
     1.tdd_pb_bar_container{position:relative;background-color:#333;overflow:hidden;border:1px solid #000;height:50px;-webkit-box-shadow:inset 0 0 4px #000;-moz-box-shadow:inset 0 0 4px #000;box-shadow:inset 0 0 4px #000;border-top-right-radius:15px 100px;border-bottom-right-radius:15px 100px;}.tdd_pb_red{background-color:#ec0d0d;}.tdd_pb_orange{background-color:#e67200;}.tdd_pb_yellow{background-color:#d6e418;}.tdd_pb_green{background-color:#7cd824;}.tdd_pb_teal{background-color:#28d575;}.tdd_pb_lightblue{background-color:#2eb0b1;}.tdd_pb_blue{background-color:#003486;}.tdd_pb_purple{background-color:#7400e9;}.tdd_pb_fuchsia{background-color:#aa00a9;}.tdd_pb_strawberry{background-color:#980041;}.tdd_pb_black{background-color:#121212;}.tdd_pb_silver{background-color:silver;}.tdd_pb_bar{background-image:url(../images/bars_overlay.png);width:0;height:100%;position:relative;-webkit-box-shadow:1px 0 4px #000;-moz-box-shadow:1px 0 4px #000;box-shadow:1px 0 4px #000;z-index:1;border-top-right-radius:15px 100px;border-bottom-right-radius:15px 100px;overflow:hidden;}.tdd_pb_bar:before{content:' ';position:absolute;height:100%;width:100%;background:linear-gradient(top,rgba(255,255,255,0.5) 0 rgba(255,255,255,0) 100%;-imagefilter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80ffffff',endColorstr='#00ffffff',GradientType=0);border-top-right-radius:15px 100px;border-bottom-right-radius:15px 100px;}.tdd_pb_race .tdd_pb_bar_container{height:25px;}.tdd_pb_race .tdd_pb_bar_container .tdd_pb_numbers{font-size:15px;margin-top:4px;}.tdd_pb_numbers{text-shadow:-1px -1px 1px #000;font-size:30px;color:#ececec;position:absolute;right:0;line-height:1em;z-index:2;margin:7px 10px 0;} 
  • tdd-progress-bar/trunk/inc/admin.php

    r523224 r549997  
    2727add_action( 'add_meta_boxes', 'tdd_pb_metabox_create' ); 
    2828 
     29/** 
     30 * Load the miniColors color picker scripts 
     31 */ 
     32function enqueue_mini_colors( $hook ) { 
     33    if ( 'post.php' == $hook || 'tdd_pb_page_settings' == $hook ){ 
     34        wp_enqueue_script( 'minicolors', plugins_url( 'js/miniColors/jquery.miniColors.js', dirname( __FILE__ ) ), array( 'jquery' ), '1', true ); 
     35        wp_enqueue_style( 'minicolors', plugins_url( 'js/miniColors/jquery.miniColors.css', dirname( __FILE__ ) ), false, '1' ); 
     36    } 
     37} 
     38add_action( 'admin_enqueue_scripts', 'enqueue_mini_colors' ); 
     39 
     40/** 
     41 * Instantiate the minicolors scripts 
     42 */ 
     43function instantiate_mini_colors(){ 
     44    echo '<script>jQuery(".color").focus(function(){ jQuery(this).miniColors(); });</script>'; 
     45} 
     46add_action( 'admin_footer-tdd_pb_page_settings', 'instantiate_mini_colors' ); 
     47add_action( 'admin_footer-post.php', 'instantiate_mini_colors' ); 
     48 
    2949 
    3050/** 
     
    4262 */ 
    4363function tdd_pb_metabox_display( $post ) { 
     64 
     65 
    4466    $tdd_pb_color = get_post_meta( $post->ID, '_tdd_pb_color', true ); 
    45     $tdd_pb_percentage = get_post_meta( $post->ID, '_tdd_pb_percentage', true ); 
    46     $tdd_pb_input_method = get_post_meta( $post->ID, '_tdd_pb_input_method', true ); 
    47     $tdd_pb_start = get_post_meta( $post->ID, '_tdd_pb_start', true ); 
    48     $tdd_pb_end = get_post_meta( $post->ID, '_tdd_pb_end', true ); 
    49     $tdd_pb_percentage_display = get_post_meta( $post->ID, '_tdd_pb_percentage_display', true ); 
    50     $tdd_pb_xofy_display = get_post_meta( $post->ID, '_tdd_pb_xofy_display', true ); 
     67 
     68    if ( $input_method = get_post_meta( $post->ID, '_tdd_pb_input_method', true ) ){ 
     69        $whitelist = array( 'percentage', 'xofy' ); 
     70        if ( in_array( $input_method, $whitelist ) ) 
     71            $tdd_pb_input_method = $input_method; 
     72        else 
     73            $tdd_pb_input_method = 'percentage'; 
     74    } else { 
     75            $tdd_pb_input_method = 'percentage'; 
     76    } 
     77 
     78    $tdd_pb_percentage = absint( get_post_meta( $post->ID, '_tdd_pb_percentage', true ) ); 
     79    $tdd_pb_custom_color = tdd_pb_sanitize_color_hex_raw( get_post_meta( $post->ID, '_tdd_pb_custom_color', true ) ); 
     80    $tdd_pb_start = intval( get_post_meta( $post->ID, '_tdd_pb_start', true ) ); 
     81    $tdd_pb_end = intval( get_post_meta( $post->ID, '_tdd_pb_end', true ) ); 
     82 
     83    if ( $percentage_display = get_post_meta( $post->ID, '_tdd_pb_percentage_display', true ) ){ 
     84        $whitelist = array( 'on', 'off' ); 
     85        if ( in_array( $percentage_display, $whitelist ) ) 
     86            $tdd_pb_percentage_display = $percentage_display; 
     87        else 
     88            $tdd_pb_percentage_display = 'on'; 
     89    } else { 
     90        $tdd_pb_percentage_display = 'on'; 
     91    } 
     92 
     93    if ( $xofy_display = get_post_meta( $post->ID, '_tdd_pb_xofy_display', true ) ){ 
     94        $whitelist = array( 'on', 'off' ); 
     95        if ( in_array( $xofy_display, $whitelist ) ) 
     96            $tdd_pb_xofy_display = $xofy_display; 
     97        else 
     98            $tdd_pb_xofy_display = 'off'; 
     99    } else { 
     100        $tdd_pb_xofy_display = 'off'; 
     101    } 
     102 
    51103?> 
    52104 
     
    56108            <td><select name="tdd_pb_color"> 
    57109                <?php global $colors; ?> 
     110                <option>Select a color</option> 
    58111                <?php foreach ( $colors as $color=>$label ): ?> 
    59                     <option value="<?php echo $color; ?>" <?php selected( $tdd_pb_color, $color ); ?>"><?php echo $label; ?></option> 
     112                    <option value="<?php echo $color; ?>" <?php selected( $tdd_pb_color, $color ); ?>><?php echo $label; ?></option> 
    60113                <?php endforeach; ?> 
    61                 </select></td> 
     114                </select> 
     115 
     116                <label for="tdd_pb_custom_color">or custom: </label> 
     117                <input type="text" class="color" name="tdd_pb_custom_color" id="tdd_pb_custom_color" size="6" value="<?php echo $tdd_pb_custom_color; ?>"> 
     118            </td> 
    62119        </tr> 
    63120        <tr valign="top"> 
     
    107164            'ids' => array( get_the_ID() ), 
    108165            'class' => 'tdd_pb_race', 
     166            'height' => '25px' 
    109167        ) ); 
     168 
    110169?> 
    111170 
     
    113172} 
    114173 
    115 /** 
    116  * tdd_float_number_only 
    117  * Takes the input from a form field that expects a number, strips out everything except for numbers and decimals (.) 
    118  * Used for sanitation, not validation purposes 
    119  * @param string|int $str The input to filter. 
    120  * @return str The returned string 
    121  */ 
    122 function tdd_float_number_only( $str ){ 
    123     $regexreturn = array(); 
    124     preg_match_all("/\.?[0-9]\.?/", $str, $regexreturn ); // Selects out just the numbers and any decimal places. 
    125     $regexreturn = implode( '', $regexreturn[0] ); // Organizes the regex array back into a string. 
    126     return $regexreturn; 
    127 } 
    128  
    129174/* 
    130175* Saves the meta box info for the post 
    131176*/ 
    132177function tdd_pb_metabox_save( $post_id ) { 
    133     if ( isset( $_POST['tdd_pb_color'] ) ) { 
    134         update_post_meta( $post_id, '_tdd_pb_color', strip_tags( $_POST['tdd_pb_color'] ) ); 
    135     } 
     178 
     179    if ( isset( $_POST['tdd_pb_color'] ) ) 
     180        update_post_meta( $post_id, '_tdd_pb_color', sanitize_html_class( $_POST['tdd_pb_color'] ) ); 
     181 
     182    if ( isset( $_POST['tdd_pb_custom_color'] ) ) 
     183        update_post_meta( $post_id, '_tdd_pb_custom_color', tdd_pb_sanitize_color_hex_raw( $_POST['tdd_pb_custom_color'] ) ); 
     184    else 
     185        delete_post_meta( $post_id, '_tdd_pb_custom_color' ); 
    136186 
    137187    if ( isset( $_POST['tdd_pb_percentage'] ) ) { 
    138         $tdd_pb_percentage = tdd_float_number_only( $_POST['tdd_pb_percentage'] ); 
    139         update_post_meta( $post_id, '_tdd_pb_percentage', $tdd_pb_percentage ); 
     188        update_post_meta( $post_id, '_tdd_pb_percentage', absint( $_POST['tdd_pb_percentage'] ) ); 
    140189    } 
    141190 
    142191    if ( isset( $_POST['tdd_pb_start'] ) ) { 
    143         $tdd_pb_start = tdd_float_number_only( $_POST['tdd_pb_start'] ); 
    144         update_post_meta( $post_id, '_tdd_pb_start', $tdd_pb_start ); 
     192        update_post_meta( $post_id, '_tdd_pb_start', intval( $_POST['tdd_pb_start'] ) ); 
    145193    } 
    146194 
    147195    if ( isset( $_POST['tdd_pb_end'] ) ) { 
    148         $tdd_pb_end = tdd_float_number_only( $_POST['tdd_pb_end'] ); 
    149         update_post_meta( $post_id, '_tdd_pb_end', $tdd_pb_end ); 
     196        update_post_meta( $post_id, '_tdd_pb_end', intval( $_POST['tdd_pb_end'] ) ); 
    150197    } 
    151198 
    152199    if ( isset( $_POST['tdd_pb_input_method'] ) ){ 
    153         update_post_meta( $post_id, '_tdd_pb_input_method', strip_tags( $_POST['tdd_pb_input_method'] ) ); 
     200        switch ( $_POST['tdd_pb_input_method'] ){ 
     201            case 'xofy': 
     202                update_post_meta( $post_id, '_tdd_pb_input_method', 'xofy' ); 
     203                break; 
     204            default: 
     205                update_post_meta( $post_id, '_tdd_pb_input_method',  'percentage' ); 
     206        } 
    154207    } 
    155208 
     
    165218        update_post_meta( $post_id, '_tdd_pb_xofy_display', 'off' ); 
    166219    } 
    167  
    168     // $tdd_pb_input_method = get_post_meta( $post->ID, '_tdd_pb_input_method', true ); 
    169     // $tdd_pb_start = get_post_meta( $post->ID, '_tdd_pb_start', true ); 
    170     // $tdd_pb_end = get_post_meta( $post->ID, '_tdd_pb_end', true ); 
    171     // $tdd_pb_percentage_display = get_post_meta( $post->ID, '_tdd_pb_percentage_display', true ); 
    172     // $tdd_pb_xofy_display = get_post_meta( $post->ID, '_tdd_pb_xofy_display', true ); 
    173  
    174  
    175220 
    176221} 
     
    202247                'ids' => array( $post->ID ), 
    203248                'class' => 'tdd_pb_race', 
     249                'height' => '25px' 
    204250            ) ); 
    205251 
     
    229275            <label class="alignright"><span class="title"><?php _e( 'Bar Color', 'tdd_pb' ); ?></span> 
    230276                <select name="tdd_pb_color" id="tdd_pb_color"> 
     277                    <option>Select a color</option> 
    231278                <?php global $colors; ?> 
    232279                <?php foreach ( $colors as $color=>$label ): ?> 
     
    324371add_filter( 'post_row_actions', 'tdd_pb_quick_edit_button', 10, 2 ); 
    325372 
    326  
    327 /* 
    328 * View Settings admin page 
    329 */ 
    330 function tdd_pb_view_settings() { 
    331     $tdd_pb_options = get_option( 'tdd_pb_options' ); 
    332  
    333 ?> 
    334 <div class="wrap"> 
    335     <?php screen_icon( 'plugins' ); ?> 
    336     <h2><?php _e( 'TDD Progress Bars', 'tdd_pb' ); ?></h2> 
    337  
    338     <form action="options.php" method="post"> 
    339     <?php settings_fields( 'tdd_pb_options' ); ?> 
    340     <?php do_settings_sections(  __FILE__ ); ?> 
    341     <input name="Submit" type="submit" value="<?php _e( 'Save Changes', 'tdd_pb' ); ?>" class="button-primary" /> 
    342     </form> 
    343 </div> 
    344 <?php 
    345 } 
    346  
    347 //Register settings 
    348 function tdd_pb_admin_init() { 
    349     register_setting( 'tdd_pb_options', 'tdd_pb_options', 'tdd_pb_options_validate' ); 
    350  
    351     //register Scripts and Styles section & controls 
    352     add_settings_section( 'tdd_pb_sas', __( 'Scripts and Styles', 'tdd_pb' ), 'tdd_pb_admin_sasheader', __FILE__ ); 
    353     add_settings_field( 'animate', __( 'Animate Bars', 'tdd_pb' ), 'tdd_pb_admin_form_animate', __FILE__ , 'tdd_pb_sas' ); 
    354     add_settings_field( 'default_css', __( 'Use Default CSS', 'tdd_pb' ), 'tdd_pb_admin_form_default_css', __FILE__, 'tdd_pb_sas' ); 
    355  
    356     //register Percent section & controls 
    357     add_settings_section( 'tdd_pb_percent', __( 'Percentage Displays', 'tdd_pb' ), 'tdd_pb_admin_percentheader', __FILE__ ); 
    358     add_settings_field( 'display_percentage', __( 'Display Text on the Bar', 'tdd_pb' ), 'tdd_pb_admin_form_perecent_display', __FILE__, 'tdd_pb_percent' ); 
    359     add_settings_field( 'percentage_color', __( 'Color of Percentage Text', 'tdd_pb' ), 'tdd_pb_admin_form_percentage_color', __FILE__, 'tdd_pb_percent' ); 
    360     add_settings_field( 'bar_background_color', __( 'Color of Bar Background', 'tdd_pb' ), 'tdd_pb_admin_form_bar_background_color', __FILE__, 'tdd_pb_percent' ); 
    361  
    362 } 
    363 add_action( 'admin_init', 'tdd_pb_admin_init' ); 
    364  
    365 //Scripts & Styles section header 
    366 function tdd_pb_admin_sasheader() { 
    367     _e( "<p>The following two boxes allow you to stop including the animation javascript and the default CSS on each page load. It's highly suggested that you don't turn off the Default CSS option unless you have a replacement in mind. The Animate Bars option can be turned off freely if you'd prefer the bars didn't have that cool animation (or you want to save HTTP requests).</p>", 'tdd_pb' ); 
    368 } 
    369  
    370 //Animate Checkbox 
    371 function tdd_pb_admin_form_animate() { 
    372     $options = get_option( 'tdd_pb_options' ); 
    373     $checked = ( $options['animate'] ) ? ' checked="checked" ' : ''; 
    374     echo "<input name='tdd_pb_options[animate]' id='animate' type='checkbox' ". $checked ."> <br /> "; 
    375     _e( "<small>This script depends on jQuery, so it will ensure that is loaded as well</small>", 'tdd_pb' ); 
    376 } 
    377  
    378 //Default CSS 
    379 function tdd_pb_admin_form_default_css() { 
    380     $options = get_option( 'tdd_pb_options' ); 
    381     $checked = ( $options['default_css'] ) ? ' checked="checked" ' : ''; 
    382     echo "<input name='tdd_pb_options[default_css]' id='default_css' type='checkbox' ".$checked.">"; 
    383 } 
    384  
    385  
    386 //Percentage displays section header 
    387 function tdd_pb_admin_percentheader() { 
    388     _e( "<p>This is a global control to turn on and off text being displayed on the bar. Individual bars may show the percentage, text (x of y), both, or nothing if this box is checked. Bars will show nothing if this box is unchecked.</p>", 'tdd_pb' ); 
    389 } 
    390  
    391  
    392 //Percent Display 
    393 function tdd_pb_admin_form_perecent_display() { 
    394     $options = get_option( 'tdd_pb_options' ); 
    395     $checked = ( $options['display_percentage'] ) ? ' checked="checked" ' : ''; 
    396     echo "<input name='tdd_pb_options[display_percentage]' id='display_percentage' type='checkbox' ". $checked .">"; 
    397 } 
    398  
    399 //percentage_color 
    400 function tdd_pb_admin_form_percentage_color() { 
    401     $options = get_option( 'tdd_pb_options' ); 
    402     _e( "#<input name='tdd_pb_options[percentage_color]' id='percentage_color' type='text' value='{$options['percentage_color']}' maxlength='6' size='6' />", 'tdd_pb' ); 
    403 } 
    404  
    405 function tdd_pb_admin_form_bar_background_color() { 
    406     $options = get_option( 'tdd_pb_options' ); 
    407     echo "#<input name='tdd_pb_options[bar_background_color]' id='bar_backround_color' type='text' value='{$options['bar_background_color']}' maxlength='6' size='6' />"; 
    408 } 
    409  
    410 //validate 
    411 function tdd_pb_options_validate( $input ) { 
    412  
    413     //whitelist checkboxes (add them back in, even if false) 
    414     $input['display_percentage'] =  ( isset( $input['display_percentage'] ) ) ? $input['display_percentage'] : false; 
    415     $input['animate'] =  ( isset( $input['animate'] ) ) ? $input['animate'] : false; 
    416     $input['default_css'] =  ( isset( $input['default_css'] ) ) ? $input['default_css'] : false; 
    417  
    418     return $input; 
    419 } 
     373/** 
     374 * Class sets up and handles the global settings page for the progress bar. Settings sub-panel is attached to the custom post type menu. 
     375 */ 
     376class TDD_PB_Admin_Settings { 
     377 
     378    function __construct(){ 
     379        add_action( 'admin_menu', array( $this, 'add_submenu' ) ); 
     380        add_action( 'admin_init', array( $this, 'register_settings' ) ); 
     381    } 
     382 
     383    /** 
     384     * Add the sub-menu to the Progress Bars custom post type. 
     385     */ 
     386    function add_submenu(){ 
     387        add_submenu_page( 'edit.php?post_type=tdd_pb', 'TDD Progress Bars - Settings', 'Settings', 'manage_options', 'settings', array( $this, 'render_settings_page' ) ); 
     388    } 
     389 
     390    /** 
     391     * Renders the settings page. Fired via callback in $this->add_submenu 
     392     */ 
     393    function render_settings_page(){ 
     394        ?> 
     395        <div class="wrap"> 
     396            <?php screen_icon( 'plugins' ); ?> 
     397            <h2><?php _e( 'TDD Progress Bars', 'tdd_pb' ); ?></h2> 
     398 
     399            <?php if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] == true ): ?> 
     400                <div class="updated"><p><strong><?php _e('Settings saved.'); ?></strong></p></div> 
     401            <?php endif; ?> 
     402 
     403            <form action="options.php" method="post"> 
     404                <?php settings_fields( 'tdd_pb_options' ); ?> 
     405                <?php do_settings_sections(  __FILE__ ); ?> 
     406                <input name="Submit" type="submit" value="<?php _e( 'Save Changes', 'tdd_pb' ); ?>" class="button-primary" /> 
     407            </form> 
     408        </div> 
     409        <?php 
     410    } 
     411 
     412    /** 
     413     * Hooked in the construct() to admin_init 
     414     */ 
     415    function register_settings(){ 
     416        register_setting( 'tdd_pb_options', 'tdd_pb_options', array( $this, 'validate' ) ); 
     417 
     418        //register Scripts and Styles section & controls 
     419        add_settings_section( 'tdd_pb_sas', __( 'Scripts and Styles', 'tdd_pb' ), array( $this, 'sasheader' ), __FILE__ ); 
     420        add_settings_field( 'animate', __( 'Animate Bars', 'tdd_pb' ), array( $this, 'setting_animate' ), __FILE__ , 'tdd_pb_sas' ); 
     421        add_settings_field( 'default_css', __( 'Use Default CSS', 'tdd_pb' ), array( $this, 'setting_css' ), __FILE__, 'tdd_pb_sas' ); 
     422        add_settings_field( 'bar_background_color', __( 'Color of Bar Background', 'tdd_pb' ), array( $this, 'setting_bar_background_color' ), __FILE__, 'tdd_pb_sas' ); 
     423        add_settings_field( 'single_height', __( 'Default height for a single progress bar' ), array( $this, 'setting_default_single_height' ), __FILE__, 'tdd_pb_sas' ); 
     424        add_settings_field( 'race_height', __( 'Default height when multiple bars are shown together, sometimes called "racing"' ), array( $this, 'setting_default_race_height' ), __FILE__, 'tdd_pb_sas' ); 
     425 
     426        //register Percent section & controls 
     427        add_settings_section( 'tdd_pb_percent', __( 'Text Overlay Displays', 'tdd_pb' ), array( $this, 'percentheader' ), __FILE__ ); 
     428        add_settings_field( 'display_percentage', __( 'Display Text on the Bar', 'tdd_pb' ), array( $this, 'setting_perecent_display' ), __FILE__, 'tdd_pb_percent' ); 
     429        add_settings_field( 'percentage_color', __( 'Color of Overlay Text', 'tdd_pb' ), array( $this, 'setting_percentage_color' ), __FILE__, 'tdd_pb_percent' ); 
     430 
     431    } 
     432 
     433    function get_options( $options = '' ){ 
     434        if ( !$options ) 
     435            $options = get_option('tdd_pb_options'); 
     436        $mergedoptions = wp_parse_args( $options, array( 
     437            'animate' => true, 
     438            'default_css' => true, 
     439            'bar_background_color' => '333333', 
     440            'single_height' => '50', 
     441            'race_height' => '25', 
     442            'display_percentage' => true, 
     443            'percentage_color' => 'ececec', 
     444            ) ); 
     445 
     446        return $mergedoptions; 
     447    } 
     448 
     449    function sasheader() { 
     450        _e( "<p>The following two boxes allow you to stop including the animation javascript and the default CSS on each page load. It's highly suggested that you don't turn off the Default CSS option unless you have a replacement in mind. The Animate Bars option can be turned off freely if you'd prefer the bars didn't have that cool animation (or you'd rather not load the required javascript)</p>", 'tdd_pb' ); 
     451    } 
     452 
     453    //Animate Checkbox 
     454    function setting_animate() { 
     455        $options = $this->get_options(); 
     456        ?> 
     457        <input name="tdd_pb_options[animate]" id="animate" type="checkbox" <?php checked( $options['animate'] ); ?>> <br /> 
     458        <?php _e( "<small>This script depends on jQuery, so it will ensure that is loaded as well</small>", 'tdd_pb' ); ?> 
     459        <? 
     460    } 
     461 
     462    //Default CSS Checkbox 
     463    function setting_css() { 
     464        $options = $this->get_options(); 
     465        ?> 
     466        <input name="tdd_pb_options[default_css]" id="default_css" type="checkbox" <?php checked( $options['default_css'] ); ?>> 
     467        <?php 
     468    } 
     469 
     470    function setting_bar_background_color() { 
     471        //TODO: For all these color options, implement a color picker. 
     472        $options = $this->get_options(); 
     473        ?> 
     474        <input name="tdd_pb_options[bar_background_color]" id="bar_backround_color" type="text" value="<?php echo tdd_pb_sanitize_color_hex_raw( $options['bar_background_color'] ); ?>" size="6" class="color" /> 
     475        <?php 
     476    } 
     477 
     478    function setting_default_single_height() { 
     479        $options = $this->get_options(); 
     480        ?> 
     481        <input name="tdd_pb_options[single_height]" id="single_height" type="text" value="<?php echo absint( $options['single_height'] ); ?>" size="3" />px 
     482        <?php 
     483    } 
     484 
     485    function setting_default_race_height() { 
     486        $options = $this->get_options(); 
     487        ?> 
     488        <input name="tdd_pb_options[race_height]" id="race_height" type="text" value="<?php echo absint( $options['race_height'] ); ?>" size="3" />px 
     489        <?php 
     490    } 
     491 
     492    //Percentage displays section header 
     493    function percentheader() { 
     494        _e( "<p>This is a global control to turn on and off text being displayed on the bar. Individual bars may optionally show the percentage, text (x of y), or both, however nothing will show if this box is unchecked.</p>", 'tdd_pb' ); 
     495    } 
     496 
     497    //Percent Display Checkbox 
     498    function setting_perecent_display() { 
     499        $options = $this->get_options(); 
     500        ?> 
     501        <input name="tdd_pb_options[display_percentage]" id="display_percentage" type="checkbox" <?php checked( $options['display_percentage'] ) ?>> 
     502        <?php 
     503    } 
     504 
     505    //percentage_color 
     506    function setting_percentage_color() { 
     507        $options = $this->get_options(); 
     508        ?> 
     509        <input name="tdd_pb_options[percentage_color]" id="percentage_color" class="color" type="text" value="<?php echo tdd_pb_sanitize_color_hex_raw( $options['percentage_color'] ); ?>" size="6" /> 
     510        <?php 
     511    } 
     512 
     513    //validate 
     514    function validate( $input ) { 
     515        //whitelist checkboxes (add them back in, even if false) 
     516        $output['display_percentage'] =  isset( $input['display_percentage'] ) ? true : false; 
     517        $output['animate'] =  isset( $input['animate'] ) ? true : false; 
     518        $output['default_css'] =  isset( $input['default_css'] ) ? true : false; 
     519 
     520        //Sanitize other options 
     521        if ( ! empty( $input['bar_background_color'] ) ) 
     522            $output['bar_background_color'] = tdd_pb_sanitize_color_hex_raw( $input['bar_background_color'] ); 
     523        else 
     524 
     525            unset( $output['bar_background_color'] ); 
     526 
     527        if ( ! empty( $input['single_height'] ) ) 
     528            $output['single_height'] = absint( $input['single_height'] ); 
     529        else 
     530            unset( $output['single_height'] ); 
     531 
     532        if ( ! empty( $input['race_height'] ) ) 
     533            $output['race_height'] = absint( $input['race_height'] ); 
     534        else 
     535            unset( $output['race_height'] ); 
     536 
     537        if ( ! empty( $input['percentage_color'] ) ) 
     538            $output['percentage_color'] = tdd_pb_sanitize_color_hex_raw( $input['percentage_color'] ); 
     539        else 
     540            unset( $output['percentage_color'] ); 
     541 
     542        //We now need to set all the array indexes that are blank to their default values. 
     543        $mergedoutput = $this->get_options( $output ); 
     544        return $mergedoutput; 
     545    } 
     546 
     547} 
     548new TDD_PB_Admin_Settings; 
  • tdd-progress-bar/trunk/inc/widget.php

    r499505 r549997  
    55 
    66//Initalize/Register widget 
    7 add_action( 'widgets_init', 'tdd_progress_register_widget' ); 
    87function tdd_progress_register_widget() { 
    98    register_widget( 'TDD_Progress_Widget' ); 
    109} 
     10add_action( 'widgets_init', 'tdd_progress_register_widget' ); 
     11 
     12/** 
     13 * Enqueue Chosen.js and related CSS 
     14 */ 
     15function enqueue_chosen( $hook ){ 
     16    if ( 'widgets.php' == $hook ){ 
     17        wp_enqueue_script( 'chosen' , plugins_url( '/js/chosen/chosen/chosen.jquery.js', dirname( __FILE__ ) ), array( 'jquery' ), '0.9.8', false ); 
     18        wp_enqueue_style( 'chosen', plugins_url( 'js/chosen/chosen/chosen.css', dirname( __FILE__ ) ), false, '0.9.8' ); 
     19        wp_enqueue_style( 'chosen-overrides', plugins_url( 'css/mychosen.css', dirname( __FILE__ ) ), false, '0.9.8' ); 
     20    } 
     21} 
     22add_action( 'admin_enqueue_scripts', 'enqueue_chosen' ); 
    1123 
    1224class TDD_Progress_Widget extends WP_Widget { 
    13  
    1425    function TDD_Progress_Widget() { 
    1526        $widget_opts = array( 
     
    1930        $this->WP_Widget( 'TDD_Progress_Widget', 'TDD Progress Bars', $widget_opts ); 
    2031    } 
    21      
     32 
    2233    function form($instance){ 
    2334        $defaults = array( 
    2435            'title' => 'Progress', 
    25             'ids' => '', 
     36            'ids' => array(), 
    2637            'desc' => '', 
    2738        ); 
    28          
     39 
    2940        //merge defaults with existing instance 
    3041        $instance = wp_parse_args ( (array) $instance, $defaults ); 
     
    3344        $desc = $instance['desc']; 
    3445        ?> 
    35         <p>Title: <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></p> 
     46        <p> 
     47            <label for="<?php echo $this->get_field_id( 'title' ); ?>">Title: </label> 
     48            <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /> 
     49        </p> 
    3650 
    37         <p>Progress Bar IDs: <input class="widefat" id="<?php echo $this->get_field_id( 'ids' ); ?>" name="<?php echo $this->get_field_name( 'ids' ); ?>" type="text" value="<?php echo esc_attr( $ids ); ?>" /><br><small>Comma separated</small></p> 
    38          
    39         <p>Description: 
    40         <textarea class="widefat" id="<?php echo $this->get_field_id( 'desc '); ?>" name="<?php echo $this->get_field_name( 'desc' ); ?>"><?php echo esc_attr($desc); ?></textarea> 
     51        <p> 
     52            <label for="<?php echo $this->get_field_id( 'ids' ); ?>">Progress Bars: </label><br> 
     53            <select class="widefat chzn-select" style="width:220px" data-placeholder="Select progress bars to show" id="<?php echo $this->get_field_id( 'ids' ); ?>" name="<?php echo $this->get_field_name( 'ids' ); ?>[]" multiple> 
     54                <?php 
     55                    $bars = new WP_Query( array( 
     56                        'post_type' => 'tdd_pb', 
     57                        'posts_per_page' => -1 
     58                    )); 
     59                    while ( $bars->have_posts() ): $bars->the_post(); 
     60                        if ( in_array( get_the_ID(), (array) $ids ) ) 
     61                            $selected = "selected='selected'"; 
     62                        else 
     63                            $selected = ''; 
     64                        echo '<option value="' . get_the_ID() . '"' . $selected . '>'; 
     65                        the_title(); 
     66                        echo '</option>'; 
     67                    endwhile; 
     68                    wp_reset_postdata(); 
     69                ?> 
     70            </select><br> 
     71            <script>jQuery(".chzn-select").chosen();</script> <?php /* This entire form is ajax refreshed, putting the call here makes it stay bound on-save */ ?> 
     72            <small>Maximum of 20 will be shown in one block</small> 
     73            <!--<input class="widefat" id="<?php echo $this->get_field_id( 'ids' ); ?>" name="<?php echo $this->get_field_name( 'ids' ); ?>" type="text" value="<?php echo esc_attr( $ids ); ?>" /><br><small>Comma separated</small>--></p> 
     74 
     75        <p> 
     76            <label for="<?php echo $this->get_field_id( 'desc' ); ?>">Description:</label> 
     77            <textarea class="widefat" id="<?php echo $this->get_field_id( 'desc '); ?>" name="<?php echo $this->get_field_name( 'desc' ); ?>"><?php echo esc_attr($desc); ?></textarea> 
     78        </p> 
    4179 
    4280        <?php 
     
    4684        $instance = $old_instance; 
    4785        $instance['title'] = strip_tags ( $new_instance['title'] ); 
    48         $instance['ids'] = strip_tags( $new_instance['ids'] ); 
     86        $instance['ids'] = array_map( 'absint', $new_instance['ids'] ); 
    4987        $instance['desc'] = strip_tags( $new_instance['desc'] ); 
    5088        return $instance; 
    5189    } 
    52      
     90 
    5391    function widget( $args, $instance ){ 
    5492        extract($args); 
     
    5795 
    5896        $title = apply_filters( 'widget_title', $instance['title'] ); 
    59         if ( !empty($title) ){ echo $before_title . $title . $after_title; } 
    60          
    61         $ids = explode ( ',', $instance['ids'] ); 
    62          
     97        if ( !empty($title) ){ echo $before_title . sanitize_text_field( $title ) . $after_title; } 
     98 
    6399        $args = array( 
    64             'ids' => $ids, 
     100            'ids' => array_map( 'absint', (array) $instance['ids'] ), 
    65101            ); 
    66102 
    67103        echo tdd_pb_get_bars( $args ); 
    68          
    69         echo ( $instance['desc'] ) ? wpautop($instance['desc']) : '' ; 
    70          
     104 
     105        echo ( $instance['desc'] ) ? wpautop( esc_html( $instance['desc'] ) ) : '' ; 
     106 
    71107        echo $after_widget; 
    72108    } 
  • tdd-progress-bar/trunk/readme.txt

    r523224 r549997  
    55Requires at least: 3.3 
    66Tested up to: 3.3.1 
    7 Stable tag: 0.4 
     7Stable tag: 0.5 
    88 
    9 Configure and display any number of percent-complete progress bars.8 
     9Configure and display any number of percent-complete progress bars. 
    1010 
    1111== Description == 
     
    2424 
    2525= It doesn't look right.. = 
    26 This project uses some cutting-edge CSS3 to make things look cooler like drop shadow, inner-shadow, border-radius, etc. If it doesn't look right in your browser first, consider upgrading, second: let me know what browser you're using to see if I want to consider support. Things should degrade gracefully for non-cutting edge browsers (although IE6 is still going to look like crap no matter what you do). You're welcome to write your own CSS to override what I've already written (or un-check "Default Styles" on the settings page and roll-yer-own). 
     26This project uses some cutting-edge CSS3 to make things look cooler like drop shadow, inner-shadow, border-radius, etc. If it doesn't look right in your browser first, consider upgrading, second: let me know what browser you're using to see if I want to consider support. Things should degrade gracefully for non-cutting edge browsers (although IE6 is still going to look like crap no matter what you do). You're welcome to write your own CSS to override what I've already written (or un-check "Default Styles" on the settings page and roll-yer-own). Of course, if it's supposed to look right and it isn't, then there may be issue you should let me know about... 
    2727 
    2828= How do I use the filter hook to modify a percentage? = 
     
    5454* Race multiple bars: `[progress id=32,35,54]` 
    5555* Set the bar's width: `[progress ids=12,33 width="25%"]` 
     56* Set the height of the bar `[progress ids=12 height="50px"] 
    5657* Align Center: `[progress ids=4 width="50%" class="aligncenter"]` 
    5758 
    5859Note that "id" and "ids" are interchangeable 
    5960 
    60 Or use the widget which accepts a comma separated list of Ids to display. 
     61Or use the widget which allows you to pick bars to display 
    6162 
    6263== Changelog == 
     64 
     65= 0.5 = 
     66* UPGRADE NOTICE: Because of the change to how bars in the widget are selected and stored your widgets will not display properly until you re-configure them. Sorry for any inconvenience, but I thought the new interface was totally worth it. 
     67* Much easier to select bars to display in the widget thanks to Chosen.js. 
     68* Custom Colors! Now possible to set custom colors for each bar using the very nice miniColors color picker 
     69* Lots of sanitization behind the scenes to make the plugin more secure 
     70* Height options. It's now possible to set the height of the progress bar(s) in the shortcode by passing a CSS height value. See "Usage" for an example 
    6371 
    6472= 0.4 = 
  • tdd-progress-bar/trunk/tdd-progress-bar.php

    r523224 r549997  
    44Plugin URI: http://github.com/tddewey/tdd-progress 
    55Description: Manage and display progress bars 
    6 Version: 0.4 
     6Version: 0.5 
    77Author: Taylor D. Dewey 
    88Author URI: http://websitesthatdontsuck.com 
     
    140140add_action( 'init', 'tdd_pb_register_post_type' ); 
    141141 
    142 /* 
    143 * Set up admin menus 
    144 */ 
    145 function tdd_pb_admin_menu(){ 
    146     add_submenu_page( 'edit.php?post_type=tdd_pb', 'TDD Progress Bars - Settings', 'Settings', 'manage_options',  __FILE__, 'tdd_pb_view_settings' ); 
    147 } 
    148 add_action( 'admin_menu', 'tdd_pb_admin_menu' ); 
    149142 
    150143/* 
     
    177170        'width' => 'auto', 
    178171        'class' => '', 
     172        'height' => '', 
    179173        ), $args ); 
    180174 
     
    190184        'width' => $args['width'], 
    191185        'class' => $args['class'], 
     186        'height' => $args['height'] 
    192187    )); 
    193188 
     
    199194add_shortcode('tdd_pb', 'tdd_pb_shortcode' ); 
    200195 
     196/** 
     197 * Returns the HTML for a single bar. Function can be used to generate any random bar at any time. 
     198 * Arguments 
     199 * - $percentage => Will directly affect how much of the bar is shown 
     200 * - $text_on_bar => Whatever text to display on the bar in the numbers div. 
     201 * - $title => Title attribute for the bar container 
     202 * - $classes => An array of classes to put in the bar container 
     203 * - $Width => any valid CSS width, defaults to auto (for the bar container) 
     204 * - $height => any valid CSS height, defaults to the setting in Progress Bars->settings 
     205 * - $custom_color => If there's a custom color, will be added as the CSS style background-color 
     206 * 
     207 * @param  arr $args See above for arguments 
     208 * @return [type]       [description] 
     209 */ 
     210function tdd_pb_render_bar( $args ){ 
     211 
     212    $tdd_pb_options = get_option( 'tdd_pb_options'); 
     213 
     214    $args = extract( wp_parse_args( $args, $defaults = array( 
     215        'percentage' => 0, 
     216        'text_on_bar' => '', 
     217        'title' => '', 
     218        'classes' => array(), 
     219        'width' => 'auto', 
     220        'height' => '', 
     221        'color_class' => 'tdd_pb_red', 
     222        'custom_color' => '', 
     223        ) ) ); 
     224 
     225    $container_classes = 'tdd_pb_bar_container '; 
     226    foreach ( $classes as $class ){ 
     227        $container_classes .= sanitize_html_class( $class ); 
     228    } 
     229 
     230    $container_styles = 'width: ' . esc_attr( $width ) . ';'; 
     231    $container_styles .= ' background-color: #' . tdd_pb_sanitize_color_hex_raw( $tdd_pb_options["bar_background_color"] ) . ';'; 
     232    if ( $height ) 
     233        $container_styles .= ' height: ' . esc_attr( $height ) . ';'; 
     234 
     235    $bar_classes = 'tdd_pb_bar '; 
     236    $bar_classes .= sanitize_html_class( $color_class ); 
     237 
     238    $bar_styles = 'width: ' . absint( $percentage ) . '%;'; 
     239    if ( $custom_color ) 
     240        $bar_styles .= ' background-color: #' . tdd_pb_sanitize_color_hex_raw( $custom_color ) . ';'; 
     241 
     242 
     243    $return = '<div class="' . $container_classes . '" style="' . $container_styles . '" aria-valuemax="100" aria-valuemin="0" aria-valuenow="' . absint( $percentage ) . '" role="progressbar" title="' . esc_attr( $title ) . ': ' . absint( $percentage ) . '%">'; 
     244 
     245    //display percentage option is now a global control to show text on the bar (percentage or xofy). Name is for back compat 
     246    if ($tdd_pb_options['display_percentage']){ 
     247        $return .= '<div class="tdd_pb_numbers" style="color: #'. esc_attr( $tdd_pb_options["percentage_color"] ).'">' . esc_html( $text_on_bar ) . '</div>'; 
     248    } 
     249 
     250    $return .= '<div class="' . $bar_classes . '" style="' . $bar_styles . '"></div>'; 
     251 
     252    $return .= '</div>'; // end of the container 
     253 
     254    return $return; 
     255} 
     256 
    201257 
    202258/* 
    203259* Returns a progress bar container with 1 or more progress bars 
     260* TODO: Cleanup, this function is a mess. 
     261* TODO: Cache. 
    204262* 
    205263* @param    array   $ids            An array of the ids of progress bars to fetch. 
     
    209267*/ 
    210268function tdd_pb_get_bars( $args ){ 
    211     $defaults = array( 
     269    $args = wp_parse_args( $args, $defaults = array( 
    212270        'ids' => array(), 
    213271        'width' => 'auto', 
     272        'height' => '', 
    214273        'class' => '', 
    215274        'default_color' => 'tdd_pb_red', 
    216         ); 
     275        ) ); 
    217276 
    218277    $tdd_pb_options = get_option( 'tdd_pb_options'); 
    219278 
    220     //parse incoming arguments against default. 
    221     $args = wp_parse_args( $args, $defaults ); 
    222  
    223     //Filter the array to ensure we're getting things that look like integers. Will also filter out blank array items (i.e. '' ) 
     279    //Filter the array to ensure we're getting things that look like integers. Will also filter out blank array items 
    224280    $idsarr = array_filter( $args['ids'], 'is_numeric' ); 
    225281 
    226     //count if this is a race (more than one progress bar being displayed. The race format can also be forced by passing "race" in the $class argument) 
     282    //count if this is a race (more than one progress bar being displayed. The race format can also be forced by passing "tdd_pb_race" in the $class argument) 
     283    if ( count ( $idsarr ) > 1 ){ 
     284        $race = 'tdd_pb_race'; 
     285        if ( ! $args['height'] ){ 
     286            $args['height'] = $tdd_pb_options['race_height'] . 'px'; 
     287        } 
     288    } else { 
     289        $race = ''; 
     290        if ( ! $args['height'] ){ 
     291            $args['height'] = $tdd_pb_options['single_height'] . 'px'; 
     292        } 
     293    } 
     294 
     295 
    227296    $race = ( count( $idsarr ) > 1 ) ? 'tdd_pb_race' : ''; 
    228297 
    229298    //Set up our global container 
    230     $return = '<div class="tdd_pb_global_container '.$race.' '.$args['class'].'" style="width:'.strip_tags( $args['width'] ).'">'; 
     299    $return = '<div class="tdd_pb_global_container ' . $race . ' '. sanitize_html_class( $args['class'] ); 
     300    $return .= '" style="width:' . esc_attr(strip_tags( $args['width'] ) ) . '">'; 
    231301 
    232302    //If there are no ids to display, this is kind of a moot proccess - so let's say so: 
    233303    if ( count( $idsarr ) <= 0 ){ 
    234         $return .= '<p>' . __( 'No progress bars were set, so there is nothing to display', 'tdd_pb' ). '</p></div>'; 
     304        $return .= '<p>' . __( 'No progress bars were set, so there is nothing to display', 'tdd_pb' ) . '</p></div>'; 
    235305        return $return; 
    236306    } 
     
    240310    $tdd_pb_query->query(array( 
    241311        'post_type' => 'tdd_pb', 
    242         'posts_per_page' => -1, 
     312        'posts_per_page' => 20, 
    243313        'post__in' => $idsarr, 
    244314        'no_found_rows' => true, 
    245 //      'meta_key' => '_tdd_pb_percentage' //Used to be this was the only, and required key. Is no longer the case... 
    246315    )); 
    247316 
     
    250319        $return .= '<p>'. __( 'No progress bars found', 'tdd_pb' ) . '</p></div>'; 
    251320        return $return; 
    252         } 
     321    } 
    253322 
    254323    while ( $tdd_pb_query->have_posts() ): $tdd_pb_query->the_post(); 
    255         $percentage = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_percentage', true ) ); 
    256         $start = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_start', true ) ); 
    257         $end = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_end', true ) ); 
    258         $input_method = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_input_method', true ) ); 
    259         $percentage_display = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_percentage_display', true ) ); 
    260         $xofy_display = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_xofy_display', true ) ); 
    261  
    262         if ( $input_method == 'xofy' ){ 
    263             $calcpercentage = round( ($start/$end)*100, 2 ); 
     324        $color              = get_post_meta( get_the_ID(), '_tdd_pb_color', true ); 
     325        $custom_color       = get_post_meta( get_the_ID(), '_tdd_pb_custom_color', true ); 
     326        $percentage         = get_post_meta( get_the_ID(), '_tdd_pb_percentage', true ); 
     327        $start              = get_post_meta( get_the_ID(), '_tdd_pb_start', true ); 
     328        $end                = get_post_meta( get_the_ID(), '_tdd_pb_end', true ); 
     329        $input_method       = get_post_meta( get_the_ID(), '_tdd_pb_input_method', true ); 
     330        $percentage_display = get_post_meta( get_the_ID(), '_tdd_pb_percentage_display', true ); 
     331        $xofy_display       = get_post_meta( get_the_ID(), '_tdd_pb_xofy_display', true ); 
     332 
     333        //Get the calculated percentage 
     334        if ( $input_method == 'xofy' && $end > 0 ){ 
     335            $start = intval( $start ); 
     336            $end = intval( $end ); 
     337            $calcpercentage = round( $start/$end*100, 2 ); 
    264338        } else { 
    265339            $calcpercentage = $percentage; 
     
    269343        $calcpercentage = apply_filters( 'tdd_pb_calculated_percentage', $calcpercentage, get_the_ID() ); 
    270344 
    271         $color = strip_tags( get_post_meta( get_the_ID(), '_tdd_pb_color', true ) ); 
    272         //if no color, define a default 
    273         $color = (!$color) ? $args['default_color'] : 'tdd_pb_'.$color; 
    274         $return .= '<div title="'.get_the_title() .': '.$calcpercentage.'%" class="tdd_pb_bar_container" style="background-color: #'. $tdd_pb_options["bar_background_color"] .'" role="progressbar" aria-valuenow="'.$calcpercentage.'" aria-valuemax="100" aria-valuemin="0">'; 
    275         if ($tdd_pb_options['display_percentage']): 
    276             $return .= '<div class="tdd_pb_numbers" style="color: #'.$tdd_pb_options["percentage_color"].'">'; 
    277  
    278             if ( $percentage_display == 'on' || $percentage_display === '' ){ 
    279                 $return .= $calcpercentage .'%'; 
    280             } 
    281  
    282             if ( $xofy_display == 'on' ){ 
    283                 $return .='&nbsp;&nbsp;' . $start . ' ' . __( 'of', 'tdd_pb' ) . ' ' . $end; 
    284             } 
    285  
    286             $return .='</div>'; 
    287         endif; 
    288         $return .= '<div class="tdd_pb_bar '. $color .'" style="width:'. $calcpercentage .'%"></div></div>'; 
     345        //Fallback to default bar color 
     346        $color_class = ( $color ) ? sanitize_html_class( 'tdd_pb_' . $color ) : $args['default_color']; 
     347 
     348        //Are we displaying text on the bar? Potentially... (there's a global setting that can override this) 
     349        $text_on_bar = ''; 
     350        if ( $percentage_display == 'on' || $percentage_display === '' ) 
     351            $text_on_bar .= absint( $calcpercentage ) .'%'; 
     352 
     353        if ( $xofy_display == 'on' ) 
     354            $text_on_bar .='&nbsp;&nbsp;' .intval( $start ) . ' ' . __( 'of', 'tdd_pb' ) . ' ' . intval( $end ); 
     355 
     356        $barargs = array( 
     357            'percentage' => $calcpercentage, 
     358            'text_on_bar' => $text_on_bar, 
     359            'title' => get_the_title(), 
     360            'classes' => array(), 
     361            'width' => esc_attr( $args['width'] ), 
     362            'height' => esc_attr( $args['height'] ), 
     363            'color_class' => $color_class, 
     364            'custom_color' => tdd_pb_sanitize_color_hex_raw( $custom_color ) 
     365            ); 
     366 
     367        $return .= tdd_pb_render_bar( $barargs ); 
    289368 
    290369    endwhile; 
     370    wp_reset_postdata(); 
    291371 
    292372    //Close the progress bar container, and return everything to screen. 
     
    294374    return $return; 
    295375} 
     376 
     377/** 
     378 * Function to sanitize a hex color string. Taken from this ticket, so it may be in core eventually: 
     379 * http://core.trac.wordpress.org/attachment/ticket/19100/19100.2.diff 
     380 * @param  str $color suspected hex color string 
     381 * @return str        sanitized color hex string 
     382 */ 
     383function tdd_pb_sanitize_color_hex_raw( $color ) { 
     384    $default = ''; 
     385    $color = trim( strtolower( urldecode( $color ) ), "# \t\n\r\0\x0B" ); 
     386 
     387    if ( ! in_array( strlen( $color ), array( 3, 6 ) ) ) 
     388            return $default; 
     389 
     390    if ( ! preg_match( "/(([a-f0-9]){3}){1,2}$/i", $color ) ) 
     391        return $default; 
     392 
     393    return $color; 
     394} 
Note: See TracChangeset for help on using the changeset viewer.