<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/

	
	File: qa-include/qa-layer-voters-flaggers.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: Theme layer class for viewing voters and flaggers


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

	class qa_html_theme_layer extends qa_html_theme_base {
		
		var $qa_voters_flaggers_queue=array();
		var $qa_voters_flaggers_cache=array();
		

	//	Utility functions for this layer
		
		function queue_post_voters_flaggers($post)
		{
			if (!qa_user_post_permit_error('permit_view_voters_flaggers', $post)) {
				$postids=array(@$post['postid'], @$post['opostid']); // opostid can be relevant for flags
			
				foreach ($postids as $postid)
					if (isset($postid) && !isset($this->qa_voters_flaggers_cache[$postid]))
						$this->qa_voters_flaggers_queue[$postid]=true;
			}
		}
				
		function queue_raw_posts_voters_flaggers($posts)
		{
			if (is_array($posts))
				foreach ($posts as $post)
					if (isset($post['raw']))
						$this->queue_post_voters_flaggers($post['raw']);
		}
		
		function retrieve_queued_voters_flaggers()
		{
			if (count($this->qa_voters_flaggers_queue)) {
				require_once QA_INCLUDE_DIR.'qa-db-votes.php';
				
				$postids=array_keys($this->qa_voters_flaggers_queue);
				
				foreach ($postids as $postid)
					$this->qa_voters_flaggers_cache[$postid]=array();
				
				$newvotersflaggers=qa_db_uservoteflag_posts_get($postids);
				
				if (QA_FINAL_EXTERNAL_USERS) {
					$keyuserids=array();
					foreach ($newvotersflaggers as $voterflagger)
						$keyuserids[$voterflagger['userid']]=true;
						
					$useridhandles=qa_get_public_from_userids(array_keys($keyuserids));
					foreach ($newvotersflaggers as $index => $voterflagger)
						$newvotersflaggers[$index]['handle']=@$useridhandles[$voterflagger['userid']];
				}
				
				foreach ($newvotersflaggers as $voterflagger)
					$this->qa_voters_flaggers_cache[$voterflagger['postid']][]=$voterflagger;
				
				$this->qa_voters_flaggers_queue=array();
			}
		}
		
		function get_post_voters_flaggers($post, $postid)
		{
			require_once QA_INCLUDE_DIR.'qa-util-sort.php';
			
			if (!isset($this->qa_voters_flaggers_cache[$postid])) {
				$this->queue_post_voters_flaggers($post);
				$this->retrieve_queued_voters_flaggers();
			}
			
			$votersflaggers=@$this->qa_voters_flaggers_cache[$postid];
			
			if (isset($votersflaggers))
				qa_sort_by($votersflaggers, 'handle');
				
			return $votersflaggers;
		}
		

	//	Collect up all required postids for the entire page to save DB queries - common case where whole page output
		
		function main()
		{
			foreach ($this->content as $key => $part) {
				if (strpos($key, 'q_list')===0)
					$this->queue_raw_posts_voters_flaggers(@$part['qs']);
				
				elseif (strpos($key, 'q_view')===0) {
					$this->queue_post_voters_flaggers($part['raw']);
					$this->queue_raw_posts_voters_flaggers($part['c_list']['cs']);
				
				} elseif (strpos($key, 'a_list')===0) {	
					if (!empty($part)) {
						$this->queue_raw_posts_voters_flaggers($part['as']);

						foreach ($part['as'] as $a_item)
							$this->queue_raw_posts_voters_flaggers(@$a_item['c_list']['cs']);
					}
				}
			}
			
			qa_html_theme_base::main();
		}
		
	
	//	Other functions which also collect up required postids for lists to save DB queries - helps with widget output and Ajax calls
	
		function q_list_items($q_items)
		{
			$this->queue_raw_posts_voters_flaggers($q_items);
			
			qa_html_theme_base::q_list_items($q_items);
		}
		
		function a_list_items($a_items)
		{
			$this->queue_raw_posts_voters_flaggers($a_items);
			
			qa_html_theme_base::a_list_items($a_items);
		}

		function c_list_items($c_items)
		{
			$this->queue_raw_posts_voters_flaggers($c_items);
			
			qa_html_theme_base::c_list_items($c_items);
		}
		
	
	//	Actual output of the voters and flaggers
	
		function vote_count($post)
		{
			$votersflaggers=$this->get_post_voters_flaggers($post['raw'], @$post['vote_opostid'] ? $post['raw']['opostid'] : $post['raw']['postid']);
			
			$tooltip='';
			
			if (isset($votersflaggers)) {
				$uphandles='';
				$downhandles='';
				
				foreach ($votersflaggers as $voterflagger) {
					if ($voterflagger['vote']>0)
						$uphandles.=(strlen($uphandles) ? ', ' : '').qa_html($voterflagger['handle']);
	
					if ($voterflagger['vote']<0)
						$downhandles.=(strlen($downhandles) ? ', ' : '').qa_html($voterflagger['handle']);
					
					$tooltip=trim((strlen($uphandles) ? ('&uarr; '.$uphandles) : '')."\n\n".(strlen($downhandles) ? ('&darr; '.$downhandles) : ''));
				}
			}
			
			if (strlen($tooltip))
				$this->output('<span title="'.$tooltip.'">');
			
			qa_html_theme_base::vote_count($post);
			
			if (strlen($tooltip))
				$this->output('</span>');
		}
		
		
		function post_meta_flags($post, $class)
		{
			$postid=@$post['raw']['opostid'];
			if (!isset($postid))
				$postid=@$post['raw']['postid'];
	
			$tooltip='';
			
			if (isset($postid)) {
				$votersflaggers=$this->get_post_voters_flaggers($post, $postid);
				
				if (isset($votersflaggers))
					foreach ($votersflaggers as $voterflagger)
						if ($voterflagger['flag']>0)
							$tooltip.=(strlen($tooltip) ? ', ' : '').qa_html($voterflagger['handle']);
			}
						
			if (strlen($tooltip))
				$this->output('<span title="&#9873; '.$tooltip.'">');
			
			qa_html_theme_base::post_meta_flags($post, $class);
			
			if (strlen($tooltip))
				$this->output('</span>');
		}

	}
	

/*
	Omit PHP closing tag to help avoid accidental output
*/