<?php


// if this an Atom theme make a special widget for it ;)
if(class_exists('AtomWidget') && (defined('Atom::VERSION'))){


 /*
  * Atom Top Rated Widget
  *
  * @since 1.0
  */
  class PostRatingsWidget extends AtomWidget{



   /*
    * Initialization
    *
    * @see AtomWidget::set and WP_Widget::__construct
    */
    public function __construct(){

      // register the widget and it's options
      $this->set(array(

        'id'           => 'top-rated',
        'title'        => __('Top Rated', PostRatings::ID),
        'description'  => __('The highest rated posts on your site'),
        'width'        => 500,
        'ajax_control' => 'get_top_rated',

        // default widget options
        'defaults'     => array(
          'title'         => __('Top Rated', PostRatings::ID),
          'sort'          => 'bayesian_rating',
          'order'         => 'DESC',
          'number'        => 5,
          'date_limit'    => 0,
          'post_type'     => 'post',
          'thumb_size'    => 48,
          'more'          => true,
        ),

        // one template definition only
        'templates'   => array(
          '<a class="clear-block" href="{URL}" title="{TITLE}">',
          ' {THUMBNAIL}',
          '  <span class="tt">{TITLE} ({AVG_RATING})</span>',
          '  <span class="c1">',
          ' {CONTENT}',
          ' {BAYESIAN_RATING_BAR}',
          '  </span>',
          '</a>',
        ),
      ));

      // register thumbnail size
      add_action('wp_loaded',    array(&$this, 'setThumbSize'));

      add_action('save_post',    array(&$this, 'flushCache'));
      add_action('deleted_post', array(&$this, 'flushCache'));
      add_action('switch_theme', array(&$this, 'flushCache'));
      add_action('rated_post',   array(&$this, 'flushCache'));
    }



    public function setThumbSize($sizes){

      // we need to process all instances because this function gets to run only once
      $widget_options = get_option($this->option_name);
      foreach((array)$widget_options as $instance => $options){

        // identify instance
        $id = "{$this->id_base}-{$instance}";

        // register thumb size if the widget is active
        if(!is_active_widget(false, $id, $this->id_base)) continue;

        $options = wp_parse_args($options, AtomWidget::getObject($id)->getDefaults());
        add_image_size($id, $options['thumb_size'], $options['thumb_size'], true);

      }
      return $sizes;
    }



    protected function getTopRated($args, &$more, $offset = 0){
      global $post;

      extract($args);

      $posts = PostRatings()->getTopRated(array(
        'post_type'  => $post_type,
        'number'     => $number,
        'sortby'     => $sort,
        'order'      => in_array($order, array('ASC', 'DESC'), true) ? $order : 'DESC',
        'offset'     => $offset,
        'date_limit' => $date_limit,
      ));

      $output = array();
      $max_rating = PostRatings()->getOptions('max_rating');

      foreach($posts as $index => $post){

        atom()->post = $post;
        $output[] = '<li>';

        $avg_rating = atom()->post->get('rating');
        $bayesian_rating = atom()->post->get('bayesian_rating');


        $bayesian_rating_bar = sprintf('<span class="rating" title="%s"><span class="bar" style="width:%d%%">%.2F</span></span>',
           sprintf(__('%s out of 10', PostRatings::ID), $avg_rating), (($bayesian_rating / $max_rating) * 100), $avg_rating);

        $avg_rating_bar = sprintf('<span class="rating" title="%s"><span class="bar" style="width:%d%%">%.2F</span></span>',
           sprintf(__('%s out of 10', PostRatings::ID), $avg_rating), (($avg_rating / $max_rating) * 100), $avg_rating);

        $fields = array(
          'TITLE'               => atom()->post->getTitle(),
          'COMMENT_COUNT'       => atom()->post->getCommentCount(),
          'THUMBNAIL'           => atom()->post->getThumbnail(str_replace('instance-', '', $id)),
          'URL'                 => atom()->post->getURL(),
          'CONTENT'             => convert_smilies(atom()->post->getContent(150, array(
                                     'allowed_tags' => Atom::SAFE_INLINE_TAGS,
                                     'more'         => '[&hellip;]',
                                   ))),
          'AVG_RATING'          => sprintf('%.2F', $avg_rating),
          'BAYESIAN_RATING'     => (int)(100 * ($bayesian_rating / $max_rating)),
          'BAYESIAN_RATING_BAR' => $bayesian_rating_bar,
          'AVG_RATING_BAR'      => $avg_rating_bar,
          'VOTES'               => (int)atom()->post->get('votes'),
          'MAX_RATING'          => $max_rating,
          'EXCERPT'             => atom()->post->getContent('e'),
          'DATE'                => atom()->post->getDate('relative'),
          'AUTHOR'              => atom()->post->author->getName(),
          'CATEGORIES'          => strip_tags(atom()->post->getTerms('category')),
          'TAGS'                => strip_tags(atom()->post->getTerms()),
          'VIEWS'               => number_format_i18n(atom()->post->getViews()),
          'INDEX'               => isset($posts->current_post) ? ($posts->current_post + 1) : $index,
          'ID'                  => atom()->post->getID(),
        );


        $fields = apply_filters('atom_widget_top_rated_keywords', $fields, atom()->post, $args);

        // output template
        $output[] = atom()->getBlockTemplate($template, $fields);

        $output[] = '</li>';
      }

      atom()->resetCurrentPost();

      return implode("\n", $output);
    }



    public function widget($args, $instance){
      extract($args);

      // check for a cached instance and display it if we have it
      if($this->getAndDisplayCache($widget_id)) return;

      $instance = wp_parse_args($instance, $this->getDefaults());
      $instance['id'] = $this->id;

      $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);

      $posts = $this->getTopRated($instance, $next);

      if(empty($posts))
        return atom()->log("No rated posts found in {$args['widget_id']} ({$args['widget_name']}). Widget marked as inactive");

      $output = $before_widget;

      if($title)
        $output .= $before_title.$title.$after_title;

      $output .= "<ul class=\"menu fadeThis ratings clear-block\">\n{$posts}\n</ul>\n";

      if($instance['more'] && $next && atom()->options('jquery')){

        // Atom 2.0 r9 +
        if(method_exists($this, 'getMoreLink')){
          $output .= $this->getMoreLink($instance['number'], 'get_top_rated');

        // for compatibility (deprecated from Atom 2.0 r9)
        }else{
          $output .= '<div class="fadeThis clear-block"><a href="#" class="more" data-count="'.$instance['number'].'">'.__('Show More', PostRatings::ID).'</a></div>';
          $output .= $this->getShowMoreCtrl('get_top_rated');

        }

      }

      $output .= $after_widget;

      echo $output;

      $this->addCache($widget_id, $output);
    }



   /*
    * Saves the widget options
    *
    * @see WP_Widget::update
    */
    public function update($new_instance, $old_instance){

      $this->FlushCache();
      extract($new_instance);

      return array(
        'title'         => esc_attr($title),
        'sort'          => esc_attr($sort),
        'order'         => ($order !== 'DESC') ? 'ASC' : 'DESC',
        'number'        => min(max((int)$number, 1), 20),
        'date_limit'    => (int)$date_limit,
        'post_type'     => post_type_exists($post_type) ? $post_type : 'post',
        'thumb_size'    => (int)$thumb_size,
        'more'          => (bool)$more,
        'template'      => (isset($template) && current_user_can('edit_themes')) ? $template : $old_instance['template'],

      ) + $old_instance;

    }



    public function form($instance){
      $instance = wp_parse_args($instance, $this->getDefaults());
      $plugin_options = PostRatings()->getOptions();
      ?>
      <div <?php $this->formClass(); ?>>

        <p>
          <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', PostRatings::ID); ?></label>
          <input class="wide" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $instance['title']; ?>" />
        </p>

        <p>
          <label for="<?php echo $this->get_field_id('post_type'); ?>"><?php _e('Get most rated:', PostRatings::ID); ?></label>
          <select id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
            <?php foreach(get_post_types(array('public' => true)) as $type): ?>
            <?php $object = get_post_type_object($type); ?>
            <option <?php if(!in_array($type, $plugin_options['post_types'])): ?> disabled="disabled" <?php endif; ?> value="<?php echo $type; ?>" <?php selected($type, $instance['post_type']); ?>><?php echo $object->labels->name; ?></option>
            <?php endforeach; ?>
          </select>
        </p>

        <p>
         <label for="<?php echo $this->get_field_id('sort'); ?>"><?php _e('Sort by:', PostRatings::ID); ?></label>
         <select class="wide" id="<?php echo $this->get_field_id('sort'); ?>" name="<?php echo $this->get_field_name('sort'); ?>">
           <option <?php selected('bayesian_rating', $instance['sort']); ?> value="bayesian_rating"><?php _e('Overall bayesian rating (score)', PostRatings::ID); ?></option>
           <option <?php selected('rating', $instance['sort']); ?> value="rating"><?php _e('Average rating', PostRatings::ID); ?></option>
           <option <?php selected('votes', $instance['sort']); ?> value="votes"><?php _e('Number of votes', PostRatings::ID); ?></option>
         </select>
        </p>

        <p>
         <label for="<?php echo $this->get_field_id('order'); ?>_desc">
           <input id="<?php echo $this->get_field_id('order'); ?>_desc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="DESC" <?php checked('DESC', $instance['order']); ?> />
           <?php _e('Descending', PostRatings::ID); ?>
         </label>
         &nbsp;&nbsp;&nbsp;&nbsp;
         <label for="<?php echo $this->get_field_id('order'); ?>_asc">
           <input id="<?php echo $this->get_field_id('order'); ?>_asc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="ASC" <?php checked('ASC', $instance['order']); ?> />
           <?php _e('Ascending', PostRatings::ID); ?>
         </label>
        </p>

        <p>
          <label for="<?php echo $this->get_field_id('date_limit'); ?>"><?php _e('Ignore posts older than:', PostRatings::ID); ?></label>
          <input id="<?php echo $this->get_field_id('date_limit'); ?>" name="<?php echo $this->get_field_name('date_limit'); ?>" type="text" value="<?php echo $instance['date_limit']; ?>" size="3" /> <?php _e('days', PostRatings::ID); ?>
          <br />
          <small><?php _e('(0 to ignore date)', PostRatings::ID); ?></small>
        </p>

        <p>
          <label for="<?php echo $this->get_field_id('thumb_size'); ?>"><?php _e('Thumbnail Size:', PostRatings::ID) ?></label>
          <input type="text" size="3" id="<?php echo $this->get_field_id('thumb_size'); ?>" name="<?php echo $this->get_field_name('thumb_size'); ?>" value="<?php if (isset($instance['thumb_size'])) echo (int)$instance['thumb_size']; ?>" /> <em><?php _e('pixels', PostRatings::ID); ?></em>
        </p>

        <p>
          <label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Limit:', PostRatings::ID); ?></label>
          <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $instance['number']; ?>" size="3" />
        </p>

        <p>
         <input <?php if(!atom()->options('jquery')) echo "disabled=\"disabled\""; ?> type="checkbox" id="<?php echo $this->get_field_id('more'); ?>" name="<?php echo $this->get_field_name('more'); ?>"<?php checked($instance['more']); ?> />
         <label for="<?php echo $this->get_field_id('more'); ?>" <?php if(!atom()->options('jquery')) echo "class=\"disabled\""; ?>><?php printf(__('Display %s Link', PostRatings::ID), '<code>'.__('Show More', PostRatings::ID).'</code>'); ?></label>
        </p>

        <?php if(current_user_can('edit_themes')): ?>
        <div class="user-template">
          <textarea class="wide code editor" id="<?php echo $this->get_field_id('template'); ?>" name="<?php echo $this->get_field_name('template'); ?>" rows="8" cols="28" mode="atom/html"><?php echo (empty($instance['template'])) ? format_to_edit($this->getTemplate()) : format_to_edit($instance['template']); ?></textarea>
          <small>
            <?php printf(__('Read the %s to see all available keywords.', PostRatings::ID), '<a href="'.Atom::THEME_DOC_URI.'" target="_blank">'.__('documentation', PostRatings::ID).'</a>'); ?>
          </small>
        </div>
        <?php endif; ?>

        <hr />
        <p>
          <em>
            <?php
              printf(__('<strong>Important:</strong> %1$s sized thumbnails have to be created if you just added this widget, or if you\'re changing the thumbnail size. Read more about thumbnail sizes %2$s', PostRatings::ID),  (int)$instance['thumb_size'].'x'.(int)$instance['thumb_size'], '<a href="'.admin_url('themes.php?page='.ATOM.'#advanced').'">'.__('here', PostRatings::ID).'</a>'); ?>
          </em>
        </p>

      </div>
      <?php
    }
  }





// ...normal widget
}else{






 /*
  * Top Rated posts widget
  *
  * @since 1.0
  */
  class PostRatingsWidget extends WP_Widget{



   /*
    * @since   1.0
    * @see     WP_Widget::__construct
    */
    function __construct(){

      $widget_ops = array('classname' => 'widget_top_rated', 'description' => __('The highest rated posts on your site', PostRatings::ID));
      parent::__construct('top-rated', __('Top Rated', PostRatings::ID), $widget_ops);

      add_action('save_post',    array(&$this, 'flush_widget_cache'));
      add_action('deleted_post', array(&$this, 'flush_widget_cache'));
      add_action('switch_theme', array(&$this, 'flush_widget_cache'));
      add_action('rated_post',   array(&$this, 'flush_widget_cache'));

    }



   /*
    * @since   1.0
    * @see     WP_Widget::widget
    */
    public function widget($args, $instance){
      global $post;

      extract($args);

      $cache = wp_cache_get('widget_top_rated', 'widget');

      if(!is_array($cache))
        $cache = array();

      if(isset($cache[$widget_id])){
        echo $cache[$widget_id];
        return;
      }

      $output = array();
      $options = PostRatings()->getOptions();
      extract($options);

      $title      = apply_filters('widget_title', empty($instance['title']) ? __('Top Rated', PostRatings::ID) : $instance['title'], $instance, $this->id_base);
      $number     = min(max((int)$instance['number'], 1), 20);
      $date_limit = min(max((int)$instance['date_limit'], 0), 999);
      $post_type  = post_type_exists($instance['post_type']) ? $instance['post_type'] : 'post';
      $sort       = isset($instance['sort']) ? esc_attr($instance['sort']) : 'bayesian_rating';

      $output[] = $before_widget;

      if($title)
        $output[] = $before_title.$title.$after_title;

      $posts = PostRatings()->getTopRated(array(
        'post_type'  => $post_type,
        'number'     => $number,
        'sortby'     => $sort,
        'order'      => in_array($instance['order'], array('ASC', 'DESC'), true) ? $instance['order'] : 'DESC',
        'date_limit' => $date_limit,
      ));

      if($posts){
        $output[] = '<ul>';

        foreach($posts as $post){
          setup_postdata($post);
          $output[] = '<li>';
          $output[] = '<a href="'.get_permalink().'">'.get_the_title().'</a>';

          if($sort === 'votes')
            $output[] =  '('.sprintf(_n('%d vote', '%d votes', $post->votes, PostRatings::ID), $post->votes, $post->votes).')';

          elseif($sort === 'rating')
            $output[] = sprintf('(%.2F)', $post->rating);

          else
            $output[] = sprintf('(%d%%)', (100 * ($post->bayesian_rating / $max_rating)));


          $output[] = '</li>';
        }

        $output[] = '</ul>';
        wp_reset_postdata();
      }

      $output[] = $after_widget;

      $output = implode("\n", $output);

      echo $output;

      $cache[$widget_id] = $output;
      wp_cache_set('widget_top_rated', $cache, 'widget');
    }



   /*
    * @since   1.0
    * @see     WP_Widget::update
    */
    public function update($new_instance, $old_instance){

      extract($new_instance);

      $instance = $old_instance;

      $instance['title'] = esc_attr(strip_tags($title));
      $instance['sort'] = esc_attr(strip_tags($sort));
      $instance['order'] = in_array($order, array('ASC', 'DESC'), true) ? $order : 'DESC';
      $instance['number'] = min(max((int)$number, 1), 20);
      $instance['date_limit'] = min(max((int)$date_limit, 0), 999);
      $instance['post_type'] = post_type_exists($post_type) ? $post_type : 'post';

      $this->flush_widget_cache();

      return $instance;
    }



   /*
    * Clears widget cache.
    * Should run after a post has been rated, deleted, edited etc...
    *
    * @since 1.0
    */
    public function flush_widget_cache(){
      wp_cache_delete('widget_top_rated', 'widget');
    }



   /*
    * @since   1.0
    * @see     WP_Widget::form
    */
    public function form($instance){

      $plugin_options = PostRatings()->getOptions();
      $title = isset($instance['title']) ? esc_attr($instance['title']) : __('Top Rated', PostRatings::ID);
      $sort = isset($instance['sort']) ? esc_attr($instance['sort']) : 'bayesian_rating';
      $order = in_array($instance['order'], array('ASC', 'DESC'), true) ? $instance['order'] : 'DESC';
      $date_limit = isset($instance['date_limit']) ? (int)$instance['date_limit'] : 0;
      $number = isset($instance['number']) ? min(max((int)$instance['number'], 1), 20) : 5;
      $post_type = post_type_exists($instance['post_type']) ? $instance['post_type'] : 'post';

      ?>
      <fieldset>
      <p>
        <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', PostRatings::ID); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
      </p>

      <p>
        <label for="<?php echo $this->get_field_id('post_type'); ?>"><?php _e('Get most rated:', PostRatings::ID); ?></label>
        <select class="widefat" id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
          <?php foreach(get_post_types(array('public' => true)) as $type): ?>
          <?php $object = get_post_type_object($type); ?>
          <option <?php if(!in_array($type, $plugin_options['post_types'])): ?> disabled="disabled" <?php endif; ?> value="<?php echo $type; ?>" <?php selected($type, $post_type); ?>><?php echo $object->labels->name; ?></option>
          <?php endforeach; ?>
        </select>
      </p>

      <p>
       <label for="<?php echo $this->get_field_id('sort'); ?>"><?php _e('Sort by:', PostRatings::ID); ?></label>
       <select class="widefat" id="<?php echo $this->get_field_id('sort'); ?>" name="<?php echo $this->get_field_name('sort'); ?>">
         <option <?php selected('bayesian_rating', $sort); ?> value="bayesian_rating"><?php _e('Overall bayesian rating (score)', PostRatings::ID); ?></option>
         <option <?php selected('rating', $sort); ?> value="rating"><?php _e('Average rating', PostRatings::ID); ?></option>
         <option <?php selected('votes', $sort); ?> value="votes"><?php _e('Number of votes', PostRatings::ID); ?></option>
       </select>
      </p>

      <p>
       <label for="<?php echo $this->get_field_id('order'); ?>_desc">
         <input id="<?php echo $this->get_field_id('order'); ?>_desc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="DESC" <?php checked('DESC', $order); ?> />
         <?php _e('Descending', PostRatings::ID); ?>
       </label>

       <label for="<?php echo $this->get_field_id('order'); ?>_asc">
         <input id="<?php echo $this->get_field_id('order'); ?>_asc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="ASC" <?php checked('ASC', $order); ?> />
         <?php _e('Ascending', PostRatings::ID); ?>
       </label>
      </p>

      <p>
        <label for="<?php echo $this->get_field_id('date_limit'); ?>"><?php _e('Ignore posts older than:', PostRatings::ID); ?></label>
        <input id="<?php echo $this->get_field_id('date_limit'); ?>" name="<?php echo $this->get_field_name('date_limit'); ?>" type="text" value="<?php echo $date_limit; ?>" size="3" /> <?php _e('days', PostRatings::ID); ?>
        <br />
        <small><?php _e('(0 to ignore date)', PostRatings::ID); ?></small>
      </p>

      <p>
        <label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Limit:', PostRatings::ID); ?></label>
        <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" />
      </p>
      </fieldset>
      <?php
    }

  }


}
