'representant')
* @return string
*/
public function _formatTemplate ($file, array $subs) {
$tplObj = new FileReader($file);
$tpl = $tplObj->read($tplObj->length());
foreach ($subs as $k => $v)
$tpl=str_replace("{{$k}}",$v,$tpl);
return $tpl;
}
/**
* Verifica se uma data passada é uma data de verdade
*
* @param string $date no formato YYYY-MM-DD HH:NN ou YYYY-MM-DD
* @return bool
*/
public function _isValidDate($date) {
$date=trim($date);
preg_match('@^(\d{4}-\d{2}-\d{2})(\s\d{2}:\d{2})?$@', $date, $match);
if (!(bool) $match) return false;
if (sizeof(split(' ',$date)) == 1)
$time = '00:00';
else
list($date, $time) = split(' ', $date);
list($year, $month, $day) = split('-', $date);
list($hour, $minute) = split(':', $time);
if (date('Y-m-d', mktime(0,0,0,$month,$day,$year)) !== $date) return false;
if ((int) $hour > 23 || (int) $minute > 59) return false;
return true;
}
/**
* Initializate the plugin
*
* @return object $wpdb
*/
public function init () {
global $wpdb;
Agenda::$wpdb = $wpdb;
Agenda::$info = array('plugin_dir' => dirname(__FILE__));
add_action ('admin_menu', array('Agenda','options'));
register_sidebar_widget('Agenda', array('Agenda', 'widget_agenda_lista'));
return Agenda::$wpdb;
}
/**
* Make option Page
*/
function option_page () {
$dir=Agenda::$info['plugin_dir'];
$o=ob_get_contents();ob_end_clean();ob_start();wp_nonce_field('update-options');$wp_nonce_field=ob_get_flush();ob_end_clean();
$options = array ();
$categories=get_categories(array('hide_empty' => false));
foreach ($categories as $cat)
$options[] = sprintf('%s ', $cat->cat_ID, ($cat->cat_ID == get_option('event_category') ? ' selected="selected"' : ''), $cat->category_nicename);
$options = implode ("\n", $options);
ob_start();
print $o . Agenda::_formatTemplate("$dir/form_option.html", array(
'TITLE' => __('Events Options'),
'UPDATE_OPTIONS' => $wp_nonce_field,
'OPTIONS' => $options,
'CATEGORY' => __('Global CategoryWho manipulate yours events? '),
'SAVE' => __('Save')
));
}
/**
* Makes the menu options, calling the right function
*
*/
function options (){
add_management_page (__('Events'), __('Events'), 8, 'agenda/manage', array('Agenda','manipulate_list'));
add_action('load-edit.php', array('Agenda', 'loadEditPage'));
add_action('load-write_page_agenda/write', array('Agenda', 'loadWriteEvent'));
add_submenu_page( 'post.php', 'Write', 'Event', 8, 'agenda/write', array('Agenda', 'manipulate'));
add_options_page(__('Agenda'), __('Agenda'), 10, 'agenda/options', array('Agenda', 'option_page'));
register_widget_control('Agenda', array('Agenda', 'widget_agenda_lista_control'));
}
/**
* Creates a configuration for the widget
*/
function widget_agenda_lista_control() {
$dir = Agenda::$info['plugin_dir'];
$options = get_option('widget_agenda_lista');
if ( !is_array($options) )
$options = array('title'=> __('List of events'),'next'=>5,'destak'=>true, 'show_date' => true, 'before'=>'
', 'after'=>' ');
if ($_POST['widget_agenda_lista-submit']) {
foreach (array('title', 'next', 'before', 'after', 'destak', 'show_date') as $item)
$options[$item]=$_POST['widget_agenda_lista-'.$item];
update_option('widget_agenda_lista', $options);
}
foreach (array('destak', 'show_date') as $item)
$options[$item] = $options[$item] == 'true' ? ' checked="checked"' : '';
extract($options);
print Agenda::_formatTemplate("$dir/widget.html",array(
'TITLE' => __('Title'),
'NEXT' => __('Next'),
'EVENTS' => __('events'),
'ONLY_DESTAK' => __('Show only Highlighted Events'),
'SHOW_DATE' => __('Show date'),
'BEFORE' => __('Before each event'),
'AFTER' => __('After each event'),
'v_title' => $title,
'v_next' => $next,
'v_destak' => $destak,
'v_show_date' => $show_date,
'v_before' => $before,
'v_after' => $after,
));
}
/**
* Generates a widget for your events
*/
function widget_agenda_lista ($args) {
extract($args);
$options=get_option('widget_agenda_lista');
foreach (array('destak', 'show_date') as $item)
$options[$item] = ($options[$item] === 'true');
extract($options);
echo $before_widget . $before_title . $title . $after_title;
agenda_list ($next, $destak, $show_date, $before, $after);
echo $after_widget;
}
/**
* Add filter for edit post
*/
public function loadEditPage() {
add_filter('request', array ('Agenda', 'filter_posts'));
}
/**
* Load Scripts on Edit/Write Event
*/
public function loadWriteEvent () {
wp_enqueue_script('post');
if ( user_can_richedit() ) wp_enqueue_script('editor');
add_thickbox();
wp_enqueue_script('thickbox');
wp_enqueue_script('media-upload');
}
public function filter_posts ($q) {
$q['cat'] = implode (',', array($q['cat'], '-'.get_option('event_category')));
return $q;
}
/**
* Install the plugin, create the categorie and put the id in the wordpress options
*
* @return true
*/
public function install () {
$wpdb = Agenda::init();
/* @var $wpdb wpdb */
$cat_id = $wpdb->get_var("SELECT * FROM $wpdb->terms WHERE slug = '__events__'");
if (!$category) {
$cat = array('cat_name' => '__events__', 'category_description' => 'Events Category', 'category_nicename' => '__events__');
$cat_id = wp_insert_category ($cat);
}
add_option ('event_category', $cat_id);
return true;
}
/**
* Generates a form to make an event
*
* @param bool $print If true, prints this form
*/
public function form ($post = array(), $msg = '', $print = true) {
global $current_user, $user_ID;
$default_post = array(
'v_what' => '',
'v_when_start_date' => '',
'v_when_start_time' => '',
'v_when_end_date' => '',
'v_when_end_time' => '',
'v_all_day' => '',
'v_where' => '',
'v_calendar' => array(),
'content' => '',
'v_tags' => '',
'v_repeat_weekly_on_sunday' => '',
'v_repeat_weekly_on_monday' => '',
'v_repeat_weekly_on_tuesday' => '',
'v_repeat_weekly_on_wednesday' => '',
'v_repeat_weekly_on_thursday' => '',
'v_repeat_weekly_on_friday' => '',
'v_repeat_weekly_on_saturday' => '',
'v_repeat_no_repeat' => '',
'v_repeat_daily' => '',
'v_repeat_weekly' => '',
'v_repeat_monthly' => '',
'v_repeat_yearly' => '',
'repeat_monthly_by' => '',
'v_repeat_monthly_by_day_of_the_week' => '',
'v_repeat_monthly_by_day_of_the_month' => '',
'range' => '',
'v_range_never' => '',
'v_range_until' => '',
'v_range_ends_until' => '',
'repeat_weekly_every' => '',
'repeat_daily_every' => '',
'repeat_monthly_every' => '',
'repeat_yearly_every' => '',
'v_excerpt' => '',
'v_author' => $user_ID,
'v_pings' => 'open',
'v_comments' => 'open',
'v_destak' => 0
);
$post = array_merge((array) $default_post, (array) $post, $_REQUEST);
$post['v_author'] = wp_dropdown_users( array('include' => $authors, 'name' => 'v_author', 'selected' => $post['v_author'], 'echo' => false) );
ob_start (); checked($post['v_pings'], 'open'); $post['v_pings'] = ob_get_contents(); ob_end_clean();
ob_start (); checked($post['v_destak'], '1'); $post['v_destak'] = ob_get_contents(); ob_end_clean();
ob_start (); checked($post['v_comments'], 'open'); $post['v_comments'] = ob_get_contents(); ob_end_clean();
ob_start (); the_editor($post['content'], 'content', 'title', true); $editor = ob_get_contents(); ob_end_clean();
$post['v_repeat_monthly_by_day_of_the_'.($post['repeat_monthly_by'] == 'week' ? 'week' : 'month')] = ' checked="checked"';
$post['v_range_'.($post['range'] == 'never' ? 'never' : 'until')] = ' checked="checked"';
if ($post['v_all_day'] == 'v_all_day') $post['v_all_day'] = ' checked="checked"';
if (in_array($post['repeat'], array('no_repeat','daily','weekly','monthly','yearly')))
$post['v_repeat_'.$post['repeat']] = ' checked="checked"';
foreach (array ('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday') as $item)
if ($post['v_repeat_weekly_on_'.$item])
$post['v_repeat_weekly_on_'.$item] = ' checked="checked"';
$wpdb = Agenda::init();
$dir = Agenda::$info['plugin_dir'];
$style = Agenda::_formatTemplate("$dir/style.css", array());
$style = preg_replace ('/(\{|;)\n\s*/i', '${1}', $style);
$style = preg_replace ('/:\s+/', ':', $style);
$style = preg_replace ('/\n+/', "\n", $style);
$script = Agenda::_formatTemplate("$dir/script.js", array());
$options = array();
foreach (array ('repeat_weekly_every', 'repeat_daily_every', 'repeat_monthly_every', 'repeat_yearly_every') as $v)
foreach (range(1,30) as $i)
$options[$v][] = vsprintf(
'%1$s ',
array ($i, $post[$v] == $i ? ' selected="selected"' : '')
);
$cats = get_categories ('hide_empty=0&child_of='.get_option('event_category'));
$options_calendar = array ();
foreach ($cats as $cat)
$options_calendar[] = sprintf('%s ', $cat->term_id, in_array($cat->term_id, $post['v_calendar']) ? ' selected="selected"' : '', $cat->name);
array_walk($options, create_function('&$a', '$a = implode (\'\', $a);'));
if (trim($msg))
$msg = "";
$dados = array(
'STYLE' => $style,
'SCRIPT' => $script,
'MSG' => $msg,
'INPUT_ID' => sprintf (' ', $post['event_id'] ? $post['event_id'] : '0'),
'WRITE_EVENT' => __('Write Event'),
'WHAT' => __('What'),
'WHEN' => __('When'),
'TO' => __('to'),
'ALL_DAY' => __('All day'),
'REPEATS' => __('Repeats'),
'NO_REPEAT' => __('No repeat'),
'REPEAT_DAILY' => __('Daily'),
'REPEAT_EVERY' => __('Every'),
'DAILY_OPTIONS' => $options['repeat_daily_every'],
'DAYS' => __('days'),
'REPEAT_WEEKLY' => __('Weekly'),
'WEEKLY_OPTIONS' => $options['repeat_weekly_every'],
'WEEKS' => __('Weeks'),
'REPEAT_ON' => __('Repeat on'),
'SUNDAY' => __('S'),
'MONDAY' => __('M'),
'TUESDAY' => __('T'),
'WEDNESDAY' => __('W'),
'THURSDAY' => __('T'),
'FRIDAY' => __('F'),
'SATURDAY' => __('S'),
'REPEAT_MONTHLY' => __('Monthly'),
'MONTHLY_OPTIONS' => $options['repeat_monthly_every'],
'MONTHS' => __('Months'),
'REPEAT_BY' => __('Repeat by'),
'DAY_OF_THE_MONTH' => __('Day of the month'),
'DAY_OF_THE_WEEK' => __('Day of the week'),
'REPEAT_YEARLY' => __('Yearly'),
'YEARLY_OPTIONS' => $options['repeat_yearly_every'],
'YEARS' => __('Years'),
'RANGE' => __('Range'),
'ENDS' => __('Ends:'),
'NEVER' => __('Never'),
'UNTIL' => __('Until'),
'WHERE' => __('Where'),
'CALENDAR' => __('Calendar'),
'OPTIONS_CALENDAR' => implode ("\n", $options_calendar),
'DESCRIPTION' => __('Descrption'),
'THE_EDITOR' => $editor,
'TAGS' => __('Tags'),
'HOWTO_TAGS' => __('Separate tags with commas'),
'EXCERPT' => __('Excerpt'),
'AUTHOR' => __('Author'),
'DESTAK' => __('Hightlight this event'),
'ALLOW_PINGS' => __('Allow pings'),
'ALLOW_COMMENTS' => __('Allow comments'),
'SAVE' => __('Save'),
);
$dados = $dados + $post;
$return = Agenda::_formatTemplate("$dir/form.html",$dados);
if ($print) print $return;
return $return;
}
/**
* Manipulate, create (save) and edit form
*
* @param array $request
* @param bool $print
* @return string
*/
public function manipulate($request = array(), $print = true) {
if ($_REQUEST) $request = (array) $request + (array) $_REQUEST;
$mensagem = '';
if ($request['all_day'] == 'all_day')
$request['v_all_day'] = ' checked="checked"';
if ($request['submit']) {
$request['event_id'] = Agenda::saver();
$mensagem = __('The event has been saved.');
}
if ($request['edit_id']) {
$request = Agenda::req($request['edit_id']);
}
return Agenda::form($request, $mensagem, $print);
}
/**
* Generates a list of events for manipulate
*
*/
public function manipulate_list () {
$p = preg_match('@^\d+$@', $_REQUEST['p']) ? $_REQUEST['p'] : 1;
$message = '';
if ($_GET['delete_id'])
$message = vsprintf(' ', array(
__('Are you sure that you want to delete this event(s)?'),
sprintf('%s ', implode ('&delete_id[]=',$_GET['delete_id']), __('Yes'))
));
if ($_GET['delete_id'] && $_GET['confirm']) {
foreach ($_GET['delete_id'] as $item)
wp_delete_post((int) $item);
$message = vsprintf(' ', array(
__('The event(s) has been deleted sussefuly.'),
));
}
$dir = Agenda::$info['plugin_dir'];
$args = array (
'numberposts' => 10,
'offset' => 10*($p-1),
'category' => get_option('event_category'),
);
$page_links = paginate_links( array(
'base' => add_query_arg( 'p', '%#%' ),
'format' => '',
'total' => ceil(count(get_posts(array('numberposts'=>-1,'category'=>get_option('event_category'))))/10),
'current' => $p,
));
if ( $page_links ) $page_links = "$page_links
";
$posts = get_posts($args);
$rows = array();
if (!isset($_GET['delete_id'])) $_GET['delete_id'] = array();
foreach ($posts as $post) {
$q = array_map(create_function('$a', 'return $a[0];'), get_post_custom($post->ID));
$vars = array(
'P' => $p,
'ID' => $post->ID,
'TITLE' => $post->post_title,
'DATE' => date('Y-m-d H:i', $q['_start']),
'CLASS_ACTIVE' => in_array ($post->ID, $_GET['delete_id']) ? 'class="active"' : '',
);
$rows[] = Agenda::_formatTemplate("{$dir}/manipulate_list_rows.html", $vars);
}
$vars = array(
'P' => $p,
'NEW' => __('add new'),
'MANAGE_EVENTS' => __('Manage Events'),
'DATE' => __('Date'),
'TITLE' => __('Title'),
'ACTIONS' => __('Actions'),
'ROWS' => implode ("\n\n", $rows),
'MESSAGE' => $message,
'DELETE' => __('Delete Selected Events'),
'PAGE_LINKS' => $page_links,
);
$return = Agenda::_formatTemplate("{$dir}/manipulate_list.html", $vars);
print $return;
}
/**
* Generates the request for a determinet id
*
* @param int $id
* @return array
*/
function req($id) {
$post = get_post($id);
$request['event_id'] = $post->ID;
$request['v_what'] = $post->post_title;
$request['content'] = $post->post_content;
$request['v_excerpt'] = $post->post_excerpt;
$request['v_author'] = $post->post_author;
$request['v_pings'] = $post->ping_status;
$request['v_comments'] = $post->comment_status;
$request['v_calendar'] = wp_get_post_categories ($post->ID);
$post = get_post_custom($post->ID);
$request['v_where'] = $post['_where'][0];
$request['v_destak'] = $post['_destak'][0];
$request['v_when_start_date'] = date('Y-m-d', $post['_start'][0]);
$request['v_when_start_time'] = date('H:i', $post['_start'][0]);
$request['v_when_end_date'] = date('Y-m-d', $post['_end'][0]);
$request['v_when_end_time'] = date('H:i', $post['_end'][0]);
$request['v_all_day'] = $post['_all_day'][0] ? ' checked="checked"' : '';
$request['repeat'] = $post['_repeat'][0];
$tags = get_tags();
$ttags = array ();
foreach ($tags as $item)
$ttags[] = $item->name;
$request['v_tags'] = implode (',', $ttags);
switch ($request['repeat']) {
case 'daily':
$request['repeat_daily'] = 'daily';
$request['repeat_daily_every'] = $post['_every'][0];
break;
case 'weekly':
$request['repeat_weekly'] = 'weekly';
$request['repeat_weekly_every'] = $post['_every'][0];
foreach (explode(',',$post['_every_on'][0]) as $v)
$request['v_repeat_weekly_on_'.$v] = $v;
break;
case 'monthly':
$request['repeat_monthly'] = 'monthly';
$request['repeat_monthly_every'] = $post['_every'][0];
$request['repeat_monthly_by'] = $post['_repeat_on'][0];
break;
case 'yearly':
$request['repeat_yearly'] = 'yearly';
$request['repeat_yearly_every'] = $post['_every'][0];
break;
}
$request['range'] = $post['_range'][0];
$request['v_range_ends_until'] = $post['_range_until'][0];
return $request;
}
/**
* Calls the save function ussing the global $_REQUEST
*
*/
function saver () {
if ($_REQUEST['repeat']) {
$_REQUEST['v_all_day'] = $_REQUEST['v_all_day'] == 'v_all_day';
$r=Agenda::saveEvent(
(int) $_REQUEST['event_id'],
$_REQUEST['v_what'],
$_REQUEST['v_when_start_date'] . ' ' . $_REQUEST['v_when_start_time'],
$_REQUEST['v_when_end_date'] . ' ' . $_REQUEST['v_when_end_time'],
$_REQUEST['v_all_day'],
$_REQUEST['v_where'],
$_REQUEST['content'],
$_REQUEST
);
$_REQUEST = array();
return $r;
}
}
/**
* Makes a event
*
* @param string $what
* @param string $from No formato YYYY-NN-DD HH:MM
* @param string $to No formato YYYY-NN-DD HH:MM
* @param string $where
* @param string $desc
* @param array $repeat Array gerado pelo post contendo o repeat do evento
*
* @return false|int Returns integer (ID of the post) if the post has been created
*/
public function saveEvent ($id = 0, $what, $from, $to, $all_day=false, $where, $desc, $repeat, $jump_rules = false) {
global $event_errors;
$event_errors = array();
if (!$jump_rules) {
if ( !current_user_can( 'edit_posts' ) ) {
$event_errors[] = __('You are not allowed to create posts or drafts on this blog.');
return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this blog.' ) );
}
# Se estiver editando, verificar se ele pode postar em cima de outro usuario
if ( !current_user_can( 'edit_others_posts' ) ) {
$event_errors[] = __('You are not allowed to post as this user.');
return new WP_Error( 'edit_others_posts', __( 'You are not allowed to post as this user.' ) );
}
}
$from = trim($from); $to = trim($to) ? trim($to) : trim($from);
$m='@\d{4}-\d{2}-\d{2}( \d{2}:\d{2})?@';
if (!preg_match($m, $from) || !preg_match($m, $to)) {
$event_errors[] = __('Worng value on to or from dates.');
return false;
}
$m='@\d{4}-\d{2}-\d{2} \d{2}:\d{2}@';
if (!preg_match($m, $from)) $from .= ' 00:00';
if (!preg_match($m, $to)) $to .= ' 00:00';
list($from_date, $from_time) = split(' ', $from);
list($to_date, $to_time) = split(' ', $to);
list($from_year, $from_month, $from_day) = split('-', $from_date);
list($to_year, $to_month, $to_day) = split('-', $to_date);
if ($all_day) {
$from_time = '00:00';
$to_time = '00:00';
}
list($from_hour, $from_minutes) = split(':', $from_time);
list($to_hour, $to_minutes) = split(':', $to_time);
$from_timestamp = mktime ($from_hour, $from_minutes, 0, $from_month, $from_day, $from_year);
$to_timestamp = mktime ($to_hour, $to_minutes, 0, $to_month, $to_day, $to_year);
if ($from_timestamp > $to_timestamp) {
$event_errors[] = $from . '>' . $to . __(' From date is larger than To date.');
return false;
}
$post = array(
'post_title' => $what ? $what : __('(No title)'),
'post_status' => 'publish',
'post_content' => $desc,
'post_category' => array(get_option('event_category'), $repeat['v_calendar']),
'tags_input' => $repeat['v_tags'],
'post_excerpt' => $repeat['v_excerpt'],
'ping_status' => $repeat['v_pings'],
'comment_status' => $repeat['v_comments'],
);
if ($id) { $post['ID'] = $id; wp_update_post($post); }
else { $id = wp_insert_post($post); }
if ($all_day) add_post_meta($id, '_all_day', '1', true) or update_post_meta($id, '_all_day', '1');
else delete_post_meta($id, '_all_day', '1');
add_post_meta($id, '_start', $from_timestamp, true) or update_post_meta($id, '_start', $from_timestamp);
add_post_meta($id, '_end', $to_timestamp, true) or update_post_meta($id, '_end', $to_timestamp);
add_post_meta($id, '_where', $where, true) or update_post_meta($id, '_where', $where);
add_post_meta($id, '_destak', $repeat['v_destak'], true) or update_post_meta($id, '_destak', $repeat['v_destak']);
if (!in_array($repeat['repeat'], array ('daily', 'weekly', 'monthly', 'yearly', 'other')) || !in_array($repeat['range'], array('never', 'until'))) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
} else {
if ($repeat['range'] == 'until' && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $repeat['v_range_ends_until'])) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
}
}
if ($repeat['repeat'] == 'daily') {
if (!preg_match('@^\d+$@', $repeat['repeat_daily_every'])) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
} else {
add_post_meta($id, '_repeat', 'daily', true) or update_post_meta($id, '_repeat', 'daily');
add_post_meta($id, '_every', $repeat['repeat_daily_every'], true) or update_post_meta($id, '_every', $repeat['repeat_daily_every']);
}
}
if ($repeat['repeat'] == 'weekly') {
if (!preg_match('@^\d+$@', $repeat['repeat_weekly_every'])) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
} else {
$repeats_on=array();
$tmp=array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
foreach ($tmp as $tmpi)
if ($repeat['v_repeat_weekly_on_' . $tmpi])
$repeats_on[] = $tmpi;
add_post_meta($id, '_repeat', 'weekly', true) or update_post_meta($id, '_repeat', 'weekly');
add_post_meta($id, '_every', $repeat['repeat_weekly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_weekly_every']);
add_post_meta($id, '_every_on', implode(',', $repeats_on), true) or update_post_meta($id, '_every_on', implode(',', $repeats_on));
}
}
if ($repeat['repeat'] == 'monthly') {
if (!preg_match('@^\d+$@', $repeat['repeat_monthly_every'])) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
} else {
add_post_meta($id, '_repeat', 'monthly', true) or update_post_meta($id, '_repeat', 'monthly');
add_post_meta($id, '_every', $repeat['repeat_monthly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_monthly_every']);
add_post_meta($id, '_repeat_on', $repeat['repeat_monthly_by'], true) or update_post_meta($id, '_repeat_on', $repeat['repeat_monthly_by']);
}
}
if ($repeat['repeat'] == 'yearly') {
if (!preg_match('@^\d+$@', $repeat['repeat_yearly_every'])) {
$repeat['repeat'] = 'no_repeat';
$repeat['range'] = 'never';
} else {
add_post_meta($id, '_repeat', 'yearly', true) or update_post_meta($id, '_repeat', 'yearly');
add_post_meta($id, '_every', $repeat['repeat_yearly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_yearly_every']);
}
}
if ($repeat['repeat'] == 'no_repeat') {
add_post_meta($id, '_repeat', 'no_repeat', true) or update_post_meta($id, '_repeat', 'no_repeat');
} else {
add_post_meta($id, '_range', $repeat['range'], true) or update_post_meta($id, '_range', $repeat['range']);
add_post_meta($id, '_range_until', $repeat['range'] == 'until' ? $repeat['v_range_ends_until'] : '', true) or update_post_meta($id, '_range_until', $repeat['range'] == 'until' ? $repeat['v_range_ends_until'] : '');
}
return $id;
}
function tratare (&$event) {
global $event_order;
if (empty($event_order)) $event_order = array ();
if ($event['all_day']) {
$event['when_start_time'] = '00:00';
$event['when_end_time'] = '24:00';
}
list($year, $month, $day) = split('-', $event['when_start_date']);
list($hour, $minute) = split(':', $event['when_start_time']);
$start = mktime($hour, $minute, 0, $month, $day, $year);
list($year, $month, $day) = split('-', $event['when_end_date']);
list($hour, $minute) = split(':', $event['when_end_time']);
$end = mktime($hour, $minute, 0, $month, $day, $year);
$duration = $end-$start;
$event['duration'] = $duration;
if ($event['repeat'] == 'no_repeat') $event['ends_on'] = 'once';
elseif ($event['range'] == 'never') $event['ends_on'] = 'never';
else {
list($year, $month, $day) = split('-', $event['range_ends_until']);
$event['ends_on'] = mktime(0,1,0,$month,$day,$year);
}
list($hour, $minute) = split(':', $event['when_start_time']);
list($year, $month, $day) = split('-', $event['when_start_date']);
if ($event['repeat'] == 'monthly' && $event['repeat_monthly_by'] == 'week') {
$r_d_week = date('w', $start);
$l_month = mktime(0, 0, 0, $month, 1, $year);
$ld_month = date('t', $l_month);
for ($i=1,$w=1;$i<$ld_month;$i++) {
$tmp=mktime($hour,$minute,0,$month,$i,$year);
if ($i>1 && date('w',$tmp) == 0) $w++;
if ($i==$day) {$r_w_weel = $w;break;}
}
}
if ($event['repeat'] == 'weekly') {
$w_days = array();
foreach (array ('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday') as $item)
if (isset($event['repeat_weekly_on_'.$item]))
$w_days[] = $item;
$w_time = $start;
$event_order[] = "{$start}|{$event['event_id']}";
}
for ($i=0; $i < 100; $i++) {
if ($event['ends_on'] == 'once') {
$time = $start;
}
if ($event['repeat'] == 'daily') {
$repeat_time = $i*($event['repeat_daily_every']-1);
$time = mktime($hour, $minute, $duration*$i, $month, $day+$repeat_time, $year);
}
if ($event['repeat'] == 'yearly') {
$time = mktime($hour, $minute, 0, $month, $day, $year+$i*$event['repeat_yearly_every']);
if(!$time) break;
}
if ($event['repeat'] == 'monthly') {
if ($event['repeat_monthly_by'] == 'month') {
$time = mktime($hour, $minute, 0, $month+$i*$event['repeat_monthly_every'], $day, $year);
}
if ($event['repeat_monthly_by'] == 'week') {
$r_month = $month + ($i*$event['repeat_monthly_every']);
$t_month = mktime(0, 0, 0, $r_month, 1, $year);
$d_month = date('t', $t_month);
for ($j=1,$w=1;$j<$d_month;$j++) {
$tmp=mktime($hour,$minute,0,$month+$i,$j,$year);
if($j>1&&date('w',$tmp)==0)$w++;
if ($w<$r_w_week) continue;
if ($r_d_week == date('w', $tmp)) {$time = $tmp;break 1;}
}
}
}
if ($event['repeat'] == 'weekly') {
for ($j=0,$w_time+=(24*60*60);$j<7;$j++,$w_time+=(24*60*60)){
if (in_array(strtolower(date('l', $w_time)), $w_days)) {
$time=$w_time;
break 1;
}
}
}
if (preg_match('@^\d+$@', $event['ends_on']) && $time > $event['ends_on']) break;
$event_order[] = "{$time}|{$event['event_id']}";
if ($event['ends_on'] == 'once') break;
}
}
function the_events ($only_destak=false) {
global $event_order;
if (gettype($event_order)!=='array')
$event_order=array ();
$args = array (
'numberposts' => -1,
'category' => get_option('event_category'),
);
$posts = get_posts($args);
$return = array();
foreach ($posts as $post) {
$tmp = Agenda::req($post->ID);
if($only_destak && !$tmp['v_destak']) continue;
foreach ($tmp as $k=>$v) {
if (preg_match('@^v_@', $k)) {
$tmp[preg_replace('@^v_@', '', $k)] = $v;
unset ($tmp[$k]);
}
}
if ($tmp['all_day']) {
$tmp['all_day'] = true;
unset($tmp['when_start_time'], $tmp['when_end_time']);
}
if ($tmp['repeat']=='no_repeat') {
unset($tmp['range'], $tmp['range_ends_until']);
}
$return[] = $tmp;
}
array_filter($return, array('Agenda', 'tratare'));
sort($event_order);
return $return;
}
public function next_events ($next = 5,$only_destak=false) {
global $event_order;
if (gettype($event_order)!=='array')
$event_order=array ();
$events = Agenda::the_events($only_destak);
$now = time();
$return = array();
foreach ($event_order as $item) {
list($time,$id)=explode('|', $item);
if ($now>$time) continue;
$e=Agenda::req($id);
$return[] = array('utime'=>$time,'date'=>date('d-m-Y H:i', $time),'id'=>$id,'event'=>$e);
if ($next<=++$i) break;
}
return $return;
}
function events_on ($args) {
global $event_order;
$defaults = array(
'month' => date('m'),
'year' => date('Y'),
);
$args = wp_parse_args($args, $defaults);
extract($args); $month=(int) $month; $year=(int) $year;
if (!is_int($month) || (!is_int($year) && $year!=false)) return;
if (gettype($event_order)!=='array') $event_order=array ();
$events = Agenda::the_events($only_destak);
$return = array();
if ($month) {
$start = mktime(0,0,0,$month, 1, $year);
$end = mktime(0,0,0,$month+1, 0, $year);
} else {
$start = mktime(0,0,0,1, 1, $year);
$end = mktime(0,0,0,1, 0, $year+1);
}
foreach ($event_order as $item) {
list($time,$id)=explode('|', $item);
$e=Agenda::req($id);
if ($time<$start || $time>$end) continue;
$return[] = array('utime'=>$time,'date'=>date('d-m-Y H:i', $time),'id'=>$id,'event'=>$e);
}
return $return;
}
}
function agenda_list ($next=5, $only_destak=true, $show_date=true, $before='', $after=' ', $print=true) {
$e = Agenda::next_events($next,$only_destak);
$itens=array ();
foreach ($e as $item) {
$p = get_post($item['id']);
$itens[] = sprintf ('%s%s%s%s%s %s',
$before,
$p->guid,
$item['event']['v_what'],
(!$only_destak ? ($item['event']['v_destak'] == '1' ? '' : '') : ''),
$show_date ? $item['date'] . ' - ' : '',
$item['event']['v_what'],
(!$only_destak ? ($item['event']['v_destak'] == '1' ? ' ' : '') : ''),
$after
);
}
$return = implode("\n", $itens);
if ($print) print ($return);
return $return;
}
function agenda_compromissos ($next=25, $title_tag='h3', $print=true) {
$e = Agenda::next_events($next);
$itens=array ();
foreach ($e as $item) {
$p = get_post($item['id']);
$itens[date('d-m-Y', $item['utime'])][] = sprintf ('%s ',
$p->guid,
$item['event']['v_what'],
$item['event']['v_what']
);
}
$r='';
$i=0;
foreach ($itens as $key => $value) {
$i++;
$even_odd='event_'.($i%2?'even':'odd');
$r.="\n\n<$title_tag>$key$title_tag>
";
foreach ($value as $item)
$r.="$item";
$r.=' ';
}
if ($print) print ($r);
return $r;
}
function agenda_events($args='') {
$defaults = array(
'month' => date('m'),
'year' => date('Y'),
'title_tag' => 'h3',
'print' => '1'
);
$args = wp_parse_args($args, $defaults);
extract($args); $month=(int) $month; $year=(int) $year;
$events = Agenda::events_on($args);
$itens=array ();
foreach ($events as $item) {
$p = get_post($item['id']);
$itens[date('d-m-Y', $item['utime'])][] = sprintf ('%s ',
$p->guid,
$item['event']['v_what'],
$item['event']['v_what']
);
}
$r='';
$i=0;
foreach ($itens as $key => $value) {
$even_odd='event_'.(++$i%2?'even':'odd');
$r.="\n\n<$title_tag>$key$title_tag>
";
foreach ($value as $item)
$r.="$item";
$r.=' ';
}
if ($print) print ($r);
return $r;
}
$ucmPluginFile = substr(strrchr(dirname(__FILE__),DIRECTORY_SEPARATOR),1).DIRECTORY_SEPARATOR.basename(__FILE__);
register_activation_hook($ucmPluginFile, array('Agenda','install'));
add_action('init', array ('Agenda', 'init'), 10);