/**
  * The actualiser to send a newsletter.
  *
  * @return tempcode		The UI
  */
 function send_message()
 {
     $title = get_page_title('NEWSLETTER_SEND');
     $lang = choose_language($title);
     if (is_object($lang)) {
         return $lang;
     }
     if (get_param('old_type', '') == 'whatsnew') {
         set_value('newsletter_whatsnew', strval(time()));
     }
     $message = post_param('message');
     $subject = post_param('subject');
     $csv_data = post_param('csv_data', '');
     // serialized PHP array
     $template = post_param('template', 'MAIL');
     $in_full = post_param_integer('in_full', 0);
     $html_only = post_param_integer('html_only', 0);
     $from_email = post_param('from_email', '');
     $from_name = post_param('from_name', '');
     $priority = post_param_integer('priority', 3);
     $newsletters = $GLOBALS['SITE_DB']->query_select('newsletters', array('id'));
     $send_details = array();
     foreach ($newsletters as $newsletter) {
         $send_details[strval($newsletter['id'])] = post_param_integer(strval($newsletter['id']), 0);
     }
     if (get_forum_type() == 'ocf') {
         $groups = $GLOBALS['FORUM_DRIVER']->get_usergroup_list();
         foreach (array_keys($groups) as $id) {
             $send_details['g' . strval($id)] = post_param_integer('g' . strval($id), 0);
         }
         $send_details['-1'] = post_param_integer('-1', 0);
     }
     if (post_param_integer('make_periodic', 0) == 1) {
         // We're a periodic newsletter, so we don't actually want to be sent
         // out now. Rather, we store the newsletter settings so that it can be
         // regenerated as needed.
         // Next we store all of our settings in the newsletter_periodic table
         $when = post_param('periodic_when');
         $day = 1;
         if ($when == 'monthly') {
             $day = post_param_integer('periodic_monthly') % 29;
         } elseif ($when == 'biweekly') {
             $day = post_param_integer('periodic_weekday_biweekly', 5);
         } elseif ($when == 'weekly') {
             $day = post_param_integer('periodic_weekday_weekly', 5);
         }
         $map = array('np_message' => post_param('chosen_categories', ''), 'np_subject' => $subject, 'np_lang' => $lang, 'np_send_details' => serialize($send_details), 'np_html_only' => $html_only, 'np_from_email' => $from_email, 'np_from_name' => $from_name, 'np_priority' => $priority, 'np_csv_data' => $csv_data, 'np_frequency' => $when, 'np_day' => $day, 'np_in_full' => $in_full, 'np_template' => $template);
         require_lang('dates');
         $week_days = array(1 => do_lang('MONDAY'), 2 => do_lang('TUESDAY'), 3 => do_lang('WEDNESDAY'), 4 => do_lang('THURSDAY'), 5 => do_lang('FRIDAY'), 6 => do_lang('SATURDAY'), 7 => do_lang('SUNDAY'));
         if ($when == 'weekly') {
             $each = $week_days[$day];
         } elseif ($when == 'biweekly') {
             $each = $week_days[$day];
         } else {
             $suffix = gmdate('S', gmmktime(0, 0, 0, 1, $day, 1990));
             $each = strval($day) . $suffix;
         }
         $matches = array();
         if (preg_match('#^replace_existing\\_(\\d+)$#', post_param('periodic_choice', ''), $matches) != 0) {
             if (post_param('periodic_for') != 'future') {
                 $map['np_last_sent'] = 0;
             }
             $GLOBALS['SITE_DB']->query_update('newsletter_periodic', $map, array('id' => intval($matches[1])), '', 1);
             $message = do_lang('PERIODIC_SUCCESS_MESSAGE_EDIT', $when, $each);
         } else {
             $last_sent = post_param('periodic_for') == 'future' ? time() : 0;
             $map['np_last_sent'] = $last_sent;
             $GLOBALS['SITE_DB']->query_insert('newsletter_periodic', $map, true);
             $message = do_lang('PERIODIC_SUCCESS_MESSAGE_ADD', $when, $each);
         }
         $url = build_url(array('page' => 'admin_newsletter', 'type' => 'misc', 'redirected' => '1'), get_module_zone('admin_newsletter'));
         return redirect_screen(do_lang('SUCCESS'), $url, $message, false, 'inform');
     }
     if (addon_installed('calendar')) {
         $schedule = get_input_date('schedule');
         if (!is_null($schedule)) {
             require_code('calendar');
             require_code('calendar2');
             $send_details_string_exp = '';
             foreach ($send_details as $key => $val) {
                 $send_details_string_exp .= '"' . str_replace(chr(10), '\\n', addslashes($key)) . '"=>"' . str_replace(chr(10), '\\n', addslashes($val)) . '",';
             }
             $schedule_code = ':require_code(\'newsletter\'); actual_send_newsletter("' . php_addslashes($message) . '","' . php_addslashes($subject) . '","' . php_addslashes($lang) . '",array(' . $send_details_string_exp . '),' . strval($html_only) . ',"' . php_addslashes($from_email) . '","' . php_addslashes($from_name) . '",' . strval($priority) . ',"' . php_addslashes($template) . '");';
             $start_year = post_param_integer('schedule_year');
             $start_month = post_param_integer('schedule_month');
             $start_day = post_param_integer('schedule_day');
             $start_hour = post_param_integer('schedule_hour');
             $start_minute = post_param_integer('schedule_minute');
             $event_id = add_calendar_event(db_get_first_id(), '', NULL, 0, do_lang('NEWSLETTER_SEND', $subject), $schedule_code, 3, 0, $start_year, $start_month, $start_day, $start_hour, $start_minute);
             regenerate_event_reminder_jobs($event_id);
             return inform_screen($title, do_lang_tempcode('NEWSLETTER_DEFERRED', get_timezoned_date($schedule)));
         }
     }
     actual_send_newsletter($message, $subject, $lang, $send_details, $html_only, $from_email, $from_name, $priority, $csv_data, $template);
     breadcrumb_set_parents(array(array('_SELF:_SELF:misc', do_lang_tempcode('MANAGE_NEWSLETTER')), array('_SELF:_SELF:new', do_lang_tempcode('NEWSLETTER_SEND'))));
     breadcrumb_set_self(do_lang_tempcode('DONE'));
     return inform_screen($title, do_lang_tempcode('SENDING_NEWSLETTER'));
 }
 /**
  * Send a periodic newsletter.
  *
  * @param  array			Details of periodic newsletter
  * @return ?TIME			Time was sent (NULL: not sent)
  */
 function newsletter_periodic_handle($periodic_row)
 {
     // If we're here then we have a periodic newsletter along with details of
     // what we should put in it, who it should go to and when it should be
     // sent.
     // We check here to see if we're scheduled to be sent out
     $last_sent = $periodic_row['np_last_sent'];
     // At the moment we only support weekly or biweekly or monthly intervals. Thus we can
     // say for sure that if the last issue was sent in the past 4 days, we
     // don't need to run. This is useful because it stops the code sending out
     // multiple issues all day, and because we may as well extend it a few
     // days either side so that we bail out more quickly.
     if (abs(time() - $last_sent) < 60 * 60 * 24 * 4) {
         return NULL;
     }
     if ($periodic_row['np_frequency'] == 'monthly') {
         // Find out what day of the month it is
         $today = date('j');
         // Are we meant to be sending out an issue today?
         if (intval($today) != $periodic_row['np_day']) {
             return NULL;
         }
         // No, we're not
     } elseif ($periodic_row['np_frequency'] == 'weekly' || $periodic_row['np_frequency'] == 'biweekly') {
         // Find out what day of the week it is
         $weekdays = array('Error', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
         $send_day = $weekdays[$periodic_row['np_day']];
         $today = date('l');
         // Are we meant to be sending out an issue today?
         if ($today != $send_day) {
             return NULL;
         }
         // No, we're not
         if ($periodic_row['np_frequency'] == 'biweekly' && abs(time() - $last_sent) < 60 * 60 * 24 * 14) {
             return NULL;
         }
     } else {
         // If we don't know when to send it then we bail out
         return NULL;
     }
     // If we're here then we need to create and send out a newsletter.
     // We include everything since the last "What's New" newsletter,
     // irregardless of whether it was automatically or manually generated.
     $cutoff_time = $periodic_row['np_last_sent'];
     require_lang('newsletter');
     $lang = $periodic_row['np_lang'];
     $in_full = $periodic_row['np_in_full'] == 1;
     // We need to build the content, based on the chosen categories. This code
     // is lifted straight out of admin_newsletter.php
     // Generate Comcode for content selected, drawing on hooks
     $automatic = array();
     $i = 0;
     $contentarr = explode("\n", $periodic_row['np_message']);
     $_hooks = find_all_hooks('modules', 'admin_newsletter');
     foreach (array_keys($_hooks) as $hook) {
         require_code('hooks/modules/admin_newsletter/' . filter_naughty_harsh($hook));
         $object = object_factory('Hook_whats_news_' . filter_naughty_harsh($hook), true);
         if (is_null($object)) {
             continue;
         }
         //$filter=array_key_exists('whatsnew_'.$hook.'_filter',$_POST)?$_POST['whatsnew_'.$hook.'_filter']:NULL;
         $found_one_match = false;
         $last_find_id = mixed();
         $last_cat_id = mixed();
         $filter = '';
         foreach ($contentarr as $find_id => $line) {
             $matches = array();
             if (preg_match('#\\[' . str_replace('#', '\\#', preg_quote($hook)) . '/(.*)\\]#', $line, $matches) != 0) {
                 $found_one_match = true;
                 if (!is_null($last_find_id) && $find_id != $last_find_id + 1) {
                     $last_cat_id = intval($matches[1]);
                     $temp = $object->run(intval($cutoff_time), $lang, $filter, $in_full);
                     if (is_null($temp) || count($temp) == 0) {
                         continue;
                     }
                     if (!$temp[0]->is_empty()) {
                         $automatic[$last_find_id] = do_template('NEWSLETTER_AUTOMATE_SECTION_FCOMCODE', array('I' => strval($i + 1), 'TITLE' => $temp[1], 'CONTENT' => $temp[0]));
                         $i++;
                     }
                     $filter = $matches[1];
                 } else {
                     if ($filter != '') {
                         $filter .= ',';
                     }
                     $filter .= $matches[1];
                 }
                 $last_find_id = $find_id;
             }
         }
         //if (is_null($filter))
         if (!$found_one_match) {
             //$test=post_param_integer('whatsnew_'.$hook.'_include',0);
             //if ($test==0) continue;
             $found = false;
             foreach ($contentarr as $find_id => $line) {
                 if (strpos($line, '[' . $hook . ']') !== false) {
                     $found = true;
                     break;
                 }
             }
             if (!$found) {
                 continue;
             }
             $temp = $object->run(intval($cutoff_time), $lang, $filter, $in_full);
             if (is_null($temp) || count($temp) == 0) {
                 continue;
             }
             if (!$temp[0]->is_empty()) {
                 $automatic[$find_id] = do_template('NEWSLETTER_AUTOMATE_SECTION_FCOMCODE', array('I' => strval($i + 1), 'TITLE' => $temp[1], 'CONTENT' => $temp[0]));
                 $i++;
             }
         } elseif ($filter != '') {
             $temp = $object->run(intval($cutoff_time), $lang, $filter, $in_full);
             if (is_null($temp) || count($temp) == 0) {
                 continue;
             }
             if (!$temp[0]->is_empty()) {
                 $automatic[$last_find_id] = do_template('NEWSLETTER_AUTOMATE_SECTION_FCOMCODE', array('I' => strval($i + 1), 'TITLE' => $temp[1], 'CONTENT' => $temp[0]));
                 $i++;
             }
         }
     }
     ksort($automatic);
     $_automatic = new ocp_tempcode();
     if (count($automatic) == 0) {
         return NULL;
     }
     // Nothing new
     foreach ($automatic as $tp) {
         $_automatic->attach($tp);
     }
     $completed = do_template('NEWSLETTER_AUTOMATED_FCOMCODE', array('CONTENT' => $_automatic));
     // Now we have the contents of our newsletter, we can send it to all of
     // those listed in the newsletter_periodic row
     $message = $completed->evaluate($lang);
     $subject = $periodic_row['np_subject'] . '-' . get_timezoned_date(time(), false, false, false, true);
     $time = time();
     require_code('newsletter');
     actual_send_newsletter($message, $subject, $lang, unserialize($periodic_row['np_send_details']), $periodic_row['np_html_only'], $periodic_row['np_from_email'], $periodic_row['np_from_name'], $periodic_row['np_priority'], $periodic_row['np_csv_data'], $periodic_row['np_template']);
     return $time;
 }