blob: e393345dfbf050bd9f97f10586e92fc1d8fa70b0 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Andrey Andreev80500af2013-01-01 08:16:53 +020021 * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000028
Derek Allard2067d1a2008-11-13 22:59:24 +000029/**
30 * CodeIgniter Calendar Class
31 *
32 * This class enables the creation of calendars
33 *
34 * @package CodeIgniter
35 * @subpackage Libraries
36 * @category Libraries
Derek Jonesf4a4bd82011-10-20 12:18:42 -050037 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000038 * @link http://codeigniter.com/user_guide/libraries/calendar.html
39 */
40class CI_Calendar {
41
Timothy Warren68f09812012-04-27 10:38:32 -040042 /**
43 * Reference to CodeIgniter instance
44 *
45 * @var object
46 */
Andrey Andreev6dbabb52012-03-26 15:41:48 +030047 protected $CI;
Andrey Andreev56454792012-05-17 14:32:19 +030048
Timothy Warren68f09812012-04-27 10:38:32 -040049 /**
50 * Current local time
51 *
52 * @var int
53 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020054 public $local_time;
Andrey Andreev56454792012-05-17 14:32:19 +030055
Timothy Warren68f09812012-04-27 10:38:32 -040056 /**
57 * Calendar layout template
58 *
59 * @var string
60 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020061 public $template = '';
Andrey Andreev56454792012-05-17 14:32:19 +030062
Timothy Warren68f09812012-04-27 10:38:32 -040063 /**
64 * Day of the week to start the calendar on
65 *
66 * @var string
67 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020068 public $start_day = 'sunday';
Andrey Andreev56454792012-05-17 14:32:19 +030069
Timothy Warren68f09812012-04-27 10:38:32 -040070 /**
71 * How to display months
72 *
73 * @var string
74 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020075 public $month_type = 'long';
Andrey Andreev56454792012-05-17 14:32:19 +030076
Timothy Warren68f09812012-04-27 10:38:32 -040077 /**
78 * How to display names of days
79 *
80 * @var string
81 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +020082 public $day_type = 'abr';
Andrey Andreev56454792012-05-17 14:32:19 +030083
Timothy Warren68f09812012-04-27 10:38:32 -040084 /**
85 * Whether to show next/prev month links
86 *
87 * @var bool
88 */
Andrey Andreev56454792012-05-17 14:32:19 +030089 public $show_next_prev = FALSE;
90
Timothy Warren68f09812012-04-27 10:38:32 -040091 /**
92 * Url base to use for next/prev month links
93 *
94 * @var bool
95 */
Andrey Andreev56454792012-05-17 14:32:19 +030096 public $next_prev_url = '';
Derek Allard2067d1a2008-11-13 22:59:24 +000097
98 /**
Marcos SF Filho7977e1d2014-01-08 15:34:11 -020099 * Show days of other months
100 *
101 * @var bool
102 */
103 public $show_other_days = FALSE;
104
105 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300106 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +0000107 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300108 * Loads the calendar language file and sets the default time reference.
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300109 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300110 * @uses CI_Lang::$is_loaded
111 *
112 * @param array $config Calendar options
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300113 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000114 */
Greg Akera9263282010-11-10 15:26:43 -0600115 public function __construct($config = array())
Barry Mienydd671972010-10-04 16:33:58 +0200116 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000117 $this->CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200118
Greg Aker3a746652011-04-19 10:59:47 -0500119 if ( ! in_array('calendar_lang.php', $this->CI->lang->is_loaded, TRUE))
Derek Allard2067d1a2008-11-13 22:59:24 +0000120 {
121 $this->CI->lang->load('calendar');
122 }
123
124 $this->local_time = time();
Barry Mienydd671972010-10-04 16:33:58 +0200125
Derek Allard2067d1a2008-11-13 22:59:24 +0000126 if (count($config) > 0)
127 {
128 $this->initialize($config);
129 }
Barry Mienydd671972010-10-04 16:33:58 +0200130
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300131 log_message('debug', 'Calendar Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000132 }
Barry Mienydd671972010-10-04 16:33:58 +0200133
Derek Allard2067d1a2008-11-13 22:59:24 +0000134 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200135
Derek Allard2067d1a2008-11-13 22:59:24 +0000136 /**
137 * Initialize the user preferences
138 *
139 * Accepts an associative array as input, containing display preferences
140 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000141 * @param array config preferences
142 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200143 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200144 public function initialize($config = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000145 {
146 foreach ($config as $key => $val)
147 {
148 if (isset($this->$key))
149 {
150 $this->$key = $val;
151 }
152 }
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200153
154 // Set the next_prev_url to the controller if required but not defined
Marcos SF Filhoc4f66162014-01-08 18:57:09 -0200155 if ($this->show_next_prev === TRUE && empty($this->next_prev_url))
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200156 {
Marcos SF Filhoc4f66162014-01-08 18:57:09 -0200157 $this->next_prev_url = rtrim($this->CI->config->site_url($this->CI->router->class.'/'.$this->CI->router->method), '/').'/';
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200158 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000159 }
Barry Mienydd671972010-10-04 16:33:58 +0200160
Derek Allard2067d1a2008-11-13 22:59:24 +0000161 // --------------------------------------------------------------------
162
163 /**
164 * Generate the calendar
165 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300166 * @param int the year
167 * @param int the month
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 * @param array the data to be shown in the calendar cells
169 * @return string
170 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200171 public function generate($year = '', $month = '', $data = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000172 {
173 // Set and validate the supplied month/year
Andrey Andreevf51b1fb2012-06-16 20:02:23 +0300174 if (empty($year))
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200175 {
Andrey Andreev838a9d62012-12-03 14:37:47 +0200176 $year = date('Y', $this->local_time);
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200177 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200178 elseif (strlen($year) === 1)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200179 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000180 $year = '200'.$year;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200181 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200182 elseif (strlen($year) === 2)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200183 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000184 $year = '20'.$year;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200185 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000186
Andrey Andreevf51b1fb2012-06-16 20:02:23 +0300187 if (empty($month))
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200188 {
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200189 $month = date('m', $this->local_time);
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200190 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200191 elseif (strlen($month) === 1)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200192 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000193 $month = '0'.$month;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200194 }
Barry Mienydd671972010-10-04 16:33:58 +0200195
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 $adjusted_date = $this->adjust_date($month, $year);
Barry Mienydd671972010-10-04 16:33:58 +0200197
Derek Allard2067d1a2008-11-13 22:59:24 +0000198 $month = $adjusted_date['month'];
199 $year = $adjusted_date['year'];
Barry Mienydd671972010-10-04 16:33:58 +0200200
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 // Determine the total days in the month
202 $total_days = $this->get_total_days($month, $year);
Barry Mienydd671972010-10-04 16:33:58 +0200203
Derek Allard2067d1a2008-11-13 22:59:24 +0000204 // Set the starting day of the week
205 $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);
Andrey Andreev56454792012-05-17 14:32:19 +0300206 $start_day = isset($start_days[$this->start_day]) ? $start_days[$this->start_day] : 0;
Barry Mienydd671972010-10-04 16:33:58 +0200207
Derek Allard2067d1a2008-11-13 22:59:24 +0000208 // Set the starting day number
209 $local_date = mktime(12, 0, 0, $month, 1, $year);
210 $date = getdate($local_date);
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300211 $day = $start_day + 1 - $date['wday'];
Barry Mienydd671972010-10-04 16:33:58 +0200212
Derek Allard2067d1a2008-11-13 22:59:24 +0000213 while ($day > 1)
214 {
215 $day -= 7;
216 }
Barry Mienydd671972010-10-04 16:33:58 +0200217
Derek Allard2067d1a2008-11-13 22:59:24 +0000218 // Set the current month/year/day
219 // We use this to determine the "today" date
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200220 $cur_year = date('Y', $this->local_time);
221 $cur_month = date('m', $this->local_time);
222 $cur_day = date('j', $this->local_time);
Barry Mienydd671972010-10-04 16:33:58 +0200223
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300224 $is_current_month = ($cur_year == $year && $cur_month == $month);
Barry Mienydd671972010-10-04 16:33:58 +0200225
Derek Allard2067d1a2008-11-13 22:59:24 +0000226 // Generate the template data array
227 $this->parse_template();
Derek Allard2067d1a2008-11-13 22:59:24 +0000228
Barry Mienydd671972010-10-04 16:33:58 +0200229 // Begin building the calendar output
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200230 $out = $this->temp['table_open']."\n\n".$this->temp['heading_row_start']."\n";
Barry Mienydd671972010-10-04 16:33:58 +0200231
Derek Allard2067d1a2008-11-13 22:59:24 +0000232 // "previous" month link
Alex Bilbied261b1e2012-06-02 11:12:16 +0100233 if ($this->show_next_prev === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000234 {
Andrey Andreev838a9d62012-12-03 14:37:47 +0200235 // Add a trailing slash to the URL if needed
236 $this->next_prev_url = preg_replace('/(.+?)\/*$/', '\\1/', $this->next_prev_url);
Barry Mienydd671972010-10-04 16:33:58 +0200237
Derek Allard2067d1a2008-11-13 22:59:24 +0000238 $adjusted_date = $this->adjust_date($month - 1, $year);
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200239 $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell'])."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000240 }
241
242 // Heading containing the month/year
Alex Bilbied261b1e2012-06-02 11:12:16 +0100243 $colspan = ($this->show_next_prev === TRUE) ? 5 : 7;
Barry Mienydd671972010-10-04 16:33:58 +0200244
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200245 $this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan,
246 str_replace('{heading}', $this->get_month_name($month).'&nbsp;'.$year, $this->temp['heading_title_cell']));
Barry Mienydd671972010-10-04 16:33:58 +0200247
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200248 $out .= $this->temp['heading_title_cell']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000249
250 // "next" month link
Alex Bilbied261b1e2012-06-02 11:12:16 +0100251 if ($this->show_next_prev === TRUE)
Barry Mienydd671972010-10-04 16:33:58 +0200252 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000253 $adjusted_date = $this->adjust_date($month + 1, $year);
254 $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_next_cell']);
255 }
256
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200257 $out .= "\n".$this->temp['heading_row_end']."\n\n"
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200258 // Write the cells containing the days of the week
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200259 .$this->temp['week_row_start']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000260
261 $day_names = $this->get_day_names();
262
263 for ($i = 0; $i < 7; $i ++)
264 {
265 $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->temp['week_day_cell']);
266 }
267
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200268 $out .= "\n".$this->temp['week_row_end']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000269
270 // Build the main body of the calendar
271 while ($day <= $total_days)
272 {
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200273 $out .= "\n".$this->temp['cal_row_start']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000274
275 for ($i = 0; $i < 7; $i++)
276 {
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300277 if ($day > 0 && $day <= $total_days)
Barry Mienydd671972010-10-04 16:33:58 +0200278 {
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200279 $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start'];
280
Derek Allard2067d1a2008-11-13 22:59:24 +0000281 if (isset($data[$day]))
Barry Mienydd671972010-10-04 16:33:58 +0200282 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000283 // Cells with content
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300284 $temp = ($is_current_month === TRUE && $day == $cur_day) ?
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200285 $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200286 $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);
Derek Allard2067d1a2008-11-13 22:59:24 +0000287 }
288 else
289 {
290 // Cells with no content
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300291 $temp = ($is_current_month === TRUE && $day == $cur_day) ?
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200292 $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000293 $out .= str_replace('{day}', $day, $temp);
294 }
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200295
296 $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000297 }
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200298 elseif ($this->show_other_days === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000299 {
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200300 $out .= $this->temp['cal_cell_start_other'];
301
302 if ($day <= 0)
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200303 {
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200304 // Day of previous month
305 $prev_month = $this->adjust_date(((int) $month) - 1, $year);
306 $prev_month_days = $this->get_total_days($prev_month['month'], $prev_month['year']);
307 $out .= str_replace('{day}', $prev_month_days + $day, $this->temp['cal_cell_other']);
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200308 }
309 else
310 {
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200311 // Day of next month
312 $out .= str_replace('{day}', $day - $total_days, $this->temp['cal_cell_other']);
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200313 }
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200314
315 $out .= $this->temp['cal_cell_end_other'];
316 }
317 else
318 {
319 // Blank cells
320 $out .= $this->temp['cal_cell_start'].$this->temp['cal_cell_blank'].$this->temp['cal_cell_end'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000321 }
Barry Mienydd671972010-10-04 16:33:58 +0200322
Derek Allard2067d1a2008-11-13 22:59:24 +0000323 $day++;
324 }
Barry Mienydd671972010-10-04 16:33:58 +0200325
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200326 $out .= "\n".$this->temp['cal_row_end']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000327 }
328
Andrey Andreev56454792012-05-17 14:32:19 +0300329 return $out .= "\n".$this->temp['table_close'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000330 }
Barry Mienydd671972010-10-04 16:33:58 +0200331
Derek Allard2067d1a2008-11-13 22:59:24 +0000332 // --------------------------------------------------------------------
333
334 /**
335 * Get Month Name
336 *
337 * Generates a textual month name based on the numeric
338 * month provided.
339 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300340 * @param int the month
Derek Allard2067d1a2008-11-13 22:59:24 +0000341 * @return string
342 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200343 public function get_month_name($month)
Derek Allard2067d1a2008-11-13 22:59:24 +0000344 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100345 if ($this->month_type === 'short')
Derek Allard2067d1a2008-11-13 22:59:24 +0000346 {
347 $month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');
348 }
349 else
350 {
Derek Allarddefaa172009-08-17 17:24:31 +0000351 $month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');
Derek Allard2067d1a2008-11-13 22:59:24 +0000352 }
Barry Mienydd671972010-10-04 16:33:58 +0200353
Andrey Andreev56454792012-05-17 14:32:19 +0300354 return ($this->CI->lang->line($month_names[$month]) === FALSE)
355 ? ucfirst(substr($month_names[$month], 4))
356 : $this->CI->lang->line($month_names[$month]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000357 }
Barry Mienydd671972010-10-04 16:33:58 +0200358
Derek Allard2067d1a2008-11-13 22:59:24 +0000359 // --------------------------------------------------------------------
360
361 /**
362 * Get Day Names
363 *
364 * Returns an array of day names (Sunday, Monday, etc.) based
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300365 * on the type. Options: long, short, abrev
Derek Allard2067d1a2008-11-13 22:59:24 +0000366 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000367 * @param string
368 * @return array
369 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200370 public function get_day_names($day_type = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000371 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100372 if ($day_type !== '')
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200373 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000374 $this->day_type = $day_type;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200375 }
Barry Mienydd671972010-10-04 16:33:58 +0200376
Andrey Andreev56454792012-05-17 14:32:19 +0300377 if ($this->day_type === 'long')
Derek Allard2067d1a2008-11-13 22:59:24 +0000378 {
379 $day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
380 }
Andrey Andreev56454792012-05-17 14:32:19 +0300381 elseif ($this->day_type === 'short')
Derek Allard2067d1a2008-11-13 22:59:24 +0000382 {
383 $day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
384 }
385 else
386 {
387 $day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');
388 }
Barry Mienydd671972010-10-04 16:33:58 +0200389
Derek Allard2067d1a2008-11-13 22:59:24 +0000390 $days = array();
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200391 for ($i = 0, $c = count($day_names); $i < $c; $i++)
Barry Mienydd671972010-10-04 16:33:58 +0200392 {
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200393 $days[] = ($this->CI->lang->line('cal_'.$day_names[$i]) === FALSE) ? ucfirst($day_names[$i]) : $this->CI->lang->line('cal_'.$day_names[$i]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000394 }
Barry Mienydd671972010-10-04 16:33:58 +0200395
Derek Allard2067d1a2008-11-13 22:59:24 +0000396 return $days;
397 }
Barry Mienydd671972010-10-04 16:33:58 +0200398
Derek Allard2067d1a2008-11-13 22:59:24 +0000399 // --------------------------------------------------------------------
400
401 /**
402 * Adjust Date
403 *
404 * This function makes sure that we have a valid month/year.
405 * For example, if you submit 13 as the month, the year will
406 * increment and the month will become January.
407 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300408 * @param int the month
409 * @param int the year
Derek Allard2067d1a2008-11-13 22:59:24 +0000410 * @return array
411 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200412 public function adjust_date($month, $year)
Derek Allard2067d1a2008-11-13 22:59:24 +0000413 {
414 $date = array();
415
416 $date['month'] = $month;
417 $date['year'] = $year;
418
419 while ($date['month'] > 12)
420 {
421 $date['month'] -= 12;
422 $date['year']++;
423 }
424
425 while ($date['month'] <= 0)
426 {
427 $date['month'] += 12;
428 $date['year']--;
429 }
430
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200431 if (strlen($date['month']) === 1)
Derek Allard2067d1a2008-11-13 22:59:24 +0000432 {
433 $date['month'] = '0'.$date['month'];
434 }
435
436 return $date;
437 }
Barry Mienydd671972010-10-04 16:33:58 +0200438
Derek Allard2067d1a2008-11-13 22:59:24 +0000439 // --------------------------------------------------------------------
440
441 /**
442 * Total days in a given month
443 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300444 * @param int the month
445 * @param int the year
446 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +0000447 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200448 public function get_total_days($month, $year)
Derek Allard2067d1a2008-11-13 22:59:24 +0000449 {
450 $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
451
452 if ($month < 1 OR $month > 12)
453 {
454 return 0;
455 }
456
457 // Is the year a leap year?
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300458 if ($month == 2)
Derek Allard2067d1a2008-11-13 22:59:24 +0000459 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100460 if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0))
Derek Allard2067d1a2008-11-13 22:59:24 +0000461 {
462 return 29;
463 }
464 }
465
466 return $days_in_month[$month - 1];
467 }
Barry Mienydd671972010-10-04 16:33:58 +0200468
Derek Allard2067d1a2008-11-13 22:59:24 +0000469 // --------------------------------------------------------------------
470
471 /**
472 * Set Default Template Data
473 *
474 * This is used in the event that the user has not created their own template
475 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300476 * @return array
Derek Allard2067d1a2008-11-13 22:59:24 +0000477 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200478 public function default_template()
Derek Allard2067d1a2008-11-13 22:59:24 +0000479 {
Andrey Andreev838a9d62012-12-03 14:37:47 +0200480 return array(
Timothy Warren68f09812012-04-27 10:38:32 -0400481 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
482 'heading_row_start' => '<tr>',
483 'heading_previous_cell' => '<th><a href="{previous_url}">&lt;&lt;</a></th>',
484 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
485 'heading_next_cell' => '<th><a href="{next_url}">&gt;&gt;</a></th>',
486 'heading_row_end' => '</tr>',
487 'week_row_start' => '<tr>',
488 'week_day_cell' => '<td>{week_day}</td>',
489 'week_row_end' => '</tr>',
490 'cal_row_start' => '<tr>',
491 'cal_cell_start' => '<td>',
492 'cal_cell_start_today' => '<td>',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200493 'cal_cell_start_other' => '<td style="color: #666;">',
Timothy Warren68f09812012-04-27 10:38:32 -0400494 'cal_cell_content' => '<a href="{content}">{day}</a>',
495 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',
496 'cal_cell_no_content' => '{day}',
497 'cal_cell_no_content_today' => '<strong>{day}</strong>',
498 'cal_cell_blank' => '&nbsp;',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200499 'cal_cell_other' => '{day}',
Timothy Warren68f09812012-04-27 10:38:32 -0400500 'cal_cell_end' => '</td>',
501 'cal_cell_end_today' => '</td>',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200502 'cal_cell_end_other' => '</td>',
Timothy Warren68f09812012-04-27 10:38:32 -0400503 'cal_row_end' => '</tr>',
504 'table_close' => '</table>'
505 );
Derek Allard2067d1a2008-11-13 22:59:24 +0000506 }
Barry Mienydd671972010-10-04 16:33:58 +0200507
Derek Allard2067d1a2008-11-13 22:59:24 +0000508 // --------------------------------------------------------------------
509
510 /**
511 * Parse Template
512 *
513 * Harvests the data within the template {pseudo-variables}
514 * used to display the calendar
515 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000516 * @return void
517 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200518 public function parse_template()
Barry Mienydd671972010-10-04 16:33:58 +0200519 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000520 $this->temp = $this->default_template();
Barry Mienydd671972010-10-04 16:33:58 +0200521
Alex Bilbied261b1e2012-06-02 11:12:16 +0100522 if ($this->template === '')
Barry Mienydd671972010-10-04 16:33:58 +0200523 {
524 return;
525 }
526
Derek Allard2067d1a2008-11-13 22:59:24 +0000527 $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');
Barry Mienydd671972010-10-04 16:33:58 +0200528
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200529 foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today', 'cal_cell_start_other', 'cal_cell_other', 'cal_cell_end_other') as $val)
Derek Allard2067d1a2008-11-13 22:59:24 +0000530 {
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300531 if (preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si', $this->template, $match))
Derek Allard2067d1a2008-11-13 22:59:24 +0000532 {
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200533 $this->temp[$val] = $match[1];
Derek Allard2067d1a2008-11-13 22:59:24 +0000534 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200535 elseif (in_array($val, $today, TRUE))
Derek Allard2067d1a2008-11-13 22:59:24 +0000536 {
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200537 $this->temp[$val] = $this->temp[substr($val, 0, -6)];
Derek Allard2067d1a2008-11-13 22:59:24 +0000538 }
Barry Mienydd671972010-10-04 16:33:58 +0200539 }
540 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000541
542}
543
Derek Allard2067d1a2008-11-13 22:59:24 +0000544/* End of file Calendar.php */
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300545/* Location: ./system/libraries/Calendar.php */