Skip to content
Browse files

First Commit

  • Loading branch information...
0 parents commit 53b39ca9f0035d271341dabb4781433bdf713f3c Silas Montgomery committed
Showing with 2,109 additions and 0 deletions.
  1. +149 −0 LICENSE
  2. +66 −0 README
  3. +47 −0 full_calendar-0.91/config/full_calendar.sql
  4. +73 −0 full_calendar-0.91/controllers/event_types_controller.php
  5. +111 −0 full_calendar-0.91/controllers/events_controller.php
  6. +21 −0 full_calendar-0.91/controllers/full_calendar_controller.php
  7. +20 −0 full_calendar-0.91/full_calendar_app_controller.php
  8. +16 −0 full_calendar-0.91/full_calendar_app_model.php
  9. +37 −0 full_calendar-0.91/models/event.php
  10. +33 −0 full_calendar-0.91/models/event_type.php
  11. +19 −0 full_calendar-0.91/models/full_calendar.php
  12. +41 −0 full_calendar-0.91/views/event_types/add.ctp
  13. +43 −0 full_calendar-0.91/views/event_types/edit.ctp
  14. +59 −0 full_calendar-0.91/views/event_types/index.ctp
  15. +72 −0 full_calendar-0.91/views/event_types/view.ctp
  16. +39 −0 full_calendar-0.91/views/events/add.ctp
  17. +41 −0 full_calendar-0.91/views/events/edit.ctp
  18. +14 −0 full_calendar-0.91/views/events/feed.ctp
  19. +73 −0 full_calendar-0.91/views/events/index.ctp
  20. +70 −0 full_calendar-0.91/views/events/view.ctp
  21. +31 −0 full_calendar-0.91/views/full_calendar/index.ctp
  22. +656 −0 full_calendar-0.91/webroot/css/fullcalendar.css
  23. +110 −0 full_calendar-0.91/webroot/js/fullcalendar.min.js
  24. +16 −0 full_calendar-0.91/webroot/js/jquery-1.5.min.js
  25. +147 −0 full_calendar-0.91/webroot/js/jquery-ui-1.8.9.custom.min.js
  26. +15 −0 full_calendar-0.91/webroot/js/jquery.qtip-1.0.0-rc3.min.js
  27. +90 −0 full_calendar-0.91/webroot/js/ready.js
149 LICENSE
@@ -0,0 +1,149 @@
+-------------------
+THE CAKEPHP LICENSE
+-------------------
+
+CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+Copyright 2005-2010, Cake Software Foundation, Inc.(http://cakefoundation.org)
+
+Licensed under The MIT License
+Redistributions of files must retain the above copyright notice.
+
+@copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
+@link http://cakephp.org CakePHP(tm) Project
+@package cake
+@since CakePHP(tm) v 0.2.9
+@license MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+
+-------------------------
+THE FULL CALENDAR LICENSE
+-------------------------
+
+Copyright (c) 2009 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+------------------
+THE JQUERY LICENSE
+------------------
+
+Copyright (c) 2011 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+---------------------
+THE JQUERY UI LICENSE
+---------------------
+
+Copyright (c) 2011 Paul Bakaus, http://jqueryui.com/
+
+This software consists of voluntary contributions made by many
+individuals (AUTHORS.txt, http://jqueryui.com/about) For exact
+contribution history, see the revision history and logs, available
+at http://jquery-ui.googlecode.com/svn/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+------------------------------
+THE qTIP JQUERY PLUGIN LICENSE
+------------------------------
+
+Copyright (c) 2009 Craig Thompson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+---------------------------------------
+THE CAKEPHP-FULLCALENDAR PLUGIN LICENSE
+---------------------------------------
+
+Copyright (c) 2010 Silas Montgomery, http://silasmontgomery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
66 README
@@ -0,0 +1,66 @@
+-----------------------------------------
+WHAT IS THE CAKEPHP FULL CALENDAR PLUGIN?
+-----------------------------------------
+
+The CakePHP Full Calendar Plugin allows you to easily integrate
+the jQuery based Full Calendar application with your CakePHP
+application for a slick ajax event calendar.
+
+The plugin brings the following MIT licensed software (see
+LICENCE) together to create a simple and sleek experience:
+
+-CakePHP (obviously)
+-Full Calendar (the alendar itself)
+-jQuery (required by Full Calendar)
+-jQuery UI (required for draggable and resizable events)
+-qTip (jQuery plugin to allow hover event details)
+
+
+----
+WHY?
+----
+
+While working on another project I needed a visual calendar for
+event management for multiple users/accounts. From that project
+I decided to simplify the calendar and turn it into a plugin
+because there didn't appear to be a clean (easy to install and
+use) CakePHP Calendar plugin out there.
+
+In it's current form this plugin is for a single user though I
+plan on creating a few associated plugins to allow for multiple
+users, etc.
+
+
+------------------------
+THE INSTALLATION PROCESS
+------------------------
+
+NOTE: These instructions assume you already have a working copy
+of CakePHP with a database connection on your web server.
+
+You can read up on CakePHP installation and DB config here:
+http://book.cakephp.org/#!/view/913/Development AND
+http://book.cakephp.org/#!/view/922/Database-Configuration
+
+
+INSTALLED IN 3 SIMPLE STEPS
+
+1. Download or fork the CakePHP Full Calendar Plugin at:
+ https://github.com/silasmontgomery/CakePHP-Full-Calendar-Plugin
+
+2. Copy or upload the "full_calendar-?.??" folder to your
+ CakePHP "app/plugins" directory and rename to
+ "full_calendar".
+
+3. Create an "events" and "event_types" table by importing the
+ "full_calendar.sql" file found in the "full_calendar/config"
+ directory (Using PHPMyAdmin, command-line, etc).
+
+
+THAT'S IT!
+
+You should now be able to access the Full Calendar Plugin at:
+http://yoursite.com/full_calendar
+
+You should add some Event Types first. Then you can start
+scheduling some Events!
47 full_calendar-0.91/config/full_calendar.sql
@@ -0,0 +1,47 @@
+/*
+ * config/full_calendar.sql
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `events`
+--
+
+CREATE TABLE IF NOT EXISTS `events` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `event_type_id` int(11) NOT NULL,
+ `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
+ `details` text COLLATE utf8_unicode_ci NOT NULL,
+ `start` datetime NOT NULL,
+ `end` datetime NOT NULL,
+ `all_day` tinyint(1) NOT NULL DEFAULT '1',
+ `status` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Scheduled',
+ `active` tinyint(1) NOT NULL DEFAULT '1',
+ `created` date DEFAULT NULL,
+ `modified` date DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `event_types`
+--
+
+CREATE TABLE IF NOT EXISTS `event_types` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
+ `color` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
73 full_calendar-0.91/controllers/event_types_controller.php
@@ -0,0 +1,73 @@
+<?php
+/*
+ * controllers/event_types_controller.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class EventTypesController extends FullCalendarAppController {
+
+ var $name = 'EventTypes';
+
+ function index() {
+ $this->EventType->recursive = 0;
+ $this->set('eventTypes', $this->paginate());
+ }
+
+ function view($id = null) {
+ if(!$id) {
+ $this->Session->setFlash(__('Invalid event type', true));
+ $this->redirect(array('action' => 'index'));
+ }
+ $this->set('eventType', $this->EventType->read(null, $id));
+ }
+
+ function add() {
+ if (!empty($this->data)) {
+ $this->EventType->create();
+ if ($this->EventType->save($this->data)) {
+ $this->Session->setFlash(__('The event type has been saved', true));
+ $this->redirect(array('action' => 'index'));
+ } else {
+ $this->Session->setFlash(__('The event type could not be saved. Please, try again.', true));
+ }
+ }
+ }
+
+ function edit($id = null) {
+ if (!$id && empty($this->data)) {
+ $this->Session->setFlash(__('Invalid event type', true));
+ $this->redirect(array('action' => 'index'));
+ }
+ if (!empty($this->data)) {
+ if ($this->EventType->save($this->data)) {
+ $this->Session->setFlash(__('The event type has been saved', true));
+ $this->redirect(array('action' => 'index'));
+ } else {
+ $this->Session->setFlash(__('The event type could not be saved. Please, try again.', true));
+ }
+ }
+ if (empty($this->data)) {
+ $this->data = $this->EventType->read(null, $id);
+ }
+ }
+
+ function delete($id = null) {
+ if (!$id) {
+ $this->Session->setFlash(__('Invalid id for event type', true));
+ $this->redirect(array('action'=>'index'));
+ }
+ if ($this->EventType->delete($id)) {
+ $this->Session->setFlash(__('Event type deleted', true));
+ $this->redirect(array('action'=>'index'));
+ }
+ $this->Session->setFlash(__('Event type was not deleted', true));
+ $this->redirect(array('action' => 'index'));
+ }
+}
+?>
111 full_calendar-0.91/controllers/events_controller.php
@@ -0,0 +1,111 @@
+<?php
+/*
+ * controllers/events_controller.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class EventsController extends FullCalendarAppController {
+
+ var $name = 'Events';
+
+ function index() {
+ $this->Event->recursive = 1;
+ $this->set('events', $this->paginate());
+ }
+
+ function view($id = null) {
+ if (!$id) {
+ $this->Session->setFlash(__('Invalid event', true));
+ $this->redirect(array('action' => 'index'));
+ }
+ $this->set('event', $this->Event->read(null, $id));
+ }
+
+ function add() {
+ if (!empty($this->data)) {
+ $this->Event->create();
+ if ($this->Event->save($this->data)) {
+ $this->Session->setFlash(__('The event has been saved', true));
+ $this->redirect(array('action' => 'index'));
+ } else {
+ $this->Session->setFlash(__('The event could not be saved. Please, try again.', true));
+ }
+ }
+ $this->set('eventTypes', $this->Event->EventType->find('list'));
+ }
+
+ function edit($id = null) {
+ if (!$id && empty($this->data)) {
+ $this->Session->setFlash(__('Invalid event', true));
+ $this->redirect(array('action' => 'index'));
+ }
+ if (!empty($this->data)) {
+ if ($this->Event->save($this->data)) {
+ $this->Session->setFlash(__('The event has been saved', true));
+ $this->redirect(array('action' => 'index'));
+ } else {
+ $this->Session->setFlash(__('The event could not be saved. Please, try again.', true));
+ }
+ }
+ if (empty($this->data)) {
+ $this->data = $this->Event->read(null, $id);
+ }
+ $this->set('eventTypes', $this->Event->EventType->find('list'));
+ }
+
+ function delete($id = null) {
+ if (!$id) {
+ $this->Session->setFlash(__('Invalid id for event', true));
+ $this->redirect(array('action'=>'index'));
+ }
+ if ($this->Event->delete($id)) {
+ $this->Session->setFlash(__('Event deleted', true));
+ $this->redirect(array('action'=>'index'));
+ }
+ $this->Session->setFlash(__('Event was not deleted', true));
+ $this->redirect(array('action' => 'index'));
+ }
+
+ function feed($id=null) {
+ $this->layout = "ajax";
+ $vars = $this->params['url'];
+ $conditions = array('conditions' => array('UNIX_TIMESTAMP(start) >=' => $vars['start'], 'UNIX_TIMESTAMP(start) <=' => $vars['end']));
+ $events = $this->Event->find('all', $conditions);
+ foreach($events as $event) {
+ if($event['Event']['all_day'] == 1) {
+ $allday = true;
+ $end = $event['Event']['start'];
+ } else {
+ $allday = false;
+ $end = $event['Event']['end'];
+ }
+ $data[] = array(
+ 'id' => $event['Event']['id'],
+ 'title'=>$event['Event']['title'],
+ 'start'=>$event['Event']['start'],
+ 'end' => $end,
+ 'allDay' => $allday,
+ 'url' => 'full_calendar/events/view/'.$event['Event']['id'],
+ 'details' => $event['Event']['details'],
+ 'className' => $event['EventType']['color']
+ );
+ }
+ $this->set("json", json_encode($data));
+ }
+
+ function update() {
+ $vars = $this->params['url'];
+ $this->Event->id = $vars['id'];
+ $this->Event->saveField('start', $vars['start']);
+ $this->Event->saveField('end', $vars['end']);
+ $this->Event->saveField('all_day', $vars['allday']);
+ }
+
+}
+?>
21 full_calendar-0.91/controllers/full_calendar_controller.php
@@ -0,0 +1,21 @@
+<?php
+/*
+ * controllers/full_calendar_controller.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class FullCalendarController extends FullCalendarAppController {
+
+ var $name = 'FullCalendar';
+
+ function index() {
+ }
+
+}
+?>
20 full_calendar-0.91/full_calendar_app_controller.php
@@ -0,0 +1,20 @@
+<?php
+/*
+ * full_calendar_app_controller.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class FullCalendarAppController extends AppController {
+
+// var $components = array('Acl', 'Session');
+ var $components = array('Session');
+ var $helpers = array('Html', 'Form', 'Session', 'Javascript');
+
+}
+?>
16 full_calendar-0.91/full_calendar_app_model.php
@@ -0,0 +1,16 @@
+<?php
+/*
+ * controllers/full_calendar_app_model.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class FullCalendarAppModel extends AppModel {
+
+}
+?>
37 full_calendar-0.91/models/event.php
@@ -0,0 +1,37 @@
+<?php
+/*
+ * models/event.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class Event extends FullCalendarAppModel {
+ var $name = 'Event';
+ var $displayField = 'title';
+ var $validate = array(
+ 'title' => array(
+ 'notempty' => array(
+ 'rule' => array('notempty'),
+ ),
+ ),
+ 'start' => array(
+ 'notempty' => array(
+ 'rule' => array('notempty'),
+ ),
+ )
+ );
+
+ var $belongsTo = array(
+ 'EventType' => array(
+ 'className' => 'EventType',
+ 'foreignKey' => 'event_type_id'
+ )
+ );
+
+}
+?>
33 full_calendar-0.91/models/event_type.php
@@ -0,0 +1,33 @@
+<?php
+/*
+ * models/event_type.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class EventType extends FullCalendarAppModel {
+ var $name = 'EventType';
+ var $displayField = 'name';
+ var $validate = array(
+ 'name' => array(
+ 'notempty' => array(
+ 'rule' => array('notempty'),
+ ),
+ ),
+ );
+
+ var $hasMany = array(
+ 'Event' => array(
+ 'className' => 'Event',
+ 'foreignKey' => 'event_type_id',
+ 'dependent' => false,
+ )
+ );
+
+}
+?>
19 full_calendar-0.91/models/full_calendar.php
@@ -0,0 +1,19 @@
+<?php
+/*
+ * models/full_calendar.php
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+class FullCalendar extends FullCalendarAppModel {
+
+ var $useTable = false;
+ var $name = 'FullCalendar';
+
+}
+?>
41 full_calendar-0.91/views/event_types/add.ctp
@@ -0,0 +1,41 @@
+<?php
+/*
+ * views/event_types/add.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="eventTypes form">
+<?php echo $this->Form->create('EventType');?>
+ <fieldset>
+ <legend><?php __('Add Event Type'); ?></legend>
+ <?php
+ echo $this->Form->input('name');
+ echo $this->Form->input('color',
+ array('options' => array(
+ 'Blue' => 'Blue',
+ 'Red' => 'Red',
+ 'Pink' => 'Pink',
+ 'Purple' => 'Purple',
+ 'Orange' => 'Orange',
+ 'Green' => 'Green',
+ 'Gray' => 'Gray',
+ 'Black' => 'Black',
+ 'Brown' => 'Brown'
+ )));
+
+ ?>
+ </fieldset>
+<?php echo $this->Form->end(__('Submit', true));?>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('Manage Event Types', true), array('plugin' => 'full_calendar', 'action' => 'index'));?></li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
43 full_calendar-0.91/views/event_types/edit.ctp
@@ -0,0 +1,43 @@
+<?php
+/*
+ * views/event_types/edit.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="eventTypes form">
+<?php echo $this->Form->create('EventType');?>
+ <fieldset>
+ <legend><?php __('Edit Event Type'); ?></legend>
+ <?php
+ echo $this->Form->input('id');
+ echo $this->Form->input('name');
+ echo $this->Form->input('color',
+ array('options' => array(
+ 'Blue' => 'Blue',
+ 'Red' => 'Red',
+ 'Pink' => 'Pink',
+ 'Purple' => 'Purple',
+ 'Orange' => 'Orange',
+ 'Green' => 'Green',
+ 'Gray' => 'Gray',
+ 'Black' => 'Black',
+ 'Brown' => 'Brown'
+ )));
+
+ ?>
+ </fieldset>
+<?php echo $this->Form->end(__('Submit', true));?>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('View Event Type', true), array('plugin' => 'full_calendar', 'action' => 'view', $this->Form->value('EventType.id'))); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Event Types', true), array('plugin' => 'full_calendar', 'action' => 'index'));?></li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
59 full_calendar-0.91/views/event_types/index.ctp
@@ -0,0 +1,59 @@
+<?php
+/*
+ * views/event_types/index.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="eventTypes index">
+ <h2><?php __('Event Types');?></h2>
+ <table cellpadding="0" cellspacing="0">
+ <tr>
+ <th><?php echo $this->Paginator->sort('name');?></th>
+ <th><?php echo $this->Paginator->sort('color');?></th>
+ <th class="actions"></th>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($eventTypes as $eventType):
+ $class = null;
+ if ($i++ % 2 == 0) {
+ $class = ' class="altrow"';
+ }
+ ?>
+ <tr<?php echo $class;?>>
+ <td><?php echo $eventType['EventType']['name']; ?>&nbsp;</td>
+ <td><?php echo $eventType['EventType']['color']; ?>&nbsp;</td>
+ <td class="actions">
+ <?php echo $this->Html->link(__('View', true), array('plugin' => 'full_calendar', 'action' => 'view', $eventType['EventType']['id'])); ?>
+ <?php echo $this->Html->link(__('Edit', true), array('plugin' => 'full_calendar', 'action' => 'edit', $eventType['EventType']['id'])); ?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </table>
+ <p>
+ <?php
+ echo $this->Paginator->counter(array(
+ 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
+ ));
+ ?> </p>
+
+ <div class="paging">
+ <?php echo $this->Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?>
+ | <?php echo $this->Paginator->numbers();?>
+ |
+ <?php echo $this->Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?>
+ </div>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('New Event Type', true), array('plugin' => 'full_calendar', 'action' => 'add')); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Events', true), array('plugin' => 'full_calendar', 'controller' => 'events', 'action' => 'index')); ?></li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
72 full_calendar-0.91/views/event_types/view.ctp
@@ -0,0 +1,72 @@
+<?php
+/*
+ * views/event_types/view.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="eventTypes view">
+<h2><?php __('Event Type');?></h2>
+ <dl><?php $i = 0; $class = ' class="altrow"';?>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Name'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $eventType['EventType']['name']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Color'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $eventType['EventType']['color']; ?>
+ &nbsp;
+ </dd>
+ </dl>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('Edit Event Type', true), array('plugin' => 'full_calendar', 'action' => 'edit', $eventType['EventType']['id'])); ?> </li>
+ <li><?php echo $this->Html->link(__('Delete Event Type', true), array('plugin' => 'full_calendar', 'action' => 'delete', $eventType['EventType']['id']), null, sprintf(__('Are you sure you want to delete %s?', true), $eventType['EventType']['name'])); ?> </li>
+ <li><?php echo $this->Html->link(__('Manage Event Types', true), array('plugin' => 'full_calendar', 'action' => 'index')); ?> </li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
+<div class="related">
+ <h3><?php __('Related Events');?></h3>
+ <?php if (!empty($eventType['Event'])):?>
+ <table cellpadding = "0" cellspacing = "0">
+ <tr>
+ <th><?php __('Title'); ?></th>
+ <th><?php __('Status'); ?></th>
+ <th><?php __('Start'); ?></th>
+ <th><?php __('End'); ?></th>
+ <th><?php __('All Day'); ?></th>
+ <th><?php __('Modified'); ?></th>
+ <th class="actions"></th>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($eventType['Event'] as $event):
+ $class = null;
+ if ($i++ % 2 == 0) {
+ $class = ' class="altrow"';
+ }
+ ?>
+ <tr<?php echo $class;?>>
+ <td><?php echo $event['title'];?></td>
+ <td><?php echo $event['status'];?></td>
+ <td><?php echo $event['start'];?></td>
+ <td><?php if($event['all_day'] != 1) { echo $event['end']; } else { echo "N/A"; } ?></td>
+ <td><?php if($event['all_day'] == 1) { echo "Yes"; } else { echo "No"; }?></td>
+ <td><?php echo $event['modified'];?></td>
+ <td class="actions">
+ <?php echo $this->Html->link(__('View', true), array('plugin' => 'full_calendar', 'controller' => 'events', 'action' => 'view', $event['id'])); ?>
+ <?php echo $this->Html->link(__('Edit', true), array('plugin' => 'full_calendar', 'controller' => 'events', 'action' => 'edit', $event['id'])); ?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+<?php endif; ?>
+</div>
39 full_calendar-0.91/views/events/add.ctp
@@ -0,0 +1,39 @@
+<?php
+/*
+ * views/events/add.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="events form">
+<?php echo $this->Form->create('Event');?>
+ <fieldset>
+ <legend><?php __('Add Event'); ?></legend>
+ <?php
+ echo $this->Form->input('event_type_id');
+ echo $this->Form->input('title');
+ echo $this->Form->input('details');
+ echo $this->Form->input('start');
+ echo $this->Form->input('end');
+ echo $this->Form->input('all_day', array('checked' => 'checked'));
+ echo $this->Form->input('status', array('options' => array(
+ 'Scheduled' => 'Scheduled','Confirmed' => 'Confirmed','In Progress' => 'In Progress',
+ 'Rescheduled' => 'Rescheduled','Completed' => 'Completed'
+ )
+ )
+ );
+ ?>
+ </fieldset>
+<?php echo $this->Form->end(__('Submit', true));?>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('Manage Events', true), array('plugin' => 'full_calendar', 'action' => 'index'));?></li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
41 full_calendar-0.91/views/events/edit.ctp
@@ -0,0 +1,41 @@
+<?php
+/*
+ * views/events/edit.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="events form">
+<?php echo $this->Form->create('Event');?>
+ <fieldset>
+ <legend><?php __('Edit Event'); ?></legend>
+ <?php
+ echo $this->Form->input('id');
+ echo $this->Form->input('event_type_id');
+ echo $this->Form->input('title');
+ echo $this->Form->input('details');
+ echo $this->Form->input('start');
+ echo $this->Form->input('end');
+ echo $this->Form->input('all_day');
+ echo $this->Form->input('status', array('options' => array(
+ 'Scheduled' => 'Scheduled','Confirmed' => 'Confirmed','In Progress' => 'In Progress',
+ 'Rescheduled' => 'Rescheduled','Completed' => 'Completed'
+ )
+ )
+ );
+ ?>
+ </fieldset>
+<?php echo $this->Form->end(__('Submit', true));?>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('View Event', true), array('plugin' => 'full_calendar', 'action' => 'view', $this->Form->value('Event.id'))); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Events', true), array('plugin' => 'full_calendar', 'action' => 'index'));?></li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
14 full_calendar-0.91/views/events/feed.ctp
@@ -0,0 +1,14 @@
+<?php
+/*
+ * views/events/feed.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+echo $json;
+?>
73 full_calendar-0.91/views/events/index.ctp
@@ -0,0 +1,73 @@
+<?php
+/*
+ * views/events/index.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="events index">
+ <h2><?php __('Events');?></h2>
+ <table cellpadding="0" cellspacing="0">
+ <tr>
+ <th><?php echo $this->Paginator->sort('event_type_id');?></th>
+ <th><?php echo $this->Paginator->sort('title');?></th>
+ <th><?php echo $this->Paginator->sort('status');?></th>
+ <th><?php echo $this->Paginator->sort('start');?></th>
+ <th><?php echo $this->Paginator->sort('end');?></th>
+ <th><?php echo $this->Paginator->sort('all_day');?></th>
+ <th class="actions"></th>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($events as $event):
+ $class = null;
+ if ($i++ % 2 == 0) {
+ $class = ' class="altrow"';
+ }
+ ?>
+ <tr<?php echo $class;?>>
+ <td>
+ <?php echo $this->Html->link($event['EventType']['name'], array('controller' => 'event_types', 'action' => 'view', $event['EventType']['id'])); ?>
+ </td>
+ <td><?php echo $event['Event']['title']; ?></td>
+ <td><?php echo $event['Event']['status']; ?></td>
+ <td><?php echo $event['Event']['start']; ?></td>
+ <?php if($event['Event']['all_day'] == 0) { ?>
+ <td><?php echo $event['Event']['end']; ?></td>
+ <?php } else { ?>
+ <td>N/A</td>
+ <?php } ?>
+ <td><?php if($event['Event']['all_day'] == 1) { echo "Yes"; } else { echo "No"; } ?>&nbsp;</td>
+ <td class="actions">
+ <?php echo $this->Html->link(__('View', true), array('action' => 'view', $event['Event']['id'])); ?>
+ <?php echo $this->Html->link(__('Edit', true), array('action' => 'edit', $event['Event']['id'])); ?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </table>
+ <p>
+ <?php
+ echo $this->Paginator->counter(array(
+ 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
+ ));
+ ?> </p>
+
+ <div class="paging">
+ <?php echo $this->Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?>
+ | <?php echo $this->Paginator->numbers();?>
+ |
+ <?php echo $this->Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?>
+ </div>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('New Event', true), array('plugin' => 'full_calendar', 'action' => 'add')); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Event Types', true), array('plugin' => 'full_calendar', 'controller' => 'event_types', 'action' => 'index')); ?> </li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
70 full_calendar-0.91/views/events/view.ctp
@@ -0,0 +1,70 @@
+<?php
+/*
+ * views/events/view.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+?>
+<div class="events view">
+<h2><?php __('Event');?></h2>
+ <dl><?php $i = 0; $class = ' class="altrow"';?>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Event Type'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $this->Html->link($event['EventType']['name'], array('controller' => 'event_types', 'action' => 'view', $event['EventType']['id'])); ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Title'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['title']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Details'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['details']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Status'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['status']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Start'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['start']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('End'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php if($event['Event']['all_day'] != 1) { echo $event['Event']['end']; } else { echo "N/A"; } ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('All Day'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php if($event['Event']['all_day'] == 1) { echo "Yes"; } else { echo "No"; } ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Created'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['created']; ?>
+ &nbsp;
+ </dd>
+ <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Modified'); ?></dt>
+ <dd<?php if ($i++ % 2 == 0) echo $class;?>>
+ <?php echo $event['Event']['modified']; ?>
+ &nbsp;
+ </dd>
+ </dl>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('Edit Event', true), array('plugin' => 'full_calendar', 'action' => 'edit', $event['Event']['id'])); ?> </li>
+ <li><?php echo $this->Html->link(__('Delete Event', true), array('plugin' => 'full_calendar', 'action' => 'delete', $event['Event']['id']), null, sprintf(__('Are you sure you want to delete this %s event?', true), $event['EventType']['name'])); ?> </li>
+ <li><?php echo $this->Html->link(__('Manage Events', true), array('plugin' => 'full_calendar', 'action' => 'index')); ?> </li>
+ <li><li><?php echo $this->Html->link(__('View Calendar', true), array('plugin' => 'full_calendar', 'controller' => 'full_calendar')); ?></li>
+ </ul>
+</div>
31 full_calendar-0.91/views/full_calendar/index.ctp
@@ -0,0 +1,31 @@
+<?php
+/*
+ * views/full_calendar/index.ctp
+ * CakePHP Full Calendar Plugin
+ *
+ * Copyright (c) 2010 Silas Montgomery
+ * http://silasmontgomery.com
+ *
+ * Licensed under MIT
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+echo $javascript->link('/full_calendar/js/jquery-1.5.min', false);
+echo $javascript->link('/full_calendar/js/jquery-ui-1.8.9.custom.min', false);
+echo $javascript->link('/full_calendar/js/fullcalendar.min', false);
+echo $javascript->link('/full_calendar/js/jquery.qtip-1.0.0-rc3.min', false);
+echo $javascript->link('/full_calendar/js/ready', false);
+echo $html->css('/full_calendar/css/fullcalendar', null, array('inline' => false));
+?>
+
+
+<div class="Calendar index">
+ <div id="calendar"></div>
+</div>
+<div class="actions">
+ <ul>
+ <li><?php echo $this->Html->link(__('New Event', true), array('plugin' => 'full_calendar', 'controller' => 'events', 'action' => 'add')); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Events', true), array('plugin' => 'full_calendar', 'controller' => 'events')); ?></li>
+ <li><?php echo $this->Html->link(__('Manage Events Types', true), array('plugin' => 'full_calendar', 'controller' => 'event_types')); ?></li>
+ </ul>
+</div>
656 full_calendar-0.91/webroot/css/fullcalendar.css
@@ -0,0 +1,656 @@
+/*
+ * FullCalendar v1.4.11 Stylesheet
+ *
+ * Feel free to edit this file to customize the look of FullCalendar.
+ * When upgrading to newer versions, please upgrade this file as well,
+ * porting over any customizations afterwards.
+ *
+ * Date: Tue Feb 22 21:47:22 2011 -0800
+ *
+ */
+
+
+/* TODO: make font sizes look the same in all doctypes */
+
+
+.fc,
+.fc .fc-header,
+.fc .fc-content {
+ font-size: 1em;
+ }
+
+.fc {
+ direction: ltr;
+ text-align: left;
+ }
+
+.fc table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+
+.fc td, .fc th {
+ padding: 0;
+ vertical-align: top;
+ }
+
+
+
+/* Header
+------------------------------------------------------------------------*/
+
+table.fc-header {
+ width: 100%;
+ }
+
+.fc-header-left {
+ width: 25%;
+ }
+
+.fc-header-left table {
+ float: left;
+ }
+
+.fc-header-center {
+ width: 50%;
+ text-align: center;
+ }
+
+.fc-header-center table {
+ margin: 0 auto;
+ }
+
+.fc-header-right {
+ width: 25%;
+ }
+
+.fc-header-right table {
+ float: right;
+ }
+
+.fc-header-title {
+ margin-top: 0;
+ white-space: nowrap;
+ }
+
+.fc-header-space {
+ padding-left: 10px;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-header-title {
+ direction: rtl;
+ }
+
+
+
+/* Buttons
+------------------------------------------------------------------------*/
+
+.fc-header .fc-state-default,
+.fc-header .ui-state-default {
+ margin-bottom: 1em;
+ cursor: pointer;
+ }
+
+.fc-header .fc-state-default {
+ border-width: 1px 0;
+ padding: 0 1px;
+ }
+
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+ border-style: solid;
+ }
+
+.fc-header .fc-state-default a {
+ display: block;
+ border-width: 0 1px;
+ margin: 0 -1px;
+ width: 100%;
+ text-decoration: none;
+ }
+
+.fc-header .fc-state-default span {
+ display: block;
+ border-style: solid;
+ border-width: 1px 0 1px 1px;
+ padding: 3px 5px;
+ }
+
+.fc-header .ui-state-default {
+ padding: 4px 6px;
+ }
+
+.fc-header .fc-state-default span,
+.fc-header .ui-state-default span {
+ white-space: nowrap;
+ }
+
+/* for adjacent buttons */
+
+.fc-header .fc-no-right {
+ padding-right: 0;
+ }
+
+.fc-header .fc-no-right a {
+ margin-right: 0;
+ border-right: 0;
+ }
+
+.fc-header .ui-no-right {
+ border-right: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-header .fc-corner-left {
+ margin-left: 1px;
+ padding-left: 0;
+ }
+
+.fc-header .fc-corner-right {
+ margin-right: 1px;
+ padding-right: 0;
+ }
+
+/* DEFAULT button COLORS */
+
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+ border-color: #777; /* outer border */
+ color: #333;
+ }
+
+.fc-header .fc-state-default span {
+ border-color: #fff #fff #d1d1d1; /* inner border */
+ background: #e8e8e8;
+ }
+
+/* PRESSED button COLORS (down and active) */
+
+.fc-header .fc-state-active a {
+ color: #fff;
+ }
+
+.fc-header .fc-state-down span,
+.fc-header .fc-state-active span {
+ background: #888;
+ border-color: #808080 #808080 #909090; /* inner border */
+ }
+
+/* DISABLED button COLORS */
+
+.fc-header .fc-state-disabled a {
+ color: #999;
+ }
+
+.fc-header .fc-state-disabled,
+.fc-header .fc-state-disabled a {
+ border-color: #ccc; /* outer border */
+ }
+
+.fc-header .fc-state-disabled span {
+ border-color: #fff #fff #f0f0f0; /* inner border */
+ background: #f0f0f0;
+ }
+
+
+
+/* Content Area & Global Cell Styles
+------------------------------------------------------------------------*/
+
+.fc-widget-content {
+ border: 1px solid #ccc; /* outer border color */
+ }
+
+.fc-content {
+ clear: both;
+ }
+
+.fc-content .fc-state-default {
+ border-style: solid;
+ border-color: #ccc; /* inner border color */
+ }
+
+.fc-content .fc-state-highlight { /* today */
+ background: #ffc;
+ }
+
+.fc-content .fc-not-today { /* override jq-ui highlight (TODO: ui-widget-content) */
+ background: none;
+ }
+
+.fc-cell-overlay { /* semi-transparent rectangle while dragging */
+ background: #9cf;
+ opacity: .2;
+ filter: alpha(opacity=20); /* for IE */
+ }
+
+.fc-view { /* prevents dragging outside of widget */
+ width: 100%;
+ overflow: hidden;
+ }
+
+
+
+
+
+/* Global Event Styles
+------------------------------------------------------------------------*/
+
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+ border-style: solid;
+ border-color: #36c; /* default BORDER color (probably the same as background-color) */
+ background-color: #36c; /* default BACKGROUND color */
+ color: #fff; /* default TEXT color */
+ }
+
+ /* Use the 'className' CalEvent property and the following
+ * example CSS to change event color on a per-event basis:
+ *
+ * .myclass,
+ * .fc-agenda .myclass .fc-event-time,
+ * .myclass a {
+ * background-color: black;
+ * border-color: black;
+ * color: red;
+ * }
+ */
+
+
+/* CakePHP Full Calendar Plugin Note:
+ *
+ * CUSTOM CSS FOR EVENT TYPES
+ * Feel free to add/change colors here but you'll need to edit the
+ * following files as the colors are currently hard coded:
+ *
+ * views/event_types/add.ctp
+ * views/event_types/edit.ctp
+ */
+
+.Blue, .fc-agenda .Blue .fc-event-time, .Blue a {
+ border-color: #36c;
+ background-color: #36c;
+ color: #fff;
+}
+
+.Green, .fc-agenda .Green .fc-event-time, .Green a {
+ border-color: #009B4E;
+ background-color: #009B4E;
+ color: #fff;
+}
+
+.Red, .fc-agenda .Red .fc-event-time, .Red a {
+ border-color: #820000;
+ background-color: #820000;
+ color: #fff;
+}
+
+.Pink, .fc-agenda .Pink .fc-event-time, .Pink a {
+ border-color: #F6F;
+ background-color: #F6F;
+ color: #fff;
+}
+
+.Purple, .fc-agenda .Purple .fc-event-time, .Purple a {
+ border-color: #93F;
+ background-color: #93F;
+ color: #fff;
+}
+
+.Orange, .fc-agenda .Orange .fc-event-time, .Orange a {
+ border-color: #F93;
+ background-color: #F93;
+ color: #fff;
+}
+
+.Gray, .fc-agenda .Gray .fc-event-time, .Gray a {
+ border-color: #666;
+ background-color: #666;
+ color: #fff;
+}
+
+.Black, .fc-agenda .Black .fc-event-time, .Black a {
+ border-color: #000;
+ background-color: #000;
+ color: #fff;
+}
+
+.Brown, .fc-agenda .Brown .fc-event-time, .Brown a {
+ border-color: #930;
+ background-color: #930;
+ color: #fff;
+}
+
+/* CakePHP Full Calendar Plugin Note:
+ * END COLORS FOR EVENT TYPES
+ */
+
+
+.fc-event {
+ text-align: left;
+ }
+
+.fc-event a {
+ overflow: hidden;
+ font-size: .85em;
+ text-decoration: none;
+ cursor: pointer;
+ }
+
+.fc-event-editable {
+ cursor: pointer;
+ }
+
+.fc-event-time,
+.fc-event-title {
+ padding: 0 1px;
+ }
+
+/* for fake rounded corners */
+
+.fc-event a {
+ display: block;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-event a {
+ text-align: right;
+ }
+
+/* resizable */
+
+.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anoymore, change class ***/
+ display: block;
+ position: absolute;
+ z-index: 99999;
+ border: 0 !important; /* important overrides pre jquery ui 1.7 styles */
+ background: url(data:image/gif;base64,AAAA) !important; /* hover fix for IE */
+ }
+
+
+
+/* Horizontal Events
+------------------------------------------------------------------------*/
+
+.fc-event-hori {
+ border-width: 1px 0;
+ margin-bottom: 1px;
+ }
+
+.fc-event-hori a {
+ border-width: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-content .fc-corner-left {
+ margin-left: 1px;
+ }
+
+.fc-content .fc-corner-left a {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+
+.fc-content .fc-corner-right {
+ margin-right: 1px;
+ }
+
+.fc-content .fc-corner-right a {
+ margin-right: -1px;
+ border-right-width: 1px;
+ }
+
+/* resizable */
+
+.fc-event-hori .ui-resizable-e {
+ top: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ right: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: e-resize;
+ }
+
+.fc-event-hori .ui-resizable-w {
+ top: 0 !important;
+ left: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: w-resize;
+ }
+
+.fc-event-hori .ui-resizable-handle {
+ _padding-bottom: 14px; /* IE6 had 0 height */
+ }
+
+
+
+
+/* Month View, Basic Week View, Basic Day View
+------------------------------------------------------------------------*/
+
+.fc-grid table {
+ width: 100%;
+ }
+
+.fc .fc-grid th {
+ border-width: 0 0 0 1px;
+ text-align: center;
+ }
+
+.fc .fc-grid td {
+ border-width: 1px 0 0 1px;
+ }
+
+.fc-grid th.fc-leftmost,
+.fc-grid td.fc-leftmost {
+ border-left: 0;
+ }
+
+.fc-grid .fc-day-number {
+ float: right;
+ padding: 0 2px;
+ }
+
+.fc-grid .fc-other-month .fc-day-number {
+ opacity: 0.3;
+ filter: alpha(opacity=30); /* for IE */
+ /* opacity with small font can sometimes look too faded
+ might want to set the 'color' property instead
+ making day-numbers bold also fixes the problem */
+ }
+
+.fc-grid .fc-day-content {
+ clear: both;
+ padding: 2px 2px 0; /* distance between events and day edges */
+ }
+
+/* event styles */
+
+.fc-grid .fc-event-time {
+ font-weight: bold;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-grid {
+ direction: rtl;
+ }
+
+.fc-rtl .fc-grid .fc-day-number {
+ float: left;
+ }
+
+.fc-rtl .fc-grid .fc-event-time {
+ float: right;
+ }
+
+/* Agenda Week View, Agenda Day View
+------------------------------------------------------------------------*/
+
+.fc .fc-agenda th,
+.fc .fc-agenda td {
+ border-width: 1px 0 0 1px;
+ }
+
+.fc .fc-agenda .fc-leftmost {
+ border-left: 0;
+ }
+
+.fc-agenda tr.fc-first th,
+.fc-agenda tr.fc-first td {
+ border-top: 0;
+ }
+
+.fc-agenda-head tr.fc-last th {
+ border-bottom-width: 1px;
+ }
+
+.fc .fc-agenda-head td,
+.fc .fc-agenda-body td {
+ background: none;
+ }
+
+.fc-agenda-head th {
+ text-align: center;
+ }
+
+/* the time axis running down the left side */
+
+.fc-agenda .fc-axis {
+ width: 50px;
+ padding: 0 4px;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: right;
+ font-weight: normal;
+ }
+
+/* all-day event cells at top */
+
+.fc-agenda-head tr.fc-all-day th {
+ height: 35px;
+ }
+
+.fc-agenda-head td {
+ padding-bottom: 10px;
+ }
+
+.fc .fc-divider div {
+ font-size: 1px; /* for IE6/7 */
+ height: 2px;
+ }
+
+.fc .fc-divider .fc-state-default {
+ background: #eee; /* color for divider between all-day and time-slot events */
+ }
+
+/* body styles */
+
+.fc .fc-agenda-body td div {
+ height: 20px; /* slot height */
+ }
+
+.fc .fc-agenda-body tr.fc-minor th,
+.fc .fc-agenda-body tr.fc-minor td {
+ border-top-style: dotted;
+ }
+
+.fc-agenda .fc-day-content {
+ padding: 2px 2px 0; /* distance between events and day edges */
+ }
+
+/* vertical background columns */
+
+.fc .fc-agenda-bg .ui-state-highlight {
+ background-image: none; /* tall column, don't want repeating background image */
+ }
+
+
+
+/* Vertical Events
+------------------------------------------------------------------------*/
+
+.fc-event-vert {
+ border-width: 0 1px;
+ }
+
+.fc-event-vert a {
+ border-width: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-content .fc-corner-top {
+ margin-top: 1px;
+ }
+
+.fc-content .fc-corner-top a {
+ margin-top: -1px;
+ border-top-width: 1px;
+ }
+
+.fc-content .fc-corner-bottom {
+ margin-bottom: 1px;
+ }
+
+.fc-content .fc-corner-bottom a {
+ margin-bottom: -1px;
+ border-bottom-width: 1px;
+ }
+
+/* event content */
+
+.fc-event-vert span {
+ display: block;
+ position: relative;
+ z-index: 2;
+ }
+
+.fc-event-vert span.fc-event-time {
+ white-space: nowrap;
+ _white-space: normal;
+ overflow: hidden;
+ border: 0;
+ font-size: 10px;
+ }
+
+.fc-event-vert span.fc-event-title {
+ line-height: 13px;
+ }
+
+.fc-event-vert span.fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+ opacity: .3;
+ filter: alpha(opacity=30); /* for IE */
+ }
+
+/* resizable */
+
+.fc-event-vert .ui-resizable-s {
+ bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ width: 100% !important;
+ height: 8px !important;
+ line-height: 8px !important;
+ font-size: 11px !important;
+ font-family: monospace;
+ text-align: center;
+ cursor: s-resize;
+ }
+
+
110 full_calendar-0.91/webroot/js/fullcalendar.min.js
@@ -0,0 +1,110 @@
+/*
+
+ FullCalendar v1.4.11
+ http://arshaw.com/fullcalendar/
+
+ Use fullcalendar.css for basic styling.
+ For event drag & drop, requires jQuery UI draggable.
+ For event resizing, requires jQuery UI resizable.
+
+ Copyright (c) 2010 Adam Shaw
+ Dual licensed under the MIT and GPL licenses, located in
+ MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+
+ Date: Tue Feb 22 21:47:22 2011 -0800
+
+*/
+(function(l,ga){function hb(a){l.extend(true,Oa,a)}function Db(a,b,f){function e(q){if(I){s();r();ka();N(q)}else g()}function g(){P=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");I=l("<div class='fc-content "+P+"-widget-content' style='position:relative'/>").prependTo(a);L=new Eb(W,b);(D=L.render())&&a.prepend(D);z(b.defaultView);l(window).resize(ha);u()||h()}function h(){setTimeout(function(){!v.start&&u()&&N()},0)}function m(){l(window).unbind("resize",
+ha);L.destroy();I.remove();a.removeClass("fc fc-rtl fc-ui-widget")}function p(){return Q.offsetWidth!==0}function u(){return l("body")[0].offsetWidth!==0}function z(q){if(!v||q!=v.name){n++;A();var x=v,J;if(x){(x.beforeHide||ib)();Ra(I,I.height());x.element.hide()}else Ra(I,1);I.css("overflow","hidden");if(v=i[q])v.element.show();else v=i[q]=new Fa[q](J=j=l("<div class='fc-view fc-view-"+q+"' style='position:absolute'/>").appendTo(I),W);x&&L.deactivateButton(x.name);L.activateButton(q);N();I.css("overflow",
+"");x&&Ra(I,1);J||(v.afterShow||ib)();n--}}function N(q){if(p()){n++;A();E===ga&&s();var x=false;if(!v.start||q||t<v.start||t>=v.end){v.render(t,q||0);Y(true);x=true}else if(v.sizeDirty){v.clearEvents();Y();x=true}else if(v.eventsDirty){v.clearEvents();x=true}v.sizeDirty=false;v.eventsDirty=false;da(x);k=a.outerWidth();L.updateTitle(v.title);q=new Date;q>=v.start&&q<v.end?L.disableButton("today"):L.enableButton("today");n--;v.trigger("viewDisplay",Q)}}function O(){r();if(p()){s();Y();A();v.clearEvents();
+v.renderEvents(U);v.sizeDirty=false}}function r(){l.each(i,function(q,x){x.sizeDirty=true})}function s(){E=b.contentHeight?b.contentHeight:b.height?b.height-(D?D.height():0)-Sa(I[0]):Math.round(I.width()/Math.max(b.aspectRatio,0.5))}function Y(q){n++;v.setHeight(E,q);if(j){j.css("position","relative");j=null}v.setWidth(I.width(),q);n--}function ha(){if(!n)if(v.start){var q=++d;setTimeout(function(){if(q==d&&!n&&p())if(k!=(k=a.outerWidth())){n++;O();v.trigger("windowResize",Q);n--}},200)}else h()}
+function da(q){if(!b.lazyFetching||w(v.visStart,v.visEnd))X();else q&&aa()}function X(){K(v.visStart,v.visEnd)}function la(q){U=q;aa()}function oa(q){aa(q)}function aa(q){ka();if(p()){v.clearEvents();v.renderEvents(U,q);v.eventsDirty=false}}function ka(){l.each(i,function(q,x){x.eventsDirty=true})}function ca(q,x,J){v.select(q,x,J===ga?true:J)}function A(){v&&v.unselect()}function V(){N(-1)}function c(){N(1)}function B(){Ta(t,-1);N()}function F(){Ta(t,1);N()}function G(){t=new Date;N()}function fa(q,
+x,J){if(q instanceof Date)t=C(q);else jb(t,q,x,J);N()}function na(q,x,J){q!==ga&&Ta(t,q);x!==ga&&Ua(t,x);J!==ga&&S(t,J);N()}function ia(){return C(t)}function H(){return v}function T(q,x){if(x===ga)return b[q];if(q=="height"||q=="contentHeight"||q=="aspectRatio"){b[q]=x;O()}}function va(q,x){if(b[q])return b[q].apply(x||Q,Array.prototype.slice.call(arguments,2))}var W=this;W.options=b;W.render=e;W.destroy=m;W.refetchEvents=X;W.reportEvents=la;W.reportEventChange=oa;W.rerenderEvents=aa;W.changeView=
+z;W.select=ca;W.unselect=A;W.prev=V;W.next=c;W.prevYear=B;W.nextYear=F;W.today=G;W.gotoDate=fa;W.incrementDate=na;W.formatDate=function(q,x){return Ha(q,x,b)};W.formatDates=function(q,x,J){return Va(q,x,J,b)};W.getDate=ia;W.getView=H;W.option=T;W.trigger=va;Fb.call(W,b,f);var w=W.isFetchNeeded,K=W.fetchEvents,Q=a[0],L,D,I,P,v,i={},k,E,j,d=0,n=0,t=new Date,U=[],Z;jb(t,b.year,b.month,b.date);b.droppable&&l(document).bind("dragstart",function(q,x){var J=q.target,ja=l(J);if(!ja.parents(".fc").length){var ma=
+b.dropAccept;if(l.isFunction(ma)?ma.call(J,ja):ja.is(ma)){Z=J;v.dragStart(Z,q,x)}}}).bind("dragstop",function(q,x){if(Z){v.dragStop(Z,q,x);Z=null}})}function Eb(a,b){function f(){r=b.theme?"ui":"fc";var s=b.header;if(s)return O=l("<table class='fc-header'/>").append(l("<tr/>").append(l("<td class='fc-header-left'/>").append(g(s.left))).append(l("<td class='fc-header-center'/>").append(g(s.center))).append(l("<td class='fc-header-right'/>").append(g(s.right))))}function e(){O.remove()}function g(s){if(s){var Y=
+l("<tr/>");l.each(s.split(" "),function(ha){ha>0&&Y.append("<td><span class='fc-header-space'/></td>");var da;l.each(this.split(","),function(X,la){if(la=="title"){Y.append("<td><h2 class='fc-header-title'>&nbsp;</h2></td>");da&&da.addClass(r+"-corner-right");da=null}else{var oa;if(a[la])oa=a[la];else if(Fa[la])oa=function(){aa.removeClass(r+"-state-hover");a.changeView(la)};if(oa){da&&da.addClass(r+"-no-right");var aa;X=b.theme?Wa(b.buttonIcons,la):null;var ka=Wa(b.buttonText,la);if(X)aa=l("<div class='fc-button-"+
+la+" ui-state-default'><a><span class='ui-icon ui-icon-"+X+"'/></a></div>");else if(ka)aa=l("<div class='fc-button-"+la+" "+r+"-state-default'><a><span>"+ka+"</span></a></div>");if(aa){aa.click(function(){aa.hasClass(r+"-state-disabled")||oa()}).mousedown(function(){aa.not("."+r+"-state-active").not("."+r+"-state-disabled").addClass(r+"-state-down")}).mouseup(function(){aa.removeClass(r+"-state-down")}).hover(function(){aa.not("."+r+"-state-active").not("."+r+"-state-disabled").addClass(r+"-state-hover")},
+function(){aa.removeClass(r+"-state-hover").removeClass(r+"-state-down")}).appendTo(l("<td/>").appendTo(Y));da?da.addClass(r+"-no-right"):aa.addClass(r+"-corner-left");da=aa}}}});da&&da.addClass(r+"-corner-right")});return l("<table/>").append(Y)}}function h(s){O.find("h2.fc-header-title").html(s)}function m(s){O.find("div.fc-button-"+s).addClass(r+"-state-active")}function p(s){O.find("div.fc-button-"+s).removeClass(r+"-state-active")}function u(s){O.find("div.fc-button-"+s).addClass(r+"-state-disabled")}
+function z(s){O.find("div.fc-button-"+s).removeClass(r+"-state-disabled")}var N=this;N.render=f;N.destroy=e;N.updateTitle=h;N.activateButton=m;N.deactivateButton=p;N.disableButton=u;N.enableButton=z;var O=l([]),r}function Fb(a,b){function f(c,B){return!oa||c<oa||B>aa}function e(c,B){oa=c;aa=B;V=[];c=++ka;ca=B=b.length;for(var F=0;F<B;F++)g(b[F],c)}function g(c,B){h(c,function(F){if(B==ka){for(var G=0;G<F.length;G++){Y(F[G]);F[G].source=c}V=V.concat(F);ca--;ca||la(V)}})}function h(c,B){if(typeof c==
+"string"){var F={};F[a.startParam]=Math.round(oa.getTime()/1E3);F[a.endParam]=Math.round(aa.getTime()/1E3);if(a.cacheParam)F[a.cacheParam]=(new Date).getTime();r();l.ajax({url:c,dataType:"json",data:F,cache:a.cacheParam||false,success:function(G){s();B(G)}})}else if(l.isFunction(c)){r();c(C(oa),C(aa),function(G){s();B(G)})}else B(c)}function m(c){b.push(c);ca++;g(c,ka)}function p(c){b=l.grep(b,function(B){return B!=c});V=l.grep(V,function(B){return B.source!=c});la(V)}function u(c){var B,F=V.length,
+G,fa=X().defaultEventEnd,na=c.start-c._start,ia=c.end?c.end-(c._end||fa(c)):0;for(B=0;B<F;B++){G=V[B];if(G._id==c._id&&G!=c){G.start=new Date(+G.start+na);G.end=c.end?G.end?new Date(+G.end+ia):new Date(+fa(G)+ia):null;G.title=c.title;G.url=c.url;G.allDay=c.allDay;G.className=c.className;G.editable=c.editable;Y(G)}}Y(c);la(V)}function z(c,B){Y(c);if(!c.source){if(B){b[0].push(c);c.source=b[0]}V.push(c)}la(V)}function N(c){if(c){if(!l.isFunction(c)){var B=c+"";c=function(G){return G._id==B}}V=l.grep(V,
+c,true);for(F=0;F<b.length;F++)if(typeof b[F]=="object")b[F]=l.grep(b[F],c,true)}else{V=[];for(var F=0;F<b.length;F++)if(typeof b[F]=="object")b[F]=[]}la(V)}function O(c){if(l.isFunction(c))return l.grep(V,c);else if(c){c+="";return l.grep(V,function(B){return B._id==c})}return V}function r(){A++||da("loading",null,true)}function s(){--A||da("loading",null,false)}function Y(c){c._id=c._id||(c.id===ga?"_fc"+Gb++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=C(c.start=Xa(c.start,
+a.ignoreTimezone));c.end=Xa(c.end,a.ignoreTimezone);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?C(c.end):null;if(c.allDay===ga)c.allDay=a.allDayDefault;if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}var ha=this;ha.isFetchNeeded=f;ha.fetchEvents=e;ha.addEventSource=m;ha.removeEventSource=p;ha.updateEvent=u;ha.renderEvent=z;ha.removeEvents=N;ha.clientEvents=O;ha.normalizeEvent=Y;var da=ha.trigger,X=ha.getView,la=ha.reportEvents,oa,aa,ka=
+0,ca=0,A=0,V=[];b.unshift([])}function Hb(a,b){function f(p,u){if(u){Ua(p,u);p.setDate(1)}p=C(p,true);p.setDate(1);u=Ua(C(p),1);var z=C(p),N=C(u),O=g("firstDay"),r=g("weekends")?0:1;if(r){ta(z);ta(N,-1,true)}S(z,-((z.getDay()-Math.max(O,r)+7)%7));S(N,(7-N.getDay()+Math.max(O,r))%7);O=Math.round((N-z)/(kb*7));if(g("weekMode")=="fixed"){S(N,(6-O)*7);O=6}e.title=m(p,g("titleFormat"));e.start=p;e.end=u;e.visStart=z;e.visEnd=N;h(O,r?5:7,true)}var e=this;e.render=f;Ya.call(e,a,b,"month");var g=e.opt,h=
+e.renderBasic,m=b.formatDate}function Ib(a,b){function f(p,u){u&&S(p,u*7);p=S(C(p),-((p.getDay()-g("firstDay")+7)%7));u=S(C(p),7);var z=C(p),N=C(u),O=g("weekends");if(!O){ta(z);ta(N,-1,true)}e.title=m(z,S(C(N),-1),g("titleFormat"));e.start=p;e.end=u;e.visStart=z;e.visEnd=N;h(1,O?7:5,false)}var e=this;e.render=f;Ya.call(e,a,b,"basicWeek");var g=e.opt,h=e.renderBasic,m=b.formatDates}function Jb(a,b){function f(p,u){if(u){S(p,u);g("weekends")||ta(p,u<0?-1:1)}e.title=m(p,g("titleFormat"));e.start=e.visStart=
+C(p,true);e.end=e.visEnd=S(C(e.start),1);h(1,1,false)}var e=this;e.render=f;Ya.call(e,a,b,"basicDay");var g=e.opt,h=e.renderBasic,m=b.formatDate}function Ya(a,b,f){function e(j,d,n){w=j;K=d;if(ia=V("isRTL")){H=-1;T=K-1}else{H=1;T=0}va=V("firstDay");W=V("weekends")?0:1;var t=V("theme")?"ui":"fc",U=V("columnFormat"),Z=A.start.getMonth(),q=Ga(new Date),x,J=C(A.visStart);if(P){B();d=P.find("tr").length;if(w<d)P.find("tr:gt("+(w-1)+")").remove();else if(w>d){j="";for(d=d;d<w;d++){j+="<tr class='fc-week"+
+d+"'>";for(x=0;x<K;x++){j+="<td class='fc-"+Ca[J.getDay()]+" "+t+"-state-default fc-new fc-day"+(d*K+x)+(x==T?" fc-leftmost":"")+"'>"+(n?"<div class='fc-day-number'></div>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>";S(J,1);W&&ta(J)}j+="</tr>"}P.append(j)}m(P.find("td.fc-new").removeClass("fc-new"));J=C(A.visStart);P.find("td").each(function(){var ma=l(this);if(w>1)J.getMonth()==Z?ma.removeClass("fc-other-month"):ma.addClass("fc-other-month");+J==+q?ma.removeClass("fc-not-today").addClass("fc-today").addClass(t+
+"-state-highlight"):ma.addClass("fc-not-today").removeClass("fc-today").removeClass(t+"-state-highlight");ma.find("div.fc-day-number").text(J.getDate());S(J,1);W&&ta(J)});if(w==1){J=C(A.visStart);I.find("th").each(function(ma,$){l($).text(na(J,U));$.className=$.className.replace(/^fc-\w+(?= )/,"fc-"+Ca[J.getDay()]);S(J,1);W&&ta(J)});J=C(A.visStart);P.find("td").each(function(ma,$){$.className=$.className.replace(/^fc-\w+(?= )/,"fc-"+Ca[J.getDay()]);S(J,1);W&&ta(J)})}}else{var ja=l("<table/>").appendTo(a);
+j="<thead><tr>";for(d=0;d<K;d++){j+="<th class='fc-"+Ca[J.getDay()]+" "+t+"-state-default"+(d==T?" fc-leftmost":"")+"'>"+na(J,U)+"</th>";S(J,1);W&&ta(J)}I=l(j+"</tr></thead>").appendTo(ja);j="<tbody>";J=C(A.visStart);for(d=0;d<w;d++){j+="<tr class='fc-week"+d+"'>";for(x=0;x<K;x++){j+="<td class='fc-"+Ca[J.getDay()]+" "+t+"-state-default fc-day"+(d*K+x)+(x==T?" fc-leftmost":"")+(w>1&&J.getMonth()!=Z?" fc-other-month":"")+(+J==+q?" fc-today "+t+"-state-highlight":" fc-not-today")+"'>"+(n?"<div class='fc-day-number'>"+
+J.getDate()+"</div>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>";S(J,1);W&&ta(J)}j+="</tr>"}P=l(j+"</tbody>").appendTo(ja);m(P.find("td"));v=l("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}}function g(j){D=j;j=P.find("tr td:first-child");var d=D-I.height(),n;if(V("weekMode")=="variable")n=d=Math.floor(d/(w==1?2:6));else{n=Math.floor(d/w);d=d-n*(w-1)}if(Za===ga){var t=P.find("tr:first").find("td:first");t.height(n);Za=n!=t.height()}if(Za){j.slice(0,
+-1).height(n);j.slice(-1).height(d)}else{Pa(j.slice(0,-1),n);Pa(j.slice(-1),d)}}function h(j){L=j;E.clear();Q=Math.floor(L/K);Ia(I.find("th").slice(0,-1),Q)}function m(j){j.click(p).mousedown(fa)}function p(j){if(!V("selectable")){var d=parseInt(this.className.match(/fc\-day(\d+)/)[1]);d=S(C(A.visStart),Math.floor(d/K)*7+d%K);c("dayClick",this,d,true,j)}}function u(j,d,n){n&&i.build();n=C(A.visStart);for(var t=S(C(n),K),U=0;U<w;U++){var Z=new Date(Math.max(n,j)),q=new Date(Math.min(t,d));if(Z<q){var x;
+if(ia){x=Aa(q,n)*H+T+1;Z=Aa(Z,n)*H+T+1}else{x=Aa(Z,n);Z=Aa(q,n)}m(z(U,x,U,Z-1))}S(n,7);S(t,7)}}function z(j,d,n,t){j=i.rect(j,d,n,t,a);return F(j,a)}function N(j){return C(j)}function O(j,d){u(j,S(C(d),1),true)}function r(){G()}function s(j,d){k.start(function(n){G();n&&z(n.row,n.col,n.row,n.col)},d)}function Y(j,d,n){var t=k.stop();G();if(t){t=aa(t);c("drop",j,t,true,d,n)}}function ha(j){return C(j.start)}function da(j){return E.left(j)}function X(j){return E.right(j)}function la(j){return(j-Math.max(va,
+W)+K)%K}function oa(j){return{row:Math.floor(Aa(j,A.visStart)/7),col:la(j.getDay())*H+T}}function aa(j){return S(C(A.visStart),j.row*7+j.col*H+T)}function ka(j){return P.find("tr:eq("+j+")")}function ca(){return{left:0,right:L}}var A=this;A.renderBasic=e;A.setHeight=g;A.setWidth=h;A.renderDayOverlay=u;A.defaultSelectionEnd=N;A.renderSelection=O;A.clearSelection=r;A.dragStart=s;A.dragStop=Y;A.defaultEventEnd=ha;A.getHoverListener=function(){return k};A.colContentLeft=da;A.colContentRight=X;A.dayOfWeekCol=
+la;A.dateCell=oa;A.cellDate=aa;A.cellIsAllDay=function(){return true};A.allDayTR=ka;A.allDayBounds=ca;A.getRowCnt=function(){return w};A.getColCnt=function(){return K};A.getColWidth=function(){return Q};A.getDaySegmentContainer=function(){return v};lb.call(A,a,b,f);mb.call(A);nb.call(A);Kb.call(A);var V=A.opt,c=A.trigger,B=A.clearEvents,F=A.renderOverlay,G=A.clearOverlays,fa=A.daySelectionMousedown,na=b.formatDate,ia,H,T,va,W,w,K,Q,L,D,I,P,v,i,k,E;ob(a.addClass("fc-grid"));i=new pb(function(j,d){var n,
+t,U,Z=P.find("tr:first td");if(ia)Z=l(Z.get().reverse());Z.each(function(q,x){n=l(x);t=n.offset().left;if(q)U[1]=t;U=[t];d[q]=U});U[1]=t+n.outerWidth();P.find("tr").each(function(q,x){n=l(x);t=n.offset().top;if(q)U[1]=t;U=[t];j[q]=U});U[1]=t+n.outerHeight()});k=new qb(i);E=new rb(function(j){return P.find("td:eq("+j+") div div")})}function Kb(){function a(ca,A){u(ca);aa(f(ca),A)}function b(){z();Y().empty()}function f(ca){var A=la(),V=oa(),c=C(h.visStart);V=S(C(c),V);var B=l.map(ca,Na),F,G,fa,na,
+ia,H,T=[];for(F=0;F<A;F++){G=$a(ab(ca,B,c,V));for(fa=0;fa<G.length;fa++){na=G[fa];for(ia=0;ia<na.length;ia++){H=na[ia];H.row=F;H.level=fa;T.push(H)}}S(c,7);S(V,7)}return T}function e(ca,A,V){N(ca,A);if(ca.editable||ca.editable===ga&&m("editable")){g(ca,A);V.isEnd&&ka(ca,A,V)}}function g(ca,A){if(!m("disableDragging")&&A.draggable){var V=ha(),c;A.draggable({zIndex:9,delay:50,opacity:m("dragOpacity"),revertDuration:m("dragRevertDuration"),start:function(B,F){p("eventDragStart",A,ca,B,F);r(ca,A);V.start(function(G,
+fa,na,ia){A.draggable("option","revert",!G||!na&&!ia);X();if(G){c=na*7+ia*(m("isRTL")?-1:1);da(S(C(ca.start),c),S(Na(ca),c))}else c=0},B,"drag")},stop:function(B,F){V.stop();X();p("eventDragStop",A,ca,B,F);if(c){A.find("a").removeAttr("href");s(this,ca,c,0,ca.allDay,B,F)}else{l.browser.msie&&A.css("filter","");O(ca,A)}}})}}var h=this;h.renderEvents=a;h.compileDaySegs=f;h.clearEvents=b;h.bindDaySeg=e;sb.call(h);var m=h.opt,p=h.trigger,u=h.reportEvents,z=h.reportEventClear,N=h.eventElementHandlers,
+O=h.showEvents,r=h.hideEvents,s=h.eventDrop,Y=h.getDaySegmentContainer,ha=h.getHoverListener,da=h.renderDayOverlay,X=h.clearOverlays,la=h.getRowCnt,oa=h.getColCnt,aa=h.renderDaySegs,ka=h.resizableDayEvent}function Lb(a,b){function f(p,u){u&&S(p,u*7);p=S(C(p),-((p.getDay()-g("firstDay")+7)%7));u=S(C(p),7);var z=C(p),N=C(u),O=g("weekends");if(!O){ta(z);ta(N,-1,true)}e.title=m(z,S(C(N),-1),g("titleFormat"));e.start=p;e.end=u;e.visStart=z;e.visEnd=N;h(O?7:5)}var e=this;e.render=f;tb.call(e,a,b,"agendaWeek");
+var g=e.opt,h=e.renderAgenda,m=b.formatDates}function Mb(a,b){function f(p,u){if(u){S(p,u);g("weekends")||ta(p,u<0?-1:1)}u=C(p,true);var z=S(C(u),1);e.title=m(p,g("titleFormat"));e.start=e.visStart=u;e.end=e.visEnd=z;h(1)}var e=this;e.render=f;tb.call(e,a,b,"agendaDay");var g=e.opt,h=e.renderAgenda,m=b.formatDate}function tb(a,b,f){function e(o){d=o;ja=T("theme")?"ui":"fc";$=T("weekends")?0:1;ma=T("firstDay");if(qa=T("isRTL")){ea=-1;pa=d-1}else{ea=1;pa=0}xa=bb(T("minTime"));Ba=bb(T("maxTime"));o=
+qa?S(C(H.visEnd),-1):C(H.visStart);var y=C(o),M=Ga(new Date),R=T("columnFormat");if(v){W();v.find("tr:first th").slice(1,-1).each(function(Ja,ya){l(ya).text(P(y,R));ya.className=ya.className.replace(/^fc-\w+(?= )/,"fc-"+Ca[y.getDay()]);S(y,ea);$&&ta(y,ea)});y=C(o);j.find("td").each(function(Ja,ya){ya.className=ya.className.replace(/^fc-\w+(?= )/,"fc-"+Ca[y.getDay()]);+y==+M?l(ya).removeClass("fc-not-today").addClass("fc-today").addClass(ja+"-state-highlight"):l(ya).addClass("fc-not-today").removeClass("fc-today").removeClass(ja+
+"-state-highlight");S(y,ea);$&&ta(y,ea)})}else{var ba,ua,Da=T("slotMinutes")%15==0,ra="<div class='fc-agenda-head' style='position:relative;z-index:4'><table style='width:100%'><tr class='fc-first"+(T("allDaySlot")?"":" fc-last")+"'><th class='fc-leftmost "+ja+"-state-default'>&nbsp;</th>";for(ba=0;ba<d;ba++){ra+="<th class='fc-"+Ca[y.getDay()]+" "+ja+"-state-default'>"+P(y,R)+"</th>";S(y,ea);$&&ta(y,ea)}ra+="<th class='"+ja+"-state-default'>&nbsp;</th></tr>";if(T("allDaySlot"))ra+="<tr class='fc-all-day'><th class='fc-axis fc-leftmost "+
+ja+"-state-default'>"+T("allDayText")+"</th><td colspan='"+d+"' class='"+ja+"-state-default'><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td><th class='"+ja+"-state-default'>&nbsp;</th></tr><tr class='fc-divider fc-last'><th colspan='"+(d+2)+"' class='"+ja+"-state-default fc-leftmost'><div/></th></tr>";ra+="</table></div>";v=l(ra).appendTo(a);z(v.find("td"));ub=l("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(v);y=vb();var cb=sa(C(y),Ba);sa(y,
+xa);ra="<table>";for(ba=0;y<cb;ba++){ua=y.getMinutes();ra+="<tr class='"+(!ba?"fc-first":!ua?"":"fc-minor")+"'><th class='fc-axis fc-leftmost "+ja+"-state-default'>"+(!Da||!ua?P(y,T("axisFormat")):"&nbsp;")+"</th><td class='fc-slot"+ba+" "+ja+"-state-default'><div style='position:relative'>&nbsp;</div></td></tr>";sa(y,T("slotMinutes"));n++}ra+="</table>";i=l("<div class='fc-agenda-body' style='position:relative;z-index:2;overflow:auto'/>").append(k=l("<div style='position:relative;overflow:hidden'>").append(E=
+l(ra))).appendTo(a);N(i.find("td"));wb=l("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(k);y=C(o);ra="<div class='fc-agenda-bg' style='position:absolute;z-index:1'><table style='width:100%;height:100%'><tr class='fc-first'>";for(ba=0;ba<d;ba++){ra+="<td class='fc-"+Ca[y.getDay()]+" "+ja+"-state-default "+(!ba?"fc-leftmost ":"")+(+y==+M?ja+"-state-highlight fc-today":"fc-not-today")+"'><div class='fc-day-content'><div>&nbsp;</div></div></td>";S(y,ea);$&&ta(y,ea)}ra+="</tr></table></div>";
+j=l(ra).appendTo(a)}}function g(o,y){if(o===ga)o=x;x=o;db={};o=o-v.height();o=Math.min(o,E.height());i.height(o);Z=i.find("tr:first div").height()+1;y&&m()}function h(o){q=o;Qa.clear();i.width(o).css("overflow","auto");E.width("");var y=v.find("tr:first th"),M=v.find("tr.fc-all-day th:last"),R=j.find("td"),ba=i[0].clientWidth;E.width(ba);ba=i[0].clientWidth;E.width(ba);t=0;Ia(v.find("tr:lt(2) th:first").add(i.find("tr:first th")).width(1).each(function(){t=Math.max(t,l(this).outerWidth())}),t);U=
+Math.floor((ba-t)/d);Ia(R.slice(0,-1),U);Ia(y.slice(1,-2),U);if(o!=ba){Ia(y.slice(-2,-1),ba-t-U*(d-1));y.slice(-1).show();M.show()}else{i.