diff --git a/includes/fullcalendar/cupertino.css b/includes/fullcalendar/cupertino.css
deleted file mode 100644
index 2b79a91..0000000
--- a/includes/fullcalendar/cupertino.css
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * jQuery UI CSS Framework 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and ../../images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
-
-
-/*
- * jQuery UI CSS Framework 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=02_glass.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=02_glass.png&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=04_highlight_hard.png&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #dddddd; background: #f2f5f7 url(../../images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; }
-.ui-widget-content a { color: #362b36; }
-.ui-widget-header { border: 1px solid #aed0ea; background: #deedf7 url(../../images/ui-bg_highlight-soft_100_deedf7_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
-.ui-widget-header a { color: #222222; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; background: #d7ebf9 url(../../images/ui-bg_glass_80_d7ebf9_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2779aa; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; background: #e4f1fb url(../../images/ui-bg_glass_100_e4f1fb_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #0070a3; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #2694e8; background: #3baae3 url(../../images/ui-bg_glass_50_3baae3_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #ffef8f url(../../images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a url(../../images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and ../../images */
-.ui-icon { width: 16px; height: 16px; background-image: url(../../images/ui-icons_72a7cf_256x240.png); }
-.ui-widget-content .ui-icon {background-image: url(../../images/ui-icons_72a7cf_256x240.png); }
-.ui-widget-header .ui-icon {background-image: url(../../images/ui-icons_72a7cf_256x240.png); }
-.ui-state-default .ui-icon { background-image: url(../../images/ui-icons_3d80b3_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../../images/ui-icons_2694e8_256x240.png); }
-.ui-state-active .ui-icon {background-image: url(../../images/ui-icons_ffffff_256x240.png); }
-.ui-state-highlight .ui-icon {background-image: url(../../images/ui-icons_2e83ff_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../../images/ui-icons_ffffff_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; }
-.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
-.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
-.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
-.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
-.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
-.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }
-
-/* Overlays */
-.ui-widget-overlay { background: #eeeeee url(../../images/ui-bg_diagonals-thick_90_eeeeee_40x40.png) 50% 50% repeat; opacity: .80;filter:Alpha(Opacity=80); }
-.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #000000 url(../../images/ui-bg_highlight-hard_70_000000_1x100.png) 50% top repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
- * jQuery UI Resizable 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
- * jQuery UI Tabs 1.8.11
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs#theming
- */
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/includes/fullcalendar/fullcalendar.css b/includes/fullcalendar/fullcalendar.css
deleted file mode 100644
index 04f1184..0000000
--- a/includes/fullcalendar/fullcalendar.css
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * FullCalendar v1.5.3 Stylesheet
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
- */
-
-
-.fc {
- direction: ltr;
- text-align: left;
- }
-
-.fc table {
- border-collapse: collapse;
- border-spacing: 0;
- }
-
-html .fc,
-.fc table {
- font-size: 1em;
- }
-
-.fc td,
-.fc th {
- padding: 0;
- vertical-align: top;
- }
-
-
-
-/* Header
-------------------------------------------------------------------------*/
-
-.fc-header td {
- white-space: nowrap;
- }
-
-.fc-header-left {
- width: 25%;
- text-align: left;
- }
-
-.fc-header-center {
- text-align: center;
- }
-
-.fc-header-right {
- width: 25%;
- text-align: right;
- }
-
-.fc-header-title {
- display: inline-block;
- vertical-align: top;
- }
-
-.fc-header-title h2 {
- margin-top: 0;
- white-space: nowrap;
- }
-
-.fc .fc-header-space {
- padding-left: 10px;
- }
-
-.fc-header .fc-button {
- margin-bottom: 1em;
- vertical-align: top;
- }
-
-/* buttons edges butting together */
-
-.fc-header .fc-button {
- margin-right: -1px;
- }
-
-.fc-header .fc-corner-right {
- margin-right: 1px; /* back to normal */
- }
-
-.fc-header .ui-corner-right {
- margin-right: 0; /* back to normal */
- }
-
-/* button layering (for border precedence) */
-
-.fc-header .fc-state-hover,
-.fc-header .ui-state-hover {
- z-index: 2;
- }
-
-.fc-header .fc-state-down {
- z-index: 3;
- }
-
-.fc-header .fc-state-active,
-.fc-header .ui-state-active {
- z-index: 4;
- }
-
-
-
-/* Content
-------------------------------------------------------------------------*/
-
-.fc-content {
- clear: both;
- }
-
-.fc-view {
- width: 100%; /* needed for view switching (when view is absolute) */
- overflow: hidden;
- }
-
-
-
-/* Cell Styles
-------------------------------------------------------------------------*/
-
-.fc-widget-header, /*
, usually */
-.fc-widget-content { /* | , usually */
- border: 1px solid #ccc;
- }
-
-.fc-state-highlight { /* | today cell */ /* TODO: add .fc-today to | */
- background: #ffc;
- }
-
-.fc-cell-overlay { /* semi-transparent rectangle while dragging */
- background: #9cf;
- opacity: .2;
- filter: alpha(opacity=20); /* for IE */
- }
-
-
-
-/* Buttons
-------------------------------------------------------------------------*/
-
-.fc-button {
- position: relative;
- display: inline-block;
- cursor: pointer;
- }
-
-.fc-state-default { /* non-theme */
- border-style: solid;
- border-width: 1px 0;
- }
-
-.fc-button-inner {
- position: relative;
- float: left;
- overflow: hidden;
- }
-
-.fc-state-default .fc-button-inner { /* non-theme */
- border-style: solid;
- border-width: 0 1px;
- }
-
-.fc-button-content {
- position: relative;
- float: left;
- height: 1.9em;
- line-height: 1.9em;
- padding: 0 .6em;
- white-space: nowrap;
- }
-
-/* icon (for jquery ui) */
-
-.fc-button-content .fc-icon-wrap {
- position: relative;
- float: left;
- top: 50%;
- }
-
-.fc-button-content .ui-icon {
- position: relative;
- float: left;
- margin-top: -50%;
- *margin-top: 0;
- *top: -50%;
- }
-
-/* gloss effect */
-
-.fc-state-default .fc-button-effect {
- position: absolute;
- top: 50%;
- left: 0;
- }
-
-.fc-state-default .fc-button-effect span {
- position: absolute;
- top: -100px;
- left: 0;
- width: 500px;
- height: 100px;
- border-width: 100px 0 0 1px;
- border-style: solid;
- border-color: #fff;
- background: #444;
- opacity: .09;
- filter: alpha(opacity=9);
- }
-
-/* button states (determines colors) */
-
-.fc-state-default,
-.fc-state-default .fc-button-inner {
- border-style: solid;
- border-color: #ccc #bbb #aaa;
- background: #F3F3F3;
- color: #000;
- }
-
-.fc-state-hover,
-.fc-state-hover .fc-button-inner {
- border-color: #999;
- }
-
-.fc-state-down,
-.fc-state-down .fc-button-inner {
- border-color: #555;
- background: #777;
- }
-
-.fc-state-active,
-.fc-state-active .fc-button-inner {
- border-color: #555;
- background: #777;
- color: #fff;
- }
-
-.fc-state-disabled,
-.fc-state-disabled .fc-button-inner {
- color: #999;
- border-color: #ddd;
- }
-
-.fc-state-disabled {
- cursor: default;
- }
-
-.fc-state-disabled .fc-button-effect {
- display: none;
- }
-
-
-
-/* Global Event Styles
-------------------------------------------------------------------------*/
-
-.fc-event {
- border-style: solid;
- border-width: 0;
- font-size: .85em;
- cursor: default;
- }
-
-a.fc-event,
-.fc-event-draggable {
- cursor: pointer;
- }
-
-a.fc-event {
- text-decoration: none;
- }
-
-.fc-rtl .fc-event {
- text-align: right;
- }
-
-.fc-event-skin {
- border-color: #36c; /* default BORDER color */
- background-color: #36c; /* default BACKGROUND color */
- color: #fff; /* default TEXT color */
- }
-
-.fc-event-inner {
- position: relative;
- width: 100%;
- height: 100%;
- border-style: solid;
- border-width: 0;
- overflow: hidden;
- }
-
-.fc-event-time,
-.fc-event-title {
- padding: 0 1px;
- }
-
-.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
- display: block;
- position: absolute;
- z-index: 99999;
- overflow: hidden; /* hacky spaces (IE6/7) */
- font-size: 300%; /* */
- line-height: 50%; /* */
- }
-
-
-
-/* Horizontal Events
-------------------------------------------------------------------------*/
-
-.fc-event-hori {
- border-width: 1px 0;
- margin-bottom: 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 */
- }
-
-
-
-/* Fake Rounded Corners (for buttons and events)
-------------------------------------------------------------*/
-
-.fc-corner-left {
- margin-left: 1px;
- }
-
-.fc-corner-left .fc-button-inner,
-.fc-corner-left .fc-event-inner {
- margin-left: -1px;
- }
-
-.fc-corner-right {
- margin-right: 1px;
- }
-
-.fc-corner-right .fc-button-inner,
-.fc-corner-right .fc-event-inner {
- margin-right: -1px;
- }
-
-.fc-corner-top {
- margin-top: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- margin-top: -1px;
- }
-
-.fc-corner-bottom {
- margin-bottom: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- margin-bottom: -1px;
- }
-
-
-
-/* Fake Rounded Corners SPECIFICALLY FOR EVENTS
------------------------------------------------------------------*/
-
-.fc-corner-left .fc-event-inner {
- border-left-width: 1px;
- }
-
-.fc-corner-right .fc-event-inner {
- border-right-width: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- border-top-width: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- border-bottom-width: 1px;
- }
-
-
-
-/* Reusable Separate-border Table
-------------------------------------------------------------*/
-
-table.fc-border-separate {
- border-collapse: separate;
- }
-
-.fc-border-separate th,
-.fc-border-separate td {
- border-width: 1px 0 0 1px;
- }
-
-.fc-border-separate th.fc-last,
-.fc-border-separate td.fc-last {
- border-right-width: 1px;
- }
-
-.fc-border-separate tr.fc-last th,
-.fc-border-separate tr.fc-last td {
- border-bottom-width: 1px;
- }
-
-.fc-border-separate tbody tr.fc-first td,
-.fc-border-separate tbody tr.fc-first th {
- border-top-width: 0;
- }
-
-
-
-/* Month View, Basic Week View, Basic Day View
-------------------------------------------------------------------------*/
-
-.fc-grid th {
- text-align: center;
- }
-
-.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 1px; /* distance between events and day edges */
- }
-
-/* event styles */
-
-.fc-grid .fc-event-time {
- font-weight: bold;
- }
-
-/* right-to-left */
-
-.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-agenda table {
- border-collapse: separate;
- }
-
-.fc-agenda-days th {
- text-align: center;
- }
-
-.fc-agenda .fc-agenda-axis {
- width: 50px;
- padding: 0 4px;
- vertical-align: middle;
- text-align: right;
- white-space: nowrap;
- font-weight: normal;
- }
-
-.fc-agenda .fc-day-content {
- padding: 2px 2px 1px;
- }
-
-/* make axis border take precedence */
-
-.fc-agenda-days .fc-agenda-axis {
- border-right-width: 1px;
- }
-
-.fc-agenda-days .fc-col0 {
- border-left-width: 0;
- }
-
-/* all-day area */
-
-.fc-agenda-allday th {
- border-width: 0 1px;
- }
-
-.fc-agenda-allday .fc-day-content {
- min-height: 34px; /* TODO: doesnt work well in quirksmode */
- _height: 34px;
- }
-
-/* divider (between all-day and slots) */
-
-.fc-agenda-divider-inner {
- height: 2px;
- overflow: hidden;
- }
-
-.fc-widget-header .fc-agenda-divider-inner {
- background: #eee;
- }
-
-/* slot rows */
-
-.fc-agenda-slots th {
- border-width: 1px 1px 0;
- }
-
-.fc-agenda-slots td {
- border-width: 1px 0 0;
- background: none;
- }
-
-.fc-agenda-slots td div {
- height: 20px;
- }
-
-.fc-agenda-slots tr.fc-slot0 th,
-.fc-agenda-slots tr.fc-slot0 td {
- border-top-width: 0;
- }
-
-.fc-agenda-slots tr.fc-minor th,
-.fc-agenda-slots tr.fc-minor td {
- border-top-style: dotted;
- }
-
-.fc-agenda-slots tr.fc-minor th.ui-widget-header {
- *border-top-style: solid; /* doesn't work with background in IE6/7 */
- }
-
-
-
-/* Vertical Events
-------------------------------------------------------------------------*/
-
-.fc-event-vert {
- border-width: 0 1px;
- }
-
-.fc-event-vert .fc-event-head,
-.fc-event-vert .fc-event-content {
- position: relative;
- z-index: 2;
- width: 100%;
- overflow: hidden;
- }
-
-.fc-event-vert .fc-event-time {
- white-space: nowrap;
- font-size: 10px;
- }
-
-.fc-event-vert .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);
- }
-
-.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */
-.fc-select-helper .fc-event-bg {
- display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */
- }
-
-/* resizable */
-
-.fc-event-vert .ui-resizable-s {
- bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */
- width: 100% !important;
- height: 8px !important;
- overflow: hidden !important;
- line-height: 8px !important;
- font-size: 11px !important;
- font-family: monospace;
- text-align: center;
- cursor: s-resize;
- }
-
-.fc-agenda .ui-resizable-resizing { /* TODO: better selector */
- _overflow: hidden;
- }
-
-
diff --git a/includes/fullcalendar/fullcalendar.js b/includes/fullcalendar/fullcalendar.js
deleted file mode 100644
index 779a313..0000000
--- a/includes/fullcalendar/fullcalendar.js
+++ /dev/null
@@ -1,5224 +0,0 @@
-/**
- * @preserve
- * FullCalendar v1.5.3
- * 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) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
- */
-
-(function($, undefined) {
-
-
-var defaults = {
-
- // display
- defaultView: 'month',
- aspectRatio: 1.35,
- header: {
- left: 'title',
- center: '',
- right: 'today prev,next'
- },
- weekends: true,
-
- // editing
- //editable: false,
- //disableDragging: false,
- //disableResizing: false,
-
- allDayDefault: true,
- ignoreTimezone: true,
-
- // event ajax
- lazyFetching: true,
- startParam: 'start',
- endParam: 'end',
-
- // time formats
- titleFormat: {
- month: 'MMMM yyyy',
- week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
- day: 'dddd, MMM d, yyyy'
- },
- columnFormat: {
- month: 'ddd',
- week: 'ddd M/d',
- day: 'dddd M/d'
- },
- timeFormat: { // for event elements
- '': 'h(:mm)t' // default
- },
-
- // locale
- isRTL: false,
- firstDay: 0,
- monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
- monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
- dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
- dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
- buttonText: {
- prev: ' ◄ ',
- next: ' ► ',
- prevYear: ' << ',
- nextYear: ' >> ',
- today: 'today',
- month: 'month',
- week: 'week',
- day: 'day'
- },
-
- // jquery-ui theming
- theme: false,
- buttonIcons: {
- prev: 'circle-triangle-w',
- next: 'circle-triangle-e'
- },
-
- //selectable: false,
- unselectAuto: true,
-
- dropAccept: '*'
-
-};
-
-// right-to-left defaults
-var rtlDefaults = {
- header: {
- left: 'next,prev today',
- center: '',
- right: 'title'
- },
- buttonText: {
- prev: ' ► ',
- next: ' ◄ ',
- prevYear: ' >> ',
- nextYear: ' << '
- },
- buttonIcons: {
- prev: 'circle-triangle-e',
- next: 'circle-triangle-w'
- }
-};
-
-
-
-var fc = $.fullCalendar = { version: "1.5.3" };
-var fcViews = fc.views = {};
-
-
-$.fn.fullCalendar = function(options) {
-
-
- // method calling
- if (typeof options == 'string') {
- var args = Array.prototype.slice.call(arguments, 1);
- var res;
- this.each(function() {
- var calendar = $.data(this, 'fullCalendar');
- if (calendar && $.isFunction(calendar[options])) {
- var r = calendar[options].apply(calendar, args);
- if (res === undefined) {
- res = r;
- }
- if (options == 'destroy') {
- $.removeData(this, 'fullCalendar');
- }
- }
- });
- if (res !== undefined) {
- return res;
- }
- return this;
- }
-
-
- // would like to have this logic in EventManager, but needs to happen before options are recursively extended
- var eventSources = options.eventSources || [];
- delete options.eventSources;
- if (options.events) {
- eventSources.push(options.events);
- delete options.events;
- }
-
-
- options = $.extend(true, {},
- defaults,
- (options.isRTL || options.isRTL===undefined && defaults.isRTL) ? rtlDefaults : {},
- options
- );
-
-
- this.each(function(i, _element) {
- var element = $(_element);
- var calendar = new Calendar(element, options, eventSources);
- element.data('fullCalendar', calendar); // TODO: look into memory leak implications
- calendar.render();
- });
-
-
- return this;
-
-};
-
-
-// function for adding/overriding defaults
-function setDefaults(d) {
- $.extend(true, defaults, d);
-}
-
-
-
-
-function Calendar(element, options, eventSources) {
- var t = this;
-
-
- // exports
- t.options = options;
- t.render = render;
- t.destroy = destroy;
- t.refetchEvents = refetchEvents;
- t.reportEvents = reportEvents;
- t.reportEventChange = reportEventChange;
- t.rerenderEvents = rerenderEvents;
- t.changeView = changeView;
- t.select = select;
- t.unselect = unselect;
- t.prev = prev;
- t.next = next;
- t.prevYear = prevYear;
- t.nextYear = nextYear;
- t.today = today;
- t.gotoDate = gotoDate;
- t.incrementDate = incrementDate;
- t.formatDate = function(format, date) { return formatDate(format, date, options) };
- t.formatDates = function(format, date1, date2) { return formatDates(format, date1, date2, options) };
- t.getDate = getDate;
- t.getView = getView;
- t.option = option;
- t.trigger = trigger;
-
-
- // imports
- EventManager.call(t, options, eventSources);
- var isFetchNeeded = t.isFetchNeeded;
- var fetchEvents = t.fetchEvents;
-
-
- // locals
- var _element = element[0];
- var header;
- var headerElement;
- var content;
- var tm; // for making theme classes
- var currentView;
- var viewInstances = {};
- var elementOuterWidth;
- var suggestedViewHeight;
- var absoluteViewElement;
- var resizeUID = 0;
- var ignoreWindowResize = 0;
- var date = new Date();
- var events = [];
- var _dragElement;
-
-
-
- /* Main Rendering
- -----------------------------------------------------------------------------*/
-
-
- setYMD(date, options.year, options.month, options.date);
-
-
- function render(inc) {
- if (!content) {
- initialRender();
- }else{
- calcSize();
- markSizesDirty();
- markEventsDirty();
- renderView(inc);
- }
- }
-
-
- function initialRender() {
- tm = options.theme ? 'ui' : 'fc';
- element.addClass('fc');
- if (options.isRTL) {
- element.addClass('fc-rtl');
- }
- if (options.theme) {
- element.addClass('ui-widget');
- }
- content = $("")
- .prependTo(element);
- header = new Header(t, options);
- headerElement = header.render();
- if (headerElement) {
- element.prepend(headerElement);
- }
- changeView(options.defaultView);
- $(window).resize(windowResize);
- // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize
- if (!bodyVisible()) {
- lateRender();
- }
- }
-
-
- // called when we know the calendar couldn't be rendered when it was initialized,
- // but we think it's ready now
- function lateRender() {
- setTimeout(function() { // IE7 needs this so dimensions are calculated correctly
- if (!currentView.start && bodyVisible()) { // !currentView.start makes sure this never happens more than once
- renderView();
- }
- },0);
- }
-
-
- function destroy() {
- $(window).unbind('resize', windowResize);
- header.destroy();
- content.remove();
- element.removeClass('fc fc-rtl ui-widget');
- }
-
-
-
- function elementVisible() {
- return _element.offsetWidth !== 0;
- }
-
-
- function bodyVisible() {
- return $('body')[0].offsetWidth !== 0;
- }
-
-
-
- /* View Rendering
- -----------------------------------------------------------------------------*/
-
- // TODO: improve view switching (still weird transition in IE, and FF has whiteout problem)
-
- function changeView(newViewName) {
- if (!currentView || newViewName != currentView.name) {
- ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached
-
- unselect();
-
- var oldView = currentView;
- var newViewElement;
-
- if (oldView) {
- (oldView.beforeHide || noop)(); // called before changing min-height. if called after, scroll state is reset (in Opera)
- setMinHeight(content, content.height());
- oldView.element.hide();
- }else{
- setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated
- }
- content.css('overflow', 'hidden');
-
- currentView = viewInstances[newViewName];
- if (currentView) {
- currentView.element.show();
- }else{
- currentView = viewInstances[newViewName] = new fcViews[newViewName](
- newViewElement = absoluteViewElement =
- $("")
- .appendTo(content),
- t // the calendar object
- );
- }
-
- if (oldView) {
- header.deactivateButton(oldView.name);
- }
- header.activateButton(newViewName);
-
- renderView(); // after height has been set, will make absoluteViewElement's position=relative, then set to null
-
- content.css('overflow', '');
- if (oldView) {
- setMinHeight(content, 1);
- }
-
- if (!newViewElement) {
- (currentView.afterShow || noop)(); // called after setting min-height/overflow, so in final scroll state (for Opera)
- }
-
- ignoreWindowResize--;
- }
- }
-
-
-
- function renderView(inc) {
- if (elementVisible()) {
- ignoreWindowResize++; // because renderEvents might temporarily change the height before setSize is reached
-
- unselect();
-
- if (suggestedViewHeight === undefined) {
- calcSize();
- }
-
- var forceEventRender = false;
- if (!currentView.start || inc || date < currentView.start || date >= currentView.end) {
- // view must render an entire new date range (and refetch/render events)
- currentView.render(date, inc || 0); // responsible for clearing events
- setSize(true);
- forceEventRender = true;
- }
- else if (currentView.sizeDirty) {
- // view must resize (and rerender events)
- currentView.clearEvents();
- setSize();
- forceEventRender = true;
- }
- else if (currentView.eventsDirty) {
- currentView.clearEvents();
- forceEventRender = true;
- }
- currentView.sizeDirty = false;
- currentView.eventsDirty = false;
- updateEvents(forceEventRender);
-
- elementOuterWidth = element.outerWidth();
-
- header.updateTitle(currentView.title);
- var today = new Date();
- if (today >= currentView.start && today < currentView.end) {
- header.disableButton('today');
- }else{
- header.enableButton('today');
- }
-
- ignoreWindowResize--;
- currentView.trigger('viewDisplay', _element);
- }
- }
-
-
-
- /* Resizing
- -----------------------------------------------------------------------------*/
-
-
- function updateSize() {
- markSizesDirty();
- if (elementVisible()) {
- calcSize();
- setSize();
- unselect();
- currentView.clearEvents();
- currentView.renderEvents(events);
- currentView.sizeDirty = false;
- }
- }
-
-
- function markSizesDirty() {
- $.each(viewInstances, function(i, inst) {
- inst.sizeDirty = true;
- });
- }
-
-
- function calcSize() {
- if (options.contentHeight) {
- suggestedViewHeight = options.contentHeight;
- }
- else if (options.height) {
- suggestedViewHeight = options.height - (headerElement ? headerElement.height() : 0) - vsides(content);
- }
- else {
- suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));
- }
- }
-
-
- function setSize(dateChanged) { // todo: dateChanged?
- ignoreWindowResize++;
- currentView.setHeight(suggestedViewHeight, dateChanged);
- if (absoluteViewElement) {
- absoluteViewElement.css('position', 'relative');
- absoluteViewElement = null;
- }
- currentView.setWidth(content.width(), dateChanged);
- ignoreWindowResize--;
- }
-
-
- function windowResize() {
- if (!ignoreWindowResize) {
- if (currentView.start) { // view has already been rendered
- var uid = ++resizeUID;
- setTimeout(function() { // add a delay
- if (uid == resizeUID && !ignoreWindowResize && elementVisible()) {
- if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) {
- ignoreWindowResize++; // in case the windowResize callback changes the height
- updateSize();
- currentView.trigger('windowResize', _element);
- ignoreWindowResize--;
- }
- }
- }, 200);
- }else{
- // calendar must have been initialized in a 0x0 iframe that has just been resized
- lateRender();
- }
- }
- }
-
-
-
- /* Event Fetching/Rendering
- -----------------------------------------------------------------------------*/
-
-
- // fetches events if necessary, rerenders events if necessary (or if forced)
- function updateEvents(forceRender) {
- if (!options.lazyFetching || isFetchNeeded(currentView.visStart, currentView.visEnd)) {
- refetchEvents();
- }
- else if (forceRender) {
- rerenderEvents();
- }
- }
-
-
- function refetchEvents() {
- fetchEvents(currentView.visStart, currentView.visEnd); // will call reportEvents
- }
-
-
- // called when event data arrives
- function reportEvents(_events) {
- events = _events;
- rerenderEvents();
- }
-
-
- // called when a single event's data has been changed
- function reportEventChange(eventID) {
- rerenderEvents(eventID);
- }
-
-
- // attempts to rerenderEvents
- function rerenderEvents(modifiedEventID) {
- markEventsDirty();
- if (elementVisible()) {
- currentView.clearEvents();
- currentView.renderEvents(events, modifiedEventID);
- currentView.eventsDirty = false;
- }
- }
-
-
- function markEventsDirty() {
- $.each(viewInstances, function(i, inst) {
- inst.eventsDirty = true;
- });
- }
-
-
-
- /* Selection
- -----------------------------------------------------------------------------*/
-
-
- function select(start, end, allDay) {
- currentView.select(start, end, allDay===undefined ? true : allDay);
- }
-
-
- function unselect() { // safe to be called before renderView
- if (currentView) {
- currentView.unselect();
- }
- }
-
-
-
- /* Date
- -----------------------------------------------------------------------------*/
-
-
- function prev() {
- renderView(-1);
- }
-
-
- function next() {
- renderView(1);
- }
-
-
- function prevYear() {
- addYears(date, -1);
- renderView();
- }
-
-
- function nextYear() {
- addYears(date, 1);
- renderView();
- }
-
-
- function today() {
- date = new Date();
- renderView();
- }
-
-
- function gotoDate(year, month, dateOfMonth) {
- if (year instanceof Date) {
- date = cloneDate(year); // provided 1 argument, a Date
- }else{
- setYMD(date, year, month, dateOfMonth);
- }
- renderView();
- }
-
-
- function incrementDate(years, months, days) {
- if (years !== undefined) {
- addYears(date, years);
- }
- if (months !== undefined) {
- addMonths(date, months);
- }
- if (days !== undefined) {
- addDays(date, days);
- }
- renderView();
- }
-
-
- function getDate() {
- return cloneDate(date);
- }
-
-
-
- /* Misc
- -----------------------------------------------------------------------------*/
-
-
- function getView() {
- return currentView;
- }
-
-
- function option(name, value) {
- if (value === undefined) {
- return options[name];
- }
- if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {
- options[name] = value;
- updateSize();
- }
- }
-
-
- function trigger(name, thisObj) {
- if (options[name]) {
- return options[name].apply(
- thisObj || _element,
- Array.prototype.slice.call(arguments, 2)
- );
- }
- }
-
-
-
- /* External Dragging
- ------------------------------------------------------------------------*/
-
- if (options.droppable) {
- $(document)
- .bind('dragstart', function(ev, ui) {
- var _e = ev.target;
- var e = $(_e);
- if (!e.parents('.fc').length) { // not already inside a calendar
- var accept = options.dropAccept;
- if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) {
- _dragElement = _e;
- currentView.dragStart(_dragElement, ev, ui);
- }
- }
- })
- .bind('dragstop', function(ev, ui) {
- if (_dragElement) {
- currentView.dragStop(_dragElement, ev, ui);
- _dragElement = null;
- }
- });
- }
-
-
-}
-
-function Header(calendar, options) {
- var t = this;
-
-
- // exports
- t.render = render;
- t.destroy = destroy;
- t.updateTitle = updateTitle;
- t.activateButton = activateButton;
- t.deactivateButton = deactivateButton;
- t.disableButton = disableButton;
- t.enableButton = enableButton;
-
-
- // locals
- var element = $([]);
- var tm;
-
-
-
- function render() {
- tm = options.theme ? 'ui' : 'fc';
- var sections = options.header;
- if (sections) {
- element = $("")
- .append(
- $(" |
")
- .append(renderSection('left'))
- .append(renderSection('center'))
- .append(renderSection('right'))
- );
- return element;
- }
- }
-
-
- function destroy() {
- element.remove();
- }
-
-
- function renderSection(position) {
- var e = $("");
- var buttonStr = options.header[position];
- if (buttonStr) {
- $.each(buttonStr.split(' '), function(i) {
- if (i > 0) {
- e.append("");
- }
- var prevButton;
- $.each(this.split(','), function(j, buttonName) {
- if (buttonName == 'title') {
- e.append("");
- if (prevButton) {
- prevButton.addClass(tm + '-corner-right');
- }
- prevButton = null;
- }else{
- var buttonClick;
- if (calendar[buttonName]) {
- buttonClick = calendar[buttonName]; // calendar method
- }
- else if (fcViews[buttonName]) {
- buttonClick = function() {
- button.removeClass(tm + '-state-hover'); // forget why
- calendar.changeView(buttonName);
- };
- }
- if (buttonClick) {
- var icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null; // why are we using smartProperty here?
- var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
- var button = $(
- "" +
- "" +
- "" +
- (icon ?
- "" +
- "" +
- "" :
- text
- ) +
- "" +
- "" +
- "" +
- ""
- );
- if (button) {
- button
- .click(function() {
- if (!button.hasClass(tm + '-state-disabled')) {
- buttonClick();
- }
- })
- .mousedown(function() {
- button
- .not('.' + tm + '-state-active')
- .not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-down');
- })
- .mouseup(function() {
- button.removeClass(tm + '-state-down');
- })
- .hover(
- function() {
- button
- .not('.' + tm + '-state-active')
- .not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-hover');
- },
- function() {
- button
- .removeClass(tm + '-state-hover')
- .removeClass(tm + '-state-down');
- }
- )
- .appendTo(e);
- if (!prevButton) {
- button.addClass(tm + '-corner-left');
- }
- prevButton = button;
- }
- }
- }
- });
- if (prevButton) {
- prevButton.addClass(tm + '-corner-right');
- }
- });
- }
- return e;
- }
-
-
- function updateTitle(html) {
- element.find('h2')
- .html(html);
- }
-
-
- function activateButton(buttonName) {
- element.find('span.fc-button-' + buttonName)
- .addClass(tm + '-state-active');
- }
-
-
- function deactivateButton(buttonName) {
- element.find('span.fc-button-' + buttonName)
- .removeClass(tm + '-state-active');
- }
-
-
- function disableButton(buttonName) {
- element.find('span.fc-button-' + buttonName)
- .addClass(tm + '-state-disabled');
- }
-
-
- function enableButton(buttonName) {
- element.find('span.fc-button-' + buttonName)
- .removeClass(tm + '-state-disabled');
- }
-
-
-}
-
-fc.sourceNormalizers = [];
-fc.sourceFetchers = [];
-
-var ajaxDefaults = {
- dataType: 'json',
- cache: false
-};
-
-var eventGUID = 1;
-
-
-function EventManager(options, _sources) {
- var t = this;
-
-
- // exports
- t.isFetchNeeded = isFetchNeeded;
- t.fetchEvents = fetchEvents;
- t.addEventSource = addEventSource;
- t.removeEventSource = removeEventSource;
- t.updateEvent = updateEvent;
- t.renderEvent = renderEvent;
- t.removeEvents = removeEvents;
- t.clientEvents = clientEvents;
- t.normalizeEvent = normalizeEvent;
-
-
- // imports
- var trigger = t.trigger;
- var getView = t.getView;
- var reportEvents = t.reportEvents;
-
-
- // locals
- var stickySource = { events: [] };
- var sources = [ stickySource ];
- var rangeStart, rangeEnd;
- var currentFetchID = 0;
- var pendingSourceCnt = 0;
- var loadingLevel = 0;
- var cache = [];
-
-
- for (var i=0; i<_sources.length; i++) {
- _addEventSource(_sources[i]);
- }
-
-
-
- /* Fetching
- -----------------------------------------------------------------------------*/
-
-
- function isFetchNeeded(start, end) {
- return !rangeStart || start < rangeStart || end > rangeEnd;
- }
-
-
- function fetchEvents(start, end) {
- rangeStart = start;
- rangeEnd = end;
- cache = [];
- var fetchID = ++currentFetchID;
- var len = sources.length;
- pendingSourceCnt = len;
- for (var i=0; i)), return null instead
- return null;
-}
-
-
-function parseISO8601(s, ignoreTimezone) { // ignoreTimezone defaults to false
- // derived from http://delete.me.uk/2005/03/iso8601.html
- // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
- var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);
- if (!m) {
- return null;
- }
- var date = new Date(m[1], 0, 1);
- if (ignoreTimezone || !m[13]) {
- var check = new Date(m[1], 0, 1, 9, 0);
- if (m[3]) {
- date.setMonth(m[3] - 1);
- check.setMonth(m[3] - 1);
- }
- if (m[5]) {
- date.setDate(m[5]);
- check.setDate(m[5]);
- }
- fixDate(date, check);
- if (m[7]) {
- date.setHours(m[7]);
- }
- if (m[8]) {
- date.setMinutes(m[8]);
- }
- if (m[10]) {
- date.setSeconds(m[10]);
- }
- if (m[12]) {
- date.setMilliseconds(Number("0." + m[12]) * 1000);
- }
- fixDate(date, check);
- }else{
- date.setUTCFullYear(
- m[1],
- m[3] ? m[3] - 1 : 0,
- m[5] || 1
- );
- date.setUTCHours(
- m[7] || 0,
- m[8] || 0,
- m[10] || 0,
- m[12] ? Number("0." + m[12]) * 1000 : 0
- );
- if (m[14]) {
- var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0);
- offset *= m[15] == '-' ? 1 : -1;
- date = new Date(+date + (offset * 60 * 1000));
- }
- }
- return date;
-}
-
-
-function parseTime(s) { // returns minutes since start of day
- if (typeof s == 'number') { // an hour
- return s * 60;
- }
- if (typeof s == 'object') { // a Date object
- return s.getHours() * 60 + s.getMinutes();
- }
- var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/);
- if (m) {
- var h = parseInt(m[1], 10);
- if (m[3]) {
- h %= 12;
- if (m[3].toLowerCase().charAt(0) == 'p') {
- h += 12;
- }
- }
- return h * 60 + (m[2] ? parseInt(m[2], 10) : 0);
- }
-}
-
-
-
-/* Date Formatting
------------------------------------------------------------------------------*/
-// TODO: use same function formatDate(date, [date2], format, [options])
-
-
-function formatDate(date, format, options) {
- return formatDates(date, null, format, options);
-}
-
-
-function formatDates(date1, date2, format, options) {
- options = options || defaults;
- var date = date1,
- otherDate = date2,
- i, len = format.length, c,
- i2, formatter,
- res = '';
- for (i=0; ii; i2--) {
- if (formatter = dateFormatters[format.substring(i, i2)]) {
- if (date) {
- res += formatter(date, options);
- }
- i = i2 - 1;
- break;
- }
- }
- if (i2 == i) {
- if (date) {
- res += c;
- }
- }
- }
- }
- return res;
-};
-
-
-var dateFormatters = {
- s : function(d) { return d.getSeconds() },
- ss : function(d) { return zeroPad(d.getSeconds()) },
- m : function(d) { return d.getMinutes() },
- mm : function(d) { return zeroPad(d.getMinutes()) },
- h : function(d) { return d.getHours() % 12 || 12 },
- hh : function(d) { return zeroPad(d.getHours() % 12 || 12) },
- H : function(d) { return d.getHours() },
- HH : function(d) { return zeroPad(d.getHours()) },
- d : function(d) { return d.getDate() },
- dd : function(d) { return zeroPad(d.getDate()) },
- ddd : function(d,o) { return o.dayNamesShort[d.getDay()] },
- dddd: function(d,o) { return o.dayNames[d.getDay()] },
- M : function(d) { return d.getMonth() + 1 },
- MM : function(d) { return zeroPad(d.getMonth() + 1) },
- MMM : function(d,o) { return o.monthNamesShort[d.getMonth()] },
- MMMM: function(d,o) { return o.monthNames[d.getMonth()] },
- yy : function(d) { return (d.getFullYear()+'').substring(2) },
- yyyy: function(d) { return d.getFullYear() },
- t : function(d) { return d.getHours() < 12 ? 'a' : 'p' },
- tt : function(d) { return d.getHours() < 12 ? 'am' : 'pm' },
- T : function(d) { return d.getHours() < 12 ? 'A' : 'P' },
- TT : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' },
- u : function(d) { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
- S : function(d) {
- var date = d.getDate();
- if (date > 10 && date < 20) {
- return 'th';
- }
- return ['st', 'nd', 'rd'][date%10-1] || 'th';
- }
-};
-
-
-
-fc.applyAll = applyAll;
-
-
-/* Event Date Math
------------------------------------------------------------------------------*/
-
-
-function exclEndDay(event) {
- if (event.end) {
- return _exclEndDay(event.end, event.allDay);
- }else{
- return addDays(cloneDate(event.start), 1);
- }
-}
-
-
-function _exclEndDay(end, allDay) {
- end = cloneDate(end);
- return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end);
-}
-
-
-function segCmp(a, b) {
- return (b.msLength - a.msLength) * 100 + (a.event.start - b.event.start);
-}
-
-
-function segsCollide(seg1, seg2) {
- return seg1.end > seg2.start && seg1.start < seg2.end;
-}
-
-
-
-/* Event Sorting
------------------------------------------------------------------------------*/
-
-
-// event rendering utilities
-function sliceSegs(events, visEventEnds, start, end) {
- var segs = [],
- i, len=events.length, event,
- eventStart, eventEnd,
- segStart, segEnd,
- isStart, isEnd;
- for (i=0; i start && eventStart < end) {
- if (eventStart < start) {
- segStart = cloneDate(start);
- isStart = false;
- }else{
- segStart = eventStart;
- isStart = true;
- }
- if (eventEnd > end) {
- segEnd = cloneDate(end);
- isEnd = false;
- }else{
- segEnd = eventEnd;
- isEnd = true;
- }
- segs.push({
- event: event,
- start: segStart,
- end: segEnd,
- isStart: isStart,
- isEnd: isEnd,
- msLength: segEnd - segStart
- });
- }
- }
- return segs.sort(segCmp);
-}
-
-
-// event rendering calculation utilities
-function stackSegs(segs) {
- var levels = [],
- i, len = segs.length, seg,
- j, collide, k;
- for (i=0; i=0; i--) {
- res = obj[parts[i].toLowerCase()];
- if (res !== undefined) {
- return res;
- }
- }
- return obj[''];
-}
-
-
-function htmlEscape(s) {
- return s.replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/'/g, ''')
- .replace(/"/g, '"')
- .replace(/\n/g, '
');
-}
-
-
-function cssKey(_element) {
- return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, '');
-}
-
-
-function disableTextSelection(element) {
- element
- .attr('unselectable', 'on')
- .css('MozUserSelect', 'none')
- .bind('selectstart.ui', function() { return false; });
-}
-
-
-/*
-function enableTextSelection(element) {
- element
- .attr('unselectable', 'off')
- .css('MozUserSelect', '')
- .unbind('selectstart.ui');
-}
-*/
-
-
-function markFirstLast(e) {
- e.children()
- .removeClass('fc-first fc-last')
- .filter(':first-child')
- .addClass('fc-first')
- .end()
- .filter(':last-child')
- .addClass('fc-last');
-}
-
-
-function setDayID(cell, date) {
- cell.each(function(i, _cell) {
- _cell.className = _cell.className.replace(/^fc-\w*/, 'fc-' + dayIDs[date.getDay()]);
- // TODO: make a way that doesn't rely on order of classes
- });
-}
-
-
-function getSkinCss(event, opt) {
- var source = event.source || {};
- var eventColor = event.color;
- var sourceColor = source.color;
- var optionColor = opt('eventColor');
- var backgroundColor =
- event.backgroundColor ||
- eventColor ||
- source.backgroundColor ||
- sourceColor ||
- opt('eventBackgroundColor') ||
- optionColor;
- var borderColor =
- event.borderColor ||
- eventColor ||
- source.borderColor ||
- sourceColor ||
- opt('eventBorderColor') ||
- optionColor;
- var textColor =
- event.textColor ||
- source.textColor ||
- opt('eventTextColor');
- var statements = [];
- if (backgroundColor) {
- statements.push('background-color:' + backgroundColor);
- }
- if (borderColor) {
- statements.push('border-color:' + borderColor);
- }
- if (textColor) {
- statements.push('color:' + textColor);
- }
- return statements.join(';');
-}
-
-
-function applyAll(functions, thisObj, args) {
- if ($.isFunction(functions)) {
- functions = [ functions ];
- }
- if (functions) {
- var i;
- var ret;
- for (i=0; i" +
- "" +
- "";
- for (i=0; i"; // need fc- for setDayID
- }
- s +=
- "
" +
- "" +
- "";
- for (i=0; i";
- for (j=0; j" + // need fc- for setDayID
- "" +
- (showNumbers ?
- "
" :
- ''
- ) +
- "
" +
- "
" +
- "";
- }
- s +=
- "";
- }
- s +=
- "" +
- "";
- table = $(s).appendTo(element);
-
- head = table.find('thead');
- headCells = head.find('th');
- body = table.find('tbody');
- bodyRows = body.find('tr');
- bodyCells = body.find('td');
- bodyFirstCells = bodyCells.filter(':first-child');
- bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
-
- markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
- markFirstLast(bodyRows); // marks first+last td's
- bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
-
- dayBind(bodyCells);
-
- daySegmentContainer =
- $("")
- .appendTo(element);
- }
-
-
-
- function updateCells(firstTime) {
- var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
- var month = t.start.getMonth();
- var today = clearTime(new Date());
- var cell;
- var date;
- var row;
-
- if (dowDirty) {
- headCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- cell.html(formatDate(date, colFormat));
- setDayID(cell, date);
- });
- }
-
- bodyCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- if (date.getMonth() == month) {
- cell.removeClass('fc-other-month');
- }else{
- cell.addClass('fc-other-month');
- }
- if (+date == +today) {
- cell.addClass(tm + '-state-highlight fc-today');
- }else{
- cell.removeClass(tm + '-state-highlight fc-today');
- }
- cell.find('div.fc-day-number').text(date.getDate());
- if (dowDirty) {
- setDayID(cell, date);
- }
- });
-
- bodyRows.each(function(i, _row) {
- row = $(_row);
- if (i < rowCnt) {
- row.show();
- if (i == rowCnt-1) {
- row.addClass('fc-last');
- }else{
- row.removeClass('fc-last');
- }
- }else{
- row.hide();
- }
- });
- }
-
-
-
- function setHeight(height) {
- viewHeight = height;
-
- var bodyHeight = viewHeight - head.height();
- var rowHeight;
- var rowHeightLast;
- var cell;
-
- if (opt('weekMode') == 'variable') {
- rowHeight = rowHeightLast = Math.floor(bodyHeight / (rowCnt==1 ? 2 : 6));
- }else{
- rowHeight = Math.floor(bodyHeight / rowCnt);
- rowHeightLast = bodyHeight - rowHeight * (rowCnt-1);
- }
-
- bodyFirstCells.each(function(i, _cell) {
- if (i < rowCnt) {
- cell = $(_cell);
- setMinHeight(
- cell.find('> div'),
- (i==rowCnt-1 ? rowHeightLast : rowHeight) - vsides(cell)
- );
- }
- });
-
- }
-
-
- function setWidth(width) {
- viewWidth = width;
- colContentPositions.clear();
- colWidth = Math.floor(viewWidth / colCnt);
- setOuterWidth(headCells.slice(0, -1), colWidth);
- }
-
-
-
- /* Day clicking and binding
- -----------------------------------------------------------*/
-
-
- function dayBind(days) {
- days.click(dayClick)
- .mousedown(daySelectionMousedown);
- }
-
-
- function dayClick(ev) {
- if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
- var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
- var date = indexDate(index);
- trigger('dayClick', this, date, true, ev);
- }
- }
-
-
-
- /* Semi-transparent Overlay Helpers
- ------------------------------------------------------*/
-
-
- function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive
- if (refreshCoordinateGrid) {
- coordinateGrid.build();
- }
- var rowStart = cloneDate(t.visStart);
- var rowEnd = addDays(cloneDate(rowStart), colCnt);
- for (var i=0; i" +
- "" +
- "" +
- "";
- for (i=0; i"; // fc- needed for setDayID
- }
- s +=
- "" +
- "
" +
- "" +
- "" +
- "" +
- "";
- for (i=0; i" + // fc- needed for setDayID
- "" +
- "";
- }
- s +=
- "| | " +
- "
" +
- "" +
- "";
- dayTable = $(s).appendTo(element);
- dayHead = dayTable.find('thead');
- dayHeadCells = dayHead.find('th').slice(1, -1);
- dayBody = dayTable.find('tbody');
- dayBodyCells = dayBody.find('td').slice(0, -1);
- dayBodyCellInners = dayBodyCells.find('div.fc-day-content div');
- dayBodyFirstCell = dayBodyCells.eq(0);
- dayBodyFirstCellStretcher = dayBodyFirstCell.find('> div');
-
- markFirstLast(dayHead.add(dayHead.find('tr')));
- markFirstLast(dayBody.add(dayBody.find('tr')));
-
- axisFirstCells = dayHead.find('th:first');
- gutterCells = dayTable.find('.fc-agenda-gutter');
-
- slotLayer =
- $("")
- .appendTo(element);
-
- if (opt('allDaySlot')) {
-
- daySegmentContainer =
- $("")
- .appendTo(slotLayer);
-
- s =
- "" +
- "" +
- "" +
- "| " +
- "" +
- " | " +
- "" +
- "
" +
- "
";
- allDayTable = $(s).appendTo(slotLayer);
- allDayRow = allDayTable.find('tr');
-
- dayBind(allDayRow.find('td'));
-
- axisFirstCells = axisFirstCells.add(allDayTable.find('th:first'));
- gutterCells = gutterCells.add(allDayTable.find('th.fc-agenda-gutter'));
-
- slotLayer.append(
- ""
- );
-
- }else{
-
- daySegmentContainer = $([]); // in jQuery 1.4, we can just do $()
-
- }
-
- slotScroller =
- $("")
- .appendTo(slotLayer);
-
- slotContent =
- $("")
- .appendTo(slotScroller);
-
- slotSegmentContainer =
- $("")
- .appendTo(slotContent);
-
- s =
- "" +
- "";
- d = zeroDate();
- maxd = addMinutes(cloneDate(d), maxMinute);
- addMinutes(d, minMinute);
- slotCnt = 0;
- for (i=0; d < maxd; i++) {
- minutes = d.getMinutes();
- s +=
- "" +
- "" +
- "| " +
- " " +
- " | " +
- "
";
- addMinutes(d, opt('slotMinutes'));
- slotCnt++;
- }
- s +=
- "" +
- "
";
- slotTable = $(s).appendTo(slotContent);
- slotTableFirstInner = slotTable.find('div:first');
-
- slotBind(slotTable.find('td'));
-
- axisFirstCells = axisFirstCells.add(slotTable.find('th:first'));
- }
-
-
-
- function updateCells() {
- var i;
- var headCell;
- var bodyCell;
- var date;
- var today = clearTime(new Date());
- for (i=0; i= 0) {
- addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
- }
- return d;
- }
-
-
- function colDate(col) { // returns dates with 00:00:00
- return addDays(cloneDate(t.visStart), col*dis+dit);
- }
-
-
- function cellIsAllDay(cell) {
- return opt('allDaySlot') && !cell.row;
- }
-
-
- function dayOfWeekCol(dayOfWeek) {
- return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt)*dis+dit;
- }
-
-
-
-
- // get the Y coordinate of the given time on the given day (both Date objects)
- function timePosition(day, time) { // both date objects. day holds 00:00 of current day
- day = cloneDate(day, true);
- if (time < addMinutes(cloneDate(day), minMinute)) {
- return 0;
- }
- if (time >= addMinutes(cloneDate(day), maxMinute)) {
- return slotTable.height();
- }
- var slotMinutes = opt('slotMinutes'),
- minutes = time.getHours()*60 + time.getMinutes() - minMinute,
- slotI = Math.floor(minutes / slotMinutes),
- slotTop = slotTopCache[slotI];
- if (slotTop === undefined) {
- slotTop = slotTopCache[slotI] = slotTable.find('tr:eq(' + slotI + ') td div')[0].offsetTop; //.position().top; // need this optimization???
- }
- return Math.max(0, Math.round(
- slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
- ));
- }
-
-
- function allDayBounds() {
- return {
- left: axisWidth,
- right: viewWidth - gutterWidth
- }
- }
-
-
- function getAllDayRow(index) {
- return allDayRow;
- }
-
-
- function defaultEventEnd(event) {
- var start = cloneDate(event.start);
- if (event.allDay) {
- return start;
- }
- return addMinutes(start, opt('defaultEventMinutes'));
- }
-
-
-
- /* Selection
- ---------------------------------------------------------------------------------*/
-
-
- function defaultSelectionEnd(startDate, allDay) {
- if (allDay) {
- return cloneDate(startDate);
- }
- return addMinutes(cloneDate(startDate), opt('slotMinutes'));
- }
-
-
- function renderSelection(startDate, endDate, allDay) { // only for all-day
- if (allDay) {
- if (opt('allDaySlot')) {
- renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true);
- }
- }else{
- renderSlotSelection(startDate, endDate);
- }
- }
-
-
- function renderSlotSelection(startDate, endDate) {
- var helperOption = opt('selectHelper');
- coordinateGrid.build();
- if (helperOption) {
- var col = dayDiff(startDate, t.visStart) * dis + dit;
- if (col >= 0 && col < colCnt) { // only works when times are on same day
- var rect = coordinateGrid.rect(0, col, 0, col, slotContent); // only for horizontal coords
- var top = timePosition(startDate, startDate);
- var bottom = timePosition(startDate, endDate);
- if (bottom > top) { // protect against selections that are entirely before or after visible range
- rect.top = top;
- rect.height = bottom - top;
- rect.left += 2;
- rect.width -= 5;
- if ($.isFunction(helperOption)) {
- var helperRes = helperOption(startDate, endDate);
- if (helperRes) {
- rect.position = 'absolute';
- rect.zIndex = 8;
- selectionHelper = $(helperRes)
- .css(rect)
- .appendTo(slotContent);
- }
- }else{
- rect.isStart = true; // conside rect a "seg" now
- rect.isEnd = true; //
- selectionHelper = $(slotSegHtml(
- {
- title: '',
- start: startDate,
- end: endDate,
- className: ['fc-select-helper'],
- editable: false
- },
- rect
- ));
- selectionHelper.css('opacity', opt('dragOpacity'));
- }
- if (selectionHelper) {
- slotBind(selectionHelper);
- slotContent.append(selectionHelper);
- setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended
- setOuterHeight(selectionHelper, rect.height, true);
- }
- }
- }
- }else{
- renderSlotOverlay(startDate, endDate);
- }
- }
-
-
- function clearSelection() {
- clearOverlays();
- if (selectionHelper) {
- selectionHelper.remove();
- selectionHelper = null;
- }
- }
-
-
- function slotSelectionMousedown(ev) {
- if (ev.which == 1 && opt('selectable')) { // ev.which==1 means left mouse button
- unselect(ev);
- var dates;
- hoverListener.start(function(cell, origCell) {
- clearSelection();
- if (cell && cell.col == origCell.col && !cellIsAllDay(cell)) {
- var d1 = cellDate(origCell);
- var d2 = cellDate(cell);
- dates = [
- d1,
- addMinutes(cloneDate(d1), opt('slotMinutes')),
- d2,
- addMinutes(cloneDate(d2), opt('slotMinutes'))
- ].sort(cmp);
- renderSlotSelection(dates[0], dates[3]);
- }else{
- dates = null;
- }
- }, ev);
- $(document).one('mouseup', function(ev) {
- hoverListener.stop();
- if (dates) {
- if (+dates[0] == +dates[1]) {
- reportDayClick(dates[0], false, ev);
- }
- reportSelection(dates[0], dates[3], false, ev);
- }
- });
- }
- }
-
-
- function reportDayClick(date, allDay, ev) {
- trigger('dayClick', dayBodyCells[dayOfWeekCol(date.getDay())], date, allDay, ev);
- }
-
-
-
- /* External Dragging
- --------------------------------------------------------------------------------*/
-
-
- function dragStart(_dragElement, ev, ui) {
- hoverListener.start(function(cell) {
- clearOverlays();
- if (cell) {
- if (cellIsAllDay(cell)) {
- renderCellOverlay(cell.row, cell.col, cell.row, cell.col);
- }else{
- var d1 = cellDate(cell);
- var d2 = addMinutes(cloneDate(d1), opt('defaultEventMinutes'));
- renderSlotOverlay(d1, d2);
- }
- }
- }, ev);
- }
-
-
- function dragStop(_dragElement, ev, ui) {
- var cell = hoverListener.stop();
- clearOverlays();
- if (cell) {
- trigger('drop', _dragElement, cellDate(cell), cellIsAllDay(cell), ev, ui);
- }
- }
-
-
-}
-
-function AgendaEventRenderer() {
- var t = this;
-
-
- // exports
- t.renderEvents = renderEvents;
- t.compileDaySegs = compileDaySegs; // for DayEventRenderer
- t.clearEvents = clearEvents;
- t.slotSegHtml = slotSegHtml;
- t.bindDaySeg = bindDaySeg;
-
-
- // imports
- DayEventRenderer.call(t);
- var opt = t.opt;
- var trigger = t.trigger;
- //var setOverflowHidden = t.setOverflowHidden;
- var isEventDraggable = t.isEventDraggable;
- var isEventResizable = t.isEventResizable;
- var eventEnd = t.eventEnd;
- var reportEvents = t.reportEvents;
- var reportEventClear = t.reportEventClear;
- var eventElementHandlers = t.eventElementHandlers;
- var setHeight = t.setHeight;
- var getDaySegmentContainer = t.getDaySegmentContainer;
- var getSlotSegmentContainer = t.getSlotSegmentContainer;
- var getHoverListener = t.getHoverListener;
- var getMaxMinute = t.getMaxMinute;
- var getMinMinute = t.getMinMinute;
- var timePosition = t.timePosition;
- var colContentLeft = t.colContentLeft;
- var colContentRight = t.colContentRight;
- var renderDaySegs = t.renderDaySegs;
- var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
- var getColCnt = t.getColCnt;
- var getColWidth = t.getColWidth;
- var getSlotHeight = t.getSlotHeight;
- var getBodyContent = t.getBodyContent;
- var reportEventElement = t.reportEventElement;
- var showEvents = t.showEvents;
- var hideEvents = t.hideEvents;
- var eventDrop = t.eventDrop;
- var eventResize = t.eventResize;
- var renderDayOverlay = t.renderDayOverlay;
- var clearOverlays = t.clearOverlays;
- var calendar = t.calendar;
- var formatDate = calendar.formatDate;
- var formatDates = calendar.formatDates;
-
-
-
- /* Rendering
- ----------------------------------------------------------------------------*/
-
-
- function renderEvents(events, modifiedEventId) {
- reportEvents(events);
- var i, len=events.length,
- dayEvents=[],
- slotEvents=[];
- for (i=0; i" +
- "" +
- "
" +
- "
" +
- htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
- "
" +
- "
" +
- "
" +
- "
" +
- htmlEscape(event.title) +
- "
" +
- "
" +
- "
" +
- "
"; // close inner
- if (seg.isEnd && isEventResizable(event)) {
- html +=
- "=
";
- }
- html +=
- "" + (url ? "a" : "div") + ">";
- return html;
- }
-
-
- function bindDaySeg(event, eventElement, seg) {
- if (isEventDraggable(event)) {
- draggableDayEvent(event, eventElement, seg.isStart);
- }
- if (seg.isEnd && isEventResizable(event)) {
- resizableDayEvent(event, eventElement, seg);
- }
- eventElementHandlers(event, eventElement);
- // needs to be after, because resizableDayEvent might stopImmediatePropagation on click
- }
-
-
- function bindSlotSeg(event, eventElement, seg) {
- var timeElement = eventElement.find('div.fc-event-time');
- if (isEventDraggable(event)) {
- draggableSlotEvent(event, eventElement, timeElement);
- }
- if (seg.isEnd && isEventResizable(event)) {
- resizableSlotEvent(event, eventElement, timeElement);
- }
- eventElementHandlers(event, eventElement);
- }
-
-
-
- /* Dragging
- -----------------------------------------------------------------------------------*/
-
-
- // when event starts out FULL-DAY
-
- function draggableDayEvent(event, eventElement, isStart) {
- var origWidth;
- var revert;
- var allDay=true;
- var dayDelta;
- var dis = opt('isRTL') ? -1 : 1;
- var hoverListener = getHoverListener();
- var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
- var minMinute = getMinMinute();
- eventElement.draggable({
- zIndex: 9,
- opacity: opt('dragOpacity', 'month'), // use whatever the month view was using
- revertDuration: opt('dragRevertDuration'),
- start: function(ev, ui) {
- trigger('eventDragStart', eventElement, event, ev, ui);
- hideEvents(event, eventElement);
- origWidth = eventElement.width();
- hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
- clearOverlays();
- if (cell) {
- //setOverflowHidden(true);
- revert = false;
- dayDelta = colDelta * dis;
- if (!cell.row) {
- // on full-days
- renderDayOverlay(
- addDays(cloneDate(event.start), dayDelta),
- addDays(exclEndDay(event), dayDelta)
- );
- resetElement();
- }else{
- // mouse is over bottom slots
- if (isStart) {
- if (allDay) {
- // convert event to temporary slot-event
- eventElement.width(colWidth - 10); // don't use entire width
- setOuterHeight(
- eventElement,
- slotHeight * Math.round(
- (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
- / opt('slotMinutes')
- )
- );
- eventElement.draggable('option', 'grid', [colWidth, 1]);
- allDay = false;
- }
- }else{
- revert = true;
- }
- }
- revert = revert || (allDay && !dayDelta);
- }else{
- resetElement();
- //setOverflowHidden(false);
- revert = true;
- }
- eventElement.draggable('option', 'revert', revert);
- }, ev, 'drag');
- },
- stop: function(ev, ui) {
- hoverListener.stop();
- clearOverlays();
- trigger('eventDragStop', eventElement, event, ev, ui);
- if (revert) {
- // hasn't moved or is out of bounds (draggable has already reverted)
- resetElement();
- eventElement.css('filter', ''); // clear IE opacity side-effects
- showEvents(event, eventElement);
- }else{
- // changed!
- var minuteDelta = 0;
- if (!allDay) {
- minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
- * opt('slotMinutes')
- + minMinute
- - (event.start.getHours() * 60 + event.start.getMinutes());
- }
- eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui);
- }
- //setOverflowHidden(false);
- }
- });
- function resetElement() {
- if (!allDay) {
- eventElement
- .width(origWidth)
- .height('')
- .draggable('option', 'grid', null);
- allDay = true;
- }
- }
- }
-
-
- // when event starts out IN TIMESLOTS
-
- function draggableSlotEvent(event, eventElement, timeElement) {
- var origPosition;
- var allDay=false;
- var dayDelta;
- var minuteDelta;
- var prevMinuteDelta;
- var dis = opt('isRTL') ? -1 : 1;
- var hoverListener = getHoverListener();
- var colCnt = getColCnt();
- var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
- eventElement.draggable({
- zIndex: 9,
- scroll: false,
- grid: [colWidth, slotHeight],
- axis: colCnt==1 ? 'y' : false,
- opacity: opt('dragOpacity'),
- revertDuration: opt('dragRevertDuration'),
- start: function(ev, ui) {
- trigger('eventDragStart', eventElement, event, ev, ui);
- hideEvents(event, eventElement);
- origPosition = eventElement.position();
- minuteDelta = prevMinuteDelta = 0;
- hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
- eventElement.draggable('option', 'revert', !cell);
- clearOverlays();
- if (cell) {
- dayDelta = colDelta * dis;
- if (opt('allDaySlot') && !cell.row) {
- // over full days
- if (!allDay) {
- // convert to temporary all-day event
- allDay = true;
- timeElement.hide();
- eventElement.draggable('option', 'grid', null);
- }
- renderDayOverlay(
- addDays(cloneDate(event.start), dayDelta),
- addDays(exclEndDay(event), dayDelta)
- );
- }else{
- // on slots
- resetElement();
- }
- }
- }, ev, 'drag');
- },
- drag: function(ev, ui) {
- minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
- if (minuteDelta != prevMinuteDelta) {
- if (!allDay) {
- updateTimeText(minuteDelta);
- }
- prevMinuteDelta = minuteDelta;
- }
- },
- stop: function(ev, ui) {
- var cell = hoverListener.stop();
- clearOverlays();
- trigger('eventDragStop', eventElement, event, ev, ui);
- if (cell && (dayDelta || minuteDelta || allDay)) {
- // changed!
- eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui);
- }else{
- // either no change or out-of-bounds (draggable has already reverted)
- resetElement();
- eventElement.css('filter', ''); // clear IE opacity side-effects
- eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
- updateTimeText(0);
- showEvents(event, eventElement);
- }
- }
- });
- function updateTimeText(minuteDelta) {
- var newStart = addMinutes(cloneDate(event.start), minuteDelta);
- var newEnd;
- if (event.end) {
- newEnd = addMinutes(cloneDate(event.end), minuteDelta);
- }
- timeElement.text(formatDates(newStart, newEnd, opt('timeFormat')));
- }
- function resetElement() {
- // convert back to original slot-event
- if (allDay) {
- timeElement.css('display', ''); // show() was causing display=inline
- eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
- allDay = false;
- }
- }
- }
-
-
-
- /* Resizing
- --------------------------------------------------------------------------------------*/
-
-
- function resizableSlotEvent(event, eventElement, timeElement) {
- var slotDelta, prevSlotDelta;
- var slotHeight = getSlotHeight();
- eventElement.resizable({
- handles: {
- s: 'div.ui-resizable-s'
- },
- grid: slotHeight,
- start: function(ev, ui) {
- slotDelta = prevSlotDelta = 0;
- hideEvents(event, eventElement);
- eventElement.css('z-index', 9);
- trigger('eventResizeStart', this, event, ev, ui);
- },
- resize: function(ev, ui) {
- // don't rely on ui.size.height, doesn't take grid into account
- slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
- if (slotDelta != prevSlotDelta) {
- timeElement.text(
- formatDates(
- event.start,
- (!slotDelta && !event.end) ? null : // no change, so don't display time range
- addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
- opt('timeFormat')
- )
- );
- prevSlotDelta = slotDelta;
- }
- },
- stop: function(ev, ui) {
- trigger('eventResizeStop', this, event, ev, ui);
- if (slotDelta) {
- eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
- }else{
- eventElement.css('z-index', 8);
- showEvents(event, eventElement);
- // BUG: if event was really short, need to put title back in span
- }
- }
- });
- }
-
-
-}
-
-
-function countForwardSegs(levels) {
- var i, j, k, level, segForward, segBack;
- for (i=levels.length-1; i>0; i--) {
- level = levels[i];
- for (j=0; j");
- var elements;
- var segmentContainer = getDaySegmentContainer();
- var i;
- var segCnt = segs.length;
- var element;
- tempContainer[0].innerHTML = daySegHTML(segs); // faster than .html()
- elements = tempContainer.children();
- segmentContainer.append(elements);
- daySegElementResolve(segs, elements);
- daySegCalcHSides(segs);
- daySegSetWidths(segs);
- daySegCalcHeights(segs);
- daySegSetTops(segs, getRowTops(getRowDivs()));
- elements = [];
- for (i=0; i" +
- "";
- if (!event.allDay && seg.isStart) {
- html +=
- "" +
- htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
- "";
- }
- html +=
- "" + htmlEscape(event.title) + "" +
- "
";
- if (seg.isEnd && isEventResizable(event)) {
- html +=
- "" +
- " " + // makes hit area a lot better for IE6/7
- "
";
- }
- html +=
- "" + (url ? "a" : "div" ) + ">";
- seg.left = left;
- seg.outerWidth = right - left;
- seg.startCol = leftCol;
- seg.endCol = rightCol + 1; // needs to be exclusive
- }
- return html;
- }
-
-
- function daySegElementResolve(segs, elements) { // sets seg.element
- var i;
- var segCnt = segs.length;
- var seg;
- var event;
- var element;
- var triggerRes;
- for (i=0; i div'); // optimal selector?
- }
- return rowDivs;
- }
-
-
- function getRowTops(rowDivs) {
- var i;
- var rowCnt = rowDivs.length;
- var tops = [];
- for (i=0; i selection for IE
- element
- .mousedown(function(ev) { // prevent native selection for others
- ev.preventDefault();
- })
- .click(function(ev) {
- if (isResizing) {
- ev.preventDefault(); // prevent link from being visited (only method that worked in IE6)
- ev.stopImmediatePropagation(); // prevent fullcalendar eventClick handler from being called
- // (eventElementHandlers needs to be bound after resizableDayEvent)
- }
- });
-
- handle.mousedown(function(ev) {
- if (ev.which != 1) {
- return; // needs to be left mouse button
- }
- isResizing = true;
- var hoverListener = t.getHoverListener();
- var rowCnt = getRowCnt();
- var colCnt = getColCnt();
- var dis = rtl ? -1 : 1;
- var dit = rtl ? colCnt-1 : 0;
- var elementTop = element.css('top');
- var dayDelta;
- var helpers;
- var eventCopy = $.extend({}, event);
- var minCell = dateCell(event.start);
- clearSelection();
- $('body')
- .css('cursor', direction + '-resize')
- .one('mouseup', mouseup);
- trigger('eventResizeStart', this, event, ev);
- hoverListener.start(function(cell, origCell) {
- if (cell) {
- var r = Math.max(minCell.row, cell.row);
- var c = cell.col;
- if (rowCnt == 1) {
- r = 0; // hack for all-day area in agenda views
- }
- if (r == minCell.row) {
- if (rtl) {
- c = Math.min(minCell.col, c);
- }else{
- c = Math.max(minCell.col, c);
- }
- }
- dayDelta = (r*7 + c*dis+dit) - (origCell.row*7 + origCell.col*dis+dit);
- var newEnd = addDays(eventEnd(event), dayDelta, true);
- if (dayDelta) {
- eventCopy.end = newEnd;
- var oldHelpers = helpers;
- helpers = renderTempDaySegs(compileDaySegs([eventCopy]), seg.row, elementTop);
- helpers.find('*').css('cursor', direction + '-resize');
- if (oldHelpers) {
- oldHelpers.remove();
- }
- hideEvents(event);
- }else{
- if (helpers) {
- showEvents(event);
- helpers.remove();
- helpers = null;
- }
- }
- clearOverlays();
- renderDayOverlay(event.start, addDays(cloneDate(newEnd), 1)); // coordinate grid already rebuild at hoverListener.start
- }
- }, ev);
-
- function mouseup(ev) {
- trigger('eventResizeStop', this, event, ev);
- $('body').css('cursor', '');
- hoverListener.stop();
- clearOverlays();
- if (dayDelta) {
- eventResize(this, event, dayDelta, 0, ev);
- // event redraw will clear helpers
- }
- // otherwise, the drag handler already restored the old events
-
- setTimeout(function() { // make this happen after the element's click event
- isResizing = false;
- },0);
- }
-
- });
- }
-
-
-}
-
-//BUG: unselect needs to be triggered when events are dragged+dropped
-
-function SelectionManager() {
- var t = this;
-
-
- // exports
- t.select = select;
- t.unselect = unselect;
- t.reportSelection = reportSelection;
- t.daySelectionMousedown = daySelectionMousedown;
-
-
- // imports
- var opt = t.opt;
- var trigger = t.trigger;
- var defaultSelectionEnd = t.defaultSelectionEnd;
- var renderSelection = t.renderSelection;
- var clearSelection = t.clearSelection;
-
-
- // locals
- var selected = false;
-
-
-
- // unselectAuto
- if (opt('selectable') && opt('unselectAuto')) {
- $(document).mousedown(function(ev) {
- var ignore = opt('unselectCancel');
- if (ignore) {
- if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match
- return;
- }
- }
- unselect(ev);
- });
- }
-
-
- function select(startDate, endDate, allDay) {
- unselect();
- if (!endDate) {
- endDate = defaultSelectionEnd(startDate, allDay);
- }
- renderSelection(startDate, endDate, allDay);
- reportSelection(startDate, endDate, allDay);
- }
-
-
- function unselect(ev) {
- if (selected) {
- selected = false;
- clearSelection();
- trigger('unselect', null, ev);
- }
- }
-
-
- function reportSelection(startDate, endDate, allDay, ev) {
- selected = true;
- trigger('select', null, startDate, endDate, allDay, ev);
- }
-
-
- function daySelectionMousedown(ev) { // not really a generic manager method, oh well
- var cellDate = t.cellDate;
- var cellIsAllDay = t.cellIsAllDay;
- var hoverListener = t.getHoverListener();
- var reportDayClick = t.reportDayClick; // this is hacky and sort of weird
- if (ev.which == 1 && opt('selectable')) { // which==1 means left mouse button
- unselect(ev);
- var _mousedownElement = this;
- var dates;
- hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell
- clearSelection();
- if (cell && cellIsAllDay(cell)) {
- dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp);
- renderSelection(dates[0], dates[1], true);
- }else{
- dates = null;
- }
- }, ev);
- $(document).one('mouseup', function(ev) {
- hoverListener.stop();
- if (dates) {
- if (+dates[0] == +dates[1]) {
- reportDayClick(dates[0], true, ev);
- }
- reportSelection(dates[0], dates[1], true, ev);
- }
- });
- }
- }
-
-
-}
-
-function OverlayManager() {
- var t = this;
-
-
- // exports
- t.renderOverlay = renderOverlay;
- t.clearOverlays = clearOverlays;
-
-
- // locals
- var usedOverlays = [];
- var unusedOverlays = [];
-
-
- function renderOverlay(rect, parent) {
- var e = unusedOverlays.shift();
- if (!e) {
- e = $("");
- }
- if (e[0].parentNode != parent[0]) {
- e.appendTo(parent);
- }
- usedOverlays.push(e.css(rect).show());
- return e;
- }
-
-
- function clearOverlays() {
- var e;
- while (e = usedOverlays.shift()) {
- unusedOverlays.push(e.hide().unbind());
- }
- }
-
-
-}
-
-function CoordinateGrid(buildFunc) {
-
- var t = this;
- var rows;
- var cols;
-
-
- t.build = function() {
- rows = [];
- cols = [];
- buildFunc(rows, cols);
- };
-
-
- t.cell = function(x, y) {
- var rowCnt = rows.length;
- var colCnt = cols.length;
- var i, r=-1, c=-1;
- for (i=0; i= rows[i][0] && y < rows[i][1]) {
- r = i;
- break;
- }
- }
- for (i=0; i= cols[i][0] && x < cols[i][1]) {
- c = i;
- break;
- }
- }
- return (r>=0 && c>=0) ? { row:r, col:c } : null;
- };
-
-
- t.rect = function(row0, col0, row1, col1, originElement) { // row1,col1 is inclusive
- var origin = originElement.offset();
- return {
- top: rows[row0][0] - origin.top,
- left: cols[col0][0] - origin.left,
- width: cols[col1][1] - cols[col0][0],
- height: rows[row1][1] - rows[row0][0]
- };
- };
-
-}
-
-function HoverListener(coordinateGrid) {
-
-
- var t = this;
- var bindType;
- var change;
- var firstCell;
- var cell;
-
-
- t.start = function(_change, ev, _bindType) {
- change = _change;
- firstCell = cell = null;
- coordinateGrid.build();
- mouse(ev);
- bindType = _bindType || 'mousemove';
- $(document).bind(bindType, mouse);
- };
-
-
- function mouse(ev) {
- _fixUIEvent(ev); // see below
- var newCell = coordinateGrid.cell(ev.pageX, ev.pageY);
- if (!newCell != !cell || newCell && (newCell.row != cell.row || newCell.col != cell.col)) {
- if (newCell) {
- if (!firstCell) {
- firstCell = newCell;
- }
- change(newCell, firstCell, newCell.row-firstCell.row, newCell.col-firstCell.col);
- }else{
- change(newCell, firstCell);
- }
- cell = newCell;
- }
- }
-
-
- t.stop = function() {
- $(document).unbind(bindType, mouse);
- return cell;
- };
-
-
-}
-
-
-
-// this fix was only necessary for jQuery UI 1.8.16 (and jQuery 1.7 or 1.7.1)
-// upgrading to jQuery UI 1.8.17 (and using either jQuery 1.7 or 1.7.1) fixed the problem
-// but keep this in here for 1.8.16 users
-// and maybe remove it down the line
-
-function _fixUIEvent(event) { // for issue 1168
- if (event.pageX === undefined) {
- event.pageX = event.originalEvent.pageX;
- event.pageY = event.originalEvent.pageY;
- }
-}
-function HorizontalPositionCache(getElement) {
-
- var t = this,
- elements = {},
- lefts = {},
- rights = {};
-
- function e(i) {
- return elements[i] = elements[i] || getElement(i);
- }
-
- t.left = function(i) {
- return lefts[i] = lefts[i] === undefined ? e(i).position().left : lefts[i];
- };
-
- t.right = function(i) {
- return rights[i] = rights[i] === undefined ? t.left(i) + e(i).width() : rights[i];
- };
-
- t.clear = function() {
- elements = {};
- lefts = {};
- rights = {};
- };
-
-}
-
-})(jQuery);
diff --git a/includes/fullcalendar/fullcalendar.min.js b/includes/fullcalendar/fullcalendar.min.js
deleted file mode 100644
index df37bdf..0000000
--- a/includes/fullcalendar/fullcalendar.min.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-
- FullCalendar v1.5.3
- 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) 2011 Adam Shaw
- Dual licensed under the MIT and GPL licenses, located in
- MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
-
- Date: Mon Feb 6 22:40:40 2012 -0800
-
-*/
-(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
-E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&&
-Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===ma&&u();var D=false;if(!n.start||k||r=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k").append(m("
").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("");(u=b.header[u])&&m.each(u.split(" "),function(oa){oa>0&&fa.append("");var ga;
-m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append("");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){na.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),na=m(""+(ra?"":da)+"");if(na){na.click(function(){na.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){na.removeClass(q+"-state-down")}).hover(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){na.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa);
-ga||na.addClass(q+"-corner-left");ga=na}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("h2").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton=
-j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||cka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;Hl;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.starte&&td){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e=0;e--){d=a[b[e].toLowerCase()];if(d!==
-ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
-function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
-[a];if(a){var d,f;for(d=0;d";for(aa=0;aa";R+="
";for(aa=0;aa";for(V=0;V";R+=""}R+="";w=
-m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()==
-R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea| | ";for(A=0;A";x+=" |
|---|
| | ";for(A=0;A";x+=" |
";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("").appendTo(a);
-if(i("allDaySlot")){ia=m("").appendTo(ja);x="";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("")}else ia=m([]);w=m("").appendTo(ja);I=m("").appendTo(w);R=m("").appendTo(I);x="";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta| "+(!Ea||!Da?s(ta,i("axisFormat")):" ")+" | | ";xa(ta,i("slotMinutes"));tb++}x+="
";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O=xa(N(h),bb))return V.height();
-h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===ma)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&oa(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x=
-i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&Ata){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h,
-O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=na(A);x=na(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row,
-x.col,x.row,x.col);else{x=na(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,na(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=na;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia};
-K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=oa;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger,
-P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A=
-$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb"+Qa(W(o.start,o.end,u("timeFormat")))+"
";if(s.isEnd&&ga(o))v+="=
";
-v+=""+(F?"a":"div")+">";return v}function j(o,s,v){oa(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");oa(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart",
-s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top-
-X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"),
-start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R);
-else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index",
-8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,oa=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,na=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt,
-H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B";if(!n.allDay&&B.isStart)k+=""+Qa(T(n.start,n.end,fa("timeFormat")))+"";k+=""+Qa(n.title)+"
";if(B.isEnd&&ra(n))k+="
";k+=""+(Y?
-"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length,
-t,y=-1,S=-1;for(t=0;t=e[t][0]&&g=d[t][0]&&f=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){xc(j);j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;
-g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
-header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '—'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
-"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:" ◄ ",next:" ► ",prevYear:" << ",nextYear:" >> ",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
-{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
-b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
-Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
-ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
-12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,
-maxTime:24})})(jQuery);
diff --git a/includes/fullcalendar/fullcalendar.print.css b/includes/fullcalendar/fullcalendar.print.css
deleted file mode 100644
index e11c181..0000000
--- a/includes/fullcalendar/fullcalendar.print.css
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * FullCalendar v1.5.3 Print Stylesheet
- *
- * Include this stylesheet on your page to get a more printer-friendly calendar.
- * When including this stylesheet, use the media='print' attribute of the tag.
- * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
- */
-
-
- /* Events
------------------------------------------------------*/
-
-.fc-event-skin {
- background: none !important;
- color: #000 !important;
- }
-
-/* horizontal events */
-
-.fc-event-hori {
- border-width: 0 0 1px 0 !important;
- border-bottom-style: dotted !important;
- border-bottom-color: #000 !important;
- padding: 1px 0 0 0 !important;
- }
-
-.fc-event-hori .fc-event-inner {
- border-width: 0 !important;
- padding: 0 1px !important;
- }
-
-/* vertical events */
-
-.fc-event-vert {
- border-width: 0 0 0 1px !important;
- border-left-style: dotted !important;
- border-left-color: #000 !important;
- padding: 0 1px 0 0 !important;
- }
-
-.fc-event-vert .fc-event-inner {
- border-width: 0 !important;
- padding: 1px 0 !important;
- }
-
-.fc-event-bg {
- display: none !important;
- }
-
-.fc-event .ui-resizable-handle {
- display: none !important;
- }
-
-
diff --git a/includes/fullcalendar/gcal.js b/includes/fullcalendar/gcal.js
deleted file mode 100644
index e9bbe26..0000000
--- a/includes/fullcalendar/gcal.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * FullCalendar v1.5.3 Google Calendar Plugin
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
- */
-
-(function($) {
-
-
-var fc = $.fullCalendar;
-var formatDate = fc.formatDate;
-var parseISO8601 = fc.parseISO8601;
-var addDays = fc.addDays;
-var applyAll = fc.applyAll;
-
-
-fc.sourceNormalizers.push(function(sourceOptions) {
- if (sourceOptions.dataType == 'gcal' ||
- sourceOptions.dataType === undefined &&
- (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) {
- sourceOptions.dataType = 'gcal';
- if (sourceOptions.editable === undefined) {
- sourceOptions.editable = false;
- }
- }
-});
-
-
-fc.sourceFetchers.push(function(sourceOptions, start, end) {
- if (sourceOptions.dataType == 'gcal') {
- return transformOptions(sourceOptions, start, end);
- }
-});
-
-
-function transformOptions(sourceOptions, start, end) {
-
- var success = sourceOptions.success;
- var data = $.extend({}, sourceOptions.data || {}, {
- 'start-min': formatDate(start, 'u'),
- 'start-max': formatDate(end, 'u'),
- 'singleevents': true,
- 'max-results': 9999
- });
-
- var ctz = sourceOptions.currentTimezone;
- if (ctz) {
- data.ctz = ctz = ctz.replace(' ', '_');
- }
-
- return $.extend({}, sourceOptions, {
- url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?',
- dataType: 'jsonp',
- data: data,
- startParam: false,
- endParam: false,
- success: function(data) {
- var events = [];
- if (data.feed.entry) {
- $.each(data.feed.entry, function(i, entry) {
- var startStr = entry['gd$when'][0]['startTime'];
- var start = parseISO8601(startStr, true);
- var end = parseISO8601(entry['gd$when'][0]['endTime'], true);
- var allDay = startStr.indexOf('T') == -1;
- var url;
- $.each(entry.link, function(i, link) {
- if (link.type == 'text/html') {
- url = link.href;
- if (ctz) {
- url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
- }
- }
- });
- if (allDay) {
- addDays(end, -1); // make inclusive
- }
- events.push({
- id: entry['gCal$uid']['value'],
- title: entry['title']['$t'],
- url: url,
- start: start,
- end: end,
- allDay: allDay,
- location: entry['gd$where'][0]['valueString'],
- description: entry['content']['$t']
- });
- });
- }
- var args = [events].concat(Array.prototype.slice.call(arguments, 1));
- var res = applyAll(success, this, args);
- if ($.isArray(res)) {
- return res;
- }
- return events;
- }
- });
-
-}
-
-
-// legacy
-fc.gcalFeed = function(url, sourceOptions) {
- return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' });
-};
-
-
-})(jQuery);
diff --git a/schedule.php b/schedule.php
index 10fa98d..f3252dc 100644
--- a/schedule.php
+++ b/schedule.php
@@ -10,31 +10,8 @@ include "includes/meta.html";
-
-
-
-
-
-
+
+
+