/**
  * Pick winners.
  * @param int $num Number of winners to pick.
  */
 function pick_winners($num = 1)
 {
     if (!is_numeric($num) || $num < 1) {
         return false;
     }
     if (!$this->data['_valid']) {
         return false;
     }
     $participants = cf_Participant::get_all($this->data['ID'], '', '', '', '', 'not_winner');
     if (count($participants) < 1) {
         return;
     }
     $this->set_status('winners_picked');
     // generate a big entry_list
     $entry_list = array();
     $i = 0;
     foreach ($participants as $participant) {
         $entry_list[$i] = $participant->id;
         $i++;
         if (isset($participant->referral_to)) {
             $num_referrals = $participant->referral_to;
             $num_referrals = count($num_referrals);
             $entries_for_referral = 1;
             if (isset($this->data['cf_referral_entries']) && is_numeric($this->data['cf_referral_entries']) && $this->data['cf_referral_entries'] > 0) {
                 $entries_for_referral = $this->data['cf_referral_entries'];
             }
             for ($x = 0; $x < $num_referrals * $entries_for_referral; $x++) {
                 $entry_list[$i] = $participant->id;
                 $i++;
             }
         }
     }
     $admin_email = get_option('admin_email');
     // echo '<pre>';var_dump($entry_list);echo '</pre>';
     // check for random.org quota
     $url = 'http://www.random.org/quota/?format=plain';
     $curl = curl_init();
     curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $url, CURLOPT_USERAGENT => $admin_email));
     $resp = curl_exec($curl);
     curl_close($curl);
     // echo '<pre>';var_dump(intval($resp));echo '</pre>';
     $min = 0;
     $max = count($entry_list) - 1;
     if (empty($resp) || intval($resp) <= 0) {
         $resp = range($min, $max);
         $result = shuffle($resp);
         if ($result) {
             $result = $resp;
         } else {
             die('Error generating random array.');
         }
     } else {
         $url = 'http://www.random.org/sequences/?min=' . $min . '&max=' . $max . '&col=1&format=plain&rnd=new';
         $curl = curl_init();
         curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $url, CURLOPT_USERAGENT => $admin_email));
         $resp = curl_exec($curl);
         curl_close($curl);
         if (empty($resp) || strpos($resp, 'Error:') !== false) {
             $resp = range($min, $max);
             $result = shuffle($resp);
             if ($result) {
                 $result = $resp;
             } else {
                 die('Error generating random array.');
             }
         } else {
             $result = explode("\n", $resp);
             if (empty($result[count($result) - 1])) {
                 unset($result[count($result) - 1]);
             }
         }
     }
     //  echo '<pre>';var_dump($result);echo '</pre>';
     $winners_num = $num;
     if ($winners_num > count($participants)) {
         $winners_num = count($participants);
     }
     // echo '<pre>';var_dump($winners_num);echo '</pre>';
     $result_helper = 0;
     $winner_helper = 1;
     $winners = array();
     while ($winner_helper <= $winners_num) {
         $tmp = $result[$result_helper];
         $result_helper += 1;
         if (!in_array($entry_list[$tmp], $winners)) {
             $winners[$winner_helper] = $entry_list[$tmp];
             $winner_helper += 1;
         }
         if ($result_helper > count($result) - 1) {
             break;
         }
     }
     // echo '<pre>';var_dump($winners);echo '</pre>';
     foreach ($winners as $winner) {
         $participant = new cf_Participant($winner);
         $participant->set_status('winner');
     }
     return true;
 }
 /**
  * Processes email confirmation when double opt-in is set.
  * @param string $confirm_code
  */
 static function process_optin($confirm_code)
 {
     if (empty($confirm_code)) {
         return false;
     }
     $participant = new cf_Participant($confirm_code, true);
     // get participant based on the confirmation code
     if (!$participant->_valid) {
         return false;
     }
     if ($participant->status != 'not_confirmed') {
         // check participant status, has not be not_confirmed or there is nothing to confirm
         return false;
     }
     $contest = new cf_Contest($participant->contest_id);
     // check if the contest participant is in, is valid
     if (!$contest->_valid) {
         return false;
     }
     if (isset($participant->tmp_referral)) {
         // get referring participant and credit him the referral
         $referral = new cf_Participant($participant->tmp_referral, true);
         if ($referral->_valid) {
             $referral->add_meta('referral_to', $participant->id);
         }
         $participant->del_meta('tmp_referral');
     }
     $participant->set_status('');
     // change the participant status
     // process stuff
     self::process_email($contest, $participant);
     self::process_integration($contest, $participant);
     self::process_cookie($contest, $participant);
 }
 /**
  * Init method, called when accessing the page. Handles processing of participant and contest $_POST and $_GET requests.
  */
 function init()
 {
     $contest = '';
     if (isset($_GET['contest'])) {
         $contest = $_GET['contest'];
     }
     if (isset($_GET['export'])) {
         cf_Table_Participants::export_csv($contest);
     }
     if (isset($_GET['togglevalid'])) {
         $participant = new cf_Participant($_GET['togglevalid']);
         if ($participant->_valid) {
             if ($participant->status == 'not_valid') {
                 $participant->set_status('');
             } else {
                 if ($participant->status != 'not_confirmed') {
                     $participant->set_status('not_valid');
                 }
             }
         }
         $url = 'admin.php?page=' . self::page_id;
         if (isset($_GET['contest'])) {
             $url .= '&contest=' . $_GET['contest'];
         }
         wp_safe_redirect(admin_url($url));
         die;
     }
     if (isset($_GET['del'])) {
         $participant = new cf_Participant($_GET['del']);
         if ($participant->_valid) {
             $participant->delete();
         }
         $url = 'admin.php?page=' . self::page_id;
         if (isset($_GET['contest'])) {
             $url .= '&contest=' . $_GET['contest'];
         }
         wp_safe_redirect(admin_url($url));
         die;
     }
     if (isset($_GET['contest'])) {
         $contest = new cf_Contest($_GET['contest']);
         if ($contest->_valid != true) {
             wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Participants::page_id));
             die;
         }
         if (isset($_POST['resetcontest'])) {
             if ($contest->cf_status == 'winners_picked') {
                 $contest->set_status('active');
                 $contest->clear_winners();
             }
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
         if (isset($_POST['setexpired'])) {
             if ($contest->cf_status == 'expired') {
                 $contest->set_status('active');
             } else {
                 if ($contest->cf_status == 'active' || $contest->cf_status == '') {
                     $contest->set_status('expired');
                 }
             }
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
         if (isset($_POST['pickwinners'])) {
             $winners_num = 1;
             if (isset($contest->cf_winners_num) && is_numeric($contest->cf_winners_num) && $contest->cf_winners_num > 0) {
                 $winners_num = $contest->cf_winners_num;
             }
             $current_winners = $contest->get_current_winner_num();
             $pick_num = intval($winners_num) - intval($current_winners);
             if ($pick_num > 0) {
                 $contest->pick_winners($pick_num);
             }
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
         if (isset($_POST['clearwinners'])) {
             $contest->clear_winners();
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
         if (isset($_POST['pickwinner'])) {
             $winners_num = 1;
             if (isset($contest->cf_winners_num) && is_numeric($contest->cf_winners_num) && $contest->cf_winners_num > 0) {
                 $winners_num = $contest->cf_winners_num;
             }
             if ($contest->get_current_winner_num() < $winners_num) {
                 $participant = new cf_Participant($_POST['pickwinner']);
                 if ($participant->_valid) {
                     $participant->set_status('winner');
                     $contest->set_status('winners_picked');
                 }
             }
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
         if (isset($_POST['removewinner'])) {
             $participant = new cf_Participant($_POST['removewinner']);
             if ($participant->_valid) {
                 if (substr($participant->status, 0, 6) == 'winner') {
                     $participant->set_status('');
                 }
             }
             if (isset($_GET['redirect']) && $_GET['redirect'] == 'contest') {
                 wp_safe_redirect(admin_url('admin.php?page=' . cf_Page_Contest::page_id . '&contest=' . $contest->ID . '&cf_page=dashboard'));
             } else {
                 wp_safe_redirect(admin_url('admin.php?page=' . self::page_id . '&contest=' . $contest->ID));
             }
             die;
         }
     }
     add_action('admin_footer', array(&$this, 'list_scripts'));
 }