All pastes #617900 Raw Edit

Something

public text v1 · immutable
·published 2007-07-13 15:54 UTC
rendered paste body
<?php 
/**
* @ Version: $Id: poll.php 1067 2006-11-14 20:24:55Z datahell $
* @ Copyright: Copyright (C) 2006 GoUp Inc.
* @ Package: Elxis
* @ Subpackage: Poll
* @ License: http://www.gnu.org/copyleft/gpl.html GNU/GPL
* Code was initially based on Mambo (www.mamboserver.com)
* Elxis CMS is a Free Software
* @ Note: Added Ajax capabilites and ip address check by Ioannis Sannos (datahell@elxis.org)
*/

defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );


$id 	= intval( mosGetParam( $_REQUEST, 'id', 0 ) );
$task 	= mosGetParam( $_REQUEST, 'task', '' );

if (($mosConfig_access == '1') | ($mosConfig_access == '3')) {
	//if is a guest find public frontend group name
	if ( $my->usertype == '' ) { 
	    $usertype = eUTF::utf8_strtolower($acl->get_group_name('29'));
	} else {
	    $usertype = eUTF::utf8_strtolower($my->usertype);
	}
	// ensure user is allowed to view this component
	if (!($acl->acl_check( 'action', 'view', 'users', $usertype, 'components', 'all' ) || 
	    $acl->acl_check( 'action', 'view', 'users', $usertype, 'components', 'com_poll' ))) {
		if(ereg('ajax', $task)) {
			echo _NOT_AUTH;
			exit;
		} else {
			mosRedirect( 'index.php', _NOT_AUTH );
		}
	}
}

require_once( $mainframe->getPath( 'front_html' ) );
require_once( $mainframe->getPath( 'class' ) );

$tabclass 			= 'sectiontableentry2,sectiontableentry1';
$polls_graphwidth 	= 200;
$polls_barheight 	= 2;
$polls_maxcolors 	= 5;
$polls_barcolor 	= 0;

$poll = new mosPoll( $database );

switch ($task) {
	case 'vote':
		pollAddVote( $id );
		break;
	case 'ajaxvote':
		pollAddAjaxVote( $id );
		break;
    case 'ajaxresult':
        pollAjaxresult( $id );
        break;
	default:
		pollresult( $id );
		break;
}

function pollAddVote( $uid ) {
	global $database, $mosConfig_offset, $Itemid, $lang;

	$redirect = 1;
	$sessionCookieName = md5( 'site'.$GLOBALS['mosConfig_live_site'] );
	$sessioncookie = mosGetParam( $_REQUEST, $sessionCookieName, '' );

	if (!$sessioncookie) {
		echo '<h3>'. _E_ALERT_ENABLED .'"</h3>';
		echo '<input class="button" type="button" value="'. _CMN_CONTINUE .'" onClick="window.history.go(-1);">';
		return;
	}

	$poll = new mosPoll( $database );
	if (!$poll->load( $uid )) {
		echo '<h3>'. _NOT_AUTH .'</h3>';
		echo '<input class="button" type="button" value="'. _CMN_CONTINUE .'" onClick="window.history.go(-1);">';
		return;
	}

    if ($poll->language != '') {
        $plangs = explode(',', $poll->language);
        if (!in_array($lang, $plangs)) {
            echo '<h3>'. _NOT_AUTH .'</h3>';
            echo '<input class="button" type="button" value="'. _CMN_CONTINUE .'" onClick="window.history.go(-1);">';
            return;
        }
    }

	//check if user has allready vote based on cookie
	$cookiename = "voted$poll->id";
	$voted = mosGetParam( $_COOKIE, $cookiename, '0' );

	if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR']!="") {
		$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
	} else if (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR']!="") {
		$ipaddress = $_SERVER['REMOTE_ADDR'];
	} else {
		$ipaddress = '';
	}

	// check if user has allready vote based on ip address
	if (!$voted) {
		if (strlen($ipaddress) > 7) {
			$nowstamp = strtotime ('now');
			$lagstamp = $nowstamp - ($poll->lag);
			$checkdate = date('Y-m-d H:i:s', $lagstamp);

			$query = "SELECT count(id) FROM #__poll_date WHERE "
				."\n poll_id='$poll->id' AND ipaddress='$ipaddress'"
				."\n AND date > '$checkdate'"
				;
			$database->setQuery($query);
			$counter = intval($database->loadResult());
			if ($counter > 0) { //oops a cheater!
				$voted = 1;
				@setcookie( $cookiename, '1', time()+$poll->lag );
			}
		}
	}

	if ($voted) {
		echo "<h3>"._ALREADY_VOTE."</h3>";
		echo "<input class=\"button\" type=\"button\" value=\""._CMN_CONTINUE."\" onClick=\"window.history.go(-1);\">";
		return;
	}

	$voteid = mosGetParam( $_POST, 'voteid', 0 );
	if (!$voteid) {
		echo "<h3>"._E_NO_SELECTION."</h3>";
		echo '<input class="button" type="button" value="'. _CMN_CONTINUE .'" onClick="window.history.go(-1);">';
		return;
	}

	setcookie( $cookiename, '1', time()+$poll->lag );

	$database->setQuery( "UPDATE #__poll_data SET hits=hits + 1 WHERE pollid='$poll->id' AND id='$voteid'");
	$database->query();

	$database->setQuery( "UPDATE #__polls SET voters=voters + 1 WHERE id='$poll->id'");
	$database->query();

	$now = date("Y-m-d G:i:s");
	$database->setQuery( "INSERT INTO #__poll_date (date,vote_id,poll_id) VALUES ('$now', '$voteid', '$poll->id')");
	$database->query();

	if ( $redirect ) {
		mosRedirect( sefRelToAbs( 'index.php?option=com_poll&task=results&id='. $uid ), _THANKS );
	} else {
		echo '<h3>'. _THANKS .'</h3>';
		echo '<form action="" method="GET">';
		echo '<input class="button" type="button" value="'. _BUTTON_RESULTS .'" onClick="window.location=\''. sefRelToAbs( 'index.php?option=com_poll&task=results&id='. $uid ) .'\'">';
		echo '</form>';
	}
}


/*
Author: Ioannis Sannos
*/
function pollAddAjaxVote( $uid ) {
	global $database, $mosConfig_offset, $Itemid, $lang;

	$sessionCookieName = md5( 'site'.$GLOBALS['mosConfig_live_site'] );
	$sessioncookie = mosGetParam( $_REQUEST, $sessionCookieName, '' );

	if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR']!="") {
		$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
	} else if (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR']!="") {
		$ipaddress = $_SERVER['REMOTE_ADDR'];
	} else {
		$ipaddress = '';
	}

	if (!$sessioncookie) {
		echo _E_ALERT_ENABLED;
		exit();
	}

	$poll = new mosPoll( $database );
	if (!$poll->load( $uid )) {
		echo _NOT_AUTH;
		exit();
	}

    if ($poll->language != '') {
        $plangs = explode(',', $poll->language);
        if (!in_array($lang, $plangs)) {
            echo _NOT_AUTH;
            exit();
        }
    }

	//check if user has allready vote based on cookie
	$cookiename = "voted$poll->id";
	$voted = mosGetParam( $_COOKIE, $cookiename, '0' );
	
	//check if user has allready vote based on ip address
	if (!$voted) {
		if (strlen($ipaddress) > 7) {
			$nowstamp = strtotime ('now');
			$lagstamp = $nowstamp - ($poll->lag);
			$checkdate = date('Y-m-d H:i:s', $lagstamp);

			$query = "SELECT count(id) FROM #__poll_date WHERE "
				."\n poll_id='$poll->id' AND ipaddress='$ipaddress'"
				."\n AND date > '$checkdate'"
				;
			$database->setQuery($query);
			$counter = intval($database->loadResult());
			if ($counter > 0) { //oops a cheater!
				$voted = 1;
				@setcookie( $cookiename, '1', time()+$poll->lag );
			}
		}
	}

	if ($voted) {
        pollAjaxresult( $poll->id, _ALREADY_VOTE );
        exit();
	}

	$voteid = mosGetParam( $_GET, 'voteid', 0 );
	if (!$voteid) {
		echo _E_NO_SELECTION;
		exit();
	}

	setcookie( $cookiename, '1', time()+$poll->lag );

	$database->setQuery( "UPDATE #__poll_data SET hits=hits + 1 WHERE pollid='$poll->id' AND id='$voteid'");
	$database->query();

	$database->setQuery( "UPDATE #__polls SET voters=voters + 1 WHERE id='$poll->id'");
	$database->query();

	$now = date("Y-m-d G:i:s");
	$database->setQuery( "INSERT INTO #__poll_date (date,vote_id,poll_id,ipaddress) VALUES ('$now', '$voteid', '$poll->id', '$ipaddress')");
	$database->query();

    /* Create ajax graph */
    $query = "SELECT id, text, hits FROM #__poll_data WHERE pollid='$poll->id' AND text <> '' ORDER BY id";
	$database->setQuery($query);
    if(!($options = $database->loadObjectList())) {
		echo _THANKS; //just say thanks, we can not create graph
		exit();
	}

    /* server responce on success */
    ob_clean();
    @header("Content-type: application/xml");
    echo '<?xml version="1.0" ?>';
    echo "\n<chan>\n";
	echo "<pollerTitle>".$poll->title."</pollerTitle>\n";
	echo "<totalMsg>"._E_NUM_VOTERS.": </totalMsg>\n";
    for ($i=0, $n=count( $options ); $i < $n; $i++) {
		echo "<option>\n";
		echo "<optionText>".$options[$i]->text."</optionText>\n";
		echo "<optionId>".$options[$i]->id."</optionId>\n";
		echo "<votes>".$options[$i]->hits."</votes>\n";
		echo "</option>";
	}
	echo "\n</chan>";
	exit();
}


function pollresult( $uid ) {
	global $database, $mosConfig_offset, $mosConfig_live_site, $Itemid, $mainframe, $lang;

	$poll = new mosPoll( $database );
	$poll->load( $uid );

	if (empty($poll->title)) {
		$poll->id = '';
		$poll->title = _E_SELECT_POLL;
	}

    if ($poll->language != '') {
        $plangs = explode(',', $poll->language);
        if (!in_array($lang, $plangs)) {
            $poll->id = '';
            $poll->title = _E_SELECT_POLL;
        }
    }

	$first_vote = '';
	$last_vote = '';

	if (isset($poll->id) && $poll->id != "") {
		$query = "SELECT MIN(date) AS mindate, MAX(date) AS maxdate"
		."\n FROM #__poll_date"
		."\n WHERE poll_id='$poll->id'"
		;
		$database->setQuery( $query );
		$dates = $database->loadObjectList();

		if (isset($dates[0]->mindate)) {
			$first_vote = mosFormatDate( $dates[0]->mindate, _GEM_DATE_FORMLC2 );
			$last_vote = mosFormatDate( $dates[0]->maxdate, _GEM_DATE_FORMLC2 );
		}
	}

    if (intval($poll->id) > 0) {
	   $query = "SELECT a.id, a.text, count( DISTINCT b.id ) AS hits, count( DISTINCT b.id )/COUNT( DISTINCT a.id )*100.0 AS percent"
	   . "\n FROM #__poll_data AS a"
	   . "\n LEFT JOIN #__poll_date AS b ON b.vote_id = a.id"
	   . "\n WHERE a.pollid='$poll->id' AND a.text <> ''"
	   . "\n GROUP BY a.id, a.text"
	   . "\n ORDER BY a.id"
	   ;
	   $database->setQuery( $query );
	   $votes = $database->loadObjectList();

    } else { $votes = null; }

	$query = "SELECT id, title"
	. "\n FROM #__polls"
	. "\n WHERE published=1"
	. "\n AND ((language LIKE '%$lang%') OR (language IS NULL))"
	. "\n ORDER BY id"
	;
	$database->setQuery( $query );
	$polls = $database->loadObjectList();


	reset( $polls );
	$link = sefRelToAbs( 'index.php?option=com_poll&amp;task=results&amp;id=\' + this.options[selectedIndex].value + \'&amp;Itemid='. $Itemid .'\' + \'' );
	$pollist = '<select name="id" class="inputbox" size="1" style="width:200px" onchange="if (this.options[selectedIndex].value != \'\') {document.location.href=\''. $link .'\'}">';
	$pollist .= '<option value="">'. _E_SELECT_POLL .'</option>';
	for ($i=0, $n=count( $polls ); $i < $n; $i++ ) {
		$k = $polls[$i]->id;
		$t = $polls[$i]->title;

		$sel = ($k == intval( $poll->id ) ? " selected=\"selected\"" : '');
		$pollist .= "\n\t<option value=\"".$k."\"$sel>" . $t . "</option>";
	}
	$pollist .= "\n</select>\n";

	// Adds parameter handling
	$menu =& new mosMenu( $database );
	$menu->load( $Itemid );

	$params =& new mosParameters( $menu->params );
	$params->def( 'page_title', 1 );
	$params->def( 'pageclass_sfx', '' );
	$params->def( 'back_button', $mainframe->getCfg( 'back_button' ) );
	$params->def( 'header', $menu->name );

	$mainframe->SetPageTitle($poll->title);

	poll_html::showResults( $poll, $votes, $first_vote, $last_vote, $pollist, $params );
}


/*
Author: Ioannis Sannos
*/
function pollAjaxresult( $uid, $msg='' ) {
	global $database, $lang;

	$poll = new mosPoll( $database );
	$poll->load( $uid );

	if (!$poll->load( $uid )) {
		echo _NOT_AUTH;
		exit();
	}

    if ($poll->language != '') {
        $plangs = explode(',', $poll->language);
        if (!in_array($lang, $plangs)) {
            $poll->id = '';
            $poll->title = _E_SELECT_POLL;
        }
    }

	if (empty($poll->title)) {
        echo _NOT_AUTH;
        exit();
	}

    /* Create ajax graph */
    $query = "SELECT id, text, hits FROM #__poll_data WHERE pollid='$poll->id' AND text <> '' ORDER BY id";
	$database->setQuery($query);
    if(!($options = $database->loadObjectList())) {
		echo $msg; //just print msg (usually: you have already voted), we can not create graph
		exit();
	}

    /* server responce */
    ob_clean();
    @header("Content-type: application/xml");
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    echo "<elxispoll>\n";
    if (trim($msg) != '') {
        echo "<specialMsg>".$msg."</specialMsg>\n";
    }
	echo "<totalMsg>"._E_NUM_VOTERS.": </totalMsg>\n";
	echo "<pollerTitle>".$poll->title."</pollerTitle>\n";
    for ($i=0, $n=count( $options ); $i < $n; $i++) {
		echo "<option>\n";
		echo "<optionText>".$options[$i]->text."</optionText>\n";
		echo "<optionId>".$options[$i]->id."</optionId>\n";
		echo "<votes>".$options[$i]->hits."</votes>\n";
		echo "</option>\n";
	}
	echo "</elxispoll>";
	exit;
}

?>