cakecal / branches / master / controllers / calendar_controller.php

history
<?php

class CalendarController extends AppController {

	var $uses = array('Event');
	var $components = array('RequestHandler', 'ICal', 'Csv');

	function beforeFilter() {
		$this->RequestHandler->setContent(array(
			'ics' => 'text/calendar',
			'csv' => 'application/octet-stream'
		));

		$this->set('isAjax', $this->RequestHandler->isAjax());
	}

	function index ($year = null, $month = null, $day = null) {
		if ($year == null && $this->Session->check('Calendar.View')) {
			extract($this->Session->read('Calendar.View'));
			(intval($year) == 1969) ? $year = $month = $day = null : null;
		}

		if (empty($year)) {
			$year = date('Y');
		}
		if ($month == null) {
			$month = date('m');
		}
		if (intval($day) < 1) {
			$day = null;
		}

		$tmpDay = $day == null ? 1 : $day;
		$stamp = strtotime($year.'-'.$month.'-'.$tmpDay);
		$start = date('Y-m-d', $stamp);
		$end = $start;

		if ($day == null) {
			$end = date(
				'Y-m-d', strtotime('+1 month', $stamp) - (strtotime('+1 day') - strtotime('now'))
			);
		}

		$events = $this->Event->find('all', array('conditions' => array(
			'Event.start <=' => $end . ' 23:59:59',
			'Event.end >=' => $start,
		)));

		$this->Session->write('Calendar.View', compact('year', 'month', 'day'));

		$isDay = ($day != null);
		$day = $tmpDay;
		$events = array_values($events);
		$this->set(compact('isDay', 'events', 'year', 'month', 'day'));
	}

	function view($year = null, $month = null, $day = null) {
		$this->setAction('index', $year, $month, $day);
	}

	function edit($id = null) {
		$this->data = $this->Event->findById($id);

		$this->data['Event'] = array_merge($this->data['Event'], array(
			'start_Date' => date('m/d/Y', strtotime($this->data['Event']['start'])),
			'start_Time' => date('g:i a', strtotime($this->data['Event']['start'])),
			'end_Date'   => date('m/d/Y', strtotime($this->data['Event']['end'])),
			'end_Time'   => date('g:i a', strtotime($this->data['Event']['end']))
		));
	}

	function save() {
		if (!empty($this->params['form'])) {
			$this->Event->create();

			if (!empty($this->data)) {
				$this->Event->save($this->data);

				if (!isset($this->data['Event']['id']) || empty($this->data['Event']['id'])) {
					$id = $this->Event->id;
				} else {
					$data = $this->Event->findById($this->Event->id);
					$data = $data['Event'];
				}
			} else {
				// Serialized JavaScript data
				$this->Event->create();
				$this->Event->save($this->params['form']);
				$data = $this->Event->findById($this->Event->id);
				$data['Event']['__id'] = $this->params['form']['__id'];
				$data = $data['Event'];
			}
		}
		$this->set(compact('data', 'id'));
	}

	function delete($id = null) {
		$this->Event->del($id);
	}

	function import() {
		if (!empty($this->data)) {

			$events = array();

			if ($this->data['Event']['file']['type'] == 'text/calendar') {
				// Parse as iCal
				$data = $this->ICal->read($this->data['Event']['file']['tmp_name']);
				if (!is_array($data) || empty($data) || !isset($data['Calendar'])) {
					$this->Session->setFlash('Invalid import file');
					return;
				}
				$data = $data['Calendar'];

				if (!isset($data[0])) {
					$data = array($data);
				}

				foreach ($data as $cal) {
	
					if (isset($cal['Event'][0])) {
						// Calendar contains
						foreach($cal['Event'] as $event) {
							$events[] = $this->__mapEvent($event);
						}
					} elseif (isset($cal['Event'])) {
						$events[] = $this->__mapEvent($cal['Event']);
					}
				}
			} else {
				// Parse as CSV
				$data = $this->Csv->read($this->data['Event']['file']['tmp_name']);
				foreach ($data as $e) {
					$events[] = $this->__mapEvent2($e);
				}
			}

			foreach ($events as $e) {
				$this->Event->create();
				$this->Event->save($e);
			}

			$this->Session->setFlash('Import success');
			$this->redirect(array('action' => 'index'));
		}
	}

	function __mapEvent($event) {
		$data = array('sharing' => 0, 'repeat' => 0);

		if (isset($event['start_date'][0])) {
			$event['start_date'] = $event['start_date'][0];
		}
		if (isset($event['end_date'][0])) {
			$event['end_date'] = $event['end_date'][0];
		}

		$data['start'] = $event['start_date'];
		$data['title'] = $event['summary'];

		if (isset($event['duration'])) {
			$offset = $this->__duration($event['duration']);
			$data['end'] = date('Y-m-d H:i:s', strtotime($data['start'].' + '.$offset));
		} elseif (isset($event['end_date'])) {
			$data['end'] = $event['end_date'];
		}
		return $data;
	}

	function __mapEvent2($event) {
		return array(
			'start'    => date('Y-m-d H:i:s', strtotime(
				$event['Start Date'] . ' ' . $event['Start Time']
			)),
			'end'      => date('Y-m-d H:i:s', strtotime(
				$event['End Date'] . ' ' . $event['End Time']
			)),
			'title'    => $event['Subject'],
			'notes'    => $event['Description'],
			'location' => $event['Location'],
			'repeat'   => 0,
		);
	}

	function export() {
		// $this->RequestHandler->respondAs('text/calendar', array(
		// 	'attachment' => 'cal-export.ics'
		// ));

		$this->RequestHandler->respondAs('application/octet-stream', array(
			'attachment' => 'cal-export.csv'
		));

		$data = array();
		$events = $this->Event->find('all');

		foreach ($events as $event) {
			$data[] = array(
				$event['title'],
				date('m/d/Y', strtotime($event['Event']['start'])),
				date('H:i:s A', strtotime($event['Event']['start'])),
				date('m/d/Y', strtotime($event['Event']['end'])),
				date('H:i:s A', strtotime($event['Event']['end'])),
				'False',
				'False',
				date('m/d/Y', strtotime($event['Event']['start'])),
				date('H:i:s A', strtotime($event['Event']['start'])),
				'',
				'',
				'',
				'',
				'',
				'',
				$event['Event']['notes'],
				$event['Event']['location'],
				'',
				'Normal',
				$event['Event']['sharing'] == 2 ? 'False' : 'True',
				'Normal',
				2
			);
		}

		// iCal
		/*foreach ($events as $event) {
			$event = $event['Event'];
			$tmp = array();
			$tmp['DTSTART;TZID=US/Eastern'] = date('Ymd', strtotime($event['start'])).'T'.date('His', strtotime($event['start']));
			$tmp['SUMMARY'] = $event['title'];
			$tmp['DURATION'] = $this->ICal->__putDuration($event['start'], $event['end']);
			$tmp['DESCRIPTION'] = r("\n", '\n', $event['notes']);
			$tmp['DTSTAMP;TZID=US/Eastern'] = date('Ymd', strtotime($event['created'])).'T'.date('His', strtotime($event['created']));

			if ($event['repeat'] && $event['repeat'] != 0) {
				$tmp['RRULE'] = 'FREQ=' . ($event['repeat'] == 1 ? 'WEEKLY' : 'MONTHLY');
			}
			$data[] = $tmp;
		}*/

		$this->set(compact('data'));
		$this->render('outlook_export', 'ajax');
	}
}

?>