WordPress.org

Plugin Directory

Changeset 1719626


Ignore:
Timestamp:
08/25/17 22:28:13 (3 months ago)
Author:
madjax
Message:

1.5 release

Location:
woocommerce-rejoiner
Files:
3 edited
4 copied

Legend:

Unmodified
Added
Removed
  • woocommerce-rejoiner/tags/1.5/includes/class-wc-rejoiner.php

    r1711827 r1719626  
    3636        $this->rejoiner_api_key = $this->get_option( 'rejoiner_api_key' ); 
    3737        $this->rejoiner_api_secret = $this->get_option( 'rejoiner_api_secret' ); 
     38        $this->rejoiner_send_to_list = $this->get_option( 'rejoiner_send_to_list' ); 
     39        $this->rejoiner_list_id = $this->get_option( 'rejoiner_list_id' ); 
    3840         
    3941        // Actions 
     
    8183                'title'             => __( 'Rejoiner API Secret', 'woocommerce' ), 
    8284                'description'       => __( 'Enter your API Secret', 'woocommerce' ), 
     85                'type'              => 'text', 
     86                'default'           => '' 
     87            ), 
     88            'rejoiner_send_to_list' => array( 
     89                'title'             => __( 'Send New Customers to Rejoiner', 'woocommerce' ), 
     90                'description'       => '', 
     91                'type'              => 'checkbox', 
     92                'label'             => 'Send all new customers who complete an order to Rejoiner', 
     93                'default'           => '' 
     94            ), 
     95            'rejoiner_list_id' => array( 
     96                'title'             => __( 'Rejoiner List ID', 'woocommerce' ), 
     97                'description'       => __( 'Enter the ID of the Rejoiner List you would like to use.', 'woocommerce' ), 
    8398                'type'              => 'text', 
    8499                'default'           => '' 
     
    555570            $linetotal = $order->get_line_total( $item, true, true ); 
    556571             
    557             $thumb_id = get_post_thumbnail_id( $_product->post->ID ); 
     572            $thumb_id = get_post_thumbnail_id( $_product->get_id() ); 
    558573             
    559574            $thumb_size = apply_filters( 'wc_rejoiner_thumb_size', 'shop_thumbnail' ); 
     
    571586            } 
    572587             
    573             $product_cats = get_the_terms( $_product->post->ID, 'product_cat'); 
     588            $product_cats = get_the_terms( $_product->get_id(), 'product_cat'); 
    574589 
    575590            if( is_array( $product_cats ) ) { 
     
    590605         
    591606            $_item = array( 
    592                 'product_id' => $_product->post->ID, 
     607                'product_id' => $_product->get_id(), 
    593608                'name' => $this->escape_for_json( apply_filters( 'woocommerce_cart_item_name', $_product->get_title() ) ), 
    594609                'item_qty' => $qty, 
     
    596611                'qty_price' => $this->format_money( $linetotal ), 
    597612                'image_url' => $this->format_image_url( $image ), 
    598                 'product_url' => get_permalink( $_product->post->ID ), 
     613                'product_url' => get_permalink( $_product->get_id() ), 
    599614                'category' => $product_cats_json                             
    600615            ); 
     
    718733             
    719734        } 
     735         
     736        if( $this->rejoiner_send_to_list == 'yes' && !empty( $this->rejoiner_list_id ) ) { 
     737             
     738            $fname = $order->billing_first_name; 
     739            $body = '{"email": "' . $email . '","list_id": "' . $this->rejoiner_list_id . '","first_name": "' . $fname . '"}'; 
     740             
     741            $rejoiner_path = '/api/1.0/site/' . $rejoiner_id . '/contact_add';       
     742            $hash = $this->rejoiner_hash( $rejoiner_api_secret, 'POST', $rejoiner_path, $body ); 
     743            $auth = 'Rejoiner ' . $rejoiner_api_key . ':' . $hash; 
     744             
     745            $baseurl = 'https://app.rejoiner.com'; 
     746            $posturl = $baseurl . $rejoiner_path; 
     747              
     748            $args = array( 
     749                'body' => $body, 
     750                'timeout' => '5', 
     751                'redirection' => '5', 
     752                'httpversion' => '1.0', 
     753                'blocking' => true, 
     754                'headers' => array( 
     755                    'Authorization' => $auth, 
     756                    'Content-Type' => 'application/json' 
     757                ), 
     758            ); 
     759              
     760            $response = wp_remote_post( $posturl, $args ); 
     761             
     762            if( !is_wp_error( $response ) ) 
     763                $code = $response['response']['code']; 
     764             
     765            if ( $code == 200 ) { 
     766                 
     767                $rjconverted = true; 
     768         
     769                if( WP_DEBUG_LOG ) 
     770                    error_log( "Rejoiner REST Contact Add Success / HTTP Response: $code" ); 
     771                
     772            } else { 
     773                 
     774                $rjconverted = false; 
     775                 
     776                if( is_wp_error( $response ) ) { 
     777     
     778                    $error_message = $response->get_error_message(); 
     779                     
     780                    if( WP_DEBUG_LOG ) 
     781                        error_log( "Rejoiner REST Contact Add Error : $error_message" ); 
     782     
     783                } else { 
     784                     
     785                    if( WP_DEBUG_LOG ) 
     786                        error_log( "Rejoiner REST Contact Add Error / HTTP Response: $code" );               
     787                     
     788                }            
     789                 
     790            } 
     791             
     792        } 
    720793 
    721794         
     
    775848 
    776849} 
     850?> 
  • woocommerce-rejoiner/tags/1.5/readme.txt

    r1711827 r1719626  
    33Tags: woocommerce, rejoiner, abandoned cart, email marketing, remarketing, ecommerce, cart abandonment email 
    44Requires at least: 4.6 
    5 Tested up to: 4.7.5 
    6 Stable tag: 1.4.6 
     5Tested up to: 4.8.1 
     6Stable tag: 1.5 
    77License: GPLv3 
    88License URI: http://www.gnu.org/licenses/gpl-3.0.html 
     
    8282 
    8383== Changelog == 
     84= 1.5 =  
     85* Add option to send converted customers to a Rejoiner list via REST API. 
     86 
    8487= 1.4.6 = 
    8588* Bugfix for AJAX cart sync 
  • woocommerce-rejoiner/tags/1.5/woocommerce-rejoiner.php

    r1711827 r1719626  
    55Description: eCommerce Email Marketing & Cart Abandonment Software for WooCommerce 
    66Author: Jackson Whelan 
    7 Author URI: http://www.jacksonwhelan.com 
    8 Version: 1.4.6 
     7Author URI: http://jacksonwhelan.com 
     8Version: 1.5 
    99*/ 
    1010 
  • woocommerce-rejoiner/trunk/includes/class-wc-rejoiner.php

    r1711827 r1719626  
    3636        $this->rejoiner_api_key = $this->get_option( 'rejoiner_api_key' ); 
    3737        $this->rejoiner_api_secret = $this->get_option( 'rejoiner_api_secret' ); 
     38        $this->rejoiner_send_to_list = $this->get_option( 'rejoiner_send_to_list' ); 
     39        $this->rejoiner_list_id = $this->get_option( 'rejoiner_list_id' ); 
     40 
     41        $this->rejoiner_optin_accept = $this->get_option( 'rejoiner_optin_accept' ); 
     42        $this->rejoiner_optin_field_label = $this->get_option( 'rejoiner_optin_field_label' ); 
     43        $this->rejoiner_optin_status = $this->get_option( 'rejoiner_optin_status' ); 
     44        $this->rejoiner_optin_list_id = $this->get_option( 'rejoiner_optin_list_id' ); 
     45        $this->rejoiner_optin_show_checkout = $this->get_option( 'rejoiner_optin_show_checkout' ); 
     46        $this->rejoiner_optin_show_account = $this->get_option( 'rejoiner_optin_show_account' ); 
     47        $this->rejoiner_optin_show_registration = $this->get_option( 'rejoiner_optin_show_registration' ); 
    3848         
    3949        // Actions 
     
    5363        add_action( 'wp_ajax_rejoiner_sync', array( $this, 'rejoiner_sync' ) ); 
    5464        add_action( 'wp_ajax_nopriv_rejoiner_sync', array( $this, 'rejoiner_sync' ) ); 
    55  
     65         
     66        // Accept Marketing 
     67        if( $this->rejoiner_optin_accept == 'yes' ) { 
     68             
     69            if( $this->rejoiner_optin_show_checkout == 'yes' ) { 
     70                add_filter( 'woocommerce_checkout_fields' , array( $this, 'rejoiner_checkout_fields' ) ); 
     71                add_action( 'woocommerce_checkout_order_processed', array( $this, 'rejoiner_save_checkout' ), 10, 3 ); 
     72            } 
     73                 
     74            if( $this->rejoiner_optin_show_registration == 'yes' ) { 
     75                add_action( 'woocommerce_register_form', array( $this, 'rejoiner_register_fields' ) ); 
     76                add_action( 'woocommerce_created_customer', array( $this, 'rejoiner_save_register' ) );          
     77            } 
     78             
     79            if( $this->rejoiner_optin_show_account == 'yes' ) { 
     80                add_action( 'woocommerce_edit_account_form_start', array( $this, 'rejoiner_register_fields' ) ); 
     81                add_action( 'woocommerce_save_account_details', array( $this, 'rejoiner_save_account' ) );           
     82            } 
     83 
     84        } 
     85                     
    5686    } 
    5787 
     
    83113                'type'              => 'text', 
    84114                'default'           => '' 
     115            ), 
     116            'rejoiner_section_title' => array( 
     117                'title'     => 'List Integration', 
     118                'type'     => 'title', 
     119            ), 
     120            'rejoiner_send_to_list' => array( 
     121                'title'             => __( 'Send New Customers to Rejoiner', 'woocommerce' ), 
     122                'description'       => '', 
     123                'type'              => 'checkbox', 
     124                'label'             => 'Send all new customers who complete an order to Rejoiner', 
     125                'default'           => '' 
     126            ), 
     127            'rejoiner_list_id' => array( 
     128                'title'             => __( 'Rejoiner List ID', 'woocommerce' ), 
     129                'description'       => __( 'Enter the ID of the Rejoiner List you would like to use.', 'woocommerce' ), 
     130                'type'              => 'text', 
     131                'default'           => '' 
     132            ), 
     133            'rejoiner_optin_accept' => array( 
     134                'title'             => __( 'Accepts Marketing Permissions Capture', 'woocommerce' ), 
     135                'description'       => 'This will send the email addresses of all customers who opt-in to receive marketing from you to Rejoiner', 
     136                'type'              => 'checkbox', 
     137                'label'             => 'Yes, enable Rejoiner to gather marketing permissions from customers at checkout.', 
     138                'default'           => '' 
     139            ), 
     140            'rejoiner_optin_field_label' => array( 
     141                'title'             => __( 'Opt-In Field Label', 'woocommerce' ), 
     142                'description'       => __( 'The text you want to use for your opt-in.', 'woocommerce' ), 
     143                'type'              => 'text', 
     144                'default'           => 'Subscribe to our newsletter' 
     145            ), 
     146            'rejoiner_optin_status' => array( 
     147                'title'             => __( 'Opt-In Status', 'woocommerce' ), 
     148                'description'       => __( 'Default behavior of opt-in checkbox.', 'woocommerce' ), 
     149                'type'              => 'select', 
     150                'default'           => 'disabled', 
     151                'options'           => array( 
     152                    'disabled' => 'Disabled by default', 
     153                    'enabled' => 'Enabled by default' 
     154                ) 
     155            ), 
     156            'rejoiner_optin_list_id' => array( 
     157                'title'             => __( 'Accepts Marketing Rejoiner List ID', 'woocommerce' ), 
     158                'description'       => __( 'Enter the ID of the Rejoiner List you would like to use.', 'woocommerce' ), 
     159                'type'              => 'text', 
     160                'default'           => '' 
     161            ), 
     162            'rejoiner_optin_show_checkout' => array( 
     163                'title'             => __( 'Opt-In Options', 'woocommerce' ), 
     164                'type'              => 'checkbox', 
     165                'label'             => 'Show Opt-In on Checkout', 
     166                'default'           => 'yes' 
     167            ), 
     168            'rejoiner_optin_show_account' => array( 
     169                'type'              => 'checkbox', 
     170                'label'             => 'Show Opt-In on Account Details', 
     171            ), 
     172            'rejoiner_optin_show_registration' => array( 
     173                'type'              => 'checkbox', 
     174                'label'             => 'Show Opt-In on Registration Form', 
    85175            ) 
    86176             
    87177        ); 
    88178 
    89     }  
     179    } 
    90180     
     181    function rejoiner_checkout_fields( $fields ) { 
     182 
     183        $default = ( $this->rejoiner_optin_status == 'enabled' ) ? 1 : 0 ; 
     184         
     185        $fields['billing']['rejoiner_optin'] = array( 
     186            'type'      => 'checkbox', 
     187            'label'     => $this->rejoiner_optin_field_label, 
     188            'required'  => false, 
     189            'class'     => array('form-row-wide'), 
     190            'default'   => $default 
     191        ); 
     192         
     193        return $fields; 
     194    } 
     195     
     196    function rejoiner_register_fields() { 
     197        ?> 
     198        <p class="form-row form-row-wide"> 
     199            <label for="rejoiner_optin"> 
     200                <input type="checkbox" class="input-checkbox" name="rejoiner_optin" id="rejoiner_optin" value="subscribe" <?php $this->rejoiner_get_checked(true); ?> /> 
     201                <?php echo $this->rejoiner_optin_field_label; ?> 
     202            </label> 
     203        </p> 
     204        <div class="clear"></div> 
     205        <?php        
     206    } 
     207         
     208    function rejoiner_save_register( $customer_id ) { 
     209        if ( isset( $_POST['rejoiner_optin'] ) ) { 
     210            $this->rejoiner_rest_subscribe( $_POST['email'], $this->rejoiner_optin_list_id, null ); 
     211            update_user_meta( $customer_id, 'rejoiner_subscribe', date('U') ); 
     212        } 
     213    } 
     214 
     215    function rejoiner_save_account() { 
     216        if ( isset( $_POST['rejoiner_optin'] ) ) { 
     217            $this->rejoiner_rest_subscribe( $_POST['account_email'], $this->rejoiner_optin_list_id, $_POST['account_first_name'] ); 
     218            update_user_meta( get_current_user_id(), 'rejoiner_subscribe', date('U') ); 
     219        } 
     220    } 
     221 
     222    function rejoiner_save_checkout( $order_id, $posted_data, $order ) { 
     223        if ( isset( $_POST['rejoiner_optin'] ) ) { 
     224            $this->rejoiner_rest_subscribe( $_POST['billing_email'], $this->rejoiner_optin_list_id, $_POST['billing_first_name'] ); 
     225            update_post_meta( $order_id, 'rejoiner_subscribe', date('U') ); 
     226        } 
     227    } 
     228         
     229    function rejoiner_get_checked( $echo = false ) { 
     230         
     231        $checked = ( $this->rejoiner_optin_status == 'enabled' ) ? 'checked=checked' : '' ; 
     232         
     233        if( $echo == true ) { 
     234             
     235            echo $checked; 
     236             
     237        } else { 
     238                 
     239            return $checked; 
     240         
     241        } 
     242         
     243    } 
     244 
    91245    function rejoiner_tracking_code() { 
    92246         
     
    555709            $linetotal = $order->get_line_total( $item, true, true ); 
    556710             
    557             $thumb_id = get_post_thumbnail_id( $_product->post->ID ); 
     711            $thumb_id = get_post_thumbnail_id( $_product->get_id() ); 
    558712             
    559713            $thumb_size = apply_filters( 'wc_rejoiner_thumb_size', 'shop_thumbnail' ); 
     
    571725            } 
    572726             
    573             $product_cats = get_the_terms( $_product->post->ID, 'product_cat'); 
     727            $product_cats = get_the_terms( $_product->get_id(), 'product_cat'); 
    574728 
    575729            if( is_array( $product_cats ) ) { 
     
    590744         
    591745            $_item = array( 
    592                 'product_id' => $_product->post->ID, 
     746                'product_id' => $_product->get_id(), 
    593747                'name' => $this->escape_for_json( apply_filters( 'woocommerce_cart_item_name', $_product->get_title() ) ), 
    594748                'item_qty' => $qty, 
     
    596750                'qty_price' => $this->format_money( $linetotal ), 
    597751                'image_url' => $this->format_image_url( $image ), 
    598                 'product_url' => get_permalink( $_product->post->ID ), 
     752                'product_url' => get_permalink( $_product->get_id() ), 
    599753                'category' => $product_cats_json                             
    600754            ); 
     
    718872             
    719873        } 
    720  
     874         
     875        if( $this->rejoiner_send_to_list == 'yes' && !empty( $this->rejoiner_list_id ) ) { 
     876             
     877            $fname = $order->billing_first_name; 
     878            $body = '{"email": "' . $email . '","list_id": "' . $this->rejoiner_list_id . '","first_name": "' . $fname . '"}'; 
     879             
     880            $rejoiner_path = '/api/1.0/site/' . $rejoiner_id . '/contact_add';       
     881            $hash = $this->rejoiner_hash( $rejoiner_api_secret, 'POST', $rejoiner_path, $body ); 
     882            $auth = 'Rejoiner ' . $rejoiner_api_key . ':' . $hash; 
     883             
     884            $baseurl = 'https://app.rejoiner.com'; 
     885            $posturl = $baseurl . $rejoiner_path; 
     886              
     887            $args = array( 
     888                'body' => $body, 
     889                'timeout' => '5', 
     890                'redirection' => '5', 
     891                'httpversion' => '1.0', 
     892                'blocking' => true, 
     893                'headers' => array( 
     894                    'Authorization' => $auth, 
     895                    'Content-Type' => 'application/json' 
     896                ), 
     897            ); 
     898              
     899            $response = wp_remote_post( $posturl, $args ); 
     900             
     901            if( !is_wp_error( $response ) ) 
     902                $code = $response['response']['code']; 
     903             
     904            if ( $code == 200 ) { 
     905                 
     906                $rjconverted = true; 
     907         
     908                if( WP_DEBUG_LOG ) 
     909                    error_log( "Rejoiner REST Contact Add Success / HTTP Response: $code" ); 
     910                
     911            } else { 
     912                 
     913                $rjconverted = false; 
     914                 
     915                if( is_wp_error( $response ) ) { 
     916     
     917                    $error_message = $response->get_error_message(); 
     918                     
     919                    if( WP_DEBUG_LOG ) 
     920                        error_log( "Rejoiner REST Contact Add Error : $error_message" ); 
     921     
     922                } else { 
     923                     
     924                    if( WP_DEBUG_LOG ) 
     925                        error_log( "Rejoiner REST Contact Add Error / HTTP Response: $code" );               
     926                     
     927                }            
     928                 
     929            } 
     930             
     931        } 
     932 
     933         
     934    } 
     935 
     936    function rejoiner_rest_subscribe( $email, $list_id, $fname ) { 
     937                         
     938        $rejoiner_id = $this->rejoiner_id; 
     939        $rejoiner_domain_name = $this->rejoiner_domain_name; 
     940        $rejoiner_api_key = $this->rejoiner_api_key; 
     941        $rejoiner_api_secret = $this->rejoiner_api_secret; 
     942         
     943        if( !$rejoiner_id || !$rejoiner_api_key || !$rejoiner_api_secret ) { 
     944            return; 
     945        } 
     946         
     947        $body = '{ "email": "' . $email . '", "list_id": "' . $list_id . '", "first_name": "' . $fname . '" }'; 
     948         
     949        $rejoiner_path = '/api/1.0/site/' . $rejoiner_id . '/contact_add';       
     950        $hash = $this->rejoiner_hash( $rejoiner_api_secret, 'POST', $rejoiner_path, $body ); 
     951        $auth = 'Rejoiner ' . $rejoiner_api_key . ':' . $hash; 
     952         
     953        $baseurl = 'https://app.rejoiner.com'; 
     954        $posturl = $baseurl . $rejoiner_path; 
     955          
     956        $args = array( 
     957            'body' => $body, 
     958            'timeout' => '5', 
     959            'redirection' => '5', 
     960            'httpversion' => '1.0', 
     961            'blocking' => true, 
     962            'headers' => array( 
     963                'Authorization' => $auth, 
     964                'Content-Type' => 'application/json' 
     965            ), 
     966        ); 
     967          
     968        $response = wp_remote_post( $posturl, $args ); 
     969         
     970        if( !is_wp_error( $response ) ) 
     971            $code = $response['response']['code']; 
     972         
     973        if ( $code == 200 ) { 
     974                 
     975            if( WP_DEBUG_LOG ) 
     976                error_log( "Rejoiner REST Subscribe Success / HTTP Response: $code" ); 
     977            
     978        } else { 
     979                         
     980            if( is_wp_error( $response ) ) { 
     981 
     982                $error_message = $response->get_error_message(); 
     983                 
     984                if( WP_DEBUG_LOG ) 
     985                    error_log( "Rejoiner REST Subscribe Error : $error_message" ); 
     986 
     987            } else { 
     988                 
     989                if( WP_DEBUG_LOG ) 
     990                    error_log( "Rejoiner REST Subscribe Error / HTTP Response: $code /  $email, $list_id, $fname  " );               
     991                 
     992            }            
     993             
     994        } 
     995         
     996    } 
     997 
     998    function rejoiner_rest_unsubscribe( $email ) { 
     999                 
     1000        $rejoiner_id = $this->rejoiner_id; 
     1001        $rejoiner_domain_name = $this->rejoiner_domain_name; 
     1002        $rejoiner_api_key = $this->rejoiner_api_key; 
     1003        $rejoiner_api_secret = $this->rejoiner_api_secret; 
     1004         
     1005        if( !$rejoiner_id || !$rejoiner_api_key || !$rejoiner_api_secret ) { 
     1006            return; 
     1007        } 
     1008         
     1009        $body = '{ "email": "' . $email . '" }'; 
     1010         
     1011        $rejoiner_path = '/api/1.0/site/' . $rejoiner_id . '/lead/unsubscribe';      
     1012        $hash = $this->rejoiner_hash( $rejoiner_api_secret, 'POST', $rejoiner_path, $body ); 
     1013        $auth = 'Rejoiner ' . $rejoiner_api_key . ':' . $hash; 
     1014         
     1015        $baseurl = 'https://app.rejoiner.com'; 
     1016        $posturl = $baseurl . $rejoiner_path; 
     1017          
     1018        $args = array( 
     1019            'body' => $body, 
     1020            'timeout' => '5', 
     1021            'redirection' => '5', 
     1022            'httpversion' => '1.0', 
     1023            'blocking' => true, 
     1024            'headers' => array( 
     1025                'Authorization' => $auth, 
     1026                'Content-Type' => 'application/json' 
     1027            ), 
     1028        ); 
     1029          
     1030        $response = wp_remote_post( $posturl, $args ); 
     1031         
     1032        if( !is_wp_error( $response ) ) 
     1033            $code = $response['response']['code']; 
     1034         
     1035        if ( $code == 200 ) { 
     1036                 
     1037            if( WP_DEBUG_LOG ) 
     1038                error_log( "Rejoiner REST Unsubscribe Success / HTTP Response: $code" ); 
     1039            
     1040        } else { 
     1041                         
     1042            if( is_wp_error( $response ) ) { 
     1043 
     1044                $error_message = $response->get_error_message(); 
     1045                 
     1046                if( WP_DEBUG_LOG ) 
     1047                    error_log( "Rejoiner REST Unsubscribe Error : $error_message" ); 
     1048 
     1049            } else { 
     1050                 
     1051                if( WP_DEBUG_LOG ) 
     1052                    error_log( "Rejoiner REST Unsubscribe Error / HTTP Response: $code" );               
     1053                 
     1054            }            
     1055             
     1056        } 
    7211057         
    7221058    } 
     
    7751111 
    7761112} 
     1113?> 
  • woocommerce-rejoiner/trunk/readme.txt

    r1711827 r1719626  
    33Tags: woocommerce, rejoiner, abandoned cart, email marketing, remarketing, ecommerce, cart abandonment email 
    44Requires at least: 4.6 
    5 Tested up to: 4.7.5 
    6 Stable tag: 1.4.6 
     5Tested up to: 4.8.1 
     6Stable tag: 1.5 
    77License: GPLv3 
    88License URI: http://www.gnu.org/licenses/gpl-3.0.html 
     
    8282 
    8383== Changelog == 
     84= 1.5.1 = 
     85* Accept marketing feature 
     86 
     87= 1.5 =  
     88* Add option to send converted customers to a Rejoiner list via REST API. 
     89 
    8490= 1.4.6 = 
    8591* Bugfix for AJAX cart sync 
  • woocommerce-rejoiner/trunk/woocommerce-rejoiner.php

    r1711827 r1719626  
    55Description: eCommerce Email Marketing & Cart Abandonment Software for WooCommerce 
    66Author: Jackson Whelan 
    7 Author URI: http://www.jacksonwhelan.com 
    8 Version: 1.4.6 
     7Author URI: http://jacksonwhelan.com 
     8Version: 1.5.1 
    99*/ 
    1010 
Note: See TracChangeset for help on using the changeset viewer.