blob: 1a0d02ba0be049ff8921a042420c29e988b61e05 [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
darwinel871754a2014-02-11 17:34:57 +010021 * @copyright Copyright (c) 2008 - 2014, 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 /**
Timothy Warren68f09812012-04-27 10:38:32 -040043 * Calendar layout template
44 *
Andrew021f8ed2014-02-09 16:31:22 -060045 * @var mixed
Andrew227a5d72014-02-09 15:32:44 -060046 */
47 public $template = '';
Andrey Andreev9bf3cf22014-02-18 16:39:46 +020048
Andrew227a5d72014-02-09 15:32:44 -060049 /**
50 * Replacements array for template
51 *
Andrewe0333db2014-02-08 01:24:00 -060052 * @var array
Timothy Warren68f09812012-04-27 10:38:32 -040053 */
Andrew227a5d72014-02-09 15:32:44 -060054 public $replacements = array();
Andrey Andreev56454792012-05-17 14:32:19 +030055
Timothy Warren68f09812012-04-27 10:38:32 -040056 /**
57 * Day of the week to start the calendar on
58 *
59 * @var string
60 */
Andrew227a5d72014-02-09 15:32:44 -060061 public $start_day = 'sunday';
Andrey Andreev56454792012-05-17 14:32:19 +030062
Timothy Warren68f09812012-04-27 10:38:32 -040063 /**
64 * How to display months
65 *
66 * @var string
67 */
Andrew227a5d72014-02-09 15:32:44 -060068 public $month_type = 'long';
Andrey Andreev56454792012-05-17 14:32:19 +030069
Timothy Warren68f09812012-04-27 10:38:32 -040070 /**
71 * How to display names of days
72 *
73 * @var string
74 */
Andrew227a5d72014-02-09 15:32:44 -060075 public $day_type = 'abr';
Andrey Andreev56454792012-05-17 14:32:19 +030076
Timothy Warren68f09812012-04-27 10:38:32 -040077 /**
78 * Whether to show next/prev month links
79 *
80 * @var bool
81 */
Andrew227a5d72014-02-09 15:32:44 -060082 public $show_next_prev = FALSE;
Andrey Andreev56454792012-05-17 14:32:19 +030083
Timothy Warren68f09812012-04-27 10:38:32 -040084 /**
85 * Url base to use for next/prev month links
86 *
87 * @var bool
88 */
Andrew227a5d72014-02-09 15:32:44 -060089 public $next_prev_url = '';
Derek Allard2067d1a2008-11-13 22:59:24 +000090
91 /**
Marcos SF Filho7977e1d2014-01-08 15:34:11 -020092 * Show days of other months
93 *
94 * @var bool
95 */
96 public $show_other_days = FALSE;
97
Andrey Andreev6125a272014-02-21 16:58:13 +020098 // --------------------------------------------------------------------
99
100 /**
101 * CI Singleton
102 *
103 * @var object
104 */
105 protected $CI;
106
107 // --------------------------------------------------------------------
108
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200109 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300110 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +0000111 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300112 * Loads the calendar language file and sets the default time reference.
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300113 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300114 * @uses CI_Lang::$is_loaded
115 *
116 * @param array $config Calendar options
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300117 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000118 */
Greg Akera9263282010-11-10 15:26:43 -0600119 public function __construct($config = array())
Barry Mienydd671972010-10-04 16:33:58 +0200120 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000121 $this->CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200122
Greg Aker3a746652011-04-19 10:59:47 -0500123 if ( ! in_array('calendar_lang.php', $this->CI->lang->is_loaded, TRUE))
Derek Allard2067d1a2008-11-13 22:59:24 +0000124 {
125 $this->CI->lang->load('calendar');
126 }
127
Andrey Andreev6125a272014-02-21 16:58:13 +0200128 empty($config) OR $this->initialize($config);
Barry Mienydd671972010-10-04 16:33:58 +0200129
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300130 log_message('debug', 'Calendar Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000131 }
Barry Mienydd671972010-10-04 16:33:58 +0200132
Derek Allard2067d1a2008-11-13 22:59:24 +0000133 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200134
Derek Allard2067d1a2008-11-13 22:59:24 +0000135 /**
136 * Initialize the user preferences
137 *
138 * Accepts an associative array as input, containing display preferences
139 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000140 * @param array config preferences
Andrew227a5d72014-02-09 15:32:44 -0600141 * @return CI_Calendar
Barry Mienydd671972010-10-04 16:33:58 +0200142 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200143 public function initialize($config = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000144 {
145 foreach ($config as $key => $val)
146 {
147 if (isset($this->$key))
148 {
149 $this->$key = $val;
150 }
151 }
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200152
153 // Set the next_prev_url to the controller if required but not defined
Marcos SF Filhoc4f66162014-01-08 18:57:09 -0200154 if ($this->show_next_prev === TRUE && empty($this->next_prev_url))
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200155 {
Marcos SF Filho0cd7c922014-01-08 19:38:00 -0200156 $this->next_prev_url = $this->CI->config->site_url($this->CI->router->class.'/'.$this->CI->router->method);
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200157 }
Andrew227a5d72014-02-09 15:32:44 -0600158
159 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000160 }
Barry Mienydd671972010-10-04 16:33:58 +0200161
Derek Allard2067d1a2008-11-13 22:59:24 +0000162 // --------------------------------------------------------------------
163
164 /**
165 * Generate the calendar
166 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300167 * @param int the year
168 * @param int the month
Derek Allard2067d1a2008-11-13 22:59:24 +0000169 * @param array the data to be shown in the calendar cells
170 * @return string
171 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200172 public function generate($year = '', $month = '', $data = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000173 {
Andrey Andreev6125a272014-02-21 16:58:13 +0200174 $local_time = time();
175
Derek Allard2067d1a2008-11-13 22:59:24 +0000176 // Set and validate the supplied month/year
Andrey Andreevf51b1fb2012-06-16 20:02:23 +0300177 if (empty($year))
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200178 {
Andrey Andreev6125a272014-02-21 16:58:13 +0200179 $year = date('Y', $local_time);
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200180 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200181 elseif (strlen($year) === 1)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200182 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000183 $year = '200'.$year;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200184 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200185 elseif (strlen($year) === 2)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200186 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000187 $year = '20'.$year;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200188 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000189
Andrey Andreevf51b1fb2012-06-16 20:02:23 +0300190 if (empty($month))
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200191 {
Andrey Andreev6125a272014-02-21 16:58:13 +0200192 $month = date('m', $local_time);
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200193 }
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200194 elseif (strlen($month) === 1)
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200195 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 $month = '0'.$month;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200197 }
Barry Mienydd671972010-10-04 16:33:58 +0200198
Derek Allard2067d1a2008-11-13 22:59:24 +0000199 $adjusted_date = $this->adjust_date($month, $year);
Barry Mienydd671972010-10-04 16:33:58 +0200200
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 $month = $adjusted_date['month'];
202 $year = $adjusted_date['year'];
Barry Mienydd671972010-10-04 16:33:58 +0200203
Derek Allard2067d1a2008-11-13 22:59:24 +0000204 // Determine the total days in the month
205 $total_days = $this->get_total_days($month, $year);
Barry Mienydd671972010-10-04 16:33:58 +0200206
Derek Allard2067d1a2008-11-13 22:59:24 +0000207 // Set the starting day of the week
208 $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);
Andrey Andreev56454792012-05-17 14:32:19 +0300209 $start_day = isset($start_days[$this->start_day]) ? $start_days[$this->start_day] : 0;
Barry Mienydd671972010-10-04 16:33:58 +0200210
Derek Allard2067d1a2008-11-13 22:59:24 +0000211 // Set the starting day number
212 $local_date = mktime(12, 0, 0, $month, 1, $year);
213 $date = getdate($local_date);
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300214 $day = $start_day + 1 - $date['wday'];
Barry Mienydd671972010-10-04 16:33:58 +0200215
Derek Allard2067d1a2008-11-13 22:59:24 +0000216 while ($day > 1)
217 {
218 $day -= 7;
219 }
Barry Mienydd671972010-10-04 16:33:58 +0200220
Derek Allard2067d1a2008-11-13 22:59:24 +0000221 // Set the current month/year/day
222 // We use this to determine the "today" date
Andrey Andreev6125a272014-02-21 16:58:13 +0200223 $cur_year = date('Y', $local_time);
224 $cur_month = date('m', $local_time);
225 $cur_day = date('j', $local_time);
Barry Mienydd671972010-10-04 16:33:58 +0200226
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300227 $is_current_month = ($cur_year == $year && $cur_month == $month);
Barry Mienydd671972010-10-04 16:33:58 +0200228
Andrew227a5d72014-02-09 15:32:44 -0600229 // Generate the template data array
230 $this->parse_template();
231
Barry Mienydd671972010-10-04 16:33:58 +0200232 // Begin building the calendar output
Andrew227a5d72014-02-09 15:32:44 -0600233 $out = $this->replacements['table_open']."\n\n".$this->replacements['heading_row_start']."\n";
Barry Mienydd671972010-10-04 16:33:58 +0200234
Derek Allard2067d1a2008-11-13 22:59:24 +0000235 // "previous" month link
Alex Bilbied261b1e2012-06-02 11:12:16 +0100236 if ($this->show_next_prev === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000237 {
Andrey Andreev838a9d62012-12-03 14:37:47 +0200238 // Add a trailing slash to the URL if needed
239 $this->next_prev_url = preg_replace('/(.+?)\/*$/', '\\1/', $this->next_prev_url);
Barry Mienydd671972010-10-04 16:33:58 +0200240
Derek Allard2067d1a2008-11-13 22:59:24 +0000241 $adjusted_date = $this->adjust_date($month - 1, $year);
Andrew227a5d72014-02-09 15:32:44 -0600242 $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_previous_cell'])."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000243 }
244
245 // Heading containing the month/year
Alex Bilbied261b1e2012-06-02 11:12:16 +0100246 $colspan = ($this->show_next_prev === TRUE) ? 5 : 7;
Barry Mienydd671972010-10-04 16:33:58 +0200247
Andrew227a5d72014-02-09 15:32:44 -0600248 $this->replacements['heading_title_cell'] = str_replace('{colspan}', $colspan,
249 str_replace('{heading}', $this->get_month_name($month).'&nbsp;'.$year, $this->replacements['heading_title_cell']));
Barry Mienydd671972010-10-04 16:33:58 +0200250
Andrew227a5d72014-02-09 15:32:44 -0600251 $out .= $this->replacements['heading_title_cell']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000252
253 // "next" month link
Alex Bilbied261b1e2012-06-02 11:12:16 +0100254 if ($this->show_next_prev === TRUE)
Barry Mienydd671972010-10-04 16:33:58 +0200255 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000256 $adjusted_date = $this->adjust_date($month + 1, $year);
Andrew227a5d72014-02-09 15:32:44 -0600257 $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_next_cell']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000258 }
259
Andrew227a5d72014-02-09 15:32:44 -0600260 $out .= "\n".$this->replacements['heading_row_end']."\n\n"
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200261 // Write the cells containing the days of the week
Andrew227a5d72014-02-09 15:32:44 -0600262 .$this->replacements['week_row_start']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000263
264 $day_names = $this->get_day_names();
265
266 for ($i = 0; $i < 7; $i ++)
267 {
Andrew227a5d72014-02-09 15:32:44 -0600268 $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->replacements['week_day_cell']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000269 }
270
Andrew227a5d72014-02-09 15:32:44 -0600271 $out .= "\n".$this->replacements['week_row_end']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000272
273 // Build the main body of the calendar
274 while ($day <= $total_days)
275 {
Andrew227a5d72014-02-09 15:32:44 -0600276 $out .= "\n".$this->replacements['cal_row_start']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000277
278 for ($i = 0; $i < 7; $i++)
279 {
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300280 if ($day > 0 && $day <= $total_days)
Barry Mienydd671972010-10-04 16:33:58 +0200281 {
Andrew227a5d72014-02-09 15:32:44 -0600282 $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start'];
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200283
Derek Allard2067d1a2008-11-13 22:59:24 +0000284 if (isset($data[$day]))
Barry Mienydd671972010-10-04 16:33:58 +0200285 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000286 // Cells with content
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300287 $temp = ($is_current_month === TRUE && $day == $cur_day) ?
Andrew227a5d72014-02-09 15:32:44 -0600288 $this->replacements['cal_cell_content_today'] : $this->replacements['cal_cell_content'];
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200289 $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);
Derek Allard2067d1a2008-11-13 22:59:24 +0000290 }
291 else
292 {
293 // Cells with no content
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300294 $temp = ($is_current_month === TRUE && $day == $cur_day) ?
Andrew227a5d72014-02-09 15:32:44 -0600295 $this->replacements['cal_cell_no_content_today'] : $this->replacements['cal_cell_no_content'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000296 $out .= str_replace('{day}', $day, $temp);
297 }
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200298
Andrew227a5d72014-02-09 15:32:44 -0600299 $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_end_today'] : $this->replacements['cal_cell_end'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000300 }
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200301 elseif ($this->show_other_days === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000302 {
Andrew227a5d72014-02-09 15:32:44 -0600303 $out .= $this->replacements['cal_cell_start_other'];
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200304
305 if ($day <= 0)
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200306 {
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200307 // Day of previous month
Marcos SF Filho2e914b72014-01-09 09:20:55 -0200308 $prev_month = $this->adjust_date($month - 1, $year);
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200309 $prev_month_days = $this->get_total_days($prev_month['month'], $prev_month['year']);
Andrew227a5d72014-02-09 15:32:44 -0600310 $out .= str_replace('{day}', $prev_month_days + $day, $this->replacements['cal_cell_other']);
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200311 }
312 else
313 {
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200314 // Day of next month
Andrew227a5d72014-02-09 15:32:44 -0600315 $out .= str_replace('{day}', $day - $total_days, $this->replacements['cal_cell_other']);
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200316 }
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200317
Andrew227a5d72014-02-09 15:32:44 -0600318 $out .= $this->replacements['cal_cell_end_other'];
Marcos SF Filhoa593e3e2014-01-08 18:22:12 -0200319 }
320 else
321 {
322 // Blank cells
Andrew227a5d72014-02-09 15:32:44 -0600323 $out .= $this->replacements['cal_cell_start'].$this->replacements['cal_cell_blank'].$this->replacements['cal_cell_end'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000324 }
Barry Mienydd671972010-10-04 16:33:58 +0200325
Derek Allard2067d1a2008-11-13 22:59:24 +0000326 $day++;
327 }
Barry Mienydd671972010-10-04 16:33:58 +0200328
Andrew227a5d72014-02-09 15:32:44 -0600329 $out .= "\n".$this->replacements['cal_row_end']."\n";
Derek Allard2067d1a2008-11-13 22:59:24 +0000330 }
331
Andrew227a5d72014-02-09 15:32:44 -0600332 return $out .= "\n".$this->replacements['table_close'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000333 }
Barry Mienydd671972010-10-04 16:33:58 +0200334
Derek Allard2067d1a2008-11-13 22:59:24 +0000335 // --------------------------------------------------------------------
336
337 /**
338 * Get Month Name
339 *
340 * Generates a textual month name based on the numeric
341 * month provided.
342 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300343 * @param int the month
Derek Allard2067d1a2008-11-13 22:59:24 +0000344 * @return string
345 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200346 public function get_month_name($month)
Derek Allard2067d1a2008-11-13 22:59:24 +0000347 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100348 if ($this->month_type === 'short')
Derek Allard2067d1a2008-11-13 22:59:24 +0000349 {
350 $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');
351 }
352 else
353 {
Derek Allarddefaa172009-08-17 17:24:31 +0000354 $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 +0000355 }
Barry Mienydd671972010-10-04 16:33:58 +0200356
Andrey Andreev56454792012-05-17 14:32:19 +0300357 return ($this->CI->lang->line($month_names[$month]) === FALSE)
358 ? ucfirst(substr($month_names[$month], 4))
359 : $this->CI->lang->line($month_names[$month]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000360 }
Barry Mienydd671972010-10-04 16:33:58 +0200361
Derek Allard2067d1a2008-11-13 22:59:24 +0000362 // --------------------------------------------------------------------
363
364 /**
365 * Get Day Names
366 *
367 * Returns an array of day names (Sunday, Monday, etc.) based
Andrew227a5d72014-02-09 15:32:44 -0600368 * on the type. Options: long, short, abr
Derek Allard2067d1a2008-11-13 22:59:24 +0000369 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000370 * @param string
371 * @return array
372 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200373 public function get_day_names($day_type = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000374 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100375 if ($day_type !== '')
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200376 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000377 $this->day_type = $day_type;
Andrey Andreevc7dc07e2011-12-24 16:48:50 +0200378 }
Barry Mienydd671972010-10-04 16:33:58 +0200379
Andrey Andreev56454792012-05-17 14:32:19 +0300380 if ($this->day_type === 'long')
Derek Allard2067d1a2008-11-13 22:59:24 +0000381 {
382 $day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
383 }
Andrey Andreev56454792012-05-17 14:32:19 +0300384 elseif ($this->day_type === 'short')
Derek Allard2067d1a2008-11-13 22:59:24 +0000385 {
386 $day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
387 }
388 else
389 {
390 $day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');
391 }
Barry Mienydd671972010-10-04 16:33:58 +0200392
Derek Allard2067d1a2008-11-13 22:59:24 +0000393 $days = array();
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200394 for ($i = 0, $c = count($day_names); $i < $c; $i++)
Barry Mienydd671972010-10-04 16:33:58 +0200395 {
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200396 $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 +0000397 }
Barry Mienydd671972010-10-04 16:33:58 +0200398
Derek Allard2067d1a2008-11-13 22:59:24 +0000399 return $days;
400 }
Barry Mienydd671972010-10-04 16:33:58 +0200401
Derek Allard2067d1a2008-11-13 22:59:24 +0000402 // --------------------------------------------------------------------
403
404 /**
405 * Adjust Date
406 *
407 * This function makes sure that we have a valid month/year.
408 * For example, if you submit 13 as the month, the year will
409 * increment and the month will become January.
410 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300411 * @param int the month
412 * @param int the year
Derek Allard2067d1a2008-11-13 22:59:24 +0000413 * @return array
414 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200415 public function adjust_date($month, $year)
Derek Allard2067d1a2008-11-13 22:59:24 +0000416 {
417 $date = array();
418
419 $date['month'] = $month;
420 $date['year'] = $year;
421
422 while ($date['month'] > 12)
423 {
424 $date['month'] -= 12;
425 $date['year']++;
426 }
427
428 while ($date['month'] <= 0)
429 {
430 $date['month'] += 12;
431 $date['year']--;
432 }
433
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200434 if (strlen($date['month']) === 1)
Derek Allard2067d1a2008-11-13 22:59:24 +0000435 {
436 $date['month'] = '0'.$date['month'];
437 }
438
439 return $date;
440 }
Barry Mienydd671972010-10-04 16:33:58 +0200441
Derek Allard2067d1a2008-11-13 22:59:24 +0000442 // --------------------------------------------------------------------
443
444 /**
445 * Total days in a given month
446 *
Andrey Andreev6dbabb52012-03-26 15:41:48 +0300447 * @param int the month
448 * @param int the year
449 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +0000450 */
Andrey Andreeve8dfc1b2011-12-24 01:22:19 +0200451 public function get_total_days($month, $year)
Derek Allard2067d1a2008-11-13 22:59:24 +0000452 {
Andrey Andreev083a2262014-02-20 16:04:58 +0200453 $this->CI->load->helper('date');
Andrey Andreevbe368a82014-02-20 15:46:05 +0200454 return days_in_month($month, $year);
Derek Allard2067d1a2008-11-13 22:59:24 +0000455 }
Barry Mienydd671972010-10-04 16:33:58 +0200456
Derek Allard2067d1a2008-11-13 22:59:24 +0000457 // --------------------------------------------------------------------
458
459 /**
Andrew227a5d72014-02-09 15:32:44 -0600460 * Set Default Template Data
Derek Allard2067d1a2008-11-13 22:59:24 +0000461 *
Andrew227a5d72014-02-09 15:32:44 -0600462 * This is used in the event that the user has not created their own template
Derek Allard2067d1a2008-11-13 22:59:24 +0000463 *
Andrew227a5d72014-02-09 15:32:44 -0600464 * @return array
Derek Allard2067d1a2008-11-13 22:59:24 +0000465 */
Andrew227a5d72014-02-09 15:32:44 -0600466 public function default_template()
Derek Allard2067d1a2008-11-13 22:59:24 +0000467 {
Andrew227a5d72014-02-09 15:32:44 -0600468 return array(
Timothy Warren68f09812012-04-27 10:38:32 -0400469 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
470 'heading_row_start' => '<tr>',
471 'heading_previous_cell' => '<th><a href="{previous_url}">&lt;&lt;</a></th>',
472 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
473 'heading_next_cell' => '<th><a href="{next_url}">&gt;&gt;</a></th>',
474 'heading_row_end' => '</tr>',
475 'week_row_start' => '<tr>',
476 'week_day_cell' => '<td>{week_day}</td>',
477 'week_row_end' => '</tr>',
478 'cal_row_start' => '<tr>',
479 'cal_cell_start' => '<td>',
480 'cal_cell_start_today' => '<td>',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200481 'cal_cell_start_other' => '<td style="color: #666;">',
Timothy Warren68f09812012-04-27 10:38:32 -0400482 'cal_cell_content' => '<a href="{content}">{day}</a>',
483 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',
484 'cal_cell_no_content' => '{day}',
485 'cal_cell_no_content_today' => '<strong>{day}</strong>',
486 'cal_cell_blank' => '&nbsp;',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200487 'cal_cell_other' => '{day}',
Timothy Warren68f09812012-04-27 10:38:32 -0400488 'cal_cell_end' => '</td>',
489 'cal_cell_end_today' => '</td>',
Marcos SF Filho7977e1d2014-01-08 15:34:11 -0200490 'cal_cell_end_other' => '</td>',
Timothy Warren68f09812012-04-27 10:38:32 -0400491 'cal_row_end' => '</tr>',
492 'table_close' => '</table>'
493 );
Derek Allard2067d1a2008-11-13 22:59:24 +0000494 }
Andrew227a5d72014-02-09 15:32:44 -0600495
496 // --------------------------------------------------------------------
497
498 /**
499 * Parse Template
500 *
501 * Harvests the data within the template {pseudo-variables}
502 * used to display the calendar
503 *
504 * @return CI_Calendar
505 */
506 public function parse_template()
507 {
508 $this->replacements = $this->default_template();
509
Andrew021f8ed2014-02-09 16:31:22 -0600510 if (empty($this->template))
Andrew227a5d72014-02-09 15:32:44 -0600511 {
512 return $this;
513 }
Andrey Andreev9bf3cf22014-02-18 16:39:46 +0200514
Andrew021f8ed2014-02-09 16:31:22 -0600515 if (is_string($this->template))
Andrew227a5d72014-02-09 15:32:44 -0600516 {
517 $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');
Andrey Andreev9bf3cf22014-02-18 16:39:46 +0200518
Andrew227a5d72014-02-09 15:32:44 -0600519 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)
520 {
521 if (preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si', $this->template, $match))
522 {
523 $this->replacements[$val] = $match[1];
524 }
525 elseif (in_array($val, $today, TRUE))
526 {
527 $this->replacements[$val] = $this->replacements[substr($val, 0, -6)];
528 }
529 }
Andrew227a5d72014-02-09 15:32:44 -0600530 }
Andrew021f8ed2014-02-09 16:31:22 -0600531 elseif (is_array($this->template))
Andrew227a5d72014-02-09 15:32:44 -0600532 {
533 $this->replacements = array_merge($this->replacements, $this->template);
534 }
Andrey Andreev9bf3cf22014-02-18 16:39:46 +0200535
Andrew021f8ed2014-02-09 16:31:22 -0600536 return $this;
Andrew227a5d72014-02-09 15:32:44 -0600537 }
538
Derek Allard2067d1a2008-11-13 22:59:24 +0000539}
540
Derek Allard2067d1a2008-11-13 22:59:24 +0000541/* End of file Calendar.php */
Andrew41713aa2014-02-11 02:07:50 -0600542/* Location: ./system/libraries/Calendar.php */