4 * functions to operate on calendar data files.
6 * @copyright © 2002-2007 The SquirrelMail Project Team
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10 * @subpackage calendar
14 * this is array that contains all events
15 * it is three dimensional array with fallowing structure
16 * $calendardata[date][time] = array(length,priority,title,message,reminder);
18 $calendardata = array();
21 * Reads multilined calendar data
23 * Plugin stores multiline texts converted to single line with PHP nl2br().
24 * Function undoes nl2br() conversion and html encoding of ASCII vertical bar.
26 * Older plugin versions sanitized data with htmlspecialchars. Since 1.5.1 calendar
27 * data is not sanitized. Output functions must make sure that data is correctly
28 * encoded and sanitized.
29 * @param string $string calendar string
30 * @return string calendar string converted to multiline text
34 function calendar_readmultiline($string) {
36 * replace html line breaks with ASCII line feeds
37 * replace htmlencoded | with ASCII vertical bar
39 $string = str_replace(array('<br />','<br>','|'),array("\n","\n",'|'),$string);
44 * Callback function used to sanitize calendar data before saving it to file
45 * @param string $sValue array value
46 * @param string $sKey array key
50 function calendar_encodedata(&$sValue, $sKey) {
52 * add html line breaks
53 * remove original ASCII line feeds and carriage returns
54 * replace ASCII vertical bar with html code in order to sanitize field delimiter
56 $sValue = str_replace(array("\n","\r",'|'),array('','','|'),nl2br($sValue));
60 * read events into array
62 * data is | delimited, just like addressbook
63 * files are structured like this:
64 * date|time|length|priority|title|message
65 * files are divided by year for performance increase
67 function readcalendardata() {
68 global $calendardata, $username, $data_dir, $year;
70 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
72 if (file_exists($filename)){
73 $fp = fopen ($filename,'r');
76 while ($fdata = fgetcsv ($fp, 4096, '|')) {
77 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
78 'priority' => $fdata[3],
79 'title' => str_replace("\n",' ',calendar_readmultiline($fdata[4])),
80 'message' => calendar_readmultiline($fdata[5]),
81 'reminder' => $fdata[6] );
84 // this is to sort the events within a day on starttime
85 $new_calendardata = array();
86 foreach($calendardata as $day => $data) {
87 ksort($data, SORT_NUMERIC
);
88 $new_calendardata[$day] = $data;
90 $calendardata = $new_calendardata;
100 function writecalendardata() {
101 global $calendardata, $username, $data_dir, $year, $color;
103 $filetmp = getHashedFile($username, $data_dir, "$username.$year.cal.tmp");
104 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
105 $fp = fopen ($filetmp,"w");
107 while ( $calfoo = each ($calendardata)) {
108 while ( $calbar = each ($calfoo['value'])) {
109 $calfoobar = $calendardata[$calfoo['key']][$calbar['key']];
110 array_walk($calfoobar,'calendar_encodedata');
112 * Make sure that reminder field is set. Calendar forms don't implement it,
113 * but it is still used for calendar data. Backwards compatibility.
115 if (!isset($calfoobar['reminder'])) $calfoobar['reminder']='';
117 $calstr = "$calfoo[key]|$calbar[key]|$calfoobar[length]|$calfoobar[priority]|$calfoobar[title]|$calfoobar[message]|$calfoobar[reminder]\n";
118 if(sq_fwrite($fp, $calstr, 4096) === FALSE) {
119 error_box(_("Could not write calendar file %s", "$username.$year.cal.tmp"));
126 rename($filetmp,$filename);
131 * deletes event from file
135 function delete_event($date, $time) {
136 global $calendardata, $username, $data_dir, $year;
138 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
139 $fp = fopen ($filename,'r');
141 while ($fdata = fgetcsv ($fp, 4096, "|")) {
142 if (($fdata[0]==$date) && ($fdata[1]==$time)){
145 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
146 'priority' => $fdata[3],
147 'title' => $fdata[4],
148 'message' => $fdata[5],
149 'reminder' => $fdata[6] );
158 * same as delete but does not save calendar
159 * saving is done inside event_edit.php
164 function update_event($date, $time) {
165 global $calendardata, $username, $data_dir, $year;
167 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
168 $fp = fopen ($filename,'r');
170 while ($fdata = fgetcsv ($fp, 4096, '|')) {
171 if (($fdata[0]==$date) && ($fdata[1]==$time)){
174 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
175 'priority' => $fdata[3],
176 'title' => $fdata[4],
177 'message' => $fdata[5],
178 'reminder' => $fdata[6] );