barl = (file_exists(THEME.'images/barl.png') ? THEME_ABS.'images/barl.png' : e_PLUGIN_ABS.'poll/images/barl.png'); $this->barr = (file_exists(THEME.'images/barr.png') ? THEME_ABS.'images/barr.png' : e_PLUGIN_ABS.'poll/images/barr.png'); $this->bar = (file_exists(THEME.'images/bar.png') ? THEME_ABS.'images/bar.png' : e_PLUGIN_ABS.'poll/images/bar.png'); } /* function remove_poll_cookies Remove unused poll cookies. See: http://krijnhoetmer.nl/stuff/javascript/maximum-cookies/ Thanks Fanat1k - bugtracker #4983 no parameters */ function remove_poll_cookies() { $arr_polls_cookies = array(); if(!empty($_COOKIE)) { foreach($_COOKIE as $cookie_name => $cookie_val) { // Collect poll cookies if(strpos($cookie_name,'poll_') === 0) { // e107::getDebug()->log("Poll: ".$cookie_name); list($str, $int) = explode('_', $cookie_name, 2); if (($str == 'poll') && is_numeric($int)) { // Yes, its poll's cookie $arr_polls_cookies[] = $int; } } } } if (count($arr_polls_cookies) > 1) { // Remove all except first (assumption: there is always only one active poll) rsort($arr_polls_cookies); for($i = 1, $iMax = count($arr_polls_cookies); $i < $iMax; $i++) { cookie("poll_{$arr_polls_cookies[$i]}", "", (time() - 2592000)); } } } /* function delete_poll parameter in: $existing - existing poll id to be deleted parameter out: language text string on succesful delete, nothing on failed deletion */ function delete_poll($existing) { global $admin_log; $sql = e107::getDb(); if ($sql->delete("polls", " poll_id='".intval($existing)."' ")) { if (function_exists("admin_purge_related")) { admin_purge_related("poll", $existing); } e107::getLog()->add('POLL_01',POLLAN_3.': '.LAN_DELETED.': '.$existing,''); //return POLL_ADLAN08; } } /* function clean_poll_array parameter in: original array with poll answers as entered in the forums parameter out: cleaned array which trims the poll answers (to avoid 'falsely' empty answers) but allows to have '0' as an option Note: Used instead of array_filter because array_filter($array, 'trim') would also ignore the value '0' (as that returns FALSE) http://www.bubjavier.com/common-problems-php-arrayfilter-no-callback */ function clean_poll_array($val) { $val = trim($val); // trims the array to remove poll answers which are (seemingly) empty but which may contain spaces $allowed_vals = array("0"); // Allows for '0' to be a poll answer option. Possible to add more allowed values. return in_array($val, $allowed_vals, true) ? true : ( $val ? true : false ); } /* function submit_poll $mode = 1 :: poll is main poll $mode = 2 :: poll is forum poll returns message */ function submit_poll($mode=1) { $tp = e107::getParser(); $sql = e107::getDb(); $admin_log = e107::getLog(); $pollID = (int) varset($_POST['poll_id']); $poll_title = $tp->toDB($_POST['poll_title']); $poll_comment = $tp->toDB($_POST['poll_comment']); $multipleChoice = intval($_POST['multipleChoice']); $showResults = intval($_POST['showResults']); $pollUserclass = intval($_POST['pollUserclass']); $storageMethod = intval($_POST['storageMethod']); $active_start = (!$_POST['startmonth'] || !$_POST['startday'] || !$_POST['startyear'] ? 0 : mktime (0, 0, 0, $_POST['startmonth'], $_POST['startday'], $_POST['startyear'])); $active_end = (!$_POST['endmonth'] || !$_POST['endday'] || !$_POST['endyear'] ? 0 : mktime (0, 0, 0, $_POST['endmonth'], $_POST['endday'], $_POST['endyear'])); $poll_options = ''; $pollOption = $tp->filter($_POST['poll_option']); $pollOption = array_filter($pollOption, 'poll::clean_poll_array'); foreach ($pollOption as $key => $value) { $poll_options .= $tp->toDB($value).chr(1); } if (defset('POLLACTION') === 'edit' || !empty($pollID)) { $sql->update("polls", "poll_title='{$poll_title}', poll_options='{$poll_options}', poll_comment='{$poll_comment}', poll_type={$mode}, poll_allow_multiple={$multipleChoice}, poll_result_type={$showResults}, poll_vote_userclass={$pollUserclass}, poll_storage_method={$storageMethod} WHERE poll_id=".$pollID); /* update poll results - bugtracker #1124 .... */ $sql->select("polls", "poll_votes", "poll_id='".$pollID."' "); $foo = $sql->fetch(); $voteA = explode(chr(1), $foo['poll_votes']); // $poll_option = varset($poll_options, 0); $opt = count($pollOption) - count($voteA); if ($opt) { for($a=0; $a<=$opt; $a++) { $foo['poll_votes'] .= '0'.chr(1); } $sql->update("polls", "poll_votes='".$foo['poll_votes']."' WHERE poll_id='".$pollID."' "); } e107::getLog()->add('POLL_02','ID: '.$pollID.' - '.$poll_title,''); //$message = POLLAN_45; } else { $votes = ''; for($a=1, $aMax = count($_POST['poll_option']); $a<= $aMax; $a++) { $votes .= '0'.chr(1); } if ($mode == 1) { /* deactivate other polls */ if ($sql->select("polls", "*", "poll_type=1 AND poll_vote_userclass!=255")) { $deacArray = $sql->db_getList(); foreach ($deacArray as $deacpoll) { $sql->update("polls", "poll_end_datestamp='".time()."', poll_vote_userclass='255' WHERE poll_id=".$deacpoll['poll_id']); } } $ret = $sql->insert("polls", "'0', ".time().", ".intval($active_start).", ".intval($active_end).", ".ADMINID.", '{$poll_title}', '{$poll_options}', '{$votes}', '', '1', '".$tp->toDB($poll_comment)."', '".intval($multipleChoice)."', '".intval($showResults)."', '".intval($pollUserclass)."', '".intval($storageMethod)."'"); e107::getLog()->add('POLL_03','ID: '.$ret.' - '.$poll_title,''); // Intentionally only log admin-entered polls } else { $sql->insert("polls", "'0', ".intval($_POST['iid']).", '0', '0', ".USERID.", '$poll_title', '$poll_options', '$votes', '', '2', '0', '".intval($multipleChoice)."', '0', '0', '".intval($storageMethod)."'"); } } return varset($message); } function get_poll($query) { global $e107; $sql = e107::getDb(); if ($sql->gen($query)) { $pollArray = $sql->fetch(); if (!check_class($pollArray['poll_vote_userclass'])) { $POLLMODE = 'disallowed'; } else { switch($pollArray['poll_storage_method']) { case POLL_MODE_COOKIE: $userid = ''; $cookiename = 'poll_'.$pollArray['poll_id']; if (isset($_COOKIE[$cookiename])) { $POLLMODE = 'voted'; } else { $POLLMODE = 'notvoted'; } break; case POLL_MODE_IP: $userid = e107::getIPHandler()->getIP(FALSE); $voted_ids = explode('^', substr($pollArray['poll_ip'], 0, -1)); if (in_array($userid, $voted_ids)) { $POLLMODE = 'voted'; } else { $POLLMODE = 'notvoted'; } break; case POLL_MODE_USERID: if (!USER) { $POLLMODE = 'disallowed'; } else { $userid = USERID; $voted_ids = explode('^', substr($pollArray['poll_ip'], 0, -1)); if (in_array($userid, $voted_ids)) { $POLLMODE = 'voted'; } else { $POLLMODE = 'notvoted'; } } break; } } } else { return FALSE; } if (isset($_POST['pollvote']) && isset($POLLMODE) && $POLLMODE == 'notvoted' && ($POLLMODE != 'disallowed')) { if ($_POST['votea']) { $row = $pollArray; extract($row); $poll_votes = varset($poll_votes); $votes = explode(chr(1), $poll_votes); if (is_array($_POST['votea'])) { /* multiple choice vote */ foreach ($_POST['votea'] as $vote) { $vote = intval($vote); $votes[($vote-1)] ++; } } else { $votes[($_POST['votea']-1)] ++; } $optionArray = explode(chr(1), $pollArray['poll_options']); $optionArray = array_slice($optionArray, 0, -1); foreach ($optionArray as $k=>$v) { if (!$votes[$k]) { $votes[$k] = 0; } } $votep = implode(chr(1), $votes); $pollArray['poll_votes'] = $votep; $poll_ip = varset($poll_ip) . varset($userid); $sql->update("polls", "poll_votes = '$votep'".($pollArray['poll_storage_method'] != POLL_MODE_COOKIE ? ", poll_ip='".$poll_ip."^'" : '')." WHERE poll_id=".varset($poll_id)); /*echo " "; */ $poll_cookie_expire = time() + (3600 * 24 * 356 * 15); // FIXME cannot be used after 2023 (this year is the maxium unixstamp on 32 bit system) cookie('poll_'.$poll_id.'', $poll_id, $poll_cookie_expire); $POLLMODE = 'voted'; } } $this->pollRow = $pollArray; $this->pollmode = varset($POLLMODE); } function render_poll($pollArray = "", $type = "menu", $POLLMODE = "", $returnMethod=FALSE) { $ns = e107::getRender(); $tp = e107::getParser(); $sql = e107::getDb(); $sc = e107::getScBatch('poll'); global $POLLSTYLE; if ($type == 'preview') { $POLLMODE = 'notvoted'; $sc->pollType = $type; } elseif ($type == 'forum') { $sc->pollPreview = true; } switch ($POLLMODE) { case 'query' : // Show poll, register any vote if ($this->get_poll($pollArray) === FALSE) { return ''; // No display if no poll } $pollArray = $this->pollRow; $POLLMODE = $this->pollmode; break; case 'results' : if ($sql->gen($pollArray)) { $pollArray = $sql->fetch(); } break; case 'oldpolls': $POLLMODE = 'results'; break; case 'notvoted': break; default: if(ADMIN) { return "
No \$POLLMODE set
"; } } if ($type == 'preview') { $optionArray = array_filter($pollArray['poll_option']); $voteArray = array(); $voteArray = array_pad($voteArray, count($optionArray), 0); $pollArray['poll_allow_multiple'] = $pollArray['multipleChoice']; } else if ($type == 'forum') { if (isset($_POST['fpreview'])) { $pollArray['poll_allow_multiple'] = $pollArray['multipleChoice']; $optionArray = $pollArray['poll_option']; } else { $optionArray = explode(chr(1), $pollArray['poll_options']); $optionArray = array_slice($optionArray, 0, -1); } $voteArray = explode(chr(1), $pollArray['poll_votes']); // $voteArray = array_slice($voteArray, 0, -1); } else { // Get existing results $optionArray = explode(chr(1), $pollArray['poll_options']); $optionArray = array_slice($optionArray, 0, -1); $voteArray = explode(chr(1), $pollArray['poll_votes']); // $voteArray = array_slice($voteArray, 0, -1); } $voteTotal = intval(array_sum($voteArray)); $percentage = array(); if (count($voteArray)) { foreach ($voteArray as $votes) { $votes = intval($votes); if ($voteTotal > 0) { $percentage[] = round(($votes/$voteTotal) * 100, 2); } else { $percentage[] = 0; } } } $template = array(); if(deftrue('BOOTSTRAP')) { $template = ($type == 'forum') ? e107::getTemplate('forum','forum_poll') : e107::getTemplate('poll'); } else { /* get template */ if (file_exists(THEME.'poll_template.php')) { require(THEME.'poll_template.php'); } else if (!isset($POLL_NOTVOTED_START)) { require(e_PLUGIN.'poll/templates/poll_template.php'); } $template['form']['start'] = $POLL_NOTVOTED_START ; $template['form']['item'] = $POLL_NOTVOTED_LOOP; $template['form']['end'] = $POLL_NOTVOTED_END; $template['results']['start'] = $POLL_VOTED_START; $template['results']['item'] = $POLL_VOTED_LOOP; $template['results']['end'] = $POLL_VOTED_END; $template['denied']['start'] = $POLL_DISALLOWED_START; $template['denied']['item'] = $POLL_DISALLOWED_LOOP ; $template['denied']['end'] = $POLL_DISALLOWED_END ; } $sc->setVars($pollArray); if ($pollArray['poll_comment']) // Only get comments if they're allowed on poll. And we only need the count ATM { $sc->pollCommentTotal = $sql->count("comments", "(*)", "WHERE `comment_item_id`='".intval($pollArray['poll_id'])."' AND `comment_type`=4"); } $sc->pollCount = $sql->count("polls", "(*)", "WHERE poll_id <= '".$pollArray['poll_id']."'"); $sc->pollRenderMode = $type; $sc->pollVoteTotal = $voteTotal; $sc->pollRenderType = $type; $text = ''; switch ($POLLMODE) { case 'notvoted': $text = "
\n"; $text .= $tp->parseTemplate($template['form']['start'],true, $sc); $count = 1; $sc->answerCount = 1; foreach ($optionArray as $option) { $sc->answerOption = $option; $text .= $tp->parseTemplate($template['form']['item'], true, $sc); $count ++; $sc->answerCount++; } $text .= $tp->parseTemplate($template['form']['end'], true, $sc); $text .= "
"; break; case 'voted': case 'results' : if ($pollArray['poll_result_type'] && strpos(e_SELF, "comment.php") === false) { $text = "


".LAN_THANK_YOU."

".POLLAN_40."


"; } else { $text = $tp->parseTemplate( $template['results']['start'], true, $sc); $count = 0; $sc->answerCount = 0; foreach ($optionArray as $option) { $sc->pollPercentage = $percentage[$count]; $sc->answerOption = $option; $sc->pollVotes = $voteArray[$count]; $text .= $tp->parseTemplate($template['results']['item'], true, $sc); $count ++; $sc->answerCount++; } $text .= $tp->parseTemplate($template['results']['end'], true, $sc); } break; case 'disallowed': $text = $tp->parseTemplate($template['denied']['start'], true, $sc); $count = 0; foreach ($optionArray as $option) { $sc->pollPercentage = $percentage[$count]; $sc->answerOption = $option; $sc->pollVotes = $voteArray[$count]; $text .= $tp->parseTemplate($template['denied']['item'], true, $sc); $count ++; } $text .= $tp->parseTemplate($template['denied']['end'], true, $sc); break; } if (!defined("POLLRENDERED")) define("POLLRENDERED", TRUE); $caption = (file_exists(THEME."images/poll_menu.png") ? " ".LAN_PLUGIN_POLL_NAME : LAN_PLUGIN_POLL_NAME); if ($type == 'preview') { $caption = LAN_CREATE.SEP.LAN_PREVIEW; // "Preview"; // TODO not sure this is used. $text = "
\n
".$text."
"; } elseif ($type == 'forum') { $caption = LAN_4; } if ($returnMethod) { return $text; } else { $ns->tablerender($caption, $text, 'poll'); } } function generateBar($perc) { if(deftrue('BOOTSTRAP',false)) { $val = intval($perc); return '
'.$val.'%
'; } else { $barl = $this->barl; $barr = $this->barr; $bar = $this->bar; return ($perc ? "
" : ""); } } /* function renderPollForm $mode = "admin" :: called from admin_config.php $mode = "forum" :: called from forum_post.php */ /** * Render a Poll creation Form * @param $mode string - admin | forum | front */ function renderPollForm($mode='admin') { $tp = e107::getParser(); $frm = e107::getForm(); // echo "MODE=".$mode; //XXX New v2.x default for front-end. Currently used by forum-post in bootstrap mode. // TODO LAN - Needs a more generic LAN rewrite when used on another area than forum if ($mode == 'front') { $text = "
".LAN_FORUM_3029."
"; // $text .= "
"; $text .= "
".$frm->text('poll_title', $tp->post_toForm(vartrue($_POST['poll_title'])), '200', array('placeholder' => POLLAN_3, 'id' => 'poll_title'))."
"; $option_count = vartrue($_POST['poll_option']) ? count($_POST['poll_option']) : 2; $text .= "
"; for($count = 1; $count <= $option_count; $count++) { // if ($count != 1 && $_POST['poll_option'][($count-1)] =="") // { // // break; // } $opt = ($count==1) ? "poll_answer" : ""; $text .= "
".$frm->text('poll_option[]', varset($_POST['poll_option'][($count-1)]), '200', array('placeholder' => POLLAN_4, 'id' => $opt))."
"; } $text .= "
"; // end pollsection div $text .= "
"; //FIXME - get this looking good with Bootstrap CSS only. $opts = array(1 => LAN_YES, 0=> LAN_NO); // Set to IP address.. Can add a pref to Poll admin for 'default front-end storage method' if demand is there for it. $text .= "
". $frm->radio('multipleChoice',$opts, vartrue($_POST['multipleChoice'], 0) ).$frm->hidden('storageMethod', 1)."
"; // $text .= "
"; return $text; /* $text .= "
".POLL_506." ".POLL_507."   ".POLL_508."
"; */ //XXX Should NOT be decided by USER /* $text .= "
".POLLAN_16." ".POLLAN_17."
".LAN_IP_ADDRESS."
".POLLAN_19."
"; */ } //TODO Hardcoded FORUM code needs to be moved somewhere. if ($mode == 'forum') // legacy code. { $text = " ".LAN_FORUM_3029."
".POLLAN_3.":
"; $option_count = !empty($_POST['poll_option']) ? count($_POST['poll_option']) : 1; $text .= " ".POLLAN_4."
"; for($count = 1; $count <= $option_count; $count++) { if ($count != 1 && $_POST['poll_option'][($count-1)] =="") { break; } $opt = ($count==1) ? "id='pollopt'" : ""; $text .=""; $text .= "
"; } $text .="

".LAN_MULTIPLE_CHOICE." ".LAN_YES."   ".LAN_NO." ".POLLAN_16." ".POLLAN_17."
".LAN_IP_ADDRESS."
".POLLAN_19." "; return $text; } $formgo = e_SELF.(e_QUERY && !defined("RESET") && strpos(e_QUERY, 'delete') === FALSE ? "?".e_QUERY : ""); $text = "
"; $uclass = (ADMIN) ? "" : "public,member,admin,classes,matchclass"; $text .= "
".POLLAN_3.":
"; $option_count = (varset($_POST['poll_option']) && count($_POST['poll_option']) ? count($_POST['poll_option']) : 2); $text .= "
".LAN_OPTIONS." :
"; for($count = 1; $count <= $option_count; $count++) { $opt = ($count==1) ? "id='pollopt'" : ""; $text .="post_toForm($_POST['poll_option'][($count-1)])."\" maxlength='200' />"; $text .= "
"; } $text .="

".LAN_MULTIPLE_CHOICE." ".LAN_YES."   ".LAN_NO."
".POLLAN_12." ".POLLAN_13."
".POLLAN_14."
".POLLAN_15."".r_userclass("pollUserclass", vartrue($_POST['pollUserclass']), 'off', $uclass)."
".POLLAN_16." ".POLLAN_17."
".LAN_IP_ADDRESS."
".POLLAN_19."
".LAN_COMMENTS_ALLOWED.": ".LAN_YES." ".LAN_NO."
"; if (isset($_POST['preview']) || varset($_POST['edit'])) { // $text .= " "; $text .= $frm->admin_button('preview',LAN_PREVIEW,'other'); if (defset('POLLACTION') === 'edit') { $text .= $frm->admin_button('submit', LAN_UPDATE, 'update')." "; } else { $text .= $frm->admin_button('submit','no-value','submit', LAN_CREATE); // $text .= " "; } } else { $text .= $frm->admin_button('preview','no-value','other',LAN_PREVIEW); // $text .= " "; } if (defset('POLLID')) { $text .= $frm->admin_button('reset','no-value','reset',LAN_CLEAR); // $text .= " "; } $text .= "
"; return $text; } } class poll_shortcodes extends e_shortcode { public $answerOption = array(); public $answerCount = 0; public $pollRenderType = null; // type public $pollRenderMode = null; public $pollPreview = false; public $pollVoteTotal = 0; public $pollCommentTotal = 0; public $pollPercentage = 0; public $pollVotes = 0; public $pollCount = 0; // total polls in the system public $pollType; private $barl = null; private $barr = null; private $bar = null; public function __construct() { $this->barl = (file_exists(THEME.'images/barl.png') ? THEME_ABS.'images/barl.png' : e_PLUGIN_ABS.'poll/images/barl.png'); $this->barr = (file_exists(THEME.'images/barr.png') ? THEME_ABS.'images/barr.png' : e_PLUGIN_ABS.'poll/images/barr.png'); $this->bar = (file_exists(THEME.'images/bar.png') ? THEME_ABS.'images/bar.png' : e_PLUGIN_ABS.'poll/images/bar.png'); } function sc_option($parm='') { if(!empty($this->answerOption)) { return $this->answerOption; } } function sc_percentage($parm=null) { return $this->pollPercentage."%"; } function sc_author($parm=null) { $uparams = array('id' => $this->var['poll_admin_id'], 'name' => $this->var['user_name']); $link = e107::getUrl()->create('user/profile/view', $uparams); $userlink = "".$this->var['user_name'].""; // return print_a($this->var,true); return LAN_POSTED_BY." ".(($this->pollType == 'preview' || $this->pollType == 'forum') ? USERNAME : $userlink); } function sc_oldpolls($parm=null) { // return 'type: '.$this->pollCount; if (intval($this->pollCount) > 1 && ($this->pollRenderType == 'menu')) { return "".POLLAN_28."" ; } } function sc_disallowmessage($parm=null) { if ($this->var['poll_vote_userclass'] == 253) { return POLLAN_41; } elseif ($this->var['poll_vote_userclass'] == 254) { return POLLAN_42; } else { return POLLAN_43; } } function sc_votes($parm=null) { return POLLAN_31.": ".$this->pollVotes; } function sc_bar($parm=null) { $perc = $this->pollPercentage; if(deftrue('BOOTSTRAP',false)) { // return "".$perc.""; $val = intval($perc); return '
'.$val.'%
'; } else { $barl = $this->barl; $barr = $this->barr; $bar = $this->bar; return ($perc ? "
" : ""); } } function sc_optionbutton($parm='') { return ($this->var['poll_allow_multiple'] ? "" : ""); } function sc_question($parm = "") { $tp = e107::getParser(); return $tp->toHTML($this->var['poll_title'], true, "TITLE"); } function sc_answer($parm='') { $frm = e107::getForm(); $opt = array('label'=> $this->answerOption); if(empty($this->var['poll_allow_multiple'])) { return $frm->radio('votea', $this->answerCount,false, $opt); } else { return $frm->checkbox('votea[]', $this->answerCount,false, $opt); } } function sc_submitbutton($parm=null) { if (('preview' == $this->pollType || $this->pollPreview == true) && strpos(e_REQUEST_SELF, "forum") === false) { return ""; } return ""; // disable submit when previewing the poll or when NOT viewing the poll in the forum } function sc_vote_total($parm=null) { return POLLAN_31.": ".intval($this->pollVoteTotal); } function sc_comments($parm=null) { return ($this->var['poll_comment'] ? " ".LAN_COMMENTS.": ".$this->pollCommentTotal."" : ""); } } /* e107::js('inline', ' function setcook(pollid){ var name = "poll_"+pollid; var date = new Date(); var value = pollid; date.setTime(date.getTime()+(365*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); document.cookie = name+"="+value+expires+"; path=/"; } ');*/