From 6369da0893f30dce26b02b8ea05751601e0f355f Mon Sep 17 00:00:00 2001 From: "alextselegidis@gmail.com" Date: Wed, 12 Jun 2013 15:31:16 +0000 Subject: [PATCH] =?UTF-8?q?-=20=CE=A4=CF=81=CE=BF=CF=80=CE=BF=CF=80=CE=BF?= =?UTF-8?q?=CE=B9=CE=AE=CF=83=CE=B5=CE=B9=CF=82=20=CF=83=CF=84=CE=B1=20?= =?UTF-8?q?=CE=B1=CF=81=CF=87=CE=B5=CE=AF=CE=B1=20=CE=BA=CE=B1=CE=B9=20?= =?UTF-8?q?=CF=84=CE=B7=CE=BD=20=CE=B4=CE=BF=CE=BC=CE=AE=20=CF=84=CE=BF?= =?UTF-8?q?=CF=85=20=CE=BA=CF=8E=CE=B4=CE=B9=CE=BA=CE=B1=20-=20=CE=A5?= =?UTF-8?q?=CE=BB=CE=BF=CF=80=CE=BF=CE=AF=CE=B7=CF=83=CE=B7=20=CF=84=CE=B7?= =?UTF-8?q?=CF=82=20=CF=80=CF=81=CF=8E=CF=84=CE=B7=CF=82=20=CF=83=CE=B5?= =?UTF-8?q?=CE=BB=CE=AF=CE=B4=CE=B1=CF=82=20=CF=84=CE=BF=CF=85=20backend?= =?UTF-8?q?=20=CF=84=CE=B7=CF=82=20=CE=B5=CF=86=CE=B1=CF=81=CE=BC=CE=BF?= =?UTF-8?q?=CE=B3=CE=AE=CF=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/application/controllers/appointments.php | 28 +- src/application/controllers/backend.php | 48 ++ src/application/libraries/google_sync.php | 25 +- src/application/views/appointments/book.php | 25 +- .../views/appointments/book_success.php | 6 +- src/application/views/appointments/cancel.php | 3 +- src/application/views/backend/calendar.php | 46 ++ src/application/views/backend/footer.php | 10 + src/application/views/backend/header.php | 106 ++++ src/assets/css/backend.css | 57 ++ src/assets/css/{style.css => frontend.css} | 0 src/assets/css/libs/jquery/fullcalendar.css | 579 ++++++++++++++++++ .../css/libs/jquery/fullcalendar.print.css | 32 + src/assets/images/favicon.ico | Bin 1150 -> 1150 bytes src/assets/images/logo.png | Bin 22029 -> 7147 bytes src/assets/js/backend.js | 27 + src/assets/js/backend_calendar.js | 66 ++ .../book_appointment.js => frontend_book.js} | 48 +- src/assets/js/libs/jquery/fullcalendar.min.js | 7 + src/assets/js/libs/jquery/gcal.js | 107 ++++ 20 files changed, 1155 insertions(+), 65 deletions(-) create mode 100644 src/application/controllers/backend.php create mode 100644 src/application/views/backend/calendar.php create mode 100644 src/application/views/backend/footer.php create mode 100644 src/application/views/backend/header.php create mode 100644 src/assets/css/backend.css rename src/assets/css/{style.css => frontend.css} (100%) create mode 100644 src/assets/css/libs/jquery/fullcalendar.css create mode 100644 src/assets/css/libs/jquery/fullcalendar.print.css create mode 100644 src/assets/js/backend.js create mode 100644 src/assets/js/backend_calendar.js rename src/assets/js/{frontend/book_appointment.js => frontend_book.js} (92%) create mode 100644 src/assets/js/libs/jquery/fullcalendar.min.js create mode 100644 src/assets/js/libs/jquery/gcal.js diff --git a/src/application/controllers/appointments.php b/src/application/controllers/appointments.php index 529cdb2f..903e4945 100644 --- a/src/application/controllers/appointments.php +++ b/src/application/controllers/appointments.php @@ -102,16 +102,18 @@ class Appointments extends CI_Controller { // Synchronize the appointment with the providers plan, if the // google sync option is enabled. - $this->load->library('google_sync'); $google_sync = $this->Providers_Model->get_setting('google_sync', $appointment_data['id_users_provider']); if ($google_sync == TRUE) { $google_token = $this->Providers_Model->get_setting('google_token', $appointment_data['id_users_provider']); - // Validate the token. If it isn't valid, the sync operation cannot + + // Authenticate the token. If it isn't valid, the sync operation cannot // be completed. - if ($this->google_sync->validate_token($google_token) === TRUE) { + $this->load->library('google_sync'); + + if ($this->google_sync->authenticate($google_token) === TRUE) { if ($manage_mode === FALSE) { // Add appointment to Google Calendar. $this->google_sync->add_appointment($appointment_data['id']); @@ -122,7 +124,7 @@ class Appointments extends CI_Controller { } } - // Load the book appointment view. + // Load the book success view. $service_data = $this->Services_Model->get_row($appointment_data['id_services']); $provider_data = $this->Providers_Model->get_row($appointment_data['id_users_provider']); $company_name = $this->Settings_Model->get_setting('company_name'); @@ -180,10 +182,22 @@ class Appointments extends CI_Controller { // Delete the appointment from Google Calendar, if it is synced. if ($appointment_data['id_google_calendar'] != NULL) { - $this->load->library('google_sync'); - $this->google_sync->delete_appointment($appointment_data['id']); + $google_sync = $this->Providers_Model->get_setting('google_sync', + $appointment_data['id_users_provider']); + + if ($google_sync == TRUE) { + $this->load->library('google_sync'); + + // Get the provider's refresh token and try to authenticate the + // Google Calendar API usage. + $google_token = $this->Providers_Model->get_setting('google_token', + $appointment_data['id_users_provider']); + + if ($this->google_sync->authendicate($google_token) === TRUE) { + $this->google_sync->delete_appointment($appointment_data['id']); + } + } } - } catch(Exception $exc) { // Display the error message to the customer. $view_data['error_message'] = $exc->getMessage(); diff --git a/src/application/controllers/backend.php b/src/application/controllers/backend.php new file mode 100644 index 00000000..897049c5 --- /dev/null +++ b/src/application/controllers/backend.php @@ -0,0 +1,48 @@ +load->model('Providers_Model'); + $this->load->model('Services_Model'); + $this->load->model('Settings_Model'); + + // Display the main backend page. + $view_data['base_url'] = $this->config->item('base_url'); + $view_data['company_name'] = $this->Settings_Model->get_setting('company_name'); + $view_data['available_providers'] = $this->Providers_Model->get_available_providers(); + $view_data['available_services'] = $this->Services_Model->get_available_services(); + + $this->load->view('backend/header', $view_data); + $this->load->view('backend/calendar', $view_data); + $this->load->view('backend/footer', $view_data); + } + + public function customers() { + + } + + public function services() { + + } + + public function providers() { + + } + + public function settings() { + + } +} + +/* End of file backend.php */ +/* Location: ./application/controllers/backend.php */ \ No newline at end of file diff --git a/src/application/libraries/google_sync.php b/src/application/libraries/google_sync.php index a1d3b091..a5f3b364 100644 --- a/src/application/libraries/google_sync.php +++ b/src/application/libraries/google_sync.php @@ -37,22 +37,21 @@ class Google_Sync { } /** - * Validate the Google API access token of a provider. + * Authenticate the Google API usage. * - * In order to manage a Google user's data, one need a valid access token. - * This token is provided when the user grants the permission to a system - * to access his Google account data. So before making any action we need - * to make sure that the available token is still valid. + * This method must be executed every time we need to make actions on a + * provider's Google Calendar account. A new token is necessary and the + * only way to get it is to use the stored refresh token that was provided + * when the provider granted consent to Easy!Appointments for use his + * Google Calendar account. * - * IMPORTANT! Always use this method before anything else - * in order to make sure that the token is being set and still valid. - * - * @param string $access_token This token is normally stored in the database. - * @return bool Returns the validation result. + * @param string $refresh_token The provider's refresh token. This value is + * stored in the database and used every time we need to make actions to his + * Google Caledar account. + * @return bool Returns the authenticate operation result. */ - public function validate_token($access_token) { - $this->client->setAccessToken($access_token); - return $this->client->isAccessTokenExpired(); + public function authenticate($refresh_token) { + } /** diff --git a/src/application/views/appointments/book.php b/src/application/views/appointments/book.php index 4c8f8317..05956e81 100644 --- a/src/application/views/appointments/book.php +++ b/src/application/views/appointments/book.php @@ -26,7 +26,7 @@ + href="config->base_url(); ?>assets/css/frontend.css"> + src="config->base_url(); ?>assets/js/libs/jquery/jquery.min.js"> + src="config->base_url(); ?>assets/js/libs/jquery/jquery-ui.min.js"> + src="config->base_url(); ?>assets/js/libs/jquery/jquery.qtip.min.js"> + src="config->base_url(); ?>assets/js/libs/bootstrap/bootstrap.min.js"> + src="config->base_url(); ?>assets/js/libs/date.js"> + src="config->base_url(); ?>assets/js/frontend_book.js"> + src="config->base_url(); ?>assets/js/general_functions.js"> diff --git a/src/application/views/appointments/book_success.php b/src/application/views/appointments/book_success.php index 9f946617..4c7c6fee 100644 --- a/src/application/views/appointments/book_success.php +++ b/src/application/views/appointments/book_success.php @@ -149,16 +149,16 @@ 'Your appointment has successfully been added to ' + 'your Google Calendar account.
' + '' + - 'Appointment Link' + + 'Click here to view your appoinmtent on Google ' + + 'Calendar.' + '' + '

' + '' ); + $('#add-to-google-calendar').hide(); } else { throw 'Could not add the event to Google Calendar.'; } - - }); }); } catch(exc) { diff --git a/src/application/views/appointments/cancel.php b/src/application/views/appointments/cancel.php index 8e04d2f7..e191f0a9 100644 --- a/src/application/views/appointments/cancel.php +++ b/src/application/views/appointments/cancel.php @@ -6,8 +6,7 @@ + src="config->base_url(); ?>assets/js/libs/jquery/jquery.min.js"> + + + + + + + +
+
+
+ + +
+ + +
+ +
+ + + +
+
+ +
+
\ No newline at end of file diff --git a/src/application/views/backend/footer.php b/src/application/views/backend/footer.php new file mode 100644 index 00000000..8217b821 --- /dev/null +++ b/src/application/views/backend/footer.php @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/src/application/views/backend/header.php b/src/application/views/backend/header.php new file mode 100644 index 00000000..24efacb2 --- /dev/null +++ b/src/application/views/backend/header.php @@ -0,0 +1,106 @@ + + + + Easy!Appointments Admin + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/css/backend.css b/src/assets/css/backend.css new file mode 100644 index 00000000..a7891452 --- /dev/null +++ b/src/assets/css/backend.css @@ -0,0 +1,57 @@ +/** + * BACKEND CSS FILE FOR EASY!APPOINTMENTS + */ + +root { + display: block; +} + +/* BACKEND GENERAL ELEMENTS + -------------------------------------------------------------------- */ +#header { + height: 70px; + background-color: #35B66F; + border-bottom: 6px solid #247A4B; +} +#header #header-logo { display: inline-block; height: 60px; margin: 10px 15px 0px 15px; } +#header #header-logo img { float: left; width: 50px; height: 50px; margin-right: 6px; } +#header #header-logo span { float: left; font-size: 20px; color: white; margin-top: 16px; } + +#header #header-menu { display: inline-block; float: right; height: 100%; } +#header #header-menu .menu-item { float: left; margin-right: 8px; margin-top: 10px; + padding: 15px 12px; min-width: 68px; text-align: center; + font-weight: bold; color: #FFF; text-decoration: none; + font-size: 16px; } +#header #header-menu .menu-item:hover { background-color: #247A4B; } + +#footer { + background-color: #F7F7F7; + border-top: 1px solid #DDD; +} +#footer #footer-content { padding: 15px; } + +/* BACKEND CALENDAR PAGE + -------------------------------------------------------------------- */ +#calendar-page #calendar-toolbar { margin: 15px 10px 20px 10px; padding-bottom: 10px; + overflow: auto; border-bottom: 1px solid #D6D6D6; } +#calendar-page #calendar-filter { display: inline-block; float: left; } +#calendar-page #calendar-filter label { display: inline-block; margin-right: 7px; + font-weight: bold; font-size: 18px; width: 180px; } +#calendar-page #calendar-filter select { margin-top: 5px; } +#calendar-page #calendar-actions { display: inline-block; float: right; margin-top: 16px; } +#calendar-page #calendar { margin: 12px; } + +/* BACKEND CUSTOMERS PAGE + -------------------------------------------------------------------- */ + + +/* BACKEND SERVICES PAGE + -------------------------------------------------------------------- */ + + +/* BACKEND PROVIDERS PAGE + -------------------------------------------------------------------- */ + + +/* BACKEND SETTINGS PAGE + -------------------------------------------------------------------- */ \ No newline at end of file diff --git a/src/assets/css/style.css b/src/assets/css/frontend.css similarity index 100% rename from src/assets/css/style.css rename to src/assets/css/frontend.css diff --git a/src/assets/css/libs/jquery/fullcalendar.css b/src/assets/css/libs/jquery/fullcalendar.css new file mode 100644 index 00000000..acae725d --- /dev/null +++ b/src/assets/css/libs/jquery/fullcalendar.css @@ -0,0 +1,579 @@ +/*! + * FullCalendar v1.6.1 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.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, /* non-theme */ +.fc-header .ui-corner-right { /* theme */ + 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 #ddd; + } + +.fc-state-highlight { /* today cell */ /* TODO: add .fc-today to */ + background: #fcf8e3; + } + +.fc-cell-overlay { /* semi-transparent rectangle while dragging */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ + } + + + +/* Buttons +------------------------------------------------------------------------*/ + +.fc-button { + position: relative; + display: inline-block; + padding: 0 .6em; + overflow: hidden; + height: 1.9em; + line-height: 1.9em; + white-space: nowrap; + cursor: pointer; + } + +.fc-state-default { /* non-theme */ + border: 1px solid; + } + +.fc-state-default.fc-corner-left { /* non-theme */ + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + +.fc-state-default.fc-corner-right { /* non-theme */ + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + +/* + Our default prev/next buttons use HTML entities like ‹ › « » + and we'll try to make them look good cross-browser. +*/ + +.fc-text-arrow { + margin: 0 .1em; + font-size: 2em; + font-family: "Courier New", Courier, monospace; + vertical-align: baseline; /* for IE7 */ + } + +.fc-button-prev .fc-text-arrow, +.fc-button-next .fc-text-arrow { /* for ‹ › */ + font-weight: bold; + } + +/* icon (for jquery ui) */ + +.fc-button .fc-icon-wrap { + position: relative; + float: left; + top: 50%; + } + +.fc-button .ui-icon { + position: relative; + float: left; + margin-top: -50%; + *margin-top: 0; + *top: -50%; + } + +/* + button states + borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) +*/ + +.fc-state-default { + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + color: #333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + } + +.fc-state-hover, +.fc-state-down, +.fc-state-active, +.fc-state-disabled { + color: #333333; + background-color: #e6e6e6; + } + +.fc-state-hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; + } + +.fc-state-down, +.fc-state-active { + background-color: #cccccc; + background-image: none; + outline: 0; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + } + +.fc-state-disabled { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + box-shadow: none; + } + + + +/* Global Event Styles +------------------------------------------------------------------------*/ + +.fc-event { + border: 1px solid #3a87ad; /* default BORDER color */ + background-color: #3a87ad; /* default BACKGROUND color */ + color: #fff; /* default TEXT color */ + font-size: .85em; + cursor: default; + } + +a.fc-event { + text-decoration: none; + } + +a.fc-event, +.fc-event-draggable { + cursor: pointer; + } + +.fc-rtl .fc-event { + text-align: right; + } + +.fc-event-inner { + width: 100%; + height: 100%; + overflow: hidden; + } + +.fc-event-time, +.fc-event-title { + padding: 0 1px; + } + +.fc .ui-resizable-handle { + 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; + } + +.fc-ltr .fc-event-hori.fc-event-start, +.fc-rtl .fc-event-hori.fc-event-end { + border-left-width: 1px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + +.fc-ltr .fc-event-hori.fc-event-end, +.fc-rtl .fc-event-hori.fc-event-start { + border-right-width: 1px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + +/* 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 */ + } + + + +/* 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 .fc-week-number { + width: 22px; + text-align: center; + } + +.fc .fc-week-number div { + padding: 0 2px; + } + +.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-week-number { + font-weight: bold; + } + +.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-start { + border-top-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + +.fc-event-vert.fc-event-end { + border-bottom-width: 1px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + +.fc-event-vert .fc-event-time { + white-space: nowrap; + font-size: 10px; + } + +.fc-event-vert .fc-event-inner { + position: relative; + z-index: 2; + } + +.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: .25; + filter: alpha(opacity=25); + } + +.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/src/assets/css/libs/jquery/fullcalendar.print.css b/src/assets/css/libs/jquery/fullcalendar.print.css new file mode 100644 index 00000000..8fea38db --- /dev/null +++ b/src/assets/css/libs/jquery/fullcalendar.print.css @@ -0,0 +1,32 @@ +/*! + * FullCalendar v1.6.1 Print Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +/* + * 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. + */ + + + /* Events +-----------------------------------------------------*/ + +.fc-event { + background: #fff !important; + color: #000 !important; + } + +/* for vertical events */ + +.fc-event-bg { + display: none !important; + } + +.fc-event .ui-resizable-handle { + display: none !important; + } + + diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico index 1df1d87a363003f85781b13cb48bf04812de556a..0a46dd9eaa5d6e3b1d4e818f727058770d3c5767 100644 GIT binary patch literal 1150 zcmb_aT}TvB6rO?JdJ%%2d+ezfiwr7K>%kzm{0&jUK=dI{kTi&N#KKZc+7x`yu!ks0 zvLAXVBnrc1wsyf?bIV-Kotajbv~^eKf4NoD;A}A^t%+xh}n5bl7w(L z{K(yZO-=?tW?7a4o7)yi`H?b~9q#5#({#qP#yeM^NG45mFKE5jQc5X~~h)b{Y z&_3b8s4xgwPvJ%MHaaE?(KT6$*~CYuj_vy|tqQ!Un~>EtjLdZ7y)*(#r>VMybuEdZ z@I`PFCvhuq9>VGus^7|}-_`5XBTc9CQU7#JPuEI3mYPRzpcc)edAJj7f@Ua?L}{~s zPW{w7yY~jwVfWJJ&X~A;wuQtL`u+8oT?x<~1N06y^-BrSr^+g1S@{FXMog78%B@3J zOsI+qVd1yFCr~lo=_^H-uPhTE%5lS2jO+Xv2QKg6J?QpTjJo&V63Q8CoytLLC=-{1 z*%+9s!GmZshJ_Z#-(P6LW3dhGpN_tA^=+Xeegd|mHFyYpGnE*O)L|%c!SMsLwYWQ1 zkE>I;o9~x&)r4MxcROeeZ%Z)8dnI_#@f)1x9M l*!&Y5>nY;cqI`}mAzn&6_Y}wOXDCjwVh_g_90y7YegVsQo1*{# literal 1150 zcmbu6ZAep57{||LhJ;dTVTKcRq`eU3hs`a6vNFU>9Y&2Lu}MZ)B8a`9Xg6XTvNTFX zD_yl0oL@4^FG=~KSAxtJ%<5~YwfDBPHdOwdbJvv$lAv?>pXYy`bAI=E&b@?i^ofZf zbWR~BA_$2mglwRqDVhoAX&~8jZ&g%SY%LC{R4UKR%q)`2<%LU$o>8Z!rfwHGF={lL z`ktPiL9^NXXerrjw!y~6Ml0o3iY$vpqtT9k91e#ACX?xfL?T&yhfb$6Gu-F%!Rd5@ zoe`tQStgSyS$&cB`~AY6%jJS7c9zNMapBvf7xSM2 zLZ^1S{jpN1EM~l3uNUeEXbrE|3szGUTQlC}^&mLq#oV-C;4K!*phBT2`jZzq#xTFg zQy=_D>rZ_Vc&pX=S6*a)l0xLCnt1F80oN_DxxI)BZz~ zJ}gX!@Bb^`($sQGXiA*ss1Y^))3X?)3Q^I~*W33{C07-&`>W5Y`#Xm_(J|bCYhyRi z_2wqJ-IA-$yidE325YAUCAw0`?q)&t zv;;ZBRoFXHjjU&-NV=y&4xfjv_AYE`*b1(O^O9o1GoIVXw8rS=3ikU&V8^G$;B~72+PCt@;5{25pf5 diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png index 2ed3df08c940fc9c2c437cec042d1dc647bec0bb..dc20a9412eadda733aea4218619e30918da170f9 100644 GIT binary patch delta 4474 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 M07*qoM6N<$f|VhYwEzGB delta 19473 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 $('body').height()) { + footerHandle.css({ + 'position' : 'absolute', + 'width' : '100%', + 'bottom' : '0px' + }); + } else { + footerHandle.css({ + 'position' : 'static' + }); + } +} diff --git a/src/assets/js/backend_calendar.js b/src/assets/js/backend_calendar.js new file mode 100644 index 00000000..dd5b670a --- /dev/null +++ b/src/assets/js/backend_calendar.js @@ -0,0 +1,66 @@ +/** + * This namespace contains functions that are used by the backend calendar page. + * + * @namespace Handles the backend calendar page functionality. + */ +var BackendCalendar = { + /** + * This function makes the necessary initialization for the default backend + * calendar page. If this namespace is used in another page then this function + * might not be needed. + * + * @param {bool} defaultEventHandlers (OPTIONAL = TRUE) Determines whether the + * default event handlers will be set for the current page. + */ + initialize: function(defaultEventHandlers) { + if (defaultEventHandlers === undefined) defaultEventHandlers = true; + + // :: INITIALIZE THE DOM ELEMENTS OF THE PAGE + $('#calendar').fullCalendar({ + defaultView : 'basicWeek', + height : BackendCalendar.getCalendarHeight(), + windowResize : function(view) { + $('#calendar').fullCalendar('option', 'height', + BackendCalendar.getCalendarHeight()); + } + }); + + // :: FILL THE SELECT ELEMENTS OF THE PAGE + $.each(GlobalVariables.availableProviders, function(index, provider) { + var option = new Option(provider['first_name'] + ' ' + + provider['last_name'], provider['id']); + $('#select-provider').append(option); + }); + + $.each(GlobalVariables.availableServices, function(index, service) { + var option = new Option(service['name'], service['id']); + $('#select-service').append(option); + }); + + // :: BIND THE DEFAULT EVENT HANDLERS + if (defaultEventHandlers === true) { + BackendCalendar.bindEventHandlers(); + } + }, + + /** + * This method binds the default event handlers for the backend calendar + * page. If you do not need the default handlers then initialize the page + * by setting the "defaultEventHandlers" argument to "false". + */ + bindEventHandlers: function() { + + }, + + /** + * This method calculates the proper calendar height, in order to be displayed + * correctly, even when the browser window is resizing. + * + * @return {int} Returns the calendar element height in pixels. + */ + getCalendarHeight: function () { + var result = window.innerHeight - $('#footer').height() - $('#header').height() + - $('#calendar-toolbar').height() - 80; // 80 for fine tuning + return (result > 500) ? result : 500; // Minimum height is 500px + } +}; \ No newline at end of file diff --git a/src/assets/js/frontend/book_appointment.js b/src/assets/js/frontend_book.js similarity index 92% rename from src/assets/js/frontend/book_appointment.js rename to src/assets/js/frontend_book.js index 056571ba..ef67302e 100644 --- a/src/assets/js/frontend/book_appointment.js +++ b/src/assets/js/frontend_book.js @@ -5,7 +5,7 @@ * * @class Implements the js part of the appointment booking page. */ -var bookAppointment = { +var FrontendBook = { /** * Determines the functionality of the page. * @@ -31,7 +31,7 @@ var bookAppointment = { manageMode = false; // Default Value } - bookAppointment.manageMode = manageMode; + FrontendBook.manageMode = manageMode; // Initialize page's components (tooltips, datepickers etc). $('.book-step').qtip({ @@ -49,21 +49,21 @@ var bookAppointment = { minDate : 0, defaultDate : Date.today(), onSelect : function(dateText, instance) { - bookAppointment.getAvailableHours(dateText); - bookAppointment.updateConfirmFrame(); + FrontendBook.getAvailableHours(dateText); + FrontendBook.updateConfirmFrame(); } }); // Bind the event handlers (might not be necessary every time // we use this class). if (bindEventHandlers) { - bookAppointment.bindEventHandlers(); + FrontendBook.bindEventHandlers(); } // If the manage mode is true, the appointments data should be // loaded by default. - if (bookAppointment.manageMode) { - bookAppointment.applyAppointmentData(GlobalVariables.appointmentData, + if (FrontendBook.manageMode) { + FrontendBook.applyAppointmentData(GlobalVariables.appointmentData, GlobalVariables.providerData, GlobalVariables.customerData); } else { $('#select-service').trigger('change'); // Load the available hours. @@ -82,8 +82,8 @@ var bookAppointment = { * date - time periods must be updated. */ $('#select-provider').change(function() { - bookAppointment.getAvailableHours(Date.today().toString('dd-MM-yyyy')); - bookAppointment.updateConfirmFrame(); + FrontendBook.getAvailableHours(Date.today().toString('dd-MM-yyyy')); + FrontendBook.updateConfirmFrame(); }); /** @@ -109,8 +109,8 @@ var bookAppointment = { }); }); - bookAppointment.getAvailableHours(Date.today().toString('dd-MM-yyyy')); - bookAppointment.updateConfirmFrame(); + FrontendBook.getAvailableHours(Date.today().toString('dd-MM-yyyy')); + FrontendBook.updateConfirmFrame(); }); /** @@ -138,10 +138,10 @@ var bookAppointment = { // If we are on the 3rd tab then we will need to validate the user's // input before proceeding to the next step. if ($(this).attr('data-step_index') === '3') { - if (!bookAppointment.validateCustomerForm()) { + if (!FrontendBook.validateCustomerForm()) { return; // Validation failed, do not continue. } else { - bookAppointment.updateConfirmFrame(); + FrontendBook.updateConfirmFrame(); } } @@ -180,10 +180,10 @@ var bookAppointment = { $('#available-hours').on('click', '.available-hour', function() { $('.selected-hour').removeClass('selected-hour'); $(this).addClass('selected-hour'); - bookAppointment.updateConfirmFrame(); + FrontendBook.updateConfirmFrame(); }); - if (bookAppointment.manageMode) { + if (FrontendBook.manageMode) { /** * Event: Cancel Appointment Button "Click" * @@ -230,7 +230,7 @@ var bookAppointment = { // If the manage mode is true then the appointment's start // date should return as available too. - var appointmentId = (bookAppointment.manageMode) + var appointmentId = (FrontendBook.manageMode) ? GlobalVariables.appointmentData['id'] : undefined; var postData = { @@ -238,7 +238,7 @@ var bookAppointment = { 'provider_id' : $('#select-provider').val(), 'selected_date' : selDate, 'service_duration' : selServiceDuration, - 'manage_mode' : bookAppointment.manageMode, + 'manage_mode' : FrontendBook.manageMode, 'appointment_id' : appointmentId }; @@ -272,7 +272,7 @@ var bookAppointment = { + '
'); }); - if (bookAppointment.manageMode) { + if (FrontendBook.manageMode) { // Set the appointment start time as selected. $('.available-hour').removeClass('selected-hour'); $('.available-hour').filter(function() { @@ -285,7 +285,7 @@ var bookAppointment = { $('.available-hour:eq(0)').addClass('selected-hour'); } - bookAppointment.updateConfirmFrame(); + FrontendBook.updateConfirmFrame(); } else { $('#available-hours').text('There are no available appointment' + 'hours for the selected date. Please choose another ' @@ -365,15 +365,15 @@ var bookAppointment = { postData['appointment'] = { 'start_datetime' : $('#select-date').datepicker('getDate').toString('yyyy-MM-dd') + ' ' + $('.selected-hour').text() + ':00', - 'end_datetime' : bookAppointment.calcEndDatetime(), + 'end_datetime' : FrontendBook.calcEndDatetime(), 'notes' : $('#notes').val(), 'id_users_provider' : $('#select-provider').val(), 'id_services' : $('#select-service').val() }; - postData['manage_mode'] = bookAppointment.manageMode; + postData['manage_mode'] = FrontendBook.manageMode; - if (bookAppointment.manageMode) { + if (FrontendBook.manageMode) { postData['appointment']['id'] = GlobalVariables.appointmentData['id']; postData['customer']['id'] = GlobalVariables.customerData['id']; } @@ -431,7 +431,7 @@ var bookAppointment = { // Set Appointment Date $('#select-date').datepicker('setDate', Date.parseExact( appointmentData['start_datetime'], 'yyyy-MM-dd HH:mm:ss')); - bookAppointment.getAvailableHours($('#select-date').val()); + FrontendBook.getAvailableHours($('#select-date').val()); // Apply Customer's Data $('#last-name').val(customerData['last_name']); @@ -445,7 +445,7 @@ var bookAppointment = { var appointmentNotes = (appointmentData['notes'] !== null) ? appointmentData['notes'] : ''; $('#notes').val(appointmentNotes); - bookAppointment.updateConfirmFrame(); + FrontendBook.updateConfirmFrame(); return true; } catch(exc) { diff --git a/src/assets/js/libs/jquery/fullcalendar.min.js b/src/assets/js/libs/jquery/fullcalendar.min.js new file mode 100644 index 00000000..c3e0834a --- /dev/null +++ b/src/assets/js/libs/jquery/fullcalendar.min.js @@ -0,0 +1,7 @@ +/*! + * FullCalendar v1.6.1 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ +(function(t,e){function n(e){t.extend(!0,ye,e)}function r(n,r,l){function u(t){G?(S(),C(),R(),b(t)):f()}function f(){K=r.theme?"ui":"fc",n.addClass("fc"),r.isRTL?n.addClass("fc-rtl"):n.addClass("fc-ltr"),r.theme&&n.addClass("ui-widget"),G=t("
").prependTo(n),$=new a(Z,r),Q=$.render(),Q&&n.prepend(Q),y(r.defaultView),t(window).resize(x),m()||v()}function v(){setTimeout(function(){!te.start&&m()&&b()},0)}function h(){t(window).unbind("resize",x),$.destroy(),G.remove(),n.removeClass("fc fc-rtl ui-widget")}function g(){return 0!==se.offsetWidth}function m(){return 0!==t("body")[0].offsetWidth}function y(e){if(!te||e!=te.name){ue++,W();var n,r=te;r?((r.beforeHide||I)(),q(G,G.height()),r.element.hide()):q(G,1),G.css("overflow","hidden"),te=ce[e],te?te.element.show():te=ce[e]=new De[e](n=re=t("
").appendTo(G),Z),r&&$.deactivateButton(r.name),$.activateButton(e),b(),G.css("overflow",""),r&&q(G,1),n||(te.afterShow||I)(),ue--}}function b(t){if(g()){ue++,W(),ne===e&&S();var r=!1;!te.start||t||te.start>fe||fe>=te.end?(te.render(fe,t||0),E(!0),r=!0):te.sizeDirty?(te.clearEvents(),E(),r=!0):te.eventsDirty&&(te.clearEvents(),r=!0),te.sizeDirty=!1,te.eventsDirty=!1,T(r),ee=n.outerWidth(),$.updateTitle(te.title);var a=new Date;a>=te.start&&te.end>a?$.disableButton("today"):$.enableButton("today"),ue--,te.trigger("viewDisplay",se)}}function M(){C(),g()&&(S(),E(),W(),te.clearEvents(),te.renderEvents(de),te.sizeDirty=!1)}function C(){t.each(ce,function(t,e){e.sizeDirty=!0})}function S(){ne=r.contentHeight?r.contentHeight:r.height?r.height-(Q?Q.height():0)-L(G):Math.round(G.width()/Math.max(r.aspectRatio,.5))}function E(t){ue++,te.setHeight(ne,t),re&&(re.css("position","relative"),re=null),te.setWidth(G.width(),t),ue--}function x(){if(!ue)if(te.start){var t=++le;setTimeout(function(){t==le&&!ue&&g()&&ee!=(ee=n.outerWidth())&&(ue++,M(),te.trigger("windowResize",se),ue--)},200)}else v()}function T(t){!r.lazyFetching||oe(te.visStart,te.visEnd)?k():t&&F()}function k(){ie(te.visStart,te.visEnd)}function H(t){de=t,F()}function z(t){F(t)}function F(t){R(),g()&&(te.clearEvents(),te.renderEvents(de,t),te.eventsDirty=!1)}function R(){t.each(ce,function(t,e){e.eventsDirty=!0})}function N(t,n,r){te.select(t,n,r===e?!0:r)}function W(){te&&te.unselect()}function A(){b(-1)}function _(){b(1)}function O(){i(fe,-1),b()}function B(){i(fe,1),b()}function Y(){fe=new Date,b()}function j(t,e,n){t instanceof Date?fe=d(t):p(fe,t,e,n),b()}function P(t,n,r){t!==e&&i(fe,t),n!==e&&s(fe,n),r!==e&&c(fe,r),b()}function J(){return d(fe)}function V(){return te}function X(t,n){return n===e?r[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(r[t]=n,M()),e)}function U(t,n){return r[t]?r[t].apply(n||se,Array.prototype.slice.call(arguments,2)):e}var Z=this;Z.options=r,Z.render=u,Z.destroy=h,Z.refetchEvents=k,Z.reportEvents=H,Z.reportEventChange=z,Z.rerenderEvents=F,Z.changeView=y,Z.select=N,Z.unselect=W,Z.prev=A,Z.next=_,Z.prevYear=O,Z.nextYear=B,Z.today=Y,Z.gotoDate=j,Z.incrementDate=P,Z.formatDate=function(t,e){return w(t,e,r)},Z.formatDates=function(t,e,n){return D(t,e,n,r)},Z.getDate=J,Z.getView=V,Z.option=X,Z.trigger=U,o.call(Z,r,l);var $,Q,G,K,te,ee,ne,re,ae,oe=Z.isFetchNeeded,ie=Z.fetchEvents,se=n[0],ce={},le=0,ue=0,fe=new Date,de=[];p(fe,r.year,r.month,r.date),r.droppable&&t(document).bind("dragstart",function(e,n){var a=e.target,o=t(a);if(!o.parents(".fc").length){var i=r.dropAccept;(t.isFunction(i)?i.call(a,o):o.is(i))&&(ae=a,te.dragStart(ae,e,n))}}).bind("dragstop",function(t,e){ae&&(te.dragStop(ae,t,e),ae=null)})}function a(n,r){function a(){v=r.theme?"ui":"fc";var n=r.header;return n?h=t("").append(t("").append(i("left")).append(i("center")).append(i("right"))):e}function o(){h.remove()}function i(e){var a=t("
"),o=r.header[e];return o&&t.each(o.split(" "),function(e){e>0&&a.append("");var o;t.each(this.split(","),function(e,i){if("title"==i)a.append("

 

"),o&&o.addClass(v+"-corner-right"),o=null;else{var s;if(n[i]?s=n[i]:De[i]&&(s=function(){u.removeClass(v+"-state-hover"),n.changeView(i)}),s){var c=r.theme?J(r.buttonIcons,i):null,l=J(r.buttonText,i),u=t(""+(c?""+"":l)+"").click(function(){u.hasClass(v+"-state-disabled")||s()}).mousedown(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-down")}).mouseup(function(){u.removeClass(v+"-state-down")}).hover(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-hover")},function(){u.removeClass(v+"-state-hover").removeClass(v+"-state-down")}).appendTo(a);U(u),o||u.addClass(v+"-corner-left"),o=u}}}),o&&o.addClass(v+"-corner-right")}),a}function s(t){h.find("h2").html(t)}function c(t){h.find("span.fc-button-"+t).addClass(v+"-state-active")}function l(t){h.find("span.fc-button-"+t).removeClass(v+"-state-active")}function u(t){h.find("span.fc-button-"+t).addClass(v+"-state-disabled")}function f(t){h.find("span.fc-button-"+t).removeClass(v+"-state-disabled")}var d=this;d.render=a,d.destroy=o,d.updateTitle=s,d.activateButton=c,d.deactivateButton=l,d.disableButton=u,d.enableButton=f;var v,h=t([])}function o(n,r){function a(t,e){return!S||S>t||e>E}function o(t,e){S=t,E=e,W=[];var n=++F,r=z.length;R=r;for(var a=0;r>a;a++)i(z[a],n)}function i(e,r){s(e,function(a){if(r==F){if(a){n.eventDataTransform&&(a=t.map(a,n.eventDataTransform)),e.eventDataTransform&&(a=t.map(a,e.eventDataTransform));for(var o=0;a.length>o;o++)a[o].source=e,b(a[o]);W=W.concat(a)}R--,R||k(W)}})}function s(r,a){var o,i,c=we.sourceFetchers;for(o=0;c.length>o;o++){if(i=c[o](r,S,E,a),i===!0)return;if("object"==typeof i)return s(i,a),e}var l=r.events;if(l)t.isFunction(l)?(p(),l(d(S),d(E),function(t){a(t),y()})):t.isArray(l)?a(l):a();else{var u=r.url;if(u){var f=r.success,v=r.error,h=r.complete,g=t.extend({},r.data||{}),m=K(r.startParam,n.startParam),b=K(r.endParam,n.endParam);m&&(g[m]=Math.round(+S/1e3)),b&&(g[b]=Math.round(+E/1e3)),p(),t.ajax(t.extend({},Me,r,{data:g,success:function(e){e=e||[];var n=G(f,this,arguments);t.isArray(n)&&(e=n),a(e)},error:function(){G(v,this,arguments),a()},complete:function(){G(h,this,arguments),y()}}))}else a()}}function c(t){t=l(t),t&&(R++,i(t,F))}function l(n){return t.isFunction(n)||t.isArray(n)?n={events:n}:"string"==typeof n&&(n={url:n}),"object"==typeof n?(w(n),z.push(n),n):e}function u(e){z=t.grep(z,function(t){return!D(t,e)}),W=t.grep(W,function(t){return!D(t.source,e)}),k(W)}function f(t){var e,n,r=W.length,a=T().defaultEventEnd,o=t.start-t._start,i=t.end?t.end-(t._end||a(t)):0;for(e=0;r>e;e++)n=W[e],n._id==t._id&&n!=t&&(n.start=new Date(+n.start+o),n.end=t.end?n.end?new Date(+n.end+i):new Date(+a(n)+i):null,n.title=t.title,n.url=t.url,n.allDay=t.allDay,n.className=t.className,n.editable=t.editable,n.color=t.color,n.backgroudColor=t.backgroudColor,n.borderColor=t.borderColor,n.textColor=t.textColor,b(n));b(t),k(W)}function v(t,e){b(t),t.source||(e&&(H.events.push(t),t.source=H),W.push(t)),k(W)}function h(e){if(e){if(!t.isFunction(e)){var n=e+"";e=function(t){return t._id==n}}W=t.grep(W,e,!0);for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=t.grep(z[r].events,e,!0))}else{W=[];for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=[])}k(W)}function g(e){return t.isFunction(e)?t.grep(W,e):e?(e+="",t.grep(W,function(t){return t._id==e})):W}function p(){N++||x("loading",null,!0)}function y(){--N||x("loading",null,!1)}function b(t){var r=t.source||{},a=K(r.ignoreTimezone,n.ignoreTimezone);t._id=t._id||(t.id===e?"_fc"+Ce++:t.id+""),t.date&&(t.start||(t.start=t.date),delete t.date),t._start=d(t.start=m(t.start,a)),t.end=m(t.end,a),t.end&&t.end<=t.start&&(t.end=null),t._end=t.end?d(t.end):null,t.allDay===e&&(t.allDay=K(r.allDayDefault,n.allDayDefault)),t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[]}function w(t){t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[];for(var e=we.sourceNormalizers,n=0;e.length>n;n++)e[n](t)}function D(t,e){return t&&e&&M(t)==M(e)}function M(t){return("object"==typeof t?t.events||t.url:"")||t}var C=this;C.isFetchNeeded=a,C.fetchEvents=o,C.addEventSource=c,C.removeEventSource=u,C.updateEvent=f,C.renderEvent=v,C.removeEvents=h,C.clientEvents=g,C.normalizeEvent=b;for(var S,E,x=C.trigger,T=C.getView,k=C.reportEvents,H={events:[]},z=[H],F=0,R=0,N=0,W=[],A=0;r.length>A;A++)l(r[A])}function i(t,e,n){return t.setFullYear(t.getFullYear()+e),n||f(t),t}function s(t,e,n){if(+t){var r=t.getMonth()+e,a=d(t);for(a.setDate(1),a.setMonth(r),t.setMonth(r),n||f(t);t.getMonth()!=a.getMonth();)t.setDate(t.getDate()+(a>t?1:-1))}return t}function c(t,e,n){if(+t){var r=t.getDate()+e,a=d(t);a.setHours(9),a.setDate(r),t.setDate(r),n||f(t),l(t,a)}return t}function l(t,e){if(+t)for(;t.getDate()!=e.getDate();)t.setTime(+t+(e>t?1:-1)*xe)}function u(t,e){return t.setMinutes(t.getMinutes()+e),t}function f(t){return t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t}function d(t,e){return e?f(new Date(+t)):new Date(+t)}function v(){var t,e=0;do t=new Date(1970,e++,1);while(t.getHours());return t}function h(t,e,n){for(e=e||1;!t.getDay()||n&&1==t.getDay()||!n&&6==t.getDay();)c(t,e);return t}function g(t,e){return Math.round((d(t,!0)-d(e,!0))/Ee)}function p(t,n,r,a){n!==e&&n!=t.getFullYear()&&(t.setDate(1),t.setMonth(0),t.setFullYear(n)),r!==e&&r!=t.getMonth()&&(t.setDate(1),t.setMonth(r)),a!==e&&t.setDate(a)}function m(t,n){return"object"==typeof t?t:"number"==typeof t?new Date(1e3*t):"string"==typeof t?t.match(/^\d+(\.\d+)?$/)?new Date(1e3*parseFloat(t)):(n===e&&(n=!0),y(t,n)||(t?new Date(t):null)):null}function y(t,e){var n=t.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(!n)return null;var r=new Date(n[1],0,1);if(e||!n[13]){var a=new Date(n[1],0,1,9,0);n[3]&&(r.setMonth(n[3]-1),a.setMonth(n[3]-1)),n[5]&&(r.setDate(n[5]),a.setDate(n[5])),l(r,a),n[7]&&r.setHours(n[7]),n[8]&&r.setMinutes(n[8]),n[10]&&r.setSeconds(n[10]),n[12]&&r.setMilliseconds(1e3*Number("0."+n[12])),l(r,a)}else if(r.setUTCFullYear(n[1],n[3]?n[3]-1:0,n[5]||1),r.setUTCHours(n[7]||0,n[8]||0,n[10]||0,n[12]?1e3*Number("0."+n[12]):0),n[14]){var o=60*Number(n[16])+(n[18]?Number(n[18]):0);o*="-"==n[15]?1:-1,r=new Date(+r+1e3*60*o)}return r}function b(t){if("number"==typeof t)return 60*t;if("object"==typeof t)return 60*t.getHours()+t.getMinutes();var e=t.match(/(\d+)(?::(\d+))?\s*(\w+)?/);if(e){var n=parseInt(e[1],10);return e[3]&&(n%=12,"p"==e[3].toLowerCase().charAt(0)&&(n+=12)),60*n+(e[2]?parseInt(e[2],10):0)}}function w(t,e,n){return D(t,null,e,n)}function D(t,e,n,r){r=r||ye;var a,o,i,s,c=t,l=e,u=n.length,f="";for(a=0;u>a;a++)if(o=n.charAt(a),"'"==o){for(i=a+1;u>i;i++)if("'"==n.charAt(i)){c&&(f+=i==a+1?"'":n.substring(a+1,i),a=i);break}}else if("("==o){for(i=a+1;u>i;i++)if(")"==n.charAt(i)){var d=w(c,n.substring(a+1,i),r);parseInt(d.replace(/\D/,""),10)&&(f+=d),a=i;break}}else if("["==o){for(i=a+1;u>i;i++)if("]"==n.charAt(i)){var v=n.substring(a+1,i),d=w(c,v,r);d!=w(l,v,r)&&(f+=d),a=i;break}}else if("{"==o)c=e,l=t;else if("}"==o)c=t,l=e;else{for(i=u;i>a;i--)if(s=ke[n.substring(a,i)]){c&&(f+=s(c,r)),a=i-1;break}i==a&&c&&(f+=o)}return f}function M(t){var e,n=new Date(t.getTime());return n.setDate(n.getDate()+4-(n.getDay()||7)),e=n.getTime(),n.setMonth(0),n.setDate(1),Math.floor(Math.round((e-n)/864e5)/7)+1}function C(t){return t.end?S(t.end,t.allDay):c(d(t.start),1)}function S(t,e){return t=d(t),e||t.getHours()||t.getMinutes()?c(t,1):f(t)}function E(t,e){return 100*(e.msLength-t.msLength)+(t.event.start-e.event.start)}function x(t,e){return t.end>e.start&&t.starta;a++)o=t[a],i=o.start,s=e[a],s>n&&r>i&&(n>i?(c=d(n),u=!1):(c=i,u=!0),s>r?(l=d(r),f=!1):(l=s,f=!0),v.push({event:o,start:c,end:l,isStart:u,isEnd:f,msLength:l-c}));return v.sort(E)}function k(t){var e,n,r,a,o,i=[],s=t.length;for(e=0;s>e;e++){for(n=t[e],r=0;;){if(a=!1,i[r])for(o=0;i[r].length>o;o++)if(x(i[r][o],n)){a=!0;break}if(!a)break;r++}i[r]?i[r].push(n):i[r]=[n]}return i}function H(n,r,a){n.unbind("mouseover").mouseover(function(n){for(var o,i,s,c=n.target;c!=this;)o=c,c=c.parentNode;(i=o._fci)!==e&&(o._fci=e,s=r[i],a(s.event,s.element,s),t(n.target).trigger(n)),n.stopPropagation()})}function z(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.width(Math.max(0,n-R(a,r)))}function F(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.height(Math.max(0,n-L(a,r)))}function R(t,e){return N(t)+A(t)+(e?W(t):0)}function N(e){return(parseFloat(t.css(e[0],"paddingLeft",!0))||0)+(parseFloat(t.css(e[0],"paddingRight",!0))||0)}function W(e){return(parseFloat(t.css(e[0],"marginLeft",!0))||0)+(parseFloat(t.css(e[0],"marginRight",!0))||0)}function A(e){return(parseFloat(t.css(e[0],"borderLeftWidth",!0))||0)+(parseFloat(t.css(e[0],"borderRightWidth",!0))||0)}function L(t,e){return _(t)+B(t)+(e?O(t):0)}function _(e){return(parseFloat(t.css(e[0],"paddingTop",!0))||0)+(parseFloat(t.css(e[0],"paddingBottom",!0))||0)}function O(e){return(parseFloat(t.css(e[0],"marginTop",!0))||0)+(parseFloat(t.css(e[0],"marginBottom",!0))||0)}function B(e){return(parseFloat(t.css(e[0],"borderTopWidth",!0))||0)+(parseFloat(t.css(e[0],"borderBottomWidth",!0))||0)}function q(t,e){e="number"==typeof e?e+"px":e,t.each(function(t,n){n.style.cssText+=";min-height:"+e+";_height:"+e})}function I(){}function Y(t,e){return t-e}function j(t){return Math.max.apply(Math,t)}function P(t){return(10>t?"0":"")+t}function J(t,n){if(t[n]!==e)return t[n];for(var r,a=n.split(/(?=[A-Z])/),o=a.length-1;o>=0;o--)if(r=t[a[o].toLowerCase()],r!==e)return r;return t[""]}function V(t){return t.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function X(t){return t.id+"/"+t.className+"/"+t.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/gi,"")}function U(t){t.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return!1})}function Z(t){t.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}function $(t,e){t.each(function(t,n){n.className=n.className.replace(/^fc-\w*/,"fc-"+Se[e.getDay()])})}function Q(t,e){var n=t.source||{},r=t.color,a=n.color,o=e("eventColor"),i=t.backgroundColor||r||n.backgroundColor||a||e("eventBackgroundColor")||o,s=t.borderColor||r||n.borderColor||a||e("eventBorderColor")||o,c=t.textColor||n.textColor||e("eventTextColor"),l=[];return i&&l.push("background-color:"+i),s&&l.push("border-color:"+s),c&&l.push("color:"+c),l.join(";")}function G(e,n,r){if(t.isFunction(e)&&(e=[e]),e){var a,o;for(a=0;e.length>a;a++)o=e[a].apply(n,r)||o;return o}}function K(){for(var t=0;arguments.length>t;t++)if(arguments[t]!==e)return arguments[t]}function te(t,e){function n(t,e){e&&(s(t,e),t.setDate(1));var n=d(t,!0);n.setDate(1);var l=s(d(n),1),u=d(n),f=d(l),v=a("firstDay"),g=a("weekends")?0:1;g&&(h(u),h(f,-1,!0)),c(u,-((u.getDay()-Math.max(v,g)+7)%7)),c(f,(7-f.getDay()+Math.max(v,g))%7);var p=Math.round((f-u)/(7*Ee));"fixed"==a("weekMode")&&(c(f,7*(6-p)),p=6),r.title=i(n,a("titleFormat")),r.start=n,r.end=l,r.visStart=u,r.visEnd=f,o(p,g?5:7,!0)}var r=this;r.render=n,re.call(r,t,e,"month");var a=r.opt,o=r.renderBasic,i=e.formatDate}function ee(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(1,f?7:5,!1)}var r=this;r.render=n,re.call(r,t,e,"basicWeek");var a=r.opt,o=r.renderBasic,i=e.formatDates}function ne(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1)),r.title=i(t,a("titleFormat")),r.start=r.visStart=d(t,!0),r.end=r.visEnd=c(d(r.start),1),o(1,1,!1)}var r=this;r.render=n,re.call(r,t,e,"basicDay");var a=r.opt,o=r.renderBasic,i=e.formatDate}function re(e,n,r){function a(t,e,n){ne=t,re=e,o();var r=!P;r?i():Te(),s(n)}function o(){ce=Ee("isRTL"),ce?(le=-1,fe=re-1):(le=1,fe=0),pe=Ee("firstDay"),ye=Ee("weekends")?0:1,be=Ee("theme")?"ui":"fc",we=Ee("columnFormat"),De=Ee("weekNumbers"),Me=Ee("weekNumberTitle"),Ce="iso"!=Ee("weekNumberCalculation")?"w":"W"}function i(){Q=t("
").appendTo(e)}function s(n){var r,a,o,i,s="",c=be+"-widget-header",l=be+"-widget-content",u=B.start.getMonth(),d=f(new Date);for(s+="",De&&(s+="",r=0;ne>r;r++){for(s+="",De&&(s+=""),a=0;re>a;a++)o=F(r,a),i=["fc-day","fc-"+Se[o.getDay()],l],o.getMonth()!=u&&i.push("fc-other-month"),+o==+d&&(i.push("fc-today"),i.push(be+"-state-highlight")),s+="";s+=""}s+="
"),r=0;re>r;r++)o=F(0,r),s+="";for(s+="
"+"
"+"
"+"
",n&&(s+="
"+o.getDate()+"
"),s+="
 
",_(),I&&I.remove(),I=t(s).appendTo(e),Y=I.find("thead"),j=Y.find(".fc-day-header"),P=I.find("tbody"),J=P.find("tr"),V=P.find(".fc-day"),X=J.find("td:first-child"),$=J.eq(0).find(".fc-day-content > div"),Z(Y.add(Y.find("tr"))),Z(J),J.eq(0).addClass("fc-first"),J.filter(":last").addClass("fc-last"),De&&Y.find(".fc-week-number").text(Me),j.each(function(e,n){var r=R(e);t(n).text(Fe(r,we))}),De&&P.find(".fc-week-number > div").each(function(e,n){var r=F(e,0);t(n).text(Fe(r,Ce))}),V.each(function(e,n){var r=R(e);xe("dayRender",B,r,t(n))}),v(V)}function l(e){K=e;var n,r,a,o=K-Y.height();"variable"==Ee("weekMode")?n=r=Math.floor(o/(1==ne?2:6)):(n=Math.floor(o/ne),r=o-n*(ne-1)),X.each(function(e,o){ne>e&&(a=t(o),q(a.find("> div"),(e==ne-1?r:n)-L(a)))}),O()}function u(t){G=t,se.clear(),ee=0,De&&(ee=Y.find("th.fc-week-number").outerWidth()),te=Math.floor((G-ee)/re),z(j.slice(0,-1),te)}function v(t){t.click(h).mousedown(ze)}function h(e){if(!Ee("selectable")){var n=y(t(this).data("date"));xe("dayClick",this,n,!0,e)}}function p(t,e,n){n&&oe.build();for(var r=d(B.visStart),a=c(d(r),re),o=0;ne>o;o++){var i=new Date(Math.max(r,t)),s=new Date(Math.min(a,e));if(s>i){var l,u;ce?(l=g(s,r)*le+fe+1,u=g(i,r)*le+fe+1):(l=g(i,r),u=g(s,r)),v(m(o,l,o,u-1))}c(r,7),c(a,7)}}function m(t,n,r,a){var o=oe.rect(t,n,r,a,e);return ke(o,e)}function b(t){return d(t)}function w(t,e){p(t,c(d(e),1),!0)}function D(){He()}function M(t,e,n){var r=k(t),a=V[r.row*re+r.col];xe("dayClick",a,t,e,n)}function C(t,e){ie.start(function(t){He(),t&&m(t.row,t.col,t.row,t.col)},e)}function S(t,e,n){var r=ie.stop();if(He(),r){var a=H(r);xe("drop",t,a,!0,e,n)}}function E(t){return d(t.start)}function x(t){return se.left(t)}function T(t){return se.right(t)}function k(t){return{row:Math.floor(g(t,B.visStart)/7),col:N(t.getDay())}}function H(t){return F(t.row,t.col)}function F(t,e){return c(d(B.visStart),7*t+e*le+fe)}function R(t){return F(Math.floor(t/re),t%re)}function N(t){return(t-Math.max(pe,ye)+re)%re*le+fe}function W(t){return J.eq(t)}function A(){var t=0;return De&&(t+=ee),{left:t,right:G}}function _(){q(e,e.height())}function O(){q(e,1)}var B=this;B.renderBasic=a,B.setHeight=l,B.setWidth=u,B.renderDayOverlay=p,B.defaultSelectionEnd=b,B.renderSelection=w,B.clearSelection=D,B.reportDayClick=M,B.dragStart=C,B.dragStop=S,B.defaultEventEnd=E,B.getHoverListener=function(){return ie},B.colContentLeft=x,B.colContentRight=T,B.dayOfWeekCol=N,B.dateCell=k,B.cellDate=H,B.cellIsAllDay=function(){return!0},B.allDayRow=W,B.allDayBounds=A,B.getRowCnt=function(){return ne},B.getColCnt=function(){return re},B.getColWidth=function(){return te},B.getDaySegmentContainer=function(){return Q},ue.call(B,e,n,r),ve.call(B),de.call(B),ae.call(B);var I,Y,j,P,J,V,X,$,Q,G,K,te,ee,ne,re,oe,ie,se,ce,le,fe,pe,ye,be,we,De,Me,Ce,Ee=B.opt,xe=B.trigger,Te=B.clearEvents,ke=B.renderOverlay,He=B.clearOverlays,ze=B.daySelectionMousedown,Fe=n.formatDate;U(e.addClass("fc-grid")),oe=new he(function(e,n){var r,a,o;j.each(function(e,i){r=t(i),a=r.offset().left,e&&(o[1]=a),o=[a],n[e]=o}),o[1]=a+r.outerWidth(),J.each(function(n,i){ne>n&&(r=t(i),a=r.offset().top,n&&(o[1]=a),o=[a],e[n]=o)}),o[1]=a+r.outerHeight()}),ie=new ge(oe),se=new me(function(t){return $.eq(t)})}function ae(){function e(t,e){v(t),x(r(t),e),l("eventAfterAllRender")}function n(){h(),b().empty()}function r(e){var n,r,a,o,s,l,u=S(),f=E(),v=d(i.visStart),h=c(d(v),f),g=t.map(e,C),p=[];for(n=0;u>n;n++){for(r=k(T(e,g,v,h)),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.row=n,l.level=a,p.push(l);c(v,7),c(h,7)}return p}function a(t,e,n){u(t)&&o(t,e),n.isEnd&&f(t)&&H(t,e,n),g(t,e)}function o(t,e){var n,r=w();e.draggable({zIndex:9,delay:50,opacity:s("dragOpacity"),revertDuration:s("dragRevertDuration"),start:function(a,o){l("eventDragStart",e,t,a,o),m(t,e),r.start(function(r,a,o,i){e.draggable("option","revert",!r||!o&&!i),M(),r?(n=7*o+i*(s("isRTL")?-1:1),D(c(d(t.start),n),c(C(t),n))):n=0},a,"drag")},stop:function(a,o){r.stop(),M(),l("eventDragStop",e,t,a,o),n?y(this,t,n,0,t.allDay,a,o):(e.css("filter",""),p(t,e))}})}var i=this;i.renderEvents=e,i.compileDaySegs=r,i.clearEvents=n,i.bindDaySeg=a,fe.call(i);var s=i.opt,l=i.trigger,u=i.isEventDraggable,f=i.isEventResizable,v=i.reportEvents,h=i.reportEventClear,g=i.eventElementHandlers,p=i.showEvents,m=i.hideEvents,y=i.eventDrop,b=i.getDaySegmentContainer,w=i.getHoverListener,D=i.renderDayOverlay,M=i.clearOverlays,S=i.getRowCnt,E=i.getColCnt,x=i.renderDaySegs,H=i.resizableDayEvent}function oe(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(f?7:5)}var r=this;r.render=n,se.call(r,t,e,"agendaWeek");var a=r.opt,o=r.renderAgenda,i=e.formatDates}function ie(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1));var n=d(t,!0),s=c(d(n),1);r.title=i(t,a("titleFormat")),r.start=r.visStart=n,r.end=r.visEnd=s,o(1)}var r=this;r.render=n,se.call(r,t,e,"agendaDay");var a=r.opt,o=r.renderAgenda,i=e.formatDate}function se(n,r,a){function o(t){Le=t,i(),te?nn():s(),l()}function i(){Ye=tn("theme")?"ui":"fc",Pe=tn("weekends")?0:1,je=tn("firstDay"),(Je=tn("isRTL"))?(Ve=-1,Xe=Le-1):(Ve=1,Xe=0),Ue=b(tn("minTime")),Ze=b(tn("maxTime")),$e=tn("columnFormat"),Qe=tn("weekNumbers"),Ge=tn("weekNumberTitle"),Ke="iso"!=tn("weekNumberCalculation")?"w":"W",Ne=tn("snapMinutes")||tn("slotMinutes")}function s(){var e,r,a,o,i,s=Ye+"-widget-header",c=Ye+"-widget-content",l=0==tn("slotMinutes")%15;for(e="",e+=Qe?"",r=0;Le>r;r++)e+=""+""+""+""+""+"",r=0;Le>r;r++)e+="";for(e+=""+""+""+"
":" ";for(e+=" 
 "+"
"+"
"+"
 
"+"
"+"
"+"
 
",te=t(e).appendTo(n),ee=te.find("thead"),ne=ee.find("th").slice(1,-1),re=te.find("tbody"),ae=re.find("td").slice(0,-1),oe=ae.find("div.fc-day-content div"),ie=ae.eq(0),se=ie.find("> div"),Z(ee.add(ee.find("tr"))),Z(re.add(re.find("tr"))),Se=ee.find("th:first"),Ee=te.find(".fc-agenda-gutter"),le=t("
").appendTo(n),tn("allDaySlot")?(fe=t("
").appendTo(le),e=""+""+""+""+"
"+tn("allDayText")+""+"
"+"
 
",pe=t(e).appendTo(le),ye=pe.find("tr"),D(ye.find("td")),Se=Se.add(pe.find("th:first")),Ee=Ee.add(pe.find("th.fc-agenda-gutter")),le.append("
"+"
"+"
")):fe=t([]),be=t("
").appendTo(le),we=t("
").appendTo(be),De=t("
").appendTo(we),e="",a=v(),o=u(d(a),Ze),u(a,Ue),_e=0,r=0;o>a;r++)i=a.getMinutes(),e+=""+""+""+"",u(a,tn("slotMinutes")),_e++;e+="
"+(l&&i?" ":un(a,tn("axisFormat")))+""+"
 
"+"
",Me=t(e).appendTo(we),Ce=Me.find("div:first"),M(Me.find("td")),Se=Se.add(Me.find("th:first"))}function l(){var t,e,n,r,a=f(new Date);if(Qe){var o=un(N(0),Ke);Je?o+=Ge:o=Ge+o,ee.find(".fc-week-number").text(o)}for(t=0;Le>t;t++)r=N(t),e=ne.eq(t),e.html(un(r,$e)),n=ae.eq(t),+r==+a?n.addClass(Ye+"-state-highlight fc-today"):n.removeClass(Ye+"-state-highlight fc-today"),$(e.add(n),r)}function h(t,n){t===e&&(t=ke),ke=t,fn={};var r=re.position().top,a=be.position().top,o=Math.min(t-r,Me.height()+a+1);se.height(o-L(ie)),le.css("top",r),be.height(o-a-1),Re=Ce.height()+1,We=tn("slotMinutes")/Ne,Ae=Re/We,n&&m()}function p(e){Te=e,qe.clear(),He=0,z(Se.width("").each(function(e,n){He=Math.max(He,t(n).outerWidth())}),He);var n=be[0].clientWidth;Fe=be.width()-n,Fe?(z(Ee,Fe),Ee.show().prev().removeClass("fc-last")):Ee.hide().prev().addClass("fc-last"),ze=Math.floor((n-He)/Le),z(ne.slice(0,-1),ze)}function m(){function t(){be.scrollTop(r)}var e=v(),n=d(e);n.setHours(tn("firstHour"));var r=_(e,n)+1;t(),setTimeout(t,0)}function y(){Ie=be.scrollTop()}function w(){be.scrollTop(Ie)}function D(t){t.click(C).mousedown(cn)}function M(t){t.click(C).mousedown(V)}function C(t){if(!tn("selectable")){var e=Math.min(Le-1,Math.floor((t.pageX-te.offset().left-He)/ze)),n=N(e),r=this.parentNode.className.match(/fc-slot(\d+)/);if(r){var a=parseInt(r[1])*tn("slotMinutes"),o=Math.floor(a/60);n.setHours(o),n.setMinutes(a%60+Ue),en("dayClick",ae[e],n,!1,t)}else en("dayClick",ae[e],n,!0,t)}}function S(t,e,n){n&&Oe.build();var r,a,o=d(K.visStart);Je?(r=g(e,o)*Ve+Xe+1,a=g(t,o)*Ve+Xe+1):(r=g(t,o),a=g(e,o)),r=Math.max(0,r),a=Math.min(Le,a),a>r&&D(E(0,r,0,a-1))}function E(t,e,n,r){var a=Oe.rect(t,e,n,r,le);return rn(a,le)}function x(t,e){for(var n=d(K.visStart),r=c(d(n),1),a=0;Le>a;a++){var o=new Date(Math.max(n,t)),i=new Date(Math.min(r,e));if(i>o){var s=a*Ve+Xe,l=Oe.rect(0,s,0,s,we),u=_(n,o),f=_(n,i);l.top=u,l.height=f-u,M(rn(l,we))}c(n,1),c(r,1)}}function T(t){return qe.left(t)}function k(t){return qe.right(t)}function H(t){return{row:Math.floor(g(t,K.visStart)/7),col:A(t.getDay())}}function R(t){var e=N(t.col),n=t.row;return tn("allDaySlot")&&n--,n>=0&&u(e,Ue+n*Ne),e}function N(t){return c(d(K.visStart),t*Ve+Xe)}function W(t){return tn("allDaySlot")&&!t.row}function A(t){return(t-Math.max(je,Pe)+Le)%Le*Ve+Xe}function _(t,n){if(t=d(t,!0),u(d(t),Ue)>n)return 0;if(n>=u(d(t),Ze))return Me.height();var r=tn("slotMinutes"),a=60*n.getHours()+n.getMinutes()-Ue,o=Math.floor(a/r),i=fn[o];return i===e&&(i=fn[o]=Me.find("tr:eq("+o+") td div")[0].offsetTop),Math.max(0,Math.round(i-1+Re*(a%r/r)))}function O(){return{left:He,right:Te-Fe}}function B(){return ye}function q(t){var e=d(t.start);return t.allDay?e:u(e,tn("defaultEventMinutes"))}function I(t,e){return e?d(t):u(d(t),tn("slotMinutes"))}function j(t,e,n){n?tn("allDaySlot")&&S(t,c(d(e),1),!0):P(t,e)}function P(e,n){var r=tn("selectHelper");if(Oe.build(),r){var a=g(e,K.visStart)*Ve+Xe;if(a>=0&&Le>a){var o=Oe.rect(0,a,0,a,we),i=_(e,e),s=_(e,n);if(s>i){if(o.top=i,o.height=s-i,o.left+=2,o.width-=5,t.isFunction(r)){var c=r(e,n);c&&(o.position="absolute",o.zIndex=8,xe=t(c).css(o).appendTo(we))}else o.isStart=!0,o.isEnd=!0,xe=t(ln({title:"",start:e,end:n,className:["fc-select-helper"],editable:!1},o)),xe.css("opacity",tn("dragOpacity"));xe&&(M(xe),we.append(xe),z(xe,o.width,!0),F(xe,o.height,!0))}}}else x(e,n)}function J(){an(),xe&&(xe.remove(),xe=null)}function V(e){if(1==e.which&&tn("selectable")){sn(e);var n;Be.start(function(t,e){if(J(),t&&t.col==e.col&&!W(t)){var r=R(e),a=R(t);n=[r,u(d(r),Ne),a,u(d(a),Ne)].sort(Y),P(n[0],n[3])}else n=null},e),t(document).one("mouseup",function(t){Be.stop(),n&&(+n[0]==+n[1]&&X(n[0],!1,t),on(n[0],n[3],!1,t))})}}function X(t,e,n){en("dayClick",ae[A(t.getDay())],t,e,n)}function Q(t,e){Be.start(function(t){if(an(),t)if(W(t))E(t.row,t.col,t.row,t.col);else{var e=R(t),n=u(d(e),tn("defaultEventMinutes"));x(e,n)}},e)}function G(t,e,n){var r=Be.stop();an(),r&&en("drop",t,R(r),W(r),e,n)}var K=this;K.renderAgenda=o,K.setWidth=p,K.setHeight=h,K.beforeHide=y,K.afterShow=w,K.defaultEventEnd=q,K.timePosition=_,K.dayOfWeekCol=A,K.dateCell=H,K.cellDate=R,K.cellIsAllDay=W,K.allDayRow=B,K.allDayBounds=O,K.getHoverListener=function(){return Be},K.colContentLeft=T,K.colContentRight=k,K.getDaySegmentContainer=function(){return fe},K.getSlotSegmentContainer=function(){return De},K.getMinMinute=function(){return Ue},K.getMaxMinute=function(){return Ze},K.getBodyContent=function(){return we},K.getRowCnt=function(){return 1},K.getColCnt=function(){return Le},K.getColWidth=function(){return ze},K.getSnapHeight=function(){return Ae},K.getSnapMinutes=function(){return Ne},K.defaultSelectionEnd=I,K.renderDayOverlay=S,K.renderSelection=j,K.clearSelection=J,K.reportDayClick=X,K.dragStart=Q,K.dragStop=G,ue.call(K,n,r,a),ve.call(K),de.call(K),ce.call(K);var te,ee,ne,re,ae,oe,ie,se,le,fe,pe,ye,be,we,De,Me,Ce,Se,Ee,xe,Te,ke,He,ze,Fe,Re,Ne,We,Ae,Le,_e,Oe,Be,qe,Ie,Ye,je,Pe,Je,Ve,Xe,Ue,Ze,$e,Qe,Ge,Ke,tn=K.opt,en=K.trigger,nn=K.clearEvents,rn=K.renderOverlay,an=K.clearOverlays,on=K.reportSelection,sn=K.unselect,cn=K.daySelectionMousedown,ln=K.slotSegHtml,un=r.formatDate,fn={};U(n.addClass("fc-agenda")),Oe=new he(function(e,n){function r(t){return Math.max(c,Math.min(l,t))}var a,o,i;ne.each(function(e,r){a=t(r),o=a.offset().left,e&&(i[1]=o),i=[o],n[e]=i}),i[1]=o+a.outerWidth(),tn("allDaySlot")&&(a=ye,o=a.offset().top,e[0]=[o,o+a.outerHeight()]);for(var s=we.offset().top,c=be.offset().top,l=c+be.outerHeight(),u=0;_e*We>u;u++)e.push([r(s+Ae*u),r(s+Ae*(u+1))])}),Be=new ge(Oe),qe=new me(function(t){return oe.eq(t)})}function ce(){function n(t,e){S(t);var n,r=t.length,i=[],c=[];for(n=0;r>n;n++)t[n].allDay?i.push(t[n]):c.push(t[n]);y("allDaySlot")&&(Y(a(i),e),z()),s(o(c),e),b("eventAfterAllRender")}function r(){E(),N().empty(),W().empty()}function a(e){var n,r,a,o,i=k(T(e,t.map(e,C),m.visStart,m.visEnd)),s=i.length,c=[];for(n=0;s>n;n++)for(r=i[n],a=0;r.length>a;a++)o=r[a],o.row=0,o.level=n,c.push(o);return c}function o(e){var n,r,a,o,s,l,f=P(),v=O(),h=_(),g=u(d(m.visStart),v),p=t.map(e,i),y=[];for(n=0;f>n;n++){for(r=k(T(e,p,g,u(d(g),h-v))),le(r),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.col=n,l.level=a,y.push(l);c(g,1,!0)}return y}function i(t){return t.end?d(t.end):u(d(t.start),y("defaultEventMinutes"))}function s(n,r){var a,o,i,s,c,u,f,d,h,g,p,m,w,D,M,C,S,E,x,T,k,z,F=n.length,N="",A={},_={},O=W(),Y=P();for((T=y("isRTL"))?(k=-1,z=Y-1):(k=1,z=0),a=0;F>a;a++)o=n[a],i=o.event,s=B(o.start,o.start),c=B(o.start,o.end),u=o.col,f=o.level,d=o.forward||0,h=q(u*k+z),g=I(u*k+z)-h,g=Math.min(g-6,.95*g),p=f?g/(f+d+1):d?2*(g/(d+1)-6):g,m=h+g/(f+d+1)*f*k+(T?g-p:0),o.top=s,o.left=m,o.outerWidth=p,o.outerHeight=c-s,N+=l(i,o); +for(O[0].innerHTML=N,w=O.children(),a=0;F>a;a++)o=n[a],i=o.event,D=t(w[a]),M=b("eventRender",i,i,D),M===!1?D.remove():(M&&M!==!0&&(D.remove(),D=t(M).css({position:"absolute",top:o.top,left:o.left}).appendTo(O)),o.element=D,i._id===r?v(i,D,o):D[0]._fci=a,G(i,D));for(H(O,n,v),a=0;F>a;a++)o=n[a],(D=o.element)&&(S=A[C=o.key=X(D[0])],o.vsides=S===e?A[C]=L(D,!0):S,S=_[C],o.hsides=S===e?_[C]=R(D,!0):S,E=D.find(".fc-event-title"),E.length&&(o.contentTop=E[0].offsetTop));for(a=0;F>a;a++)o=n[a],(D=o.element)&&(D[0].style.width=Math.max(0,o.outerWidth-o.hsides)+"px",x=Math.max(0,o.outerHeight-o.vsides),D[0].style.height=x+"px",i=o.event,o.contentTop!==e&&10>x-o.contentTop&&(D.find("div.fc-event-time").text(ie(i.start,y("timeFormat"))+" - "+i.title),D.find("div.fc-event-title").remove()),b("eventAfterRender",i,i,D))}function l(t,e){var n="<",r=t.url,a=Q(t,y),o=["fc-event","fc-event-vert"];return w(t)&&o.push("fc-event-draggable"),e.isStart&&o.push("fc-event-start"),e.isEnd&&o.push("fc-event-end"),o=o.concat(t.className),t.source&&(o=o.concat(t.source.className||[])),n+=r?"a href='"+V(t.url)+"'":"div",n+=" class='"+o.join(" ")+"'"+" style='position:absolute;z-index:8;top:"+e.top+"px;left:"+e.left+"px;"+a+"'"+">"+"
"+"
"+V(se(t.start,t.end,y("timeFormat")))+"
"+"
"+V(t.title)+"
"+"
"+"
",e.isEnd&&D(t)&&(n+="
=
"),n+=""}function f(t,e,n){w(t)&&h(t,e,n.isStart),n.isEnd&&D(t)&&j(t,e,n),x(t,e)}function v(t,e,n){var r=e.find("div.fc-event-time");w(t)&&g(t,e,r),n.isEnd&&D(t)&&p(t,e,r),x(t,e)}function h(t,e,n){function r(){s||(e.width(a).height("").draggable("option","grid",null),s=!0)}var a,o,i,s=!0,l=y("isRTL")?-1:1,u=A(),f=J(),v=U(),h=Z(),g=O();e.draggable({zIndex:9,opacity:y("dragOpacity","month"),revertDuration:y("dragRevertDuration"),start:function(g,p){b("eventDragStart",e,t,g,p),te(t,e),a=e.width(),u.start(function(a,u,g,p){ae(),a?(o=!1,i=p*l,a.row?n?s&&(e.width(f-10),F(e,v*Math.round((t.end?(t.end-t.start)/Te:y("defaultEventMinutes"))/h)),e.draggable("option","grid",[f,1]),s=!1):o=!0:(re(c(d(t.start),i),c(C(t),i)),r()),o=o||s&&!i):(r(),o=!0),e.draggable("option","revert",o)},g,"drag")},stop:function(n,a){if(u.stop(),ae(),b("eventDragStop",e,t,n,a),o)r(),e.css("filter",""),K(t,e);else{var c=0;s||(c=Math.round((e.offset().top-$().offset().top)/v)*h+g-(60*t.start.getHours()+t.start.getMinutes())),ee(this,t,i,c,s,n,a)}}})}function g(t,e,n){function r(e){var r,a=u(d(t.start),e);t.end&&(r=u(d(t.end),e)),n.text(se(a,r,y("timeFormat")))}function a(){f&&(n.css("display",""),e.draggable("option","grid",[p,m]),f=!1)}var o,i,s,l,f=!1,v=y("isRTL")?-1:1,h=A(),g=P(),p=J(),m=U(),w=Z();e.draggable({zIndex:9,scroll:!1,grid:[p,m],axis:1==g?"y":!1,opacity:y("dragOpacity"),revertDuration:y("dragRevertDuration"),start:function(r,u){b("eventDragStart",e,t,r,u),te(t,e),o=e.position(),s=l=0,h.start(function(r,o,s,l){e.draggable("option","revert",!r),ae(),r&&(i=l*v,y("allDaySlot")&&!r.row?(f||(f=!0,n.hide(),e.draggable("option","grid",null)),re(c(d(t.start),i),c(C(t),i))):a())},r,"drag")},drag:function(t,e){s=Math.round((e.position.top-o.top)/m)*w,s!=l&&(f||r(s),l=s)},stop:function(n,c){var l=h.stop();ae(),b("eventDragStop",e,t,n,c),l&&(i||s||f)?ee(this,t,i,f?0:s,f,n,c):(a(),e.css("filter",""),e.css(o),r(0),K(t,e))}})}function p(t,e,n){var r,a,o=U(),i=Z();e.resizable({handles:{s:".ui-resizable-handle"},grid:o,start:function(n,o){r=a=0,te(t,e),e.css("z-index",9),b("eventResizeStart",this,t,n,o)},resize:function(s,c){r=Math.round((Math.max(o,e.height())-c.originalSize.height)/o),r!=a&&(n.text(se(t.start,r||t.end?u(M(t),i*r):null,y("timeFormat"))),a=r)},stop:function(n,a){b("eventResizeStop",this,t,n,a),r?ne(this,t,0,i*r,n,a):(e.css("z-index",8),K(t,e))}})}var m=this;m.renderEvents=n,m.compileDaySegs=a,m.clearEvents=r,m.slotSegHtml=l,m.bindDaySeg=f,fe.call(m);var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,S=m.reportEvents,E=m.reportEventClear,x=m.eventElementHandlers,z=m.setHeight,N=m.getDaySegmentContainer,W=m.getSlotSegmentContainer,A=m.getHoverListener,_=m.getMaxMinute,O=m.getMinMinute,B=m.timePosition,q=m.colContentLeft,I=m.colContentRight,Y=m.renderDaySegs,j=m.resizableDayEvent,P=m.getColCnt,J=m.getColWidth,U=m.getSnapHeight,Z=m.getSnapMinutes,$=m.getBodyContent,G=m.reportEventElement,K=m.showEvents,te=m.hideEvents,ee=m.eventDrop,ne=m.eventResize,re=m.renderDayOverlay,ae=m.clearOverlays,oe=m.calendar,ie=oe.formatDate,se=oe.formatDates}function le(t){var e,n,r,a,o,i;for(e=t.length-1;e>0;e--)for(a=t[e],n=0;a.length>n;n++)for(o=a[n],r=0;t[e-1].length>r;r++)i=t[e-1][r],x(o,i)&&(i.forward=Math.max(i.forward||0,(o.forward||0)+1))}function ue(t,n,r){function a(t,e){var n=F[t];return"object"==typeof n?J(n,e||r):n}function o(t,e){return n.trigger.apply(n,[t,e||S].concat(Array.prototype.slice.call(arguments,2),[S]))}function i(t){return l(t)&&!a("disableDragging")}function s(t){return l(t)&&!a("disableResizing")}function l(t){return K(t.editable,(t.source||{}).editable,a("editable"))}function f(t){k={};var e,n,r=t.length;for(e=0;r>e;e++)n=t[e],k[n._id]?k[n._id].push(n):k[n._id]=[n]}function v(t){return t.end?d(t.end):E(t)}function h(t,e){H.push(e),z[t._id]?z[t._id].push(e):z[t._id]=[e]}function g(){H=[],z={}}function p(t,n){n.click(function(r){return n.hasClass("ui-draggable-dragging")||n.hasClass("ui-resizable-resizing")?e:o("eventClick",this,t,r)}).hover(function(e){o("eventMouseover",this,t,e)},function(e){o("eventMouseout",this,t,e)})}function m(t,e){b(t,e,"show")}function y(t,e){b(t,e,"hide")}function b(t,e,n){var r,a=z[t._id],o=a.length;for(r=0;o>r;r++)e&&a[r][0]==e[0]||a[r][n]()}function w(t,e,n,r,a,i,s){var c=e.allDay,l=e._id;M(k[l],n,r,a),o("eventDrop",t,e,n,r,a,function(){M(k[l],-n,-r,c),T(l)},i,s),T(l)}function D(t,e,n,r,a,i){var s=e._id;C(k[s],n,r),o("eventResize",t,e,n,r,function(){C(k[s],-n,-r),T(s)},a,i),T(s)}function M(t,n,r,a){r=r||0;for(var o,i=t.length,s=0;i>s;s++)o=t[s],a!==e&&(o.allDay=a),u(c(o.start,n,!0),r),o.end&&(o.end=u(c(o.end,n,!0),r)),x(o,F)}function C(t,e,n){n=n||0;for(var r,a=t.length,o=0;a>o;o++)r=t[o],r.end=u(c(v(r),e,!0),n),x(r,F)}var S=this;S.element=t,S.calendar=n,S.name=r,S.opt=a,S.trigger=o,S.isEventDraggable=i,S.isEventResizable=s,S.reportEvents=f,S.eventEnd=v,S.reportEventElement=h,S.reportEventClear=g,S.eventElementHandlers=p,S.showEvents=m,S.hideEvents=y,S.eventDrop=w,S.eventResize=D;var E=S.defaultEventEnd,x=n.normalizeEvent,T=n.reportEventChange,k={},H=[],z={},F=n.options}function fe(){function n(t,e){var n,r,c,d,p,m,y,b,w=B(),D=T(),M=k(),C=0,S=t.length;for(w[0].innerHTML=a(t),o(t,w.children()),i(t),s(t,w,e),l(t),u(t),f(t),n=v(),r=0;D>r;r++){for(c=0,d=[],p=0;M>p;p++)d[p]=0;for(;S>C&&(m=t[C]).row==r;){for(y=j(d.slice(m.startCol,m.endCol)),m.top=y,y+=m.outerHeight,b=m.startCol;m.endCol>b;b++)d[b]=y;C++}n[r].height(j(d))}g(t,h(n))}function r(e,n,r){var i,s,c,d=t("
"),p=B(),m=e.length;for(d[0].innerHTML=a(e),i=d.children(),p.append(i),o(e,i),l(e),u(e),f(e),g(e,h(v())),i=[],s=0;m>s;s++)c=e[s].element,c&&(e[s].row===n&&c.css("top",r),i.push(c[0]));return t(i)}function a(t){var e,n,r,a,o,i,s,c,l,u,f=y("isRTL"),d=t.length,v=F(),h=v.left,g=v.right,p="";for(e=0;d>e;e++)n=t[e],r=n.event,o=["fc-event","fc-event-hori"],w(r)&&o.push("fc-event-draggable"),n.isStart&&o.push("fc-event-start"),n.isEnd&&o.push("fc-event-end"),f?(i=A(n.end.getDay()-1),s=A(n.start.getDay()),c=n.isEnd?N(i):h,l=n.isStart?W(s):g):(i=A(n.start.getDay()),s=A(n.end.getDay()-1),c=n.isStart?N(i):h,l=n.isEnd?W(s):g),o=o.concat(r.className),r.source&&(o=o.concat(r.source.className||[])),a=r.url,u=Q(r,y),p+=a?""+"
",!r.allDay&&n.isStart&&(p+=""+V(I(r.start,r.end,y("timeFormat")))+""),p+=""+V(r.title)+""+"
",n.isEnd&&D(r)&&(p+="
"+"   "+"
"),p+="",n.left=c,n.outerWidth=l-c,n.startCol=i,n.endCol=s+1;return p}function o(e,n){var r,a,o,i,s,c=e.length;for(r=0;c>r;r++)a=e[r],o=a.event,i=t(n[r]),s=b("eventRender",o,o,i),s===!1?i.remove():(s&&s!==!0&&(s=t(s).css({position:"absolute",left:a.left}),i.replaceWith(s),i=s),a.element=i)}function i(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&C(n.event,r)}function s(t,e,n){var r,a,o,i,s=t.length;for(r=0;s>r;r++)a=t[r],o=a.element,o&&(i=a.event,i._id===n?q(i,o,a):o[0]._fci=r);H(e,t,q)}function l(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key=X(a[0]),i=c[o],i===e&&(i=c[o]=R(a,!0)),r.hsides=i)}function u(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&(r[0].style.width=Math.max(0,n.outerWidth-n.hsides)+"px")}function f(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key,i=c[o],i===e&&(i=c[o]=O(a)),r.outerHeight=a[0].offsetHeight+i)}function v(){var t,e=T(),n=[];for(t=0;e>t;t++)n[t]=z(t).find("div.fc-day-content > div");return n}function h(t){var e,n=t.length,r=[];for(e=0;n>e;e++)r[e]=t[e][0].offsetTop;return r}function g(t,e){var n,r,a,o,i=t.length;for(n=0;i>n;n++)r=t[n],a=r.element,a&&(a[0].style.top=e[r.row]+(r.top||0)+"px",o=r.event,b("eventAfterRender",o,o,a))}function p(e,n,a){var o=y("isRTL"),i=o?"w":"e",s=n.find(".ui-resizable-"+i),l=!1;U(n),n.mousedown(function(t){t.preventDefault()}).click(function(t){l&&(t.preventDefault(),t.stopImmediatePropagation())}),s.mousedown(function(s){function u(n){b("eventResizeStop",this,e,n),t("body").css("cursor",""),h.stop(),P(),f&&x(this,e,f,0,n),setTimeout(function(){l=!1},0)}if(1==s.which){l=!0;var f,v,h=m.getHoverListener(),g=T(),p=k(),y=o?-1:1,w=o?p-1:0,D=n.css("top"),C=t.extend({},e),H=L(e.start);J(),t("body").css("cursor",i+"-resize").one("mouseup",u),b("eventResizeStart",this,e,s),h.start(function(t,n){if(t){var s=Math.max(H.row,t.row),l=t.col;1==g&&(s=0),s==H.row&&(l=o?Math.min(H.col,l):Math.max(H.col,l)),f=7*s+l*y+w-(7*n.row+n.col*y+w);var u=c(M(e),f,!0);if(f){C.end=u;var h=v;v=r(_([C]),a.row,D),v.find("*").css("cursor",i+"-resize"),h&&h.remove(),E(e)}else v&&(S(e),v.remove(),v=null);P(),Y(e.start,c(d(u),1))}},s)}})}var m=this;m.renderDaySegs=n,m.resizableDayEvent=p;var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,C=m.reportEventElement,S=m.showEvents,E=m.hideEvents,x=m.eventResize,T=m.getRowCnt,k=m.getColCnt;m.getColWidth;var z=m.allDayRow,F=m.allDayBounds,N=m.colContentLeft,W=m.colContentRight,A=m.dayOfWeekCol,L=m.dateCell,_=m.compileDaySegs,B=m.getDaySegmentContainer,q=m.bindDaySeg,I=m.calendar.formatDates,Y=m.renderDayOverlay,P=m.clearOverlays,J=m.clearSelection}function de(){function e(t,e,a){n(),e||(e=c(t,a)),l(t,e,a),r(t,e,a)}function n(t){f&&(f=!1,u(),s("unselect",null,t))}function r(t,e,n,r){f=!0,s("select",null,t,e,n,r)}function a(e){var a=o.cellDate,s=o.cellIsAllDay,c=o.getHoverListener(),f=o.reportDayClick;if(1==e.which&&i("selectable")){n(e);var d;c.start(function(t,e){u(),t&&s(t)?(d=[a(e),a(t)].sort(Y),l(d[0],d[1],!0)):d=null},e),t(document).one("mouseup",function(t){c.stop(),d&&(+d[0]==+d[1]&&f(d[0],!0,t),r(d[0],d[1],!0,t))})}}var o=this;o.select=e,o.unselect=n,o.reportSelection=r,o.daySelectionMousedown=a;var i=o.opt,s=o.trigger,c=o.defaultSelectionEnd,l=o.renderSelection,u=o.clearSelection,f=!1;i("selectable")&&i("unselectAuto")&&t(document).mousedown(function(e){var r=i("unselectCancel");r&&t(e.target).parents(r).length||n(e)})}function ve(){function e(e,n){var r=o.shift();return r||(r=t("
")),r[0].parentNode!=n[0]&&r.appendTo(n),a.push(r.css(e).show()),r}function n(){for(var t;t=a.shift();)o.push(t.hide().unbind())}var r=this;r.renderOverlay=e,r.clearOverlays=n;var a=[],o=[]}function he(t){var e,n,r=this;r.build=function(){e=[],n=[],t(e,n)},r.cell=function(t,r){var a,o=e.length,i=n.length,s=-1,c=-1;for(a=0;o>a;a++)if(r>=e[a][0]&&e[a][1]>r){s=a;break}for(a=0;i>a;a++)if(t>=n[a][0]&&n[a][1]>t){c=a;break}return s>=0&&c>=0?{row:s,col:c}:null},r.rect=function(t,r,a,o,i){var s=i.offset();return{top:e[t][0]-s.top,left:n[r][0]-s.left,width:n[o][1]-n[r][0],height:e[a][1]-e[t][0]}}}function ge(e){function n(t){pe(t);var n=e.cell(t.pageX,t.pageY);(!n!=!i||n&&(n.row!=i.row||n.col!=i.col))&&(n?(o||(o=n),a(n,o,n.row-o.row,n.col-o.col)):a(n,o),i=n)}var r,a,o,i,s=this;s.start=function(s,c,l){a=s,o=i=null,e.build(),n(c),r=l||"mousemove",t(document).bind(r,n)},s.stop=function(){return t(document).unbind(r,n),i}}function pe(t){t.pageX===e&&(t.pageX=t.originalEvent.pageX,t.pageY=t.originalEvent.pageY)}function me(t){function n(e){return a[e]=a[e]||t(e)}var r=this,a={},o={},i={};r.left=function(t){return o[t]=o[t]===e?n(t).position().left:o[t]},r.right=function(t){return i[t]=i[t]===e?r.left(t)+n(t).width():i[t]},r.clear=function(){a={},o={},i={}}}var ye={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"iso",weekNumberTitle:"W",allDayDefault:!0,ignoreTimezone:!0,lazyFetching:!0,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:!1,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:!1,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:!0,dropAccept:"*"},be={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"",next:"",prevYear:"»",nextYear:"«"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},we=t.fullCalendar={version:"1.6.1"},De=we.views={};t.fn.fullCalendar=function(n){if("string"==typeof n){var a,o=Array.prototype.slice.call(arguments,1);return this.each(function(){var r=t.data(this,"fullCalendar");if(r&&t.isFunction(r[n])){var i=r[n].apply(r,o);a===e&&(a=i),"destroy"==n&&t.removeData(this,"fullCalendar")}}),a!==e?a:this}var i=n.eventSources||[];return delete n.eventSources,n.events&&(i.push(n.events),delete n.events),n=t.extend(!0,{},ye,n.isRTL||n.isRTL===e&&ye.isRTL?be:{},n),this.each(function(e,a){var o=t(a),s=new r(o,n,i);o.data("fullCalendar",s),s.render()}),this},we.sourceNormalizers=[],we.sourceFetchers=[];var Me={dataType:"json",cache:!1},Ce=1;we.addDays=c,we.cloneDate=d,we.parseDate=m,we.parseISO8601=y,we.parseTime=b,we.formatDate=w,we.formatDates=D;var Se=["sun","mon","tue","wed","thu","fri","sat"],Ee=864e5,xe=36e5,Te=6e4,ke={s:function(t){return t.getSeconds()},ss:function(t){return P(t.getSeconds())},m:function(t){return t.getMinutes()},mm:function(t){return P(t.getMinutes())},h:function(t){return t.getHours()%12||12},hh:function(t){return P(t.getHours()%12||12)},H:function(t){return t.getHours()},HH:function(t){return P(t.getHours())},d:function(t){return t.getDate()},dd:function(t){return P(t.getDate())},ddd:function(t,e){return e.dayNamesShort[t.getDay()]},dddd:function(t,e){return e.dayNames[t.getDay()]},M:function(t){return t.getMonth()+1},MM:function(t){return P(t.getMonth()+1)},MMM:function(t,e){return e.monthNamesShort[t.getMonth()]},MMMM:function(t,e){return e.monthNames[t.getMonth()]},yy:function(t){return(t.getFullYear()+"").substring(2)},yyyy:function(t){return t.getFullYear()},t:function(t){return 12>t.getHours()?"a":"p"},tt:function(t){return 12>t.getHours()?"am":"pm"},T:function(t){return 12>t.getHours()?"A":"P"},TT:function(t){return 12>t.getHours()?"AM":"PM"},u:function(t){return w(t,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(t){var e=t.getDate();return e>10&&20>e?"th":["st","nd","rd"][e%10-1]||"th"},w:function(t,e){return e.weekNumberCalculation(t)},W:function(t){return M(t)}};we.dateFormatters=ke,we.applyAll=G,De.month=te,De.basicWeek=ee,De.basicDay=ne,n({weekMode:"fixed"}),De.agendaWeek=oe,De.agendaDay=ie,n({allDaySlot:!0,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:.5},minTime:0,maxTime:24})})(jQuery); \ No newline at end of file diff --git a/src/assets/js/libs/jquery/gcal.js b/src/assets/js/libs/jquery/gcal.js new file mode 100644 index 00000000..e3008a93 --- /dev/null +++ b/src/assets/js/libs/jquery/gcal.js @@ -0,0 +1,107 @@ +/*! + * FullCalendar v1.6.1 Google Calendar Plugin + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +(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);