├── View ├── Events │ ├── feed.ctp │ ├── add.ctp │ ├── edit.ctp │ ├── index.ctp │ └── view.ctp ├── EventTypes │ ├── add.ctp │ ├── edit.ctp │ ├── index.ctp │ └── view.ctp └── FullCalendar │ └── index.ctp ├── Model ├── FullCalendarAppModel.php ├── FullCalendar.php ├── EventType.php └── Event.php ├── Controller ├── FullCalendarController.php ├── FullCalendarAppController.php ├── EventTypesController.php └── EventsController.php ├── Config └── FullCalendar.sql ├── README ├── webroot ├── js │ ├── ready.js │ ├── jquery.qtip-1.0.0-rc3.min.js │ ├── jquery-ui-1.8.9.custom.min.js │ └── fullcalendar.min.js └── css │ └── fullcalendar.css └── LICENSE /View/Events/feed.ctp: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /Model/FullCalendarAppModel.php: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /Model/FullCalendar.php: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /Controller/FullCalendarController.php: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /Controller/FullCalendarAppController.php: -------------------------------------------------------------------------------- 1 | array('Jquery')); 18 | 19 | } 20 | ?> 21 | -------------------------------------------------------------------------------- /Model/EventType.php: -------------------------------------------------------------------------------- 1 | array( 18 | 'notempty' => array( 19 | 'rule' => array('notempty'), 20 | ), 21 | ), 22 | ); 23 | 24 | var $hasMany = array( 25 | 'Event' => array( 26 | 'className' => 'FullCalendar.Event', 27 | 'foreignKey' => 'event_type_id', 28 | 'dependent' => false, 29 | ) 30 | ); 31 | 32 | } 33 | ?> 34 | -------------------------------------------------------------------------------- /Model/Event.php: -------------------------------------------------------------------------------- 1 | array( 18 | 'notempty' => array( 19 | 'rule' => array('notempty'), 20 | ), 21 | ), 22 | 'start' => array( 23 | 'notempty' => array( 24 | 'rule' => array('notempty'), 25 | ), 26 | ) 27 | ); 28 | 29 | var $belongsTo = array( 30 | 'EventType' => array( 31 | 'className' => 'FullCalendar.EventType', 32 | 'foreignKey' => 'event_type_id' 33 | ) 34 | ); 35 | 36 | } 37 | ?> 38 | -------------------------------------------------------------------------------- /View/EventTypes/add.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 | Form->create('EventType');?> 15 |
16 | 17 | Form->input('name'); 19 | echo $this->Form->input('color', 20 | array('options' => array( 21 | 'Blue' => 'Blue', 22 | 'Red' => 'Red', 23 | 'Pink' => 'Pink', 24 | 'Purple' => 'Purple', 25 | 'Orange' => 'Orange', 26 | 'Green' => 'Green', 27 | 'Gray' => 'Gray', 28 | 'Black' => 'Black', 29 | 'Brown' => 'Brown' 30 | ))); 31 | 32 | ?> 33 |
34 | Form->end(__('Submit', true));?> 35 |
36 |
37 | 41 |
42 | -------------------------------------------------------------------------------- /View/FullCalendar/index.ctp: -------------------------------------------------------------------------------- 1 | 13 | 16 | Html->script(array('/full_calendar/js/jquery-1.5.min', '/full_calendar/js/jquery-ui-1.8.9.custom.min', '/full_calendar/js/fullcalendar.min', '/full_calendar/js/jquery.qtip-1.0.0-rc3.min', '/full_calendar/js/ready'), array('inline' => 'false')); 18 | echo $this->Html->css('/full_calendar/css/fullcalendar', null, array('inline' => false)); 19 | ?> 20 | 21 | 22 |
23 |
24 |
25 |
26 | 31 |
32 | -------------------------------------------------------------------------------- /View/Events/add.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 | Form->create('Event');?> 15 |
16 | 17 | Form->input('event_type_id'); 19 | echo $this->Form->input('title'); 20 | echo $this->Form->input('details'); 21 | echo $this->Form->input('start'); 22 | echo $this->Form->input('end'); 23 | echo $this->Form->input('all_day', array('checked' => 'checked')); 24 | echo $this->Form->input('status', array('options' => array( 25 | 'Scheduled' => 'Scheduled','Confirmed' => 'Confirmed','In Progress' => 'In Progress', 26 | 'Rescheduled' => 'Rescheduled','Completed' => 'Completed' 27 | ) 28 | ) 29 | ); 30 | ?> 31 |
32 | Form->end(__('Submit', true));?> 33 |
34 |
35 | 39 |
40 | -------------------------------------------------------------------------------- /View/EventTypes/edit.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 | Form->create('EventType');?> 15 |
16 | 17 | Form->input('id'); 19 | echo $this->Form->input('name'); 20 | echo $this->Form->input('color', 21 | array('options' => array( 22 | 'Blue' => 'Blue', 23 | 'Red' => 'Red', 24 | 'Pink' => 'Pink', 25 | 'Purple' => 'Purple', 26 | 'Orange' => 'Orange', 27 | 'Green' => 'Green', 28 | 'Gray' => 'Gray', 29 | 'Black' => 'Black', 30 | 'Brown' => 'Brown' 31 | ))); 32 | 33 | ?> 34 |
35 | Form->end(__('Submit', true));?> 36 |
37 |
38 | 43 |
44 | -------------------------------------------------------------------------------- /View/Events/edit.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 | Form->create('Event');?> 15 |
16 | 17 | Form->input('id'); 19 | echo $this->Form->input('event_type_id'); 20 | echo $this->Form->input('title'); 21 | echo $this->Form->input('details'); 22 | echo $this->Form->input('start'); 23 | echo $this->Form->input('end'); 24 | echo $this->Form->input('all_day'); 25 | echo $this->Form->input('status', array('options' => array( 26 | 'Scheduled' => 'Scheduled','Confirmed' => 'Confirmed','In Progress' => 'In Progress', 27 | 'Rescheduled' => 'Rescheduled','Completed' => 'Completed' 28 | ) 29 | ) 30 | ); 31 | ?> 32 |
33 | Form->end(__('Submit', true));?> 34 |
35 |
36 | 41 |
42 | -------------------------------------------------------------------------------- /Config/FullCalendar.sql: -------------------------------------------------------------------------------- 1 | /* 2 | * Config/FullCalendar.sql 3 | * CakePHP Full Calendar Plugin 4 | * 5 | * Copyright (c) 2010 Silas Montgomery 6 | * http://silasmontgomery.com 7 | * 8 | * Licensed under MIT 9 | * http://www.opensource.org/licenses/mit-license.php 10 | */ 11 | 12 | SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 13 | 14 | -- -------------------------------------------------------- 15 | 16 | -- 17 | -- Table structure for table `events` 18 | -- 19 | 20 | CREATE TABLE IF NOT EXISTS `events` ( 21 | `id` int(11) NOT NULL AUTO_INCREMENT, 22 | `event_type_id` int(11) NOT NULL, 23 | `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 24 | `details` text COLLATE utf8_unicode_ci NOT NULL, 25 | `start` datetime NOT NULL, 26 | `end` datetime NOT NULL, 27 | `all_day` tinyint(1) NOT NULL DEFAULT '1', 28 | `status` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Scheduled', 29 | `active` tinyint(1) NOT NULL DEFAULT '1', 30 | `created` date DEFAULT NULL, 31 | `modified` date DEFAULT NULL, 32 | PRIMARY KEY (`id`) 33 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 34 | 35 | 36 | -- -------------------------------------------------------- 37 | 38 | -- 39 | -- Table structure for table `event_types` 40 | -- 41 | 42 | CREATE TABLE IF NOT EXISTS `event_types` ( 43 | `id` int(11) NOT NULL AUTO_INCREMENT, 44 | `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 45 | `color` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 46 | PRIMARY KEY (`id`) 47 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 48 | -------------------------------------------------------------------------------- /View/EventTypes/index.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 |

15 | 16 | 17 | 18 | 19 | 20 | 21 | 29 | > 30 | 31 | 32 | 36 | 37 | 38 |
Paginator->sort('name');?>Paginator->sort('color');?>
   33 | Html->link(__('View', true), array('plugin' => 'full_calendar', 'action' => 'view', $eventType['EventType']['id'])); ?> 34 | Html->link(__('Edit', true), array('plugin' => 'full_calendar', 'action' => 'edit', $eventType['EventType']['id'])); ?> 35 |
39 | 40 |
41 | Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> 42 | | Paginator->numbers();?> 43 | | 44 | Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> 45 |
46 |
47 |
48 | 53 |
54 | -------------------------------------------------------------------------------- /Controller/EventTypesController.php: -------------------------------------------------------------------------------- 1 | 15 19 | ); 20 | 21 | function index() { 22 | $this->EventType->recursive = 0; 23 | $this->set('eventTypes', $this->paginate()); 24 | } 25 | 26 | function view($id = null) { 27 | if(!$id) { 28 | $this->Session->setFlash(__('Invalid event type', true)); 29 | $this->redirect(array('action' => 'index')); 30 | } 31 | $this->set('eventType', $this->EventType->read(null, $id)); 32 | } 33 | 34 | function add() { 35 | if (!empty($this->data)) { 36 | $this->EventType->create(); 37 | if ($this->EventType->save($this->data)) { 38 | $this->Session->setFlash(__('The event type has been saved', true)); 39 | $this->redirect(array('action' => 'index')); 40 | } else { 41 | $this->Session->setFlash(__('The event type could not be saved. Please, try again.', true)); 42 | } 43 | } 44 | } 45 | 46 | function edit($id = null) { 47 | if (!$id && empty($this->data)) { 48 | $this->Session->setFlash(__('Invalid event type', true)); 49 | $this->redirect(array('action' => 'index')); 50 | } 51 | if (!empty($this->data)) { 52 | if ($this->EventType->save($this->data)) { 53 | $this->Session->setFlash(__('The event type has been saved', true)); 54 | $this->redirect(array('action' => 'index')); 55 | } else { 56 | $this->Session->setFlash(__('The event type could not be saved. Please, try again.', true)); 57 | } 58 | } 59 | if (empty($this->data)) { 60 | $this->data = $this->EventType->read(null, $id); 61 | } 62 | } 63 | 64 | function delete($id = null) { 65 | if (!$id) { 66 | $this->Session->setFlash(__('Invalid id for event type', true)); 67 | $this->redirect(array('action'=>'index')); 68 | } 69 | if ($this->EventType->delete($id)) { 70 | $this->Session->setFlash(__('Event type deleted', true)); 71 | $this->redirect(array('action'=>'index')); 72 | } 73 | $this->Session->setFlash(__('Event type was not deleted', true)); 74 | $this->redirect(array('action' => 'index')); 75 | } 76 | } 77 | ?> 78 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ----------------------------------------- 2 | WHAT IS THE CAKEPHP FULL CALENDAR PLUGIN? 3 | ----------------------------------------- 4 | 5 | The CakePHP Full Calendar Plugin allows you to easily integrate 6 | the jQuery based Full Calendar application with your CakePHP 7 | application for a slick ajax event calendar. 8 | 9 | The plugin brings the following MIT licensed software (see 10 | LICENCE) together to create a simple and sleek experience: 11 | 12 | -CakePHP (http://cakephp.org) 13 | Required by this plugin 14 | 15 | -Full Calendar (http://arshaw.com/fullcalendar) 16 | The jQuery based Calendar 17 | 18 | -jQuery (http://jquery.com) 19 | Required by Full Calendar 20 | 21 | -jQuery UI (http://jqueryui.com) 22 | Required for draggable and resizable events 23 | 24 | -qTip (http://craigsworks.com/projects/qtip) 25 | A jQuery plugin for hover details 26 | 27 | 28 | ---- 29 | WHY? 30 | ---- 31 | 32 | While working on another project I needed a visual calendar for 33 | event management for multiple users/accounts. From that project 34 | I decided to simplify the calendar and turn it into a plugin 35 | because there didn't appear to be a clean (easy to install and 36 | use) CakePHP Calendar plugin out there. 37 | 38 | In it's current form this plugin is for a single user though I 39 | plan on creating a few associated plugins to allow for multiple 40 | users, etc. 41 | 42 | 43 | ------------------------ 44 | THE INSTALLATION PROCESS 45 | ------------------------ 46 | 47 | NOTE: These instructions assume you already have a working copy 48 | of CakePHP with a database connection on your web server. 49 | 50 | You can read up on CakePHP installation and DB config here: 51 | http://book.cakephp.org/#!/view/913/Development AND 52 | http://book.cakephp.org/#!/view/922/Database-Configuration 53 | 54 | 55 | INSTALLED IN 4 SIMPLE STEPS 56 | 57 | 1. Download or fork the CakePHP Full Calendar Plugin at: 58 | https://github.com/silasmontgomery/CakePHP-Full-Calendar-Plugin 59 | 60 | 2. Create the folder "FullCalendar" in your "app/Plugin" directory 61 | and copy the Config, Controller, Model, View, and webroot 62 | folders into it. 63 | 64 | 3. Create an "events" and "event_types" table by importing the 65 | "FullCalendar.sql" file found in the "FullCalendar/Config" 66 | directory (Using PHPMyAdmin, command-line, etc). 67 | 68 | 4. In your Cake installation, edit "app/Config/bootstrap.php" 69 | and add the line "CakePlugin::load('FullCalendar');" at the 70 | bottom. 71 | 72 | THAT'S IT! 73 | 74 | You should now be able to access the Full Calendar Plugin at: 75 | http://yoursite.com/full_calendar 76 | 77 | You should add some Event Types first. Then you can start 78 | scheduling some Events! 79 | -------------------------------------------------------------------------------- /View/Events/index.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 |

15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 33 | > 34 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 50 | 51 | 52 |
Paginator->sort('event_type_id');?>Paginator->sort('title');?>Paginator->sort('status');?>Paginator->sort('start');?>Paginator->sort('end');?>Paginator->sort('all_day');?>
35 | Html->link($event['EventType']['name'], array('controller' => 'event_types', 'action' => 'view', $event['EventType']['id'])); ?> 36 | N/A  47 | Html->link(__('View', true), array('action' => 'view', $event['Event']['id'])); ?> 48 | Html->link(__('Edit', true), array('action' => 'edit', $event['Event']['id'])); ?> 49 |
53 |
54 | Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> 55 | | Paginator->numbers();?> 56 | | 57 | Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> 58 |
59 |
60 |
61 | 66 |
67 | -------------------------------------------------------------------------------- /View/Events/view.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 |

15 |
16 | > 17 | >Html->link($event['EventType']['name'], array('controller' => 'event_types', 'action' => 'view', $event['EventType']['id'])); ?> 18 | > 19 | > 20 | > 21 | > 22 | > 23 | > 24 | > 25 | > 26 | > 27 | > 28 | > 29 | > 30 | > 31 | > 32 | > 33 | > 34 |
35 |
36 |
37 | 43 |
44 | -------------------------------------------------------------------------------- /webroot/js/ready.js: -------------------------------------------------------------------------------- 1 | /* 2 | * webroot/js/ready.js 3 | * CakePHP Full Calendar Plugin 4 | * 5 | * Copyright (c) 2010 Silas Montgomery 6 | * http://silasmontgomery.com 7 | * 8 | * Licensed under MIT 9 | * http://www.opensource.org/licenses/mit-license.php 10 | */ 11 | 12 | // JavaScript Document 13 | $(document).ready(function() { 14 | 15 | // page is now ready, initialize the calendar... 16 | $('#calendar').fullCalendar({ 17 | 18 | header: { 19 | left: 'title', 20 | center: '', 21 | right: 'today agendaDay,agendaWeek,month prev,next' 22 | }, 23 | defaultView: 'agendaWeek', 24 | firstHour: 8, 25 | weekMode: 'variable', 26 | aspectRatio: 2, 27 | editable: true, 28 | events: plgFcRoot + "/events/feed", 29 | eventRender: function(event, element) { 30 | element.qtip({ 31 | content: event.details, 32 | position: { 33 | target: 'mouse', 34 | adjust: { 35 | x: 10, 36 | y: -5 37 | } 38 | }, 39 | style: { 40 | name: 'light', 41 | tip: 'leftTop' 42 | } 43 | }); 44 | }, 45 | eventDragStart: function(event) { 46 | $(this).qtip("destroy"); 47 | }, 48 | eventDrop: function(event) { 49 | var startdate = new Date(event.start); 50 | var startyear = startdate.getFullYear(); 51 | var startday = startdate.getDate(); 52 | var startmonth = startdate.getMonth()+1; 53 | var starthour = startdate.getHours(); 54 | var startminute = startdate.getMinutes(); 55 | var enddate = new Date(event.end); 56 | var endyear = enddate.getFullYear(); 57 | var endday = enddate.getDate(); 58 | var endmonth = enddate.getMonth()+1; 59 | var endhour = enddate.getHours(); 60 | var endminute = enddate.getMinutes(); 61 | if(event.allDay == true) { 62 | var allday = 1; 63 | } else { 64 | var allday = 0; 65 | } 66 | var url = plgFcRoot + "/events/update?id="+event.id+"&start="+startyear+"-"+startmonth+"-"+startday+" "+starthour+":"+startminute+":00&end="+endyear+"-"+endmonth+"-"+endday+" "+endhour+":"+endminute+":00&allday="+allday; 67 | $.post(url, function(data){}); 68 | }, 69 | eventResizeStart: function(event) { 70 | $(this).qtip("destroy"); 71 | }, 72 | eventResize: function(event) { 73 | var startdate = new Date(event.start); 74 | var startyear = startdate.getFullYear(); 75 | var startday = startdate.getDate(); 76 | var startmonth = startdate.getMonth()+1; 77 | var starthour = startdate.getHours(); 78 | var startminute = startdate.getMinutes(); 79 | var enddate = new Date(event.end); 80 | var endyear = enddate.getFullYear(); 81 | var endday = enddate.getDate(); 82 | var endmonth = enddate.getMonth()+1; 83 | var endhour = enddate.getHours(); 84 | var endminute = enddate.getMinutes(); 85 | var url = plgFcRoot + "/events/update?id="+event.id+"&start="+startyear+"-"+startmonth+"-"+startday+" "+starthour+":"+startminute+":00&end="+endyear+"-"+endmonth+"-"+endday+" "+endhour+":"+endminute+":00"; 86 | $.post(url, function(data){}); 87 | } 88 | }) 89 | 90 | }); 91 | -------------------------------------------------------------------------------- /View/EventTypes/view.ctp: -------------------------------------------------------------------------------- 1 | 13 |
14 |

15 |
16 | > 17 | > 18 | 19 |   20 | 21 | > 22 | > 23 | 24 |   25 | 26 |
27 |
28 |
29 | 35 |
36 | 73 | -------------------------------------------------------------------------------- /Controller/EventsController.php: -------------------------------------------------------------------------------- 1 | 15 19 | ); 20 | 21 | function index() { 22 | $this->Event->recursive = 1; 23 | $this->set('events', $this->paginate()); 24 | } 25 | 26 | function view($id = null) { 27 | if (!$id) { 28 | $this->Session->setFlash(__('Invalid event', true)); 29 | $this->redirect(array('action' => 'index')); 30 | } 31 | $this->set('event', $this->Event->read(null, $id)); 32 | } 33 | 34 | function add() { 35 | if (!empty($this->data)) { 36 | $this->Event->create(); 37 | if ($this->Event->save($this->data)) { 38 | $this->Session->setFlash(__('The event has been saved', true)); 39 | $this->redirect(array('action' => 'index')); 40 | } else { 41 | $this->Session->setFlash(__('The event could not be saved. Please, try again.', true)); 42 | } 43 | } 44 | $this->set('eventTypes', $this->Event->EventType->find('list')); 45 | } 46 | 47 | function edit($id = null) { 48 | if (!$id && empty($this->data)) { 49 | $this->Session->setFlash(__('Invalid event', true)); 50 | $this->redirect(array('action' => 'index')); 51 | } 52 | if (!empty($this->data)) { 53 | if ($this->Event->save($this->data)) { 54 | $this->Session->setFlash(__('The event has been saved', true)); 55 | $this->redirect(array('action' => 'index')); 56 | } else { 57 | $this->Session->setFlash(__('The event could not be saved. Please, try again.', true)); 58 | } 59 | } 60 | if (empty($this->data)) { 61 | $this->data = $this->Event->read(null, $id); 62 | } 63 | $this->set('eventTypes', $this->Event->EventType->find('list')); 64 | } 65 | 66 | function delete($id = null) { 67 | if (!$id) { 68 | $this->Session->setFlash(__('Invalid id for event', true)); 69 | $this->redirect(array('action'=>'index')); 70 | } 71 | if ($this->Event->delete($id)) { 72 | $this->Session->setFlash(__('Event deleted', true)); 73 | $this->redirect(array('action'=>'index')); 74 | } 75 | $this->Session->setFlash(__('Event was not deleted', true)); 76 | $this->redirect(array('action' => 'index')); 77 | } 78 | 79 | // The feed action is called from "webroot/js/ready.js" to get the list of events (JSON) 80 | function feed($id=null) { 81 | $this->layout = "ajax"; 82 | $vars = $this->params['url']; 83 | $conditions = array('conditions' => array('UNIX_TIMESTAMP(start) >=' => $vars['start'], 'UNIX_TIMESTAMP(start) <=' => $vars['end'])); 84 | $events = $this->Event->find('all', $conditions); 85 | foreach($events as $event) { 86 | if($event['Event']['all_day'] == 1) { 87 | $allday = true; 88 | $end = $event['Event']['start']; 89 | } else { 90 | $allday = false; 91 | $end = $event['Event']['end']; 92 | } 93 | $data[] = array( 94 | 'id' => $event['Event']['id'], 95 | 'title'=>$event['Event']['title'], 96 | 'start'=>$event['Event']['start'], 97 | 'end' => $end, 98 | 'allDay' => $allday, 99 | 'url' => Router::url('/') . '/full_calendar/events/view/'.$event['Event']['id'], 100 | 'details' => $event['Event']['details'], 101 | 'className' => $event['EventType']['color'] 102 | ); 103 | } 104 | $this->set("json", json_encode($data)); 105 | } 106 | 107 | // The update action is called from "webroot/js/ready.js" to update date/time when an event is dragged or resized 108 | function update() { 109 | $vars = $this->params['url']; 110 | $this->Event->id = $vars['id']; 111 | $this->Event->saveField('start', $vars['start']); 112 | $this->Event->saveField('end', $vars['end']); 113 | $this->Event->saveField('all_day', $vars['allday']); 114 | } 115 | 116 | } 117 | ?> 118 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ------------------- 2 | THE CAKEPHP LICENSE 3 | ------------------- 4 | 5 | CakePHP(tm) : Rapid Development Framework (http://cakephp.org) 6 | Copyright 2005-2010, Cake Software Foundation, Inc.(http://cakefoundation.org) 7 | 8 | Licensed under The MIT License 9 | Redistributions of files must retain the above copyright notice. 10 | 11 | @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) 12 | @link http://cakephp.org CakePHP(tm) Project 13 | @package cake 14 | @since CakePHP(tm) v 0.2.9 15 | @license MIT License (http://www.opensource.org/licenses/mit-license.php) 16 | 17 | 18 | ------------------------- 19 | THE FULL CALENDAR LICENSE 20 | ------------------------- 21 | 22 | Copyright (c) 2009 Adam Shaw 23 | 24 | Permission is hereby granted, free of charge, to any person obtaining a copy 25 | of this software and associated documentation files (the "Software"), to deal 26 | in the Software without restriction, including without limitation the rights 27 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 28 | copies of the Software, and to permit persons to whom the Software is 29 | furnished to do so, subject to the following conditions: 30 | 31 | The above copyright notice and this permission notice shall be included in 32 | all copies or substantial portions of the Software. 33 | 34 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 35 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 36 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 37 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 38 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 39 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 40 | THE SOFTWARE. 41 | 42 | 43 | ------------------ 44 | THE JQUERY LICENSE 45 | ------------------ 46 | 47 | Copyright (c) 2011 John Resig, http://jquery.com/ 48 | 49 | Permission is hereby granted, free of charge, to any person obtaining 50 | a copy of this software and associated documentation files (the 51 | "Software"), to deal in the Software without restriction, including 52 | without limitation the rights to use, copy, modify, merge, publish, 53 | distribute, sublicense, and/or sell copies of the Software, and to 54 | permit persons to whom the Software is furnished to do so, subject to 55 | the following conditions: 56 | 57 | The above copyright notice and this permission notice shall be 58 | included in all copies or substantial portions of the Software. 59 | 60 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 61 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 62 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 63 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 64 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 65 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 66 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 67 | 68 | 69 | --------------------- 70 | THE JQUERY UI LICENSE 71 | --------------------- 72 | 73 | Copyright (c) 2011 Paul Bakaus, http://jqueryui.com/ 74 | 75 | This software consists of voluntary contributions made by many 76 | individuals (AUTHORS.txt, http://jqueryui.com/about) For exact 77 | contribution history, see the revision history and logs, available 78 | at http://jquery-ui.googlecode.com/svn/ 79 | 80 | Permission is hereby granted, free of charge, to any person obtaining 81 | a copy of this software and associated documentation files (the 82 | "Software"), to deal in the Software without restriction, including 83 | without limitation the rights to use, copy, modify, merge, publish, 84 | distribute, sublicense, and/or sell copies of the Software, and to 85 | permit persons to whom the Software is furnished to do so, subject to 86 | the following conditions: 87 | 88 | The above copyright notice and this permission notice shall be 89 | included in all copies or substantial portions of the Software. 90 | 91 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 92 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 93 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 94 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 95 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 96 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 97 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 98 | 99 | 100 | ------------------------------ 101 | THE qTIP JQUERY PLUGIN LICENSE 102 | ------------------------------ 103 | 104 | Copyright (c) 2009 Craig Thompson 105 | 106 | Permission is hereby granted, free of charge, to any person obtaining 107 | a copy of this software and associated documentation files (the 108 | "Software"), to deal in the Software without restriction, including 109 | without limitation the rights to use, copy, modify, merge, publish, 110 | distribute, sublicense, and/or sell copies of the Software, and to 111 | permit persons to whom the Software is furnished to do so, subject to 112 | the following conditions: 113 | 114 | The above copyright notice and this permission notice shall be 115 | included in all copies or substantial portions of the Software. 116 | 117 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 118 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 119 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 120 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 121 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 122 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 123 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 124 | 125 | 126 | --------------------------------------- 127 | THE CAKEPHP-FULLCALENDAR PLUGIN LICENSE 128 | --------------------------------------- 129 | 130 | Copyright (c) 2010 Silas Montgomery, http://silasmontgomery.com/ 131 | 132 | Permission is hereby granted, free of charge, to any person obtaining 133 | a copy of this software and associated documentation files (the 134 | "Software"), to deal in the Software without restriction, including 135 | without limitation the rights to use, copy, modify, merge, publish, 136 | distribute, sublicense, and/or sell copies of the Software, and to 137 | permit persons to whom the Software is furnished to do so, subject to 138 | the following conditions: 139 | 140 | The above copyright notice and this permission notice shall be 141 | included in all copies or substantial portions of the Software. 142 | 143 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 144 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 145 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 146 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 147 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 148 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 149 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 150 | -------------------------------------------------------------------------------- /webroot/css/fullcalendar.css: -------------------------------------------------------------------------------- 1 | /* 2 | * FullCalendar v1.4.11 Stylesheet 3 | * 4 | * Feel free to edit this file to customize the look of FullCalendar. 5 | * When upgrading to newer versions, please upgrade this file as well, 6 | * porting over any customizations afterwards. 7 | * 8 | * Date: Tue Feb 22 21:47:22 2011 -0800 9 | * 10 | */ 11 | 12 | 13 | /* TODO: make font sizes look the same in all doctypes */ 14 | 15 | 16 | .fc, 17 | .fc .fc-header, 18 | .fc .fc-content { 19 | font-size: 1em; 20 | } 21 | 22 | .fc { 23 | direction: ltr; 24 | text-align: left; 25 | } 26 | 27 | .fc table { 28 | border-collapse: collapse; 29 | border-spacing: 0; 30 | } 31 | 32 | .fc td, .fc th { 33 | padding: 0; 34 | vertical-align: top; 35 | } 36 | 37 | 38 | 39 | /* Header 40 | ------------------------------------------------------------------------*/ 41 | 42 | table.fc-header { 43 | width: 100%; 44 | } 45 | 46 | .fc-header-left { 47 | width: 25%; 48 | } 49 | 50 | .fc-header-left table { 51 | float: left; 52 | } 53 | 54 | .fc-header-center { 55 | width: 50%; 56 | text-align: center; 57 | } 58 | 59 | .fc-header-center table { 60 | margin: 0 auto; 61 | } 62 | 63 | .fc-header-right { 64 | width: 25%; 65 | } 66 | 67 | .fc-header-right table { 68 | float: right; 69 | } 70 | 71 | .fc-header-title { 72 | margin-top: 0; 73 | white-space: nowrap; 74 | } 75 | 76 | .fc-header-space { 77 | padding-left: 10px; 78 | } 79 | 80 | /* right-to-left */ 81 | 82 | .fc-rtl .fc-header-title { 83 | direction: rtl; 84 | } 85 | 86 | 87 | 88 | /* Buttons 89 | ------------------------------------------------------------------------*/ 90 | 91 | .fc-header .fc-state-default, 92 | .fc-header .ui-state-default { 93 | margin-bottom: 1em; 94 | cursor: pointer; 95 | } 96 | 97 | .fc-header .fc-state-default { 98 | border-width: 1px 0; 99 | padding: 0 1px; 100 | } 101 | 102 | .fc-header .fc-state-default, 103 | .fc-header .fc-state-default a { 104 | border-style: solid; 105 | } 106 | 107 | .fc-header .fc-state-default a { 108 | display: block; 109 | border-width: 0 1px; 110 | margin: 0 -1px; 111 | width: 100%; 112 | text-decoration: none; 113 | } 114 | 115 | .fc-header .fc-state-default span { 116 | display: block; 117 | border-style: solid; 118 | border-width: 1px 0 1px 1px; 119 | padding: 3px 5px; 120 | } 121 | 122 | .fc-header .ui-state-default { 123 | padding: 4px 6px; 124 | } 125 | 126 | .fc-header .fc-state-default span, 127 | .fc-header .ui-state-default span { 128 | white-space: nowrap; 129 | } 130 | 131 | /* for adjacent buttons */ 132 | 133 | .fc-header .fc-no-right { 134 | padding-right: 0; 135 | } 136 | 137 | .fc-header .fc-no-right a { 138 | margin-right: 0; 139 | border-right: 0; 140 | } 141 | 142 | .fc-header .ui-no-right { 143 | border-right: 0; 144 | } 145 | 146 | /* for fake rounded corners */ 147 | 148 | .fc-header .fc-corner-left { 149 | margin-left: 1px; 150 | padding-left: 0; 151 | } 152 | 153 | .fc-header .fc-corner-right { 154 | margin-right: 1px; 155 | padding-right: 0; 156 | } 157 | 158 | /* DEFAULT button COLORS */ 159 | 160 | .fc-header .fc-state-default, 161 | .fc-header .fc-state-default a { 162 | border-color: #777; /* outer border */ 163 | color: #333; 164 | } 165 | 166 | .fc-header .fc-state-default span { 167 | border-color: #fff #fff #d1d1d1; /* inner border */ 168 | background: #e8e8e8; 169 | } 170 | 171 | /* PRESSED button COLORS (down and active) */ 172 | 173 | .fc-header .fc-state-active a { 174 | color: #fff; 175 | } 176 | 177 | .fc-header .fc-state-down span, 178 | .fc-header .fc-state-active span { 179 | background: #888; 180 | border-color: #808080 #808080 #909090; /* inner border */ 181 | } 182 | 183 | /* DISABLED button COLORS */ 184 | 185 | .fc-header .fc-state-disabled a { 186 | color: #999; 187 | } 188 | 189 | .fc-header .fc-state-disabled, 190 | .fc-header .fc-state-disabled a { 191 | border-color: #ccc; /* outer border */ 192 | } 193 | 194 | .fc-header .fc-state-disabled span { 195 | border-color: #fff #fff #f0f0f0; /* inner border */ 196 | background: #f0f0f0; 197 | } 198 | 199 | 200 | 201 | /* Content Area & Global Cell Styles 202 | ------------------------------------------------------------------------*/ 203 | 204 | .fc-widget-content { 205 | border: 1px solid #ccc; /* outer border color */ 206 | } 207 | 208 | .fc-content { 209 | clear: both; 210 | } 211 | 212 | .fc-content .fc-state-default { 213 | border-style: solid; 214 | border-color: #ccc; /* inner border color */ 215 | } 216 | 217 | .fc-content .fc-state-highlight { /* today */ 218 | background: #ffc; 219 | } 220 | 221 | .fc-content .fc-not-today { /* override jq-ui highlight (TODO: ui-widget-content) */ 222 | background: none; 223 | } 224 | 225 | .fc-cell-overlay { /* semi-transparent rectangle while dragging */ 226 | background: #9cf; 227 | opacity: .2; 228 | filter: alpha(opacity=20); /* for IE */ 229 | } 230 | 231 | .fc-view { /* prevents dragging outside of widget */ 232 | width: 100%; 233 | overflow: hidden; 234 | } 235 | 236 | 237 | 238 | 239 | 240 | /* Global Event Styles 241 | ------------------------------------------------------------------------*/ 242 | 243 | .fc-event, 244 | .fc-agenda .fc-event-time, 245 | .fc-event a { 246 | border-style: solid; 247 | border-color: #36c; /* default BORDER color (probably the same as background-color) */ 248 | background-color: #36c; /* default BACKGROUND color */ 249 | color: #fff; /* default TEXT color */ 250 | } 251 | 252 | /* Use the 'className' CalEvent property and the following 253 | * example CSS to change event color on a per-event basis: 254 | * 255 | * .myclass, 256 | * .fc-agenda .myclass .fc-event-time, 257 | * .myclass a { 258 | * background-color: black; 259 | * border-color: black; 260 | * color: red; 261 | * } 262 | */ 263 | 264 | 265 | /* CakePHP Full Calendar Plugin Note: 266 | * 267 | * CUSTOM CSS FOR EVENT TYPES 268 | * Feel free to add/change colors here but you'll need to edit the 269 | * following files as the colors are currently hard coded: 270 | * 271 | * views/event_types/add.ctp 272 | * views/event_types/edit.ctp 273 | */ 274 | 275 | .Blue, .fc-agenda .Blue .fc-event-time, .Blue a { 276 | border-color: #36c; 277 | background-color: #36c; 278 | color: #fff; 279 | } 280 | 281 | .Green, .fc-agenda .Green .fc-event-time, .Green a { 282 | border-color: #009B4E; 283 | background-color: #009B4E; 284 | color: #fff; 285 | } 286 | 287 | .Red, .fc-agenda .Red .fc-event-time, .Red a { 288 | border-color: #820000; 289 | background-color: #820000; 290 | color: #fff; 291 | } 292 | 293 | .Pink, .fc-agenda .Pink .fc-event-time, .Pink a { 294 | border-color: #F6F; 295 | background-color: #F6F; 296 | color: #fff; 297 | } 298 | 299 | .Purple, .fc-agenda .Purple .fc-event-time, .Purple a { 300 | border-color: #93F; 301 | background-color: #93F; 302 | color: #fff; 303 | } 304 | 305 | .Orange, .fc-agenda .Orange .fc-event-time, .Orange a { 306 | border-color: #F93; 307 | background-color: #F93; 308 | color: #fff; 309 | } 310 | 311 | .Gray, .fc-agenda .Gray .fc-event-time, .Gray a { 312 | border-color: #666; 313 | background-color: #666; 314 | color: #fff; 315 | } 316 | 317 | .Black, .fc-agenda .Black .fc-event-time, .Black a { 318 | border-color: #000; 319 | background-color: #000; 320 | color: #fff; 321 | } 322 | 323 | .Brown, .fc-agenda .Brown .fc-event-time, .Brown a { 324 | border-color: #930; 325 | background-color: #930; 326 | color: #fff; 327 | } 328 | 329 | /* CakePHP Full Calendar Plugin Note: 330 | * END COLORS FOR EVENT TYPES 331 | */ 332 | 333 | 334 | .fc-event { 335 | text-align: left; 336 | } 337 | 338 | .fc-event a { 339 | overflow: hidden; 340 | font-size: .85em; 341 | text-decoration: none; 342 | cursor: pointer; 343 | } 344 | 345 | .fc-event-editable { 346 | cursor: pointer; 347 | } 348 | 349 | .fc-event-time, 350 | .fc-event-title { 351 | padding: 0 1px; 352 | } 353 | 354 | /* for fake rounded corners */ 355 | 356 | .fc-event a { 357 | display: block; 358 | position: relative; 359 | width: 100%; 360 | height: 100%; 361 | } 362 | 363 | /* right-to-left */ 364 | 365 | .fc-rtl .fc-event a { 366 | text-align: right; 367 | } 368 | 369 | /* resizable */ 370 | 371 | .fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anoymore, change class ***/ 372 | display: block; 373 | position: absolute; 374 | z-index: 99999; 375 | border: 0 !important; /* important overrides pre jquery ui 1.7 styles */ 376 | background: url(data:image/gif;base64,AAAA) !important; /* hover fix for IE */ 377 | } 378 | 379 | 380 | 381 | /* Horizontal Events 382 | ------------------------------------------------------------------------*/ 383 | 384 | .fc-event-hori { 385 | border-width: 1px 0; 386 | margin-bottom: 1px; 387 | } 388 | 389 | .fc-event-hori a { 390 | border-width: 0; 391 | } 392 | 393 | /* for fake rounded corners */ 394 | 395 | .fc-content .fc-corner-left { 396 | margin-left: 1px; 397 | } 398 | 399 | .fc-content .fc-corner-left a { 400 | margin-left: -1px; 401 | border-left-width: 1px; 402 | } 403 | 404 | .fc-content .fc-corner-right { 405 | margin-right: 1px; 406 | } 407 | 408 | .fc-content .fc-corner-right a { 409 | margin-right: -1px; 410 | border-right-width: 1px; 411 | } 412 | 413 | /* resizable */ 414 | 415 | .fc-event-hori .ui-resizable-e { 416 | top: 0 !important; /* importants override pre jquery ui 1.7 styles */ 417 | right: -3px !important; 418 | width: 7px !important; 419 | height: 100% !important; 420 | cursor: e-resize; 421 | } 422 | 423 | .fc-event-hori .ui-resizable-w { 424 | top: 0 !important; 425 | left: -3px !important; 426 | width: 7px !important; 427 | height: 100% !important; 428 | cursor: w-resize; 429 | } 430 | 431 | .fc-event-hori .ui-resizable-handle { 432 | _padding-bottom: 14px; /* IE6 had 0 height */ 433 | } 434 | 435 | 436 | 437 | 438 | /* Month View, Basic Week View, Basic Day View 439 | ------------------------------------------------------------------------*/ 440 | 441 | .fc-grid table { 442 | width: 100%; 443 | } 444 | 445 | .fc .fc-grid th { 446 | border-width: 0 0 0 1px; 447 | text-align: center; 448 | } 449 | 450 | .fc .fc-grid td { 451 | border-width: 1px 0 0 1px; 452 | } 453 | 454 | .fc-grid th.fc-leftmost, 455 | .fc-grid td.fc-leftmost { 456 | border-left: 0; 457 | } 458 | 459 | .fc-grid .fc-day-number { 460 | float: right; 461 | padding: 0 2px; 462 | } 463 | 464 | .fc-grid .fc-other-month .fc-day-number { 465 | opacity: 0.3; 466 | filter: alpha(opacity=30); /* for IE */ 467 | /* opacity with small font can sometimes look too faded 468 | might want to set the 'color' property instead 469 | making day-numbers bold also fixes the problem */ 470 | } 471 | 472 | .fc-grid .fc-day-content { 473 | clear: both; 474 | padding: 2px 2px 0; /* distance between events and day edges */ 475 | } 476 | 477 | /* event styles */ 478 | 479 | .fc-grid .fc-event-time { 480 | font-weight: bold; 481 | } 482 | 483 | /* right-to-left */ 484 | 485 | .fc-rtl .fc-grid { 486 | direction: rtl; 487 | } 488 | 489 | .fc-rtl .fc-grid .fc-day-number { 490 | float: left; 491 | } 492 | 493 | .fc-rtl .fc-grid .fc-event-time { 494 | float: right; 495 | } 496 | 497 | /* Agenda Week View, Agenda Day View 498 | ------------------------------------------------------------------------*/ 499 | 500 | .fc .fc-agenda th, 501 | .fc .fc-agenda td { 502 | border-width: 1px 0 0 1px; 503 | } 504 | 505 | .fc .fc-agenda .fc-leftmost { 506 | border-left: 0; 507 | } 508 | 509 | .fc-agenda tr.fc-first th, 510 | .fc-agenda tr.fc-first td { 511 | border-top: 0; 512 | } 513 | 514 | .fc-agenda-head tr.fc-last th { 515 | border-bottom-width: 1px; 516 | } 517 | 518 | .fc .fc-agenda-head td, 519 | .fc .fc-agenda-body td { 520 | background: none; 521 | } 522 | 523 | .fc-agenda-head th { 524 | text-align: center; 525 | } 526 | 527 | /* the time axis running down the left side */ 528 | 529 | .fc-agenda .fc-axis { 530 | width: 50px; 531 | padding: 0 4px; 532 | vertical-align: middle; 533 | white-space: nowrap; 534 | text-align: right; 535 | font-weight: normal; 536 | } 537 | 538 | /* all-day event cells at top */ 539 | 540 | .fc-agenda-head tr.fc-all-day th { 541 | height: 35px; 542 | } 543 | 544 | .fc-agenda-head td { 545 | padding-bottom: 10px; 546 | } 547 | 548 | .fc .fc-divider div { 549 | font-size: 1px; /* for IE6/7 */ 550 | height: 2px; 551 | } 552 | 553 | .fc .fc-divider .fc-state-default { 554 | background: #eee; /* color for divider between all-day and time-slot events */ 555 | } 556 | 557 | /* body styles */ 558 | 559 | .fc .fc-agenda-body td div { 560 | height: 20px; /* slot height */ 561 | } 562 | 563 | .fc .fc-agenda-body tr.fc-minor th, 564 | .fc .fc-agenda-body tr.fc-minor td { 565 | border-top-style: dotted; 566 | } 567 | 568 | .fc-agenda .fc-day-content { 569 | padding: 2px 2px 0; /* distance between events and day edges */ 570 | } 571 | 572 | /* vertical background columns */ 573 | 574 | .fc .fc-agenda-bg .ui-state-highlight { 575 | background-image: none; /* tall column, don't want repeating background image */ 576 | } 577 | 578 | 579 | 580 | /* Vertical Events 581 | ------------------------------------------------------------------------*/ 582 | 583 | .fc-event-vert { 584 | border-width: 0 1px; 585 | } 586 | 587 | .fc-event-vert a { 588 | border-width: 0; 589 | } 590 | 591 | /* for fake rounded corners */ 592 | 593 | .fc-content .fc-corner-top { 594 | margin-top: 1px; 595 | } 596 | 597 | .fc-content .fc-corner-top a { 598 | margin-top: -1px; 599 | border-top-width: 1px; 600 | } 601 | 602 | .fc-content .fc-corner-bottom { 603 | margin-bottom: 1px; 604 | } 605 | 606 | .fc-content .fc-corner-bottom a { 607 | margin-bottom: -1px; 608 | border-bottom-width: 1px; 609 | } 610 | 611 | /* event content */ 612 | 613 | .fc-event-vert span { 614 | display: block; 615 | position: relative; 616 | z-index: 2; 617 | } 618 | 619 | .fc-event-vert span.fc-event-time { 620 | white-space: nowrap; 621 | _white-space: normal; 622 | overflow: hidden; 623 | border: 0; 624 | font-size: 10px; 625 | } 626 | 627 | .fc-event-vert span.fc-event-title { 628 | line-height: 13px; 629 | } 630 | 631 | .fc-event-vert span.fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */ 632 | position: absolute; 633 | z-index: 1; 634 | top: 0; 635 | left: 0; 636 | width: 100%; 637 | height: 100%; 638 | background: #fff; 639 | opacity: .3; 640 | filter: alpha(opacity=30); /* for IE */ 641 | } 642 | 643 | /* resizable */ 644 | 645 | .fc-event-vert .ui-resizable-s { 646 | bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */ 647 | width: 100% !important; 648 | height: 8px !important; 649 | line-height: 8px !important; 650 | font-size: 11px !important; 651 | font-family: monospace; 652 | text-align: center; 653 | cursor: s-resize; 654 | } 655 | 656 | 657 | -------------------------------------------------------------------------------- /webroot/js/jquery.qtip-1.0.0-rc3.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.qtip. The jQuery tooltip plugin 3 | * 4 | * Copyright (c) 2009 Craig Thompson 5 | * http://craigsworks.com 6 | * 7 | * Licensed under MIT 8 | * http://www.opensource.org/licenses/mit-license.php 9 | * 10 | * Launch : February 2009 11 | * Version : 1.0.0-rc3 12 | * Released: Tuesday 12th May, 2009 - 00:00 13 | * Debug: jquery.qtip.debug.js 14 | */ 15 | (function(f){f.fn.qtip=function(B,u){var y,t,A,s,x,w,v,z;if(typeof B=="string"){if(typeof f(this).data("qtip")!=="object"){f.fn.qtip.log.error.call(self,1,f.fn.qtip.constants.NO_TOOLTIP_PRESENT,false)}if(B=="api"){return f(this).data("qtip").interfaces[f(this).data("qtip").current]}else{if(B=="interfaces"){return f(this).data("qtip").interfaces}}}else{if(!B){B={}}if(typeof B.content!=="object"||(B.content.jquery&&B.content.length>0)){B.content={text:B.content}}if(typeof B.content.title!=="object"){B.content.title={text:B.content.title}}if(typeof B.position!=="object"){B.position={corner:B.position}}if(typeof B.position.corner!=="object"){B.position.corner={target:B.position.corner,tooltip:B.position.corner}}if(typeof B.show!=="object"){B.show={when:B.show}}if(typeof B.show.when!=="object"){B.show.when={event:B.show.when}}if(typeof B.show.effect!=="object"){B.show.effect={type:B.show.effect}}if(typeof B.hide!=="object"){B.hide={when:B.hide}}if(typeof B.hide.when!=="object"){B.hide.when={event:B.hide.when}}if(typeof B.hide.effect!=="object"){B.hide.effect={type:B.hide.effect}}if(typeof B.style!=="object"){B.style={name:B.style}}B.style=c(B.style);s=f.extend(true,{},f.fn.qtip.defaults,B);s.style=a.call({options:s},s.style);s.user=f.extend(true,{},B)}return f(this).each(function(){if(typeof B=="string"){w=B.toLowerCase();A=f(this).qtip("interfaces");if(typeof A=="object"){if(u===true&&w=="destroy"){while(A.length>0){A[A.length-1].destroy()}}else{if(u!==true){A=[f(this).qtip("api")]}for(y=0;y0))}if(typeof s.options.show.solo=="object"){z=f(s.options.show.solo)}else{if(s.options.show.solo===true){z=f("div.qtip").not(s.elements.tooltip)}}if(z){z.each(function(){if(f(this).qtip("api").status.rendered===true){f(this).qtip("api").hide()}})}if(typeof s.options.show.effect.type=="function"){s.options.show.effect.type.call(s.elements.tooltip,s.options.show.effect.length);s.elements.tooltip.queue(function(){w();f(this).dequeue()})}else{switch(s.options.show.effect.type.toLowerCase()){case"fade":s.elements.tooltip.fadeIn(s.options.show.effect.length,w);break;case"slide":s.elements.tooltip.slideDown(s.options.show.effect.length,function(){w();if(s.options.position.type!=="static"){s.updatePosition(y,true)}});break;case"grow":s.elements.tooltip.show(s.options.show.effect.length,w);break;default:s.elements.tooltip.show(null,w);break}s.elements.tooltip.addClass(s.options.style.classes.active)}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_SHOWN,"show")},hide:function(y){var x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"hide")}else{if(s.elements.tooltip.css("display")==="none"){return s}}clearTimeout(s.timers.show);s.elements.tooltip.stop(true,false);x=s.beforeHide.call(s,y);if(x===false){return s}function w(){s.onHide.call(s,y)}s.cache.toggle=0;if(typeof s.options.hide.effect.type=="function"){s.options.hide.effect.type.call(s.elements.tooltip,s.options.hide.effect.length);s.elements.tooltip.queue(function(){w();f(this).dequeue()})}else{switch(s.options.hide.effect.type.toLowerCase()){case"fade":s.elements.tooltip.fadeOut(s.options.hide.effect.length,w);break;case"slide":s.elements.tooltip.slideUp(s.options.hide.effect.length,w);break;case"grow":s.elements.tooltip.hide(s.options.hide.effect.length,w);break;default:s.elements.tooltip.hide(null,w);break}s.elements.tooltip.removeClass(s.options.style.classes.active)}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_HIDDEN,"hide")},updatePosition:function(w,x){var C,G,L,J,H,E,y,I,B,D,K,A,F,z;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updatePosition")}else{if(s.options.position.type=="static"){return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.CANNOT_POSITION_STATIC,"updatePosition")}}G={position:{left:0,top:0},dimensions:{height:0,width:0},corner:s.options.position.corner.target};L={position:s.getPosition(),dimensions:s.getDimensions(),corner:s.options.position.corner.tooltip};if(s.options.position.target!=="mouse"){if(s.options.position.target.get(0).nodeName.toLowerCase()=="area"){J=s.options.position.target.attr("coords").split(",");for(C=0;CG.dimensions.width){G.dimensions.width=J[C]}if(J[C]G.dimensions.height){G.dimensions.height=J[C]}if(J[C]0){if(L.corner.search(/Left/)!==-1){y.left-=s.options.style.border.radius}else{if(L.corner.search(/Right/)!==-1){y.left+=s.options.style.border.radius}}if(L.corner.search(/Top/)!==-1){y.top-=s.options.style.border.radius}else{if(L.corner.search(/Bottom/)!==-1){y.top+=s.options.style.border.radius}}}if(I){if(L.corner.search(/top/)!==-1){y.top-=I}else{if(L.corner.search(/bottom/)!==-1){y.top+=I}}if(L.corner.search(/left/)!==-1){y.left-=I}else{if(L.corner.search(/right/)!==-1){y.left+=I}}if(L.corner.search(/leftMiddle|rightMiddle/)!==-1){y.top-=1}}if(s.options.position.adjust.screen===true){y=o.call(s,y,G,L)}if(s.options.position.target==="mouse"&&s.options.position.adjust.mouse===true){if(s.options.position.adjust.screen===true&&s.elements.tip){K=s.elements.tip.attr("rel")}else{K=s.options.position.corner.tooltip}y.left+=(K.search(/right/i)!==-1)?-6:6;y.top+=(K.search(/bottom/i)!==-1)?-6:6}if(!s.elements.bgiframe&&f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){f("select, object").each(function(){A=f(this).offset();A.bottom=A.top+f(this).height();A.right=A.left+f(this).width();if(y.top+L.dimensions.height>=A.top&&y.left+L.dimensions.width>=A.left){k.call(s)}})}y.left+=s.options.position.adjust.x;y.top+=s.options.position.adjust.y;F=s.getPosition();if(y.left!=F.left||y.top!=F.top){z=s.beforePositionUpdate.call(s,w);if(z===false){return s}s.cache.position=y;if(x===true){s.status.animated=true;s.elements.tooltip.animate(y,200,"swing",function(){s.status.animated=false})}else{s.elements.tooltip.css(y)}s.onPositionUpdate.call(s,w);if(typeof w!=="undefined"&&w.type&&w.type!=="mousemove"){f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_POSITION_UPDATED,"updatePosition")}}return s},updateWidth:function(w){var x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateWidth")}else{if(w&&typeof w!=="number"){return f.fn.qtip.log.error.call(s,2,"newWidth must be of type number","updateWidth")}}x=s.elements.contentWrapper.siblings().add(s.elements.tip).add(s.elements.button);if(!w){if(typeof s.options.style.width.value=="number"){w=s.options.style.width.value}else{s.elements.tooltip.css({width:"auto"});x.hide();if(f.browser.msie){s.elements.wrapper.add(s.elements.contentWrapper.children()).css({zoom:"normal"})}w=s.getDimensions().width+1;if(!s.options.style.width.value){if(w>s.options.style.width.max){w=s.options.style.width.max}if(w").get(0).getContext){z=s.elements.tooltip.find(".qtip-tip canvas:first");x=z.get(0).getContext("2d");x.clearRect(0,0,300,300);y=z.parent("div[rel]:first").attr("rel");B=b(y,s.options.style.tip.size.width,s.options.style.tip.size.height);h.call(s,z,B,s.options.style.tip.color||s.options.style.border.color)}else{if(f.browser.msie){z=s.elements.tooltip.find('.qtip-tip [nodeName="shape"]');z.attr("fillcolor",s.options.style.tip.color||s.options.style.border.color)}}}if(s.options.style.border.radius>0){s.elements.tooltip.find(".qtip-betweenCorners").css({backgroundColor:s.options.style.border.color});if(f("").get(0).getContext){A=g(s.options.style.border.radius);s.elements.tooltip.find(".qtip-wrapper canvas").each(function(){x=f(this).get(0).getContext("2d");x.clearRect(0,0,300,300);y=f(this).parent("div[rel]:first").attr("rel");r.call(s,f(this),A[y],s.options.style.border.radius,s.options.style.border.color)})}else{if(f.browser.msie){s.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function(){f(this).attr("fillcolor",s.options.style.border.color)})}}}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_STYLE_UPDATED,"updateStyle")},updateContent:function(A,y){var z,x,w;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateContent")}else{if(!A){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.NO_CONTENT_PROVIDED,"updateContent")}}z=s.beforeContentUpdate.call(s,A);if(typeof z=="string"){A=z}else{if(z===false){return}}if(f.browser.msie){s.elements.contentWrapper.children().css({zoom:"normal"})}if(A.jquery&&A.length>0){A.clone(true).appendTo(s.elements.content).show()}else{s.elements.content.html(A)}x=s.elements.content.find("img[complete=false]");if(x.length>0){w=0;x.each(function(C){f('').load(function(){if(++w==x.length){B()}})})}else{B()}function B(){s.updateWidth();if(y!==false){if(s.options.position.type!=="static"){s.updatePosition(s.elements.tooltip.is(":visible"),true)}if(s.options.style.tip.corner!==false){n.call(s)}}}s.onContentUpdate.call(s);return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_CONTENT_UPDATED,"loadContent")},loadContent:function(w,z,A){var y;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"loadContent")}y=s.beforeContentLoad.call(s);if(y===false){return s}if(A=="post"){f.post(w,z,x)}else{f.get(w,z,x)}function x(B){s.onContentLoad.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_CONTENT_LOADED,"loadContent");s.updateContent(B)}return s},updateTitle:function(w){if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateTitle")}else{if(!w){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.NO_CONTENT_PROVIDED,"updateTitle")}}returned=s.beforeTitleUpdate.call(s);if(returned===false){return s}if(s.elements.button){s.elements.button=s.elements.button.clone(true)}s.elements.title.html(w);if(s.elements.button){s.elements.title.prepend(s.elements.button)}s.onTitleUpdate.call(s);return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_TITLE_UPDATED,"updateTitle")},focus:function(A){var y,x,w,z;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"focus")}else{if(s.options.position.type=="static"){return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.CANNOT_FOCUS_STATIC,"focus")}}y=parseInt(s.elements.tooltip.css("z-index"));x=6000+f("div.qtip[qtip]").length-1;if(!s.status.focused&&y!==x){z=s.beforeFocus.call(s,A);if(z===false){return s}f("div.qtip[qtip]").not(s.elements.tooltip).each(function(){if(f(this).qtip("api").status.rendered===true){w=parseInt(f(this).css("z-index"));if(typeof w=="number"&&w>-1){f(this).css({zIndex:parseInt(f(this).css("z-index"))-1})}f(this).qtip("api").status.focused=false}});s.elements.tooltip.css({zIndex:x});s.status.focused=true;s.onFocus.call(s,A);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_FOCUSED,"focus")}return s},disable:function(w){if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"disable")}if(w){if(!s.status.disabled){s.status.disabled=true;f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_DISABLED,"disable")}else{f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.TOOLTIP_ALREADY_DISABLED,"disable")}}else{if(s.status.disabled){s.status.disabled=false;f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_ENABLED,"disable")}else{f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.TOOLTIP_ALREADY_ENABLED,"disable")}}return s},destroy:function(){var w,x,y;x=s.beforeDestroy.call(s);if(x===false){return s}if(s.status.rendered){s.options.show.when.target.unbind("mousemove.qtip",s.updatePosition);s.options.show.when.target.unbind("mouseout.qtip",s.hide);s.options.show.when.target.unbind(s.options.show.when.event+".qtip");s.options.hide.when.target.unbind(s.options.hide.when.event+".qtip");s.elements.tooltip.unbind(s.options.hide.when.event+".qtip");s.elements.tooltip.unbind("mouseover.qtip",s.focus);s.elements.tooltip.remove()}else{s.options.show.when.target.unbind(s.options.show.when.event+".qtip-create")}if(typeof s.elements.target.data("qtip")=="object"){y=s.elements.target.data("qtip").interfaces;if(typeof y=="object"&&y.length>0){for(w=0;w0){s.elements.target.data("qtip").current=y.length-1}else{s.elements.target.removeData("qtip")}s.onDestroy.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_DESTROYED,"destroy");return s.elements.target},getPosition:function(){var w,x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getPosition")}w=(s.elements.tooltip.css("display")!=="none")?false:true;if(w){s.elements.tooltip.css({visiblity:"hidden"}).show()}x=s.elements.tooltip.offset();if(w){s.elements.tooltip.css({visiblity:"visible"}).hide()}return x},getDimensions:function(){var w,x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getDimensions")}w=(!s.elements.tooltip.is(":visible"))?true:false;if(w){s.elements.tooltip.css({visiblity:"hidden"}).show()}x={height:s.elements.tooltip.outerHeight(),width:s.elements.tooltip.outerWidth()};if(w){s.elements.tooltip.css({visiblity:"visible"}).hide()}return x}})}function p(){var s,w,u,t,v,y,x;s=this;s.beforeRender.call(s);s.status.rendered=true;s.elements.tooltip='';s.elements.tooltip=f(s.elements.tooltip);s.elements.tooltip.appendTo(s.options.position.container);s.elements.tooltip.data("qtip",{current:0,interfaces:[s]});s.elements.wrapper=s.elements.tooltip.children("div:first");s.elements.contentWrapper=s.elements.wrapper.children("div:first").css({background:s.options.style.background});s.elements.content=s.elements.contentWrapper.children("div:first").css(q(s.options.style));if(f.browser.msie){s.elements.wrapper.add(s.elements.content).css({zoom:1})}if(s.options.hide.when.event=="unfocus"){s.elements.tooltip.attr("unfocus",true)}if(typeof s.options.style.width.value=="number"){s.updateWidth()}if(f("").get(0).getContext||f.browser.msie){if(s.options.style.border.radius>0){m.call(s)}else{s.elements.contentWrapper.css({border:s.options.style.border.width+"px solid "+s.options.style.border.color})}if(s.options.style.tip.corner!==false){e.call(s)}}else{s.elements.contentWrapper.css({border:s.options.style.border.width+"px solid "+s.options.style.border.color});s.options.style.border.radius=0;s.options.style.tip.corner=false;f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.CANVAS_VML_NOT_SUPPORTED,"render")}if((typeof s.options.content.text=="string"&&s.options.content.text.length>0)||(s.options.content.text.jquery&&s.options.content.text.length>0)){u=s.options.content.text}else{if(typeof s.elements.target.attr("title")=="string"&&s.elements.target.attr("title").length>0){u=s.elements.target.attr("title").replace("\\n","
");s.elements.target.attr("title","")}else{if(typeof s.elements.target.attr("alt")=="string"&&s.elements.target.attr("alt").length>0){u=s.elements.target.attr("alt").replace("\\n","
");s.elements.target.attr("alt","")}else{u=" ";f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.NO_VALID_CONTENT,"render")}}}if(s.options.content.title.text!==false){j.call(s)}s.updateContent(u);l.call(s);if(s.options.show.ready===true){s.show()}if(s.options.content.url!==false){t=s.options.content.url;v=s.options.content.data;y=s.options.content.method||"get";s.loadContent(t,v,y)}s.onRender.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_RENDERED,"render")}function m(){var F,z,t,B,x,E,u,G,D,y,w,C,A,s,v;F=this;F.elements.wrapper.find(".qtip-borderBottom, .qtip-borderTop").remove();t=F.options.style.border.width;B=F.options.style.border.radius;x=F.options.style.border.color||F.options.style.tip.color;E=g(B);u={};for(z in E){u[z]='
';if(f("").get(0).getContext){u[z]+=''}else{if(f.browser.msie){G=B*2+3;u[z]+=''}}u[z]+="
"}D=F.getDimensions().width-(Math.max(t,B)*2);y='
';w='
'+u.topLeft+u.topRight+y;F.elements.wrapper.prepend(w);C='
'+u.bottomLeft+u.bottomRight+y;F.elements.wrapper.append(C);if(f("").get(0).getContext){F.elements.wrapper.find("canvas").each(function(){A=E[f(this).parent("[rel]:first").attr("rel")];r.call(F,f(this),A,B,x)})}else{if(f.browser.msie){F.elements.tooltip.append('')}}s=Math.max(B,(B+(t-B)));v=Math.max(t-B,0);F.elements.contentWrapper.css({border:"0px solid "+x,borderWidth:v+"px "+s+"px"})}function r(u,w,s,t){var v=u.get(0).getContext("2d");v.fillStyle=t;v.beginPath();v.arc(w[0],w[1],s,0,Math.PI*2,false);v.fill()}function e(v){var t,s,x,u,w;t=this;if(t.elements.tip!==null){t.elements.tip.remove()}s=t.options.style.tip.color||t.options.style.border.color;if(t.options.style.tip.corner===false){return}else{if(!v){v=t.options.style.tip.corner}}x=b(v,t.options.style.tip.size.width,t.options.style.tip.size.height);t.elements.tip='
';if(f("").get(0).getContext){t.elements.tip+=''}else{if(f.browser.msie){u=t.options.style.tip.size.width+","+t.options.style.tip.size.height;w="m"+x[0][0]+","+x[0][1];w+=" l"+x[1][0]+","+x[1][1];w+=" "+x[2][0]+","+x[2][1];w+=" xe";t.elements.tip+='';t.elements.tip+='';t.elements.contentWrapper.css("position","relative")}}t.elements.tooltip.prepend(t.elements.tip+"
");t.elements.tip=t.elements.tooltip.find("."+t.options.style.classes.tip).eq(0);if(f("").get(0).getContext){h.call(t,t.elements.tip.find("canvas:first"),x,s)}if(v.search(/top/)!==-1&&f.browser.msie&&parseInt(f.browser.version.charAt(0))===6){t.elements.tip.css({marginTop:-4})}n.call(t,v)}function h(t,v,s){var u=t.get(0).getContext("2d");u.fillStyle=s;u.beginPath();u.moveTo(v[0][0],v[0][1]);u.lineTo(v[1][0],v[1][1]);u.lineTo(v[2][0],v[2][1]);u.fill()}function n(u){var t,w,s,x,v;t=this;if(t.options.style.tip.corner===false||!t.elements.tip){return}if(!u){u=t.elements.tip.attr("rel")}w=positionAdjust=(f.browser.msie)?1:0;t.elements.tip.css(u.match(/left|right|top|bottom/)[0],0);if(u.search(/top|bottom/)!==-1){if(f.browser.msie){if(parseInt(f.browser.version.charAt(0))===6){positionAdjust=(u.search(/top/)!==-1)?-3:1}else{positionAdjust=(u.search(/top/)!==-1)?1:2}}if(u.search(/Middle/)!==-1){t.elements.tip.css({left:"50%",marginLeft:-(t.options.style.tip.size.width/2)})}else{if(u.search(/Left/)!==-1){t.elements.tip.css({left:t.options.style.border.radius-w})}else{if(u.search(/Right/)!==-1){t.elements.tip.css({right:t.options.style.border.radius+w})}}}if(u.search(/top/)!==-1){t.elements.tip.css({top:-positionAdjust})}else{t.elements.tip.css({bottom:positionAdjust})}}else{if(u.search(/left|right/)!==-1){if(f.browser.msie){positionAdjust=(parseInt(f.browser.version.charAt(0))===6)?1:((u.search(/left/)!==-1)?1:2)}if(u.search(/Middle/)!==-1){t.elements.tip.css({top:"50%",marginTop:-(t.options.style.tip.size.height/2)})}else{if(u.search(/Top/)!==-1){t.elements.tip.css({top:t.options.style.border.radius-w})}else{if(u.search(/Bottom/)!==-1){t.elements.tip.css({bottom:t.options.style.border.radius+w})}}}if(u.search(/left/)!==-1){t.elements.tip.css({left:-positionAdjust})}else{t.elements.tip.css({right:positionAdjust})}}}s="padding-"+u.match(/left|right|top|bottom/)[0];x=t.options.style.tip.size[(s.search(/left|right/)!==-1)?"width":"height"];t.elements.tooltip.css("padding",0);t.elements.tooltip.css(s,x);if(f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){v=parseInt(t.elements.tip.css("margin-top"))||0;v+=parseInt(t.elements.content.css("margin-top"))||0;t.elements.tip.css({marginTop:v})}}function j(){var s=this;if(s.elements.title!==null){s.elements.title.remove()}s.elements.title=f('
').css(q(s.options.style.title,true)).css({zoom:(f.browser.msie)?1:0}).prependTo(s.elements.contentWrapper);if(s.options.content.title.text){s.updateTitle.call(s,s.options.content.title.text)}if(s.options.content.title.button!==false&&typeof s.options.content.title.button=="string"){s.elements.button=f('').css(q(s.options.style.button,true)).html(s.options.content.title.button).prependTo(s.elements.title).click(function(t){if(!s.status.disabled){s.hide(t)}})}}function l(){var t,v,u,s;t=this;v=t.options.show.when.target;u=t.options.hide.when.target;if(t.options.hide.fixed){u=u.add(t.elements.tooltip)}if(t.options.hide.when.event=="inactive"){s=["click","dblclick","mousedown","mouseup","mousemove","mouseout","mouseenter","mouseleave","mouseover"];function y(z){if(t.status.disabled===true){return}clearTimeout(t.timers.inactive);t.timers.inactive=setTimeout(function(){f(s).each(function(){u.unbind(this+".qtip-inactive");t.elements.content.unbind(this+".qtip-inactive")});t.hide(z)},t.options.hide.delay)}}else{if(t.options.hide.fixed===true){t.elements.tooltip.bind("mouseover.qtip",function(){if(t.status.disabled===true){return}clearTimeout(t.timers.hide)})}}function x(z){if(t.status.disabled===true){return}if(t.options.hide.when.event=="inactive"){f(s).each(function(){u.bind(this+".qtip-inactive",y);t.elements.content.bind(this+".qtip-inactive",y)});y()}clearTimeout(t.timers.show);clearTimeout(t.timers.hide);t.timers.show=setTimeout(function(){t.show(z)},t.options.show.delay)}function w(z){if(t.status.disabled===true){return}if(t.options.hide.fixed===true&&t.options.hide.when.event.search(/mouse(out|leave)/i)!==-1&&f(z.relatedTarget).parents("div.qtip[qtip]").length>0){z.stopPropagation();z.preventDefault();clearTimeout(t.timers.hide);return false}clearTimeout(t.timers.show);clearTimeout(t.timers.hide);t.elements.tooltip.stop(true,true);t.timers.hide=setTimeout(function(){t.hide(z)},t.options.hide.delay)}if((t.options.show.when.target.add(t.options.hide.when.target).length===1&&t.options.show.when.event==t.options.hide.when.event&&t.options.hide.when.event!=="inactive")||t.options.hide.when.event=="unfocus"){t.cache.toggle=0;v.bind(t.options.show.when.event+".qtip",function(z){if(t.cache.toggle==0){x(z)}else{w(z)}})}else{v.bind(t.options.show.when.event+".qtip",x);if(t.options.hide.when.event!=="inactive"){u.bind(t.options.hide.when.event+".qtip",w)}}if(t.options.position.type.search(/(fixed|absolute)/)!==-1){t.elements.tooltip.bind("mouseover.qtip",t.focus)}if(t.options.position.target==="mouse"&&t.options.position.type!=="static"){v.bind("mousemove.qtip",function(z){t.cache.mouse={x:z.pageX,y:z.pageY};if(t.status.disabled===false&&t.options.position.adjust.mouse===true&&t.options.position.type!=="static"&&t.elements.tooltip.css("display")!=="none"){t.updatePosition(z)}})}}function o(u,v,A){var z,s,x,y,t,w;z=this;if(A.corner=="center"){return v.position}s=f.extend({},u);y={x:false,y:false};t={left:(s.left=f.fn.qtip.cache.screen.width+f.fn.qtip.cache.screen.scroll.left),top:(s.top=f.fn.qtip.cache.screen.height+f.fn.qtip.cache.screen.scroll.top)};x={left:(t.left&&(A.corner.search(/right/i)!=-1||(A.corner.search(/right/i)==-1&&!t.right))),right:(t.right&&(A.corner.search(/left/i)!=-1||(A.corner.search(/left/i)==-1&&!t.left))),top:(t.top&&A.corner.search(/top/i)==-1),bottom:(t.bottom&&A.corner.search(/bottom/i)==-1)};if(x.left){if(z.options.position.target!=="mouse"){s.left=v.position.left+v.dimensions.width}else{s.left=z.cache.mouse.x}y.x="Left"}else{if(x.right){if(z.options.position.target!=="mouse"){s.left=v.position.left-A.dimensions.width}else{s.left=z.cache.mouse.x-A.dimensions.width}y.x="Right"}}if(x.top){if(z.options.position.target!=="mouse"){s.top=v.position.top+v.dimensions.height}else{s.top=z.cache.mouse.y}y.y="top"}else{if(x.bottom){if(z.options.position.target!=="mouse"){s.top=v.position.top-A.dimensions.height}else{s.top=z.cache.mouse.y-A.dimensions.height}y.y="bottom"}}if(s.left<0){s.left=u.left;y.x=false}if(s.top<0){s.top=u.top;y.y=false}if(z.options.style.tip.corner!==false){s.corner=new String(A.corner);if(y.x!==false){s.corner=s.corner.replace(/Left|Right|Middle/,y.x)}if(y.y!==false){s.corner=s.corner.replace(/top|bottom/,y.y)}if(s.corner!==z.elements.tip.attr("rel")){e.call(z,s.corner)}}return s}function q(u,t){var v,s;v=f.extend(true,{},u);for(s in v){if(t===true&&s.search(/(tip|classes)/i)!==-1){delete v[s]}else{if(!t&&s.search(/(width|border|tip|title|classes|user)/i)!==-1){delete v[s]}}}return v}function c(s){if(typeof s.tip!=="object"){s.tip={corner:s.tip}}if(typeof s.tip.size!=="object"){s.tip.size={width:s.tip.size,height:s.tip.size}}if(typeof s.border!=="object"){s.border={width:s.border}}if(typeof s.width!=="object"){s.width={value:s.width}}if(typeof s.width.max=="string"){s.width.max=parseInt(s.width.max.replace(/([0-9]+)/i,"$1"))}if(typeof s.width.min=="string"){s.width.min=parseInt(s.width.min.replace(/([0-9]+)/i,"$1"))}if(typeof s.tip.size.x=="number"){s.tip.size.width=s.tip.size.x;delete s.tip.size.x}if(typeof s.tip.size.y=="number"){s.tip.size.height=s.tip.size.y;delete s.tip.size.y}return s}function a(){var s,t,u,x,v,w;s=this;u=[true,{}];for(t=0;t0){v.tip.size.width+=1}if(v.tip.size.height%2>0){v.tip.size.height+=1}if(v.tip.corner===true){v.tip.corner=(s.options.position.corner.tooltip==="center")?false:s.options.position.corner.tooltip}return v}function b(v,u,t){var s={bottomRight:[[0,0],[u,t],[u,0]],bottomLeft:[[0,0],[u,0],[0,t]],topRight:[[0,t],[u,0],[u,t]],topLeft:[[0,0],[0,t],[u,t]],topMiddle:[[0,t],[u/2,0],[u,t]],bottomMiddle:[[0,0],[u,0],[u/2,t]],rightMiddle:[[0,0],[u,t/2],[0,t]],leftMiddle:[[u,0],[u,t],[0,t/2]]};s.leftTop=s.bottomRight;s.rightTop=s.bottomLeft;s.leftBottom=s.topRight;s.rightBottom=s.topLeft;return s[v]}function g(s){var t;if(f("").get(0).getContext){t={topLeft:[s,s],topRight:[0,s],bottomLeft:[s,0],bottomRight:[0,0]}}else{if(f.browser.msie){t={topLeft:[-90,90,0],topRight:[-90,90,-s],bottomLeft:[90,270,0],bottomRight:[90,270,-s]}}}return t}function k(){var s,t,u;s=this;u=s.getDimensions();t='