Browse Source

added calendar on dashboard

Josh Kamau 5 years ago
parent
commit
81cf9024ea
100 changed files with 5946 additions and 0 deletions
  1. 22 0
      public/LICENSE.txt
  2. 11 0
      public/README.md
  3. 102 0
      public/examples/background-events.html
  4. 105 0
      public/examples/daygrid-views.html
  5. 70 0
      public/examples/external-dragging-2cals.html
  6. 150 0
      public/examples/external-dragging-builtin.html
  7. 126 0
      public/examples/full-height.html
  8. 78 0
      public/examples/google-calendar.html
  9. 141 0
      public/examples/js/theme-chooser.js
  10. 85 0
      public/examples/json.html
  11. 56 0
      public/examples/json/events.json
  12. 78 0
      public/examples/list-sticky-header.html
  13. 115 0
      public/examples/list-views.html
  14. 144 0
      public/examples/locales.html
  15. 101 0
      public/examples/month-view.html
  16. 109 0
      public/examples/natural-height.html
  17. 50 0
      public/examples/php/get-events.php
  18. 9 0
      public/examples/php/get-time-zones.php
  19. 130 0
      public/examples/php/utils.php
  20. 124 0
      public/examples/selectable.html
  21. 212 0
      public/examples/theming.html
  22. 137 0
      public/examples/time-zones.html
  23. 122 0
      public/examples/timegrid-sticky-header.html
  24. 107 0
      public/examples/timegrid-views-hscroll.html
  25. 109 0
      public/examples/timegrid-views.html
  26. 111 0
      public/examples/week-numbers.html
  27. 1402 0
      public/fullcalendar/locales-all.js
  28. 0 0
      public/fullcalendar/locales-all.min.js
  29. 27 0
      public/fullcalendar/locales/af.js
  30. 28 0
      public/fullcalendar/locales/ar-dz.js
  31. 28 0
      public/fullcalendar/locales/ar-kw.js
  32. 28 0
      public/fullcalendar/locales/ar-ly.js
  33. 28 0
      public/fullcalendar/locales/ar-ma.js
  34. 28 0
      public/fullcalendar/locales/ar-sa.js
  35. 28 0
      public/fullcalendar/locales/ar-tn.js
  36. 28 0
      public/fullcalendar/locales/ar.js
  37. 29 0
      public/fullcalendar/locales/az.js
  38. 28 0
      public/fullcalendar/locales/bg.js
  39. 29 0
      public/fullcalendar/locales/bs.js
  40. 27 0
      public/fullcalendar/locales/ca.js
  41. 29 0
      public/fullcalendar/locales/cs.js
  42. 27 0
      public/fullcalendar/locales/da.js
  43. 30 0
      public/fullcalendar/locales/de.js
  44. 27 0
      public/fullcalendar/locales/el.js
  45. 14 0
      public/fullcalendar/locales/en-au.js
  46. 14 0
      public/fullcalendar/locales/en-gb.js
  47. 14 0
      public/fullcalendar/locales/en-nz.js
  48. 27 0
      public/fullcalendar/locales/es-us.js
  49. 27 0
      public/fullcalendar/locales/es.js
  50. 29 0
      public/fullcalendar/locales/et.js
  51. 27 0
      public/fullcalendar/locales/eu.js
  52. 30 0
      public/fullcalendar/locales/fa.js
  53. 27 0
      public/fullcalendar/locales/fi.js
  54. 24 0
      public/fullcalendar/locales/fr-ca.js
  55. 28 0
      public/fullcalendar/locales/fr-ch.js
  56. 28 0
      public/fullcalendar/locales/fr.js
  57. 27 0
      public/fullcalendar/locales/gl.js
  58. 24 0
      public/fullcalendar/locales/he.js
  59. 29 0
      public/fullcalendar/locales/hi.js
  60. 29 0
      public/fullcalendar/locales/hr.js
  61. 27 0
      public/fullcalendar/locales/hu.js
  62. 27 0
      public/fullcalendar/locales/id.js
  63. 27 0
      public/fullcalendar/locales/is.js
  64. 29 0
      public/fullcalendar/locales/it.js
  65. 25 0
      public/fullcalendar/locales/ja.js
  66. 29 0
      public/fullcalendar/locales/ka.js
  67. 29 0
      public/fullcalendar/locales/kk.js
  68. 23 0
      public/fullcalendar/locales/ko.js
  69. 27 0
      public/fullcalendar/locales/lb.js
  70. 27 0
      public/fullcalendar/locales/lt.js
  71. 29 0
      public/fullcalendar/locales/lv.js
  72. 25 0
      public/fullcalendar/locales/mk.js
  73. 29 0
      public/fullcalendar/locales/ms.js
  74. 27 0
      public/fullcalendar/locales/nb.js
  75. 27 0
      public/fullcalendar/locales/nl.js
  76. 27 0
      public/fullcalendar/locales/nn.js
  77. 27 0
      public/fullcalendar/locales/pl.js
  78. 25 0
      public/fullcalendar/locales/pt-br.js
  79. 27 0
      public/fullcalendar/locales/pt.js
  80. 29 0
      public/fullcalendar/locales/ro.js
  81. 29 0
      public/fullcalendar/locales/ru.js
  82. 29 0
      public/fullcalendar/locales/sk.js
  83. 27 0
      public/fullcalendar/locales/sl.js
  84. 29 0
      public/fullcalendar/locales/sq.js
  85. 29 0
      public/fullcalendar/locales/sr-cyrl.js
  86. 29 0
      public/fullcalendar/locales/sr.js
  87. 27 0
      public/fullcalendar/locales/sv.js
  88. 30 0
      public/fullcalendar/locales/th.js
  89. 27 0
      public/fullcalendar/locales/tr.js
  90. 17 0
      public/fullcalendar/locales/ug.js
  91. 29 0
      public/fullcalendar/locales/uk.js
  92. 21 0
      public/fullcalendar/locales/uz.js
  93. 29 0
      public/fullcalendar/locales/vi.js
  94. 30 0
      public/fullcalendar/locales/zh-cn.js
  95. 23 0
      public/fullcalendar/locales/zh-tw.js
  96. 71 0
      public/fullcalendar/main.css
  97. 56 0
      public/fullcalendar/main.js
  98. 0 0
      public/fullcalendar/main.min.css
  99. 5 0
      public/fullcalendar/main.min.js
  100. 14 0
      resources/views/app/dashboard.blade.php

+ 22 - 0
public/LICENSE.txt

@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2020 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 11 - 0
public/README.md

@@ -0,0 +1,11 @@
+
+# FullCalendar [![Build Status](https://travis-ci.com/fullcalendar/fullcalendar.svg?branch=master)](https://travis-ci.com/fullcalendar/fullcalendar)
+
+A full-sized drag & drop JavaScript event calendar
+
+- [Project website and demos](http://fullcalendar.io/)
+- [Documentation](http://fullcalendar.io/docs)
+- [Support](http://fullcalendar.io/support)
+- [Contributing](CONTRIBUTING.md)
+- [Changelog](CHANGELOG.md)
+- [License](LICENSE.txt)

+ 102 - 0
public/examples/background-events.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
+      },
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      businessHours: true, // display business hours
+      editable: true,
+      selectable: true,
+      events: [
+        {
+          title: 'Business Lunch',
+          start: '2020-06-03T13:00:00',
+          constraint: 'businessHours'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-13T11:00:00',
+          constraint: 'availableForMeeting', // defined below
+          color: '#257e4a'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-18',
+          end: '2020-06-20'
+        },
+        {
+          title: 'Party',
+          start: '2020-06-29T20:00:00'
+        },
+
+        // areas where "Meeting" must be dropped
+        {
+          groupId: 'availableForMeeting',
+          start: '2020-06-11T10:00:00',
+          end: '2020-06-11T16:00:00',
+          display: 'background'
+        },
+        {
+          groupId: 'availableForMeeting',
+          start: '2020-06-13T10:00:00',
+          end: '2020-06-13T16:00:00',
+          display: 'background'
+        },
+
+        // red areas where no events can be dropped
+        {
+          start: '2020-06-24',
+          end: '2020-06-28',
+          overlap: false,
+          display: 'background',
+          color: '#ff9f89'
+        },
+        {
+          start: '2020-06-06',
+          end: '2020-06-08',
+          overlap: false,
+          display: 'background',
+          color: '#ff9f89'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 105 - 0
public/examples/daygrid-views.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prevYear,prev,next,nextYear today',
+        center: 'title',
+        right: 'dayGridMonth,dayGridWeek,dayGridDay'
+      },
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 70 - 0
public/examples/external-dragging-2cals.html

@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var srcCalendarEl = document.getElementById('source-calendar');
+    var destCalendarEl = document.getElementById('destination-calendar');
+
+    var srcCalendar = new FullCalendar.Calendar(srcCalendarEl, {
+      editable: true,
+      initialDate: '2020-06-12',
+      events: [
+        {
+          title: 'event1',
+          start: '2020-06-11T10:00:00',
+          end: '2020-06-11T16:00:00'
+        },
+        {
+          title: 'event2',
+          start: '2020-06-13T10:00:00',
+          end: '2020-06-13T16:00:00'
+        }
+      ],
+      eventLeave: function(info) {
+        console.log('event left!', info.event);
+      }
+    });
+
+    var destCalendar = new FullCalendar.Calendar(destCalendarEl, {
+      initialDate: '2020-06-12',
+      editable: true,
+      droppable: true, // will let it receive events!
+      eventReceive: function(info) {
+        console.log('event received!', info.event);
+      }
+    });
+
+    srcCalendar.render();
+    destCalendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 20px 0 0 20px;
+    font-size: 14px;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+  }
+
+  #source-calendar,
+  #destination-calendar {
+    float: left;
+    width: 600px;
+    margin: 0 20px 20px 0;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='source-calendar'></div>
+  <div id='destination-calendar'></div>
+
+</body>
+</html>

+ 150 - 0
public/examples/external-dragging-builtin.html

@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+
+    /* initialize the external events
+    -----------------------------------------------------------------*/
+
+    var containerEl = document.getElementById('external-events-list');
+    new FullCalendar.Draggable(containerEl, {
+      itemSelector: '.fc-event',
+      eventData: function(eventEl) {
+        return {
+          title: eventEl.innerText.trim()
+        }
+      }
+    });
+
+    //// the individual way to do it
+    // var containerEl = document.getElementById('external-events-list');
+    // var eventEls = Array.prototype.slice.call(
+    //   containerEl.querySelectorAll('.fc-event')
+    // );
+    // eventEls.forEach(function(eventEl) {
+    //   new FullCalendar.Draggable(eventEl, {
+    //     eventData: {
+    //       title: eventEl.innerText.trim(),
+    //     }
+    //   });
+    // });
+
+    /* initialize the calendar
+    -----------------------------------------------------------------*/
+
+    var calendarEl = document.getElementById('calendar');
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      editable: true,
+      droppable: true, // this allows things to be dropped onto the calendar
+      drop: function(arg) {
+        // is the "remove after drop" checkbox checked?
+        if (document.getElementById('drop-remove').checked) {
+          // if so, remove the element from the "Draggable Events" list
+          arg.draggedEl.parentNode.removeChild(arg.draggedEl);
+        }
+      }
+    });
+    calendar.render();
+
+  });
+
+</script>
+<style>
+
+  body {
+    margin-top: 40px;
+    font-size: 14px;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+  }
+
+  #external-events {
+    position: fixed;
+    left: 20px;
+    top: 20px;
+    width: 150px;
+    padding: 0 10px;
+    border: 1px solid #ccc;
+    background: #eee;
+    text-align: left;
+  }
+
+  #external-events h4 {
+    font-size: 16px;
+    margin-top: 0;
+    padding-top: 1em;
+  }
+
+  #external-events .fc-event {
+    margin: 3px 0;
+    cursor: move;
+  }
+
+  #external-events p {
+    margin: 1.5em 0;
+    font-size: 11px;
+    color: #666;
+  }
+
+  #external-events p input {
+    margin: 0;
+    vertical-align: middle;
+  }
+
+  #calendar-wrap {
+    margin-left: 200px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+  <div id='wrap'>
+
+    <div id='external-events'>
+      <h4>Draggable Events</h4>
+
+      <div id='external-events-list'>
+        <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
+          <div class='fc-event-main'>My Event 1</div>
+        </div>
+        <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
+          <div class='fc-event-main'>My Event 2</div>
+        </div>
+        <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
+          <div class='fc-event-main'>My Event 3</div>
+        </div>
+        <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
+          <div class='fc-event-main'>My Event 4</div>
+        </div>
+        <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
+          <div class='fc-event-main'>My Event 5</div>
+        </div>
+      </div>
+
+      <p>
+        <input type='checkbox' id='drop-remove' />
+        <label for='drop-remove'>remove after drop</label>
+      </p>
+    </div>
+
+    <div id='calendar-wrap'>
+      <div id='calendar'></div>
+    </div>
+
+  </div>
+</body>
+</html>

+ 126 - 0
public/examples/full-height.html

@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      height: '100%',
+      expandRows: true,
+      slotMinTime: '08:00',
+      slotMaxTime: '20:00',
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      initialView: 'dayGridMonth',
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      selectable: true,
+      nowIndicator: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01',
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  html, body {
+    overflow: hidden; /* don't do scrollbars */
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar-container {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+  }
+
+  .fc-header-toolbar {
+    /*
+    the calendar will be butting up against the edges,
+    but let's scoot in the header's buttons
+    */
+    padding-top: 1em;
+    padding-left: 1em;
+    padding-right: 1em;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar-container'>
+    <div id='calendar'></div>
+  </div>
+
+</body>
+</html>

+ 78 - 0
public/examples/google-calendar.html

@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,listYear'
+      },
+
+      displayEventTime: false, // don't show the time column in list view
+
+      // THIS KEY WON'T WORK IN PRODUCTION!!!
+      // To make your own Google API key, follow the directions here:
+      // http://fullcalendar.io/docs/google_calendar/
+      googleCalendarApiKey: 'AIzaSyDcnW6WejpTOCffshGDDb4neIrXVUA1EAE',
+
+      // US Holidays
+      events: 'en.usa#holiday@group.v.calendar.google.com',
+
+      eventClick: function(arg) {
+        // opens events in a popup window
+        window.open(arg.event.url, 'google-calendar-event', 'width=700,height=600');
+
+        arg.jsEvent.preventDefault() // don't navigate in main tab
+      },
+
+      loading: function(bool) {
+        document.getElementById('loading').style.display =
+          bool ? 'block' : 'none';
+      }
+
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #loading {
+    display: none;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='loading'>loading...</div>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 141 - 0
public/examples/js/theme-chooser.js

@@ -0,0 +1,141 @@
+
+function initThemeChooser(settings) {
+  var isInitialized = false;
+  var currentThemeSystem; // don't set this directly. use setThemeSystem
+  var currentStylesheetEl;
+  var loadingEl = document.getElementById('loading');
+  var systemSelectEl = document.querySelector('#theme-system-selector select');
+  var themeSelectWrapEls = Array.prototype.slice.call( // convert to real array
+    document.querySelectorAll('.selector[data-theme-system]')
+  );
+
+  systemSelectEl.addEventListener('change', function() {
+    setThemeSystem(this.value);
+  });
+
+  setThemeSystem(systemSelectEl.value);
+
+  themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
+    var themeSelectEl = themeSelectWrapEl.querySelector('select');
+
+    themeSelectWrapEl.addEventListener('change', function() {
+      setTheme(
+        currentThemeSystem,
+        themeSelectEl.options[themeSelectEl.selectedIndex].value
+      );
+    });
+  });
+
+
+  function setThemeSystem(themeSystem) {
+    var selectedTheme;
+
+    currentThemeSystem = themeSystem;
+
+    themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
+      var themeSelectEl = themeSelectWrapEl.querySelector('select');
+
+      if (themeSelectWrapEl.getAttribute('data-theme-system') === themeSystem) {
+        selectedTheme = themeSelectEl.options[themeSelectEl.selectedIndex].value;
+        themeSelectWrapEl.style.display = 'inline-block';
+      } else {
+        themeSelectWrapEl.style.display = 'none';
+      }
+    });
+
+    setTheme(themeSystem, selectedTheme);
+  }
+
+
+  function setTheme(themeSystem, themeName) {
+    var stylesheetUrl = generateStylesheetUrl(themeSystem, themeName);
+    var stylesheetEl;
+
+    function done() {
+      if (!isInitialized) {
+        isInitialized = true;
+        settings.init(themeSystem);
+      }
+      else {
+        settings.change(themeSystem);
+      }
+
+      showCredits(themeSystem, themeName);
+    }
+
+    if (stylesheetUrl) {
+      stylesheetEl = document.createElement('link');
+      stylesheetEl.setAttribute('rel', 'stylesheet');
+      stylesheetEl.setAttribute('href', stylesheetUrl);
+      document.querySelector('head').appendChild(stylesheetEl);
+
+      loadingEl.style.display = 'inline';
+
+      whenStylesheetLoaded(stylesheetEl, function() {
+        if (currentStylesheetEl) {
+          currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
+        }
+        currentStylesheetEl = stylesheetEl;
+        loadingEl.style.display = 'none';
+        done();
+      });
+    } else {
+      if (currentStylesheetEl) {
+        currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
+        currentStylesheetEl = null
+      }
+      done();
+    }
+  }
+
+
+  function generateStylesheetUrl(themeSystem, themeName) {
+    if (themeSystem === 'bootstrap') {
+      if (themeName) {
+        return 'https://bootswatch.com/4/' + themeName + '/bootstrap.min.css';
+      }
+      else { // the default bootstrap theme
+        return 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css';
+      }
+    }
+  }
+
+
+  function showCredits(themeSystem, themeName) {
+    var creditId;
+
+    if (themeSystem.match('bootstrap')) {
+      if (themeName) {
+        creditId = 'bootstrap-custom';
+      }
+      else {
+        creditId = 'bootstrap-standard';
+      }
+    }
+
+    Array.prototype.slice.call( // convert to real array
+      document.querySelectorAll('.credits')
+    ).forEach(function(creditEl) {
+      if (creditEl.getAttribute('data-credit-id') === creditId) {
+        creditEl.style.display = 'block';
+      } else {
+        creditEl.style.display = 'none';
+      }
+    })
+  }
+
+
+  function whenStylesheetLoaded(linkNode, callback) {
+    var isReady = false;
+
+    function ready() {
+      if (!isReady) { // avoid double-call
+        isReady = true;
+        callback();
+      }
+    }
+
+    linkNode.onload = ready; // does not work cross-browser
+    setTimeout(ready, 2000); // max wait. also handles browsers that don't support onload
+  }
+}

+ 85 - 0
public/examples/json.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      initialDate: '2020-06-12',
+      editable: true,
+      navLinks: true, // can click day/week names to navigate views
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: {
+        url: 'php/get-events.php',
+        failure: function() {
+          document.getElementById('script-warning').style.display = 'block'
+        }
+      },
+      loading: function(bool) {
+        document.getElementById('loading').style.display =
+          bool ? 'block' : 'none';
+      }
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 0;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #script-warning {
+    display: none;
+    background: #eee;
+    border-bottom: 1px solid #ddd;
+    padding: 0 10px;
+    line-height: 40px;
+    text-align: center;
+    font-weight: bold;
+    font-size: 12px;
+    color: red;
+  }
+
+  #loading {
+    display: none;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 40px auto;
+    padding: 0 10px;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='script-warning'>
+    <code>php/get-events.php</code> must be running.
+  </div>
+
+  <div id='loading'>loading...</div>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 56 - 0
public/examples/json/events.json

@@ -0,0 +1,56 @@
+[
+  {
+    "title": "All Day Event",
+    "start": "2020-06-01"
+  },
+  {
+    "title": "Long Event",
+    "start": "2020-06-07",
+    "end": "2020-06-10"
+  },
+  {
+    "id": "999",
+    "title": "Repeating Event",
+    "start": "2020-06-09T16:00:00-05:00"
+  },
+  {
+    "id": "999",
+    "title": "Repeating Event",
+    "start": "2020-06-16T16:00:00-05:00"
+  },
+  {
+    "title": "Conference",
+    "start": "2020-06-11",
+    "end": "2020-06-13"
+  },
+  {
+    "title": "Meeting",
+    "start": "2020-06-12T10:30:00-05:00",
+    "end": "2020-06-12T12:30:00-05:00"
+  },
+  {
+    "title": "Lunch",
+    "start": "2020-06-12T12:00:00-05:00"
+  },
+  {
+    "title": "Meeting",
+    "start": "2020-06-12T14:30:00-05:00"
+  },
+  {
+    "title": "Happy Hour",
+    "start": "2020-06-12T17:30:00-05:00"
+  },
+  {
+    "title": "Dinner",
+    "start": "2020-06-12T20:00:00"
+  },
+  {
+    "title": "Birthday Party",
+    "start": "2020-06-13T07:00:00-05:00"
+  },
+  {
+    "title": "Click for Google",
+    "url": "http://google.com/",
+    "start": "2020-06-28"
+  }
+]

+ 78 - 0
public/examples/list-sticky-header.html

@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      height: 'auto',
+      // stickyHeaderDates: false, // for disabling
+
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'listMonth,listYear'
+      },
+
+      // customize the button names,
+      // otherwise they'd all just say "list"
+      views: {
+        listMonth: { buttonText: 'list month' },
+        listYear: { buttonText: 'list year' }
+      },
+
+      initialView: 'listYear',
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      events: [
+        {
+          title: 'repeating event 1',
+          daysOfWeek: [ 1, 2, 3 ],
+          duration: '00:30'
+        },
+        {
+          title: 'repeating event 2',
+          daysOfWeek: [ 1, 2, 3 ],
+          duration: '00:30'
+        },
+        {
+          title: 'repeating event 3',
+          daysOfWeek: [ 1, 2, 3 ],
+          duration: '00:30'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 115 - 0
public/examples/list-views.html

@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'listDay,listWeek'
+      },
+
+      // customize the button names,
+      // otherwise they'd all just say "list"
+      views: {
+        listDay: { buttonText: 'list day' },
+        listWeek: { buttonText: 'list week' }
+      },
+
+      initialView: 'listWeek',
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 144 - 0
public/examples/locales.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script src='../lib/locales-all.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var initialLocaleCode = 'en';
+    var localeSelectorEl = document.getElementById('locale-selector');
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
+      },
+      initialDate: '2020-06-12',
+      locale: initialLocaleCode,
+      buttonIcons: false, // show the prev/next text
+      weekNumbers: true,
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+
+    // build the locale selector's options
+    calendar.getAvailableLocaleCodes().forEach(function(localeCode) {
+      var optionEl = document.createElement('option');
+      optionEl.value = localeCode;
+      optionEl.selected = localeCode == initialLocaleCode;
+      optionEl.innerText = localeCode;
+      localeSelectorEl.appendChild(optionEl);
+    });
+
+    // when the selected option changes, dynamically change the calendar option
+    localeSelectorEl.addEventListener('change', function() {
+      if (this.value) {
+        calendar.setOption('locale', this.value);
+      }
+    });
+
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 0;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #top {
+    background: #eee;
+    border-bottom: 1px solid #ddd;
+    padding: 0 10px;
+    line-height: 40px;
+    font-size: 12px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 40px auto;
+    padding: 0 10px;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='top'>
+
+    Locales:
+    <select id='locale-selector'></select>
+
+  </div>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 101 - 0
public/examples/month-view.html

@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      initialDate: '2020-06-12',
+      editable: true,
+      selectable: true,
+      businessHours: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 109 - 0
public/examples/natural-height.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      initialDate: '2020-06-12',
+      initialView: 'timeGridWeek',
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      height: 'auto',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      selectable: true,
+      selectMirror: true,
+      nowIndicator: true,
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01',
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 50 - 0
public/examples/php/get-events.php

@@ -0,0 +1,50 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// This script reads event data from a JSON file and outputs those events which are within the range
+// supplied by the "start" and "end" GET parameters.
+//
+// An optional "timeZone" GET parameter will force all ISO8601 date stings to a given timeZone.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+// Require our Event class and datetime utilities
+require dirname(__FILE__) . '/utils.php';
+
+// Short-circuit if the client did not give us a date range.
+if (!isset($_GET['start']) || !isset($_GET['end'])) {
+  die("Please provide a date range.");
+}
+
+// Parse the start/end parameters.
+// These are assumed to be ISO8601 strings with no time nor timeZone, like "2013-12-29".
+// Since no timeZone will be present, they will parsed as UTC.
+$range_start = parseDateTime($_GET['start']);
+$range_end = parseDateTime($_GET['end']);
+
+// Parse the timeZone parameter if it is present.
+$time_zone = null;
+if (isset($_GET['timeZone'])) {
+  $time_zone = new DateTimeZone($_GET['timeZone']);
+}
+
+// Read and parse our events JSON file into an array of event data arrays.
+$json = file_get_contents(dirname(__FILE__) . '/../json/events.json');
+$input_arrays = json_decode($json, true);
+
+// Accumulate an output array of event data arrays.
+$output_arrays = array();
+foreach ($input_arrays as $array) {
+
+  // Convert the input array into a useful Event object
+  $event = new Event($array, $time_zone);
+
+  // If the event is in-bounds, add it to the output
+  if ($event->isWithinDayRange($range_start, $range_end)) {
+    $output_arrays[] = $event->toArray();
+  }
+}
+
+// Send JSON to the client.
+echo json_encode($output_arrays);

+ 9 - 0
public/examples/php/get-time-zones.php

@@ -0,0 +1,9 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// This script outputs a JSON array of all timezones (like "America/Chicago") that PHP supports.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+echo json_encode(DateTimeZone::listIdentifiers());

+ 130 - 0
public/examples/php/utils.php

@@ -0,0 +1,130 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// Utilities for our event-fetching scripts.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+// PHP will fatal error if we attempt to use the DateTime class without this being set.
+date_default_timezone_set('UTC');
+
+
+class Event {
+
+  // Tests whether the given ISO8601 string has a time-of-day or not
+  const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29"
+
+  public $title;
+  public $allDay; // a boolean
+  public $start; // a DateTime
+  public $end; // a DateTime, or null
+  public $properties = array(); // an array of other misc properties
+
+
+  // Constructs an Event object from the given array of key=>values.
+  // You can optionally force the timeZone of the parsed dates.
+  public function __construct($array, $timeZone=null) {
+
+    $this->title = $array['title'];
+
+    if (isset($array['allDay'])) {
+      // allDay has been explicitly specified
+      $this->allDay = (bool)$array['allDay'];
+    }
+    else {
+      // Guess allDay based off of ISO8601 date strings
+      $this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) &&
+        (!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end']));
+    }
+
+    if ($this->allDay) {
+      // If dates are allDay, we want to parse them in UTC to avoid DST issues.
+      $timeZone = null;
+    }
+
+    // Parse dates
+    $this->start = parseDateTime($array['start'], $timeZone);
+    $this->end = isset($array['end']) ? parseDateTime($array['end'], $timeZone) : null;
+
+    // Record misc properties
+    foreach ($array as $name => $value) {
+      if (!in_array($name, array('title', 'allDay', 'start', 'end'))) {
+        $this->properties[$name] = $value;
+      }
+    }
+  }
+
+
+  // Returns whether the date range of our event intersects with the given all-day range.
+  // $rangeStart and $rangeEnd are assumed to be dates in UTC with 00:00:00 time.
+  public function isWithinDayRange($rangeStart, $rangeEnd) {
+
+    // Normalize our event's dates for comparison with the all-day range.
+    $eventStart = stripTime($this->start);
+
+    if (isset($this->end)) {
+      $eventEnd = stripTime($this->end); // normalize
+    }
+    else {
+      $eventEnd = $eventStart; // consider this a zero-duration event
+    }
+
+    // Check if the two whole-day ranges intersect.
+    return $eventStart < $rangeEnd && $eventEnd >= $rangeStart;
+  }
+
+
+  // Converts this Event object back to a plain data array, to be used for generating JSON
+  public function toArray() {
+
+    // Start with the misc properties (don't worry, PHP won't affect the original array)
+    $array = $this->properties;
+
+    $array['title'] = $this->title;
+
+    // Figure out the date format. This essentially encodes allDay into the date string.
+    if ($this->allDay) {
+      $format = 'Y-m-d'; // output like "2013-12-29"
+    }
+    else {
+      $format = 'c'; // full ISO8601 output, like "2013-12-29T09:00:00+08:00"
+    }
+
+    // Serialize dates into strings
+    $array['start'] = $this->start->format($format);
+    if (isset($this->end)) {
+      $array['end'] = $this->end->format($format);
+    }
+
+    return $array;
+  }
+
+}
+
+
+// Date Utilities
+//----------------------------------------------------------------------------------------------
+
+
+// Parses a string into a DateTime object, optionally forced into the given timeZone.
+function parseDateTime($string, $timeZone=null) {
+  $date = new DateTime(
+    $string,
+    $timeZone ? $timeZone : new DateTimeZone('UTC')
+      // Used only when the string is ambiguous.
+      // Ignored if string has a timeZone offset in it.
+  );
+  if ($timeZone) {
+    // If our timeZone was ignored above, force it.
+    $date->setTimezone($timeZone);
+  }
+  return $date;
+}
+
+
+// Takes the year/month/date values of the given DateTime and converts them to a new DateTime,
+// but in UTC.
+function stripTime($datetime) {
+  return new DateTime($datetime->format('Y-m-d'));
+}

+ 124 - 0
public/examples/selectable.html

@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay'
+      },
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      selectable: true,
+      selectMirror: true,
+      select: function(arg) {
+        var title = prompt('Event Title:');
+        if (title) {
+          calendar.addEvent({
+            title: title,
+            start: arg.start,
+            end: arg.end,
+            allDay: arg.allDay
+          })
+        }
+        calendar.unselect()
+      },
+      eventClick: function(arg) {
+        if (confirm('Are you sure you want to delete this event?')) {
+          arg.event.remove()
+        }
+      },
+      editable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 212 - 0
public/examples/theming.html

@@ -0,0 +1,212 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='https://use.fontawesome.com/releases/v5.0.6/css/all.css' rel='stylesheet'>
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script src='js/theme-chooser.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+    var calendar;
+
+    initThemeChooser({
+
+      init: function(themeSystem) {
+        calendar = new FullCalendar.Calendar(calendarEl, {
+          themeSystem: themeSystem,
+          headerToolbar: {
+            left: 'prev,next today',
+            center: 'title',
+            right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
+          },
+          initialDate: '2020-06-12',
+          weekNumbers: true,
+          navLinks: true, // can click day/week names to navigate views
+          editable: true,
+          selectable: true,
+          nowIndicator: true,
+          dayMaxEvents: true, // allow "more" link when too many events
+          // showNonCurrentDates: false,
+          events: [
+            {
+              title: 'All Day Event',
+              start: '2020-06-01'
+            },
+            {
+              title: 'Long Event',
+              start: '2020-06-07',
+              end: '2020-06-10'
+            },
+            {
+              groupId: 999,
+              title: 'Repeating Event',
+              start: '2020-06-09T16:00:00'
+            },
+            {
+              groupId: 999,
+              title: 'Repeating Event',
+              start: '2020-06-16T16:00:00'
+            },
+            {
+              title: 'Conference',
+              start: '2020-06-11',
+              end: '2020-06-13'
+            },
+            {
+              title: 'Meeting',
+              start: '2020-06-12T10:30:00',
+              end: '2020-06-12T12:30:00'
+            },
+            {
+              title: 'Lunch',
+              start: '2020-06-12T12:00:00'
+            },
+            {
+              title: 'Meeting',
+              start: '2020-06-12T14:30:00'
+            },
+            {
+              title: 'Happy Hour',
+              start: '2020-06-12T17:30:00'
+            },
+            {
+              title: 'Dinner',
+              start: '2020-06-12T20:00:00'
+            },
+            {
+              title: 'Birthday Party',
+              start: '2020-06-13T07:00:00'
+            },
+            {
+              title: 'Click for Google',
+              url: 'http://google.com/',
+              start: '2020-06-28'
+            }
+          ]
+        });
+        calendar.render();
+      },
+
+      change: function(themeSystem) {
+        calendar.setOption('themeSystem', themeSystem);
+      }
+
+    });
+
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 0;
+    padding: 0;
+    font-size: 14px;
+  }
+
+  #top,
+  #calendar.fc-theme-standard {
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+  }
+
+  #calendar.fc-theme-bootstrap {
+    font-size: 14px;
+  }
+
+  #top {
+    background: #eee;
+    border-bottom: 1px solid #ddd;
+    padding: 0 10px;
+    line-height: 40px;
+    font-size: 12px;
+    color: #000;
+  }
+
+  #top .selector {
+    display: inline-block;
+    margin-right: 10px;
+  }
+
+  #top select {
+    font: inherit; /* mock what Boostrap does, don't compete  */
+  }
+
+  .left { float: left }
+  .right { float: right }
+  .clear { clear: both }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 40px auto;
+    padding: 0 10px;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='top'>
+
+    <div class='left'>
+
+      <div id='theme-system-selector' class='selector'>
+        Theme System:
+
+        <select>
+          <option value='bootstrap' selected>Bootstrap 4</option>
+          <option value='standard'>unthemed</option>
+        </select>
+      </div>
+
+      <div data-theme-system="bootstrap" class='selector' style='display:none'>
+        Theme Name:
+
+        <select>
+          <option value='' selected>Default</option>
+          <option value='cerulean'>Cerulean</option>
+          <option value='cosmo'>Cosmo</option>
+          <option value='cyborg'>Cyborg</option>
+          <option value='darkly'>Darkly</option>
+          <option value='flatly'>Flatly</option>
+          <option value='journal'>Journal</option>
+          <option value='litera'>Litera</option>
+          <option value='lumen'>Lumen</option>
+          <option value='lux'>Lux</option>
+          <option value='materia'>Materia</option>
+          <option value='minty'>Minty</option>
+          <option value='pulse'>Pulse</option>
+          <option value='sandstone'>Sandstone</option>
+          <option value='simplex'>Simplex</option>
+          <option value='sketchy'>Sketchy</option>
+          <option value='slate'>Slate</option>
+          <option value='solar'>Solar</option>
+          <option value='spacelab'>Spacelab</option>
+          <option value='superhero'>Superhero</option>
+          <option value='united'>United</option>
+          <option value='yeti'>Yeti</option>
+        </select>
+      </div>
+
+      <span id='loading' style='display:none'>loading theme...</span>
+
+    </div>
+
+    <div class='right'>
+      <span class='credits' data-credit-id='bootstrap-standard' style='display:none'>
+        <a href='https://getbootstrap.com/docs/3.3/' target='_blank'>Theme by Bootstrap</a>
+      </span>
+      <span class='credits' data-credit-id='bootstrap-custom' style='display:none'>
+        <a href='https://bootswatch.com/' target='_blank'>Theme by Bootswatch</a>
+      </span>
+    </div>
+
+    <div class='clear'></div>
+  </div>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 137 - 0
public/examples/time-zones.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var initialTimeZone = 'local';
+    var timeZoneSelectorEl = document.getElementById('time-zone-selector');
+    var loadingEl = document.getElementById('loading');
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      timeZone: initialTimeZone,
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      selectable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: {
+        url: 'php/get-events.php',
+        failure: function() {
+          document.getElementById('script-warning').style.display = 'inline'; // show
+        }
+      },
+      loading: function(bool) {
+        if (bool) {
+          loadingEl.style.display = 'inline'; // show
+        } else {
+          loadingEl.style.display = 'none'; // hide
+        }
+      },
+
+      eventTimeFormat: { hour: 'numeric', minute: '2-digit', timeZoneName: 'short' },
+
+      dateClick: function(arg) {
+        console.log('dateClick', calendar.formatIso(arg.date));
+      },
+      select: function(arg) {
+        console.log('select', calendar.formatIso(arg.start), calendar.formatIso(arg.end));
+      }
+    });
+
+    calendar.render();
+
+    // load the list of available timezones, build the <select> options
+    // it's HIGHLY recommended to use a different library for network requests, not this internal util func
+    FullCalendar.requestJson('GET', 'php/get-time-zones.php', {}, function(timeZones) {
+
+      timeZones.forEach(function(timeZone) {
+        var optionEl;
+
+        if (timeZone !== 'UTC') { // UTC is already in the list
+          optionEl = document.createElement('option');
+          optionEl.value = timeZone;
+          optionEl.innerText = timeZone;
+          timeZoneSelectorEl.appendChild(optionEl);
+        }
+      });
+    }, function() {
+      // TODO: handle error
+    });
+
+    // when the timezone selector changes, dynamically change the calendar option
+    timeZoneSelectorEl.addEventListener('change', function() {
+      calendar.setOption('timeZone', this.value);
+    });
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 0;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #top {
+    background: #eee;
+    border-bottom: 1px solid #ddd;
+    padding: 0 10px;
+    line-height: 40px;
+    font-size: 12px;
+  }
+  .left { float: left }
+  .right { float: right }
+  .clear { clear: both }
+
+  #script-warning, #loading { display: none }
+  #script-warning { font-weight: bold; color: red }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 40px auto;
+    padding: 0 10px;
+  }
+
+  .tzo {
+    color: #000;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='top'>
+
+    <div class='left'>
+      Timezone:
+      <select id='time-zone-selector'>
+        <option value='local' selected>local</option>
+        <option value='UTC'>UTC</option>
+      </select>
+    </div>
+
+    <div class='right'>
+      <span id='loading'>loading...</span>
+      <span id='script-warning'><code>php/get-events.php</code> must be running.</span>
+    </div>
+
+    <div class='clear'></div>
+
+  </div>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 122 - 0
public/examples/timegrid-sticky-header.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      height: 'auto', // enough to active sticky headers
+      dayMinWidth: 200,
+
+      slotDuration: '00:05:00',
+      initialDate: '2020-06-12',
+      initialView: 'timeGridWeek',
+      nowIndicator: true,
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      selectable: true,
+      selectMirror: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01',
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+    text-align: center;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <p style='margin-bottom: 5em'>
+    Demo for sticky header. Also, the bottom scrollbars stick.
+  </p>
+
+  <div id='calendar'></div>
+
+  <p style='margin-top: 5em'>
+    Cool, right?
+  </p>
+
+</body>
+</html>

+ 107 - 0
public/examples/timegrid-views-hscroll.html

@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      dayMinWidth: 200,
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      initialDate: '2020-06-12',
+      initialView: 'timeGridWeek',
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01',
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 109 - 0
public/examples/timegrid-views.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      initialDate: '2020-06-12',
+      initialView: 'timeGridWeek',
+      nowIndicator: true,
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      navLinks: true, // can click day/week names to navigate views
+      editable: true,
+      selectable: true,
+      selectMirror: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01',
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 111 - 0
public/examples/week-numbers.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset='utf-8' />
+<link href='../lib/main.css' rel='stylesheet' />
+<script src='../lib/main.js'></script>
+<script>
+
+  document.addEventListener('DOMContentLoaded', function() {
+    var calendarEl = document.getElementById('calendar');
+
+    var calendar = new FullCalendar.Calendar(calendarEl, {
+      headerToolbar: {
+        left: 'prev,next today',
+        center: 'title',
+        right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
+      },
+      initialDate: '2020-06-12',
+      navLinks: true, // can click day/week names to navigate views
+      nowIndicator: true,
+
+      weekNumbers: true,
+      weekNumberCalculation: 'ISO',
+
+      editable: true,
+      selectable: true,
+      dayMaxEvents: true, // allow "more" link when too many events
+      events: [
+        {
+          title: 'All Day Event',
+          start: '2020-06-01'
+        },
+        {
+          title: 'Long Event',
+          start: '2020-06-07',
+          end: '2020-06-10'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-09T16:00:00'
+        },
+        {
+          groupId: 999,
+          title: 'Repeating Event',
+          start: '2020-06-16T16:00:00'
+        },
+        {
+          title: 'Conference',
+          start: '2020-06-11',
+          end: '2020-06-13'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T10:30:00',
+          end: '2020-06-12T12:30:00'
+        },
+        {
+          title: 'Lunch',
+          start: '2020-06-12T12:00:00'
+        },
+        {
+          title: 'Meeting',
+          start: '2020-06-12T14:30:00'
+        },
+        {
+          title: 'Happy Hour',
+          start: '2020-06-12T17:30:00'
+        },
+        {
+          title: 'Dinner',
+          start: '2020-06-12T20:00:00'
+        },
+        {
+          title: 'Birthday Party',
+          start: '2020-06-13T07:00:00'
+        },
+        {
+          title: 'Click for Google',
+          url: 'http://google.com/',
+          start: '2020-06-28'
+        }
+      ]
+    });
+
+    calendar.render();
+  });
+
+</script>
+<style>
+
+  body {
+    margin: 40px 10px;
+    padding: 0;
+    font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
+    font-size: 14px;
+  }
+
+  #calendar {
+    max-width: 1100px;
+    margin: 0 auto;
+  }
+
+</style>
+</head>
+<body>
+
+  <div id='calendar'></div>
+
+</body>
+</html>

+ 1402 - 0
public/fullcalendar/locales-all.js

@@ -0,0 +1,1402 @@
+[].push.apply(FullCalendar.globalLocales, function () {
+  'use strict';
+
+  var l0 = {
+    code: "af",
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: "Vorige",
+      next: "Volgende",
+      today: "Vandag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Heeldag",
+    moreLinkText: "Addisionele",
+    noEventsText: "Daar is geen gebeurtenisse nie"
+  };
+
+  var l1 = {
+    code: "ar-dz",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l2 = {
+    code: "ar-kw",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l3 = {
+    code: "ar-ly",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l4 = {
+    code: "ar-ma",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l5 = {
+    code: "ar-sa",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l6 = {
+    code: "ar-tn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4 // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l7 = {
+    code: "ar",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l8 = {
+    code: "az",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Əvvəl",
+      next: "Sonra",
+      today: "Bu Gün",
+      month: "Ay",
+      week: "Həftə",
+      day: "Gün",
+      list: "Gündəm"
+    },
+    weekText: "Həftə",
+    allDayText: "Bütün Gün",
+    moreLinkText: function(n) {
+      return "+ daha çox " + n;
+    },
+    noEventsText: "Göstərmək üçün hadisə yoxdur"
+  };
+
+  var l9 = {
+    code: "bg",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "назад",
+      next: "напред",
+      today: "днес",
+      month: "Месец",
+      week: "Седмица",
+      day: "Ден",
+      list: "График"
+    },
+    allDayText: "Цял ден",
+    moreLinkText: function(n) {
+      return "+още " + n;
+    },
+    noEventsText: "Няма събития за показване"
+  };
+
+  var l10 = {
+    code: "bs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prošli",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Sedmica",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Sed",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikazivanje"
+  };
+
+  var l11 = {
+    code: "ca",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Següent",
+      today: "Avui",
+      month: "Mes",
+      week: "Setmana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Set",
+    allDayText: "Tot el dia",
+    moreLinkText: "més",
+    noEventsText: "No hi ha esdeveniments per mostrar"
+  };
+
+  var l12 = {
+    code: "cs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Dříve",
+      next: "Později",
+      today: "Nyní",
+      month: "Měsíc",
+      week: "Týden",
+      day: "Den",
+      list: "Agenda"
+    },
+    weekText: "Týd",
+    allDayText: "Celý den",
+    moreLinkText: function(n) {
+      return "+další: " + n;
+    },
+    noEventsText: "Žádné akce k zobrazení"
+  };
+
+  var l13 = {
+    code: "da",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Næste",
+      today: "I dag",
+      month: "Måned",
+      week: "Uge",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uge",
+    allDayText: "Hele dagen",
+    moreLinkText: "flere",
+    noEventsText: "Ingen arrangementer at vise"
+  };
+
+  var l14 = {
+    code: "de",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zurück",
+      next: "Vor",
+      today: "Heute",
+      year: "Jahr",
+      month: "Monat",
+      week: "Woche",
+      day: "Tag",
+      list: "Terminübersicht"
+    },
+    weekText: "KW",
+    allDayText: "Ganztägig",
+    moreLinkText: function(n) {
+      return "+ weitere " + n;
+    },
+    noEventsText: "Keine Ereignisse anzuzeigen"
+  };
+
+  var l15 = {
+    code: "el",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Προηγούμενος",
+      next: "Επόμενος",
+      today: "Σήμερα",
+      month: "Μήνας",
+      week: "Εβδομάδα",
+      day: "Ημέρα",
+      list: "Ατζέντα"
+    },
+    weekText: "Εβδ",
+    allDayText: "Ολοήμερο",
+    moreLinkText: "περισσότερα",
+    noEventsText: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
+  };
+
+  var l16 = {
+    code: "en-au",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l17 = {
+    code: "en-gb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l18 = {
+    code: "en-nz",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l19 = {
+    code: "es",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  var l20 = {
+    code: "es",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  var l21 = {
+    code: "et",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Eelnev",
+      next: "Järgnev",
+      today: "Täna",
+      month: "Kuu",
+      week: "Nädal",
+      day: "Päev",
+      list: "Päevakord"
+    },
+    weekText: "näd",
+    allDayText: "Kogu päev",
+    moreLinkText: function(n) {
+      return "+ veel " + n;
+    },
+    noEventsText: "Kuvamiseks puuduvad sündmused"
+  };
+
+  var l22 = {
+    code: "eu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Aur",
+      next: "Hur",
+      today: "Gaur",
+      month: "Hilabetea",
+      week: "Astea",
+      day: "Eguna",
+      list: "Agenda"
+    },
+    weekText: "As",
+    allDayText: "Egun osoa",
+    moreLinkText: "gehiago",
+    noEventsText: "Ez dago ekitaldirik erakusteko"
+  };
+
+  var l23 = {
+    code: "fa",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12 // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "قبلی",
+      next: "بعدی",
+      today: "امروز",
+      month: "ماه",
+      week: "هفته",
+      day: "روز",
+      list: "برنامه"
+    },
+    weekText: "هف",
+    allDayText: "تمام روز",
+    moreLinkText: function(n) {
+      return "بیش از " + n;
+    },
+    noEventsText: "هیچ رویدادی به نمایش"
+  };
+
+  var l24 = {
+    code: "fi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Edellinen",
+      next: "Seuraava",
+      today: "Tänään",
+      month: "Kuukausi",
+      week: "Viikko",
+      day: "Päivä",
+      list: "Tapahtumat"
+    },
+    weekText: "Vk",
+    allDayText: "Koko päivä",
+    moreLinkText: "lisää",
+    noEventsText: "Ei näytettäviä tapahtumia"
+  };
+
+  var l25 = {
+    code: "fr",
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l26 = {
+    code: "fr-ch",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Courant",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sm",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l27 = {
+    code: "fr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l28 = {
+    code: "gl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Seg",
+      today: "Hoxe",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Axenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo o día",
+    moreLinkText: "máis",
+    noEventsText: "Non hai eventos para amosar"
+  };
+
+  var l29 = {
+    code: "he",
+    direction: 'rtl',
+    buttonText: {
+      prev: "הקודם",
+      next: "הבא",
+      today: "היום",
+      month: "חודש",
+      week: "שבוע",
+      day: "יום",
+      list: "סדר יום"
+    },
+    allDayText: "כל היום",
+    moreLinkText: "אחר",
+    noEventsText: "אין אירועים להצגה",
+    weekText: "שבוע"
+  };
+
+  var l30 = {
+    code: "hi",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "पिछला",
+      next: "अगला",
+      today: "आज",
+      month: "महीना",
+      week: "सप्ताह",
+      day: "दिन",
+      list: "कार्यसूची"
+    },
+    weekText: "हफ्ता",
+    allDayText: "सभी दिन",
+    moreLinkText: function(n) {
+      return "+अधिक " + n;
+    },
+    noEventsText: "कोई घटनाओं को प्रदर्शित करने के लिए"
+  };
+
+  var l31 = {
+    code: "hr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prijašnji",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Tjedan",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Tje",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikaz"
+  };
+
+  var l32 = {
+    code: "hu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "vissza",
+      next: "előre",
+      today: "ma",
+      month: "Hónap",
+      week: "Hét",
+      day: "Nap",
+      list: "Napló"
+    },
+    weekText: "Hét",
+    allDayText: "Egész nap",
+    moreLinkText: "további",
+    noEventsText: "Nincs megjeleníthető esemény"
+  };
+
+  var l33 = {
+    code: "id",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "mundur",
+      next: "maju",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sehari penuh",
+    moreLinkText: "lebih",
+    noEventsText: "Tidak ada acara untuk ditampilkan"
+  };
+
+  var l34 = {
+    code: "is",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Fyrri",
+      next: "Næsti",
+      today: "Í dag",
+      month: "Mánuður",
+      week: "Vika",
+      day: "Dagur",
+      list: "Dagskrá"
+    },
+    weekText: "Vika",
+    allDayText: "Allan daginn",
+    moreLinkText: "meira",
+    noEventsText: "Engir viðburðir til að sýna"
+  };
+
+  var l35 = {
+    code: "it",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prec",
+      next: "Succ",
+      today: "Oggi",
+      month: "Mese",
+      week: "Settimana",
+      day: "Giorno",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Tutto il giorno",
+    moreLinkText: function(n) {
+      return "+altri " + n;
+    },
+    noEventsText: "Non ci sono eventi da visualizzare"
+  };
+
+  var l36 = {
+    code: "ja",
+    buttonText: {
+      prev: "前",
+      next: "次",
+      today: "今日",
+      month: "月",
+      week: "週",
+      day: "日",
+      list: "予定リスト"
+    },
+    weekText: "週",
+    allDayText: "終日",
+    moreLinkText: function(n) {
+      return "他 " + n + " 件";
+    },
+    noEventsText: "表示する予定はありません"
+  };
+
+  var l37 = {
+    code: "ka",
+    week: {
+      dow: 1,
+      doy: 7
+    },
+    buttonText: {
+      prev: "წინა",
+      next: "შემდეგი",
+      today: "დღეს",
+      month: "თვე",
+      week: "კვირა",
+      day: "დღე",
+      list: "დღის წესრიგი"
+    },
+    weekText: "კვ",
+    allDayText: "მთელი დღე",
+    moreLinkText: function(n) {
+      return "+ კიდევ " + n;
+    },
+    noEventsText: "ღონისძიებები არ არის"
+  };
+
+  var l38 = {
+    code: "kk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Алдыңғы",
+      next: "Келесі",
+      today: "Бүгін",
+      month: "Ай",
+      week: "Апта",
+      day: "Күн",
+      list: "Күн тәртібі"
+    },
+    weekText: "Не",
+    allDayText: "Күні бойы",
+    moreLinkText: function(n) {
+      return "+ тағы " + n;
+    },
+    noEventsText: "Көрсету үшін оқиғалар жоқ"
+  };
+
+  var l39 = {
+    code: "ko",
+    buttonText: {
+      prev: "이전달",
+      next: "다음달",
+      today: "오늘",
+      month: "월",
+      week: "주",
+      day: "일",
+      list: "일정목록"
+    },
+    weekText: "주",
+    allDayText: "종일",
+    moreLinkText: "개",
+    noEventsText: "일정이 없습니다"
+  };
+
+  var l40 = {
+    code: "lb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zréck",
+      next: "Weider",
+      today: "Haut",
+      month: "Mount",
+      week: "Woch",
+      day: "Dag",
+      list: "Terminiwwersiicht"
+    },
+    weekText: "W",
+    allDayText: "Ganzen Dag",
+    moreLinkText: "méi",
+    noEventsText: "Nee Evenementer ze affichéieren"
+  };
+
+  var l41 = {
+    code: "lt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Atgal",
+      next: "Pirmyn",
+      today: "Šiandien",
+      month: "Mėnuo",
+      week: "Savaitė",
+      day: "Diena",
+      list: "Darbotvarkė"
+    },
+    weekText: "SAV",
+    allDayText: "Visą dieną",
+    moreLinkText: "daugiau",
+    noEventsText: "Nėra įvykių rodyti"
+  };
+
+  var l42 = {
+    code: "lv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Iepr.",
+      next: "Nāk.",
+      today: "Šodien",
+      month: "Mēnesis",
+      week: "Nedēļa",
+      day: "Diena",
+      list: "Dienas kārtība"
+    },
+    weekText: "Ned.",
+    allDayText: "Visu dienu",
+    moreLinkText: function(n) {
+      return "+vēl " + n;
+    },
+    noEventsText: "Nav notikumu"
+  };
+
+  var l43 = {
+    code: "mk",
+    buttonText: {
+      prev: "претходно",
+      next: "следно",
+      today: "Денес",
+      month: "Месец",
+      week: "Недела",
+      day: "Ден",
+      list: "График"
+    },
+    weekText: "Сед",
+    allDayText: "Цел ден",
+    moreLinkText: function(n) {
+      return "+повеќе " + n;
+    },
+    noEventsText: "Нема настани за прикажување"
+  };
+
+  var l44 = {
+    code: "ms",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Sebelum",
+      next: "Selepas",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sepanjang hari",
+    moreLinkText: function(n) {
+      return "masih ada " + n + " acara";
+    },
+    noEventsText: "Tiada peristiwa untuk dipaparkan"
+  };
+
+  var l45 = {
+    code: "nb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Neste",
+      today: "I dag",
+      month: "Måned",
+      week: "Uke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uke",
+    allDayText: "Hele dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  var l46 = {
+    code: "nl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Voorgaand",
+      next: "Volgende",
+      today: "Vandaag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Hele dag",
+    moreLinkText: "extra",
+    noEventsText: "Geen evenementen om te laten zien"
+  };
+
+  var l47 = {
+    code: "nn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Førre",
+      next: "Neste",
+      today: "I dag",
+      month: "Månad",
+      week: "Veke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Veke",
+    allDayText: "Heile dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  var l48 = {
+    code: "pl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Poprzedni",
+      next: "Następny",
+      today: "Dziś",
+      month: "Miesiąc",
+      week: "Tydzień",
+      day: "Dzień",
+      list: "Plan dnia"
+    },
+    weekText: "Tydz",
+    allDayText: "Cały dzień",
+    moreLinkText: "więcej",
+    noEventsText: "Brak wydarzeń do wyświetlenia"
+  };
+
+  var l49 = {
+    code: "pt-br",
+    buttonText: {
+      prev: "Anterior",
+      next: "Próximo",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Lista"
+    },
+    weekText: "Sm",
+    allDayText: "dia inteiro",
+    moreLinkText: function(n) {
+      return "mais +" + n;
+    },
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  var l50 = {
+    code: "pt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Seguinte",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Sem",
+    allDayText: "Todo o dia",
+    moreLinkText: "mais",
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  var l51 = {
+    code: "ro",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "precedentă",
+      next: "următoare",
+      today: "Azi",
+      month: "Lună",
+      week: "Săptămână",
+      day: "Zi",
+      list: "Agendă"
+    },
+    weekText: "Săpt",
+    allDayText: "Toată ziua",
+    moreLinkText: function(n) {
+      return "+alte " + n;
+    },
+    noEventsText: "Nu există evenimente de afișat"
+  };
+
+  var l52 = {
+    code: "ru",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Пред",
+      next: "След",
+      today: "Сегодня",
+      month: "Месяц",
+      week: "Неделя",
+      day: "День",
+      list: "Повестка дня"
+    },
+    weekText: "Нед",
+    allDayText: "Весь день",
+    moreLinkText: function(n) {
+      return "+ ещё " + n;
+    },
+    noEventsText: "Нет событий для отображения"
+  };
+
+  var l53 = {
+    code: "sk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Predchádzajúci",
+      next: "Nasledujúci",
+      today: "Dnes",
+      month: "Mesiac",
+      week: "Týždeň",
+      day: "Deň",
+      list: "Rozvrh"
+    },
+    weekText: "Ty",
+    allDayText: "Celý deň",
+    moreLinkText: function(n) {
+      return "+ďalšie: " + n;
+    },
+    noEventsText: "Žiadne akcie na zobrazenie"
+  };
+
+  var l54 = {
+    code: "sl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prejšnji",
+      next: "Naslednji",
+      today: "Trenutni",
+      month: "Mesec",
+      week: "Teden",
+      day: "Dan",
+      list: "Dnevni red"
+    },
+    weekText: "Teden",
+    allDayText: "Ves dan",
+    moreLinkText: "več",
+    noEventsText: "Ni dogodkov za prikaz"
+  };
+
+  var l55 = {
+    code: "sq",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "mbrapa",
+      next: "Përpara",
+      today: "sot",
+      month: "Muaj",
+      week: "Javë",
+      day: "Ditë",
+      list: "Listë"
+    },
+    weekText: "Ja",
+    allDayText: "Gjithë ditën",
+    moreLinkText: function(n) {
+      return "+më tepër " + n;
+    },
+    noEventsText: "Nuk ka evente për të shfaqur"
+  };
+
+  var l56 = {
+    code: "sr-cyrl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Претходна",
+      next: "следећи",
+      today: "Данас",
+      month: "Месец",
+      week: "Недеља",
+      day: "Дан",
+      list: "Планер"
+    },
+    weekText: "Сед",
+    allDayText: "Цео дан",
+    moreLinkText: function(n) {
+      return "+ још " + n;
+    },
+    noEventsText: "Нема догађаја за приказ"
+  };
+
+  var l57 = {
+    code: "sr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prethodna",
+      next: "Sledeći",
+      today: "Danas",
+      month: "Mеsеc",
+      week: "Nеdеlja",
+      day: "Dan",
+      list: "Planеr"
+    },
+    weekText: "Sed",
+    allDayText: "Cеo dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nеma događaja za prikaz"
+  };
+
+  var l58 = {
+    code: "sv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Förra",
+      next: "Nästa",
+      today: "Idag",
+      month: "Månad",
+      week: "Vecka",
+      day: "Dag",
+      list: "Program"
+    },
+    weekText: "v.",
+    allDayText: "Heldag",
+    moreLinkText: "till",
+    noEventsText: "Inga händelser att visa"
+  };
+
+  var l59 = {
+    code: "th",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "ก่อนหน้า",
+      next: "ถัดไป",
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: "วันนี้",
+      month: "เดือน",
+      week: "สัปดาห์",
+      day: "วัน",
+      list: "กำหนดการ"
+    },
+    weekText: "สัปดาห์",
+    allDayText: "ตลอดวัน",
+    moreLinkText: "เพิ่มเติม",
+    noEventsText: "ไม่มีกิจกรรมที่จะแสดง"
+  };
+
+  var l60 = {
+    code: "tr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "geri",
+      next: "ileri",
+      today: "bugün",
+      month: "Ay",
+      week: "Hafta",
+      day: "Gün",
+      list: "Ajanda"
+    },
+    weekText: "Hf",
+    allDayText: "Tüm gün",
+    moreLinkText: "daha fazla",
+    noEventsText: "Gösterilecek etkinlik yok"
+  };
+
+  var l61 = {
+    code: "ug",
+    buttonText: {
+      month: "ئاي",
+      week: "ھەپتە",
+      day: "كۈن",
+      list: "كۈنتەرتىپ"
+    },
+    allDayText: "پۈتۈن كۈن"
+  };
+
+  var l62 = {
+    code: "uk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Попередній",
+      next: "далі",
+      today: "Сьогодні",
+      month: "Місяць",
+      week: "Тиждень",
+      day: "День",
+      list: "Порядок денний"
+    },
+    weekText: "Тиж",
+    allDayText: "Увесь день",
+    moreLinkText: function(n) {
+      return "+ще " + n + "...";
+    },
+    noEventsText: "Немає подій для відображення"
+  };
+
+  var l63 = {
+    code: "uz",
+    buttonText: {
+      month: "Oy",
+      week: "Xafta",
+      day: "Kun",
+      list: "Kun tartibi"
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText: function(n) {
+      return "+ yana " + n;
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q"
+  };
+
+  var l64 = {
+    code: "vi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Trước",
+      next: "Tiếp",
+      today: "Hôm nay",
+      month: "Tháng",
+      week: "Tuần",
+      day: "Ngày",
+      list: "Lịch biểu"
+    },
+    weekText: "Tu",
+    allDayText: "Cả ngày",
+    moreLinkText: function(n) {
+      return "+ thêm " + n;
+    },
+    noEventsText: "Không có sự kiện để hiển thị"
+  };
+
+  var l65 = {
+    code: "zh-cn",
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "周",
+      day: "日",
+      list: "日程"
+    },
+    weekText: "周",
+    allDayText: "全天",
+    moreLinkText: function(n) {
+      return "另外 " + n + " 个";
+    },
+    noEventsText: "没有事件显示"
+  };
+
+  var l66 = {
+    code: "zh-tw",
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "週",
+      day: "天",
+      list: "活動列表"
+    },
+    weekText: "周",
+    allDayText: "整天",
+    moreLinkText: '顯示更多',
+    noEventsText: "没有任何活動"
+  };
+
+  var localesAll = [
+    l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, l61, l62, l63, l64, l65, l66, 
+  ];
+
+  return localesAll;
+
+}());

File diff suppressed because it is too large
+ 0 - 0
public/fullcalendar/locales-all.min.js


+ 27 - 0
public/fullcalendar/locales/af.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var af = {
+    code: "af",
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: "Vorige",
+      next: "Volgende",
+      today: "Vandag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Heeldag",
+    moreLinkText: "Addisionele",
+    noEventsText: "Daar is geen gebeurtenisse nie"
+  };
+
+  return af;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-dz.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arDz = {
+    code: "ar-dz",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arDz;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-kw.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arKw = {
+    code: "ar-kw",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arKw;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-ly.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arLy = {
+    code: "ar-ly",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arLy;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-ma.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arMa = {
+    code: "ar-ma",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arMa;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-sa.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arSa = {
+    code: "ar-sa",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arSa;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar-tn.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arTn = {
+    code: "ar-tn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4 // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arTn;
+
+}());

+ 28 - 0
public/fullcalendar/locales/ar.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ar = {
+    code: "ar",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return ar;
+
+}());

+ 29 - 0
public/fullcalendar/locales/az.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var az = {
+    code: "az",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Əvvəl",
+      next: "Sonra",
+      today: "Bu Gün",
+      month: "Ay",
+      week: "Həftə",
+      day: "Gün",
+      list: "Gündəm"
+    },
+    weekText: "Həftə",
+    allDayText: "Bütün Gün",
+    moreLinkText: function(n) {
+      return "+ daha çox " + n;
+    },
+    noEventsText: "Göstərmək üçün hadisə yoxdur"
+  };
+
+  return az;
+
+}());

+ 28 - 0
public/fullcalendar/locales/bg.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bg = {
+    code: "bg",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "назад",
+      next: "напред",
+      today: "днес",
+      month: "Месец",
+      week: "Седмица",
+      day: "Ден",
+      list: "График"
+    },
+    allDayText: "Цял ден",
+    moreLinkText: function(n) {
+      return "+още " + n;
+    },
+    noEventsText: "Няма събития за показване"
+  };
+
+  return bg;
+
+}());

+ 29 - 0
public/fullcalendar/locales/bs.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bs = {
+    code: "bs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prošli",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Sedmica",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Sed",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikazivanje"
+  };
+
+  return bs;
+
+}());

+ 27 - 0
public/fullcalendar/locales/ca.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ca = {
+    code: "ca",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Següent",
+      today: "Avui",
+      month: "Mes",
+      week: "Setmana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Set",
+    allDayText: "Tot el dia",
+    moreLinkText: "més",
+    noEventsText: "No hi ha esdeveniments per mostrar"
+  };
+
+  return ca;
+
+}());

+ 29 - 0
public/fullcalendar/locales/cs.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var cs = {
+    code: "cs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Dříve",
+      next: "Později",
+      today: "Nyní",
+      month: "Měsíc",
+      week: "Týden",
+      day: "Den",
+      list: "Agenda"
+    },
+    weekText: "Týd",
+    allDayText: "Celý den",
+    moreLinkText: function(n) {
+      return "+další: " + n;
+    },
+    noEventsText: "Žádné akce k zobrazení"
+  };
+
+  return cs;
+
+}());

+ 27 - 0
public/fullcalendar/locales/da.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var da = {
+    code: "da",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Næste",
+      today: "I dag",
+      month: "Måned",
+      week: "Uge",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uge",
+    allDayText: "Hele dagen",
+    moreLinkText: "flere",
+    noEventsText: "Ingen arrangementer at vise"
+  };
+
+  return da;
+
+}());

+ 30 - 0
public/fullcalendar/locales/de.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var de = {
+    code: "de",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zurück",
+      next: "Vor",
+      today: "Heute",
+      year: "Jahr",
+      month: "Monat",
+      week: "Woche",
+      day: "Tag",
+      list: "Terminübersicht"
+    },
+    weekText: "KW",
+    allDayText: "Ganztägig",
+    moreLinkText: function(n) {
+      return "+ weitere " + n;
+    },
+    noEventsText: "Keine Ereignisse anzuzeigen"
+  };
+
+  return de;
+
+}());

+ 27 - 0
public/fullcalendar/locales/el.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var el = {
+    code: "el",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Προηγούμενος",
+      next: "Επόμενος",
+      today: "Σήμερα",
+      month: "Μήνας",
+      week: "Εβδομάδα",
+      day: "Ημέρα",
+      list: "Ατζέντα"
+    },
+    weekText: "Εβδ",
+    allDayText: "Ολοήμερο",
+    moreLinkText: "περισσότερα",
+    noEventsText: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
+  };
+
+  return el;
+
+}());

+ 14 - 0
public/fullcalendar/locales/en-au.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enAu = {
+    code: "en-au",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enAu;
+
+}());

+ 14 - 0
public/fullcalendar/locales/en-gb.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enGb = {
+    code: "en-gb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enGb;
+
+}());

+ 14 - 0
public/fullcalendar/locales/en-nz.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enNz = {
+    code: "en-nz",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enNz;
+
+}());

+ 27 - 0
public/fullcalendar/locales/es-us.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var esUs = {
+    code: "es",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  return esUs;
+
+}());

+ 27 - 0
public/fullcalendar/locales/es.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var es = {
+    code: "es",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  return es;
+
+}());

+ 29 - 0
public/fullcalendar/locales/et.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var et = {
+    code: "et",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Eelnev",
+      next: "Järgnev",
+      today: "Täna",
+      month: "Kuu",
+      week: "Nädal",
+      day: "Päev",
+      list: "Päevakord"
+    },
+    weekText: "näd",
+    allDayText: "Kogu päev",
+    moreLinkText: function(n) {
+      return "+ veel " + n;
+    },
+    noEventsText: "Kuvamiseks puuduvad sündmused"
+  };
+
+  return et;
+
+}());

+ 27 - 0
public/fullcalendar/locales/eu.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var eu = {
+    code: "eu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Aur",
+      next: "Hur",
+      today: "Gaur",
+      month: "Hilabetea",
+      week: "Astea",
+      day: "Eguna",
+      list: "Agenda"
+    },
+    weekText: "As",
+    allDayText: "Egun osoa",
+    moreLinkText: "gehiago",
+    noEventsText: "Ez dago ekitaldirik erakusteko"
+  };
+
+  return eu;
+
+}());

+ 30 - 0
public/fullcalendar/locales/fa.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fa = {
+    code: "fa",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12 // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "قبلی",
+      next: "بعدی",
+      today: "امروز",
+      month: "ماه",
+      week: "هفته",
+      day: "روز",
+      list: "برنامه"
+    },
+    weekText: "هف",
+    allDayText: "تمام روز",
+    moreLinkText: function(n) {
+      return "بیش از " + n;
+    },
+    noEventsText: "هیچ رویدادی به نمایش"
+  };
+
+  return fa;
+
+}());

+ 27 - 0
public/fullcalendar/locales/fi.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fi = {
+    code: "fi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Edellinen",
+      next: "Seuraava",
+      today: "Tänään",
+      month: "Kuukausi",
+      week: "Viikko",
+      day: "Päivä",
+      list: "Tapahtumat"
+    },
+    weekText: "Vk",
+    allDayText: "Koko päivä",
+    moreLinkText: "lisää",
+    noEventsText: "Ei näytettäviä tapahtumia"
+  };
+
+  return fi;
+
+}());

+ 24 - 0
public/fullcalendar/locales/fr-ca.js

@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCa = {
+    code: "fr",
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return frCa;
+
+}());

+ 28 - 0
public/fullcalendar/locales/fr-ch.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCh = {
+    code: "fr-ch",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Courant",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sm",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return frCh;
+
+}());

+ 28 - 0
public/fullcalendar/locales/fr.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fr = {
+    code: "fr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return fr;
+
+}());

+ 27 - 0
public/fullcalendar/locales/gl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var gl = {
+    code: "gl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Seg",
+      today: "Hoxe",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Axenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo o día",
+    moreLinkText: "máis",
+    noEventsText: "Non hai eventos para amosar"
+  };
+
+  return gl;
+
+}());

+ 24 - 0
public/fullcalendar/locales/he.js

@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var he = {
+    code: "he",
+    direction: 'rtl',
+    buttonText: {
+      prev: "הקודם",
+      next: "הבא",
+      today: "היום",
+      month: "חודש",
+      week: "שבוע",
+      day: "יום",
+      list: "סדר יום"
+    },
+    allDayText: "כל היום",
+    moreLinkText: "אחר",
+    noEventsText: "אין אירועים להצגה",
+    weekText: "שבוע"
+  };
+
+  return he;
+
+}());

+ 29 - 0
public/fullcalendar/locales/hi.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hi = {
+    code: "hi",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "पिछला",
+      next: "अगला",
+      today: "आज",
+      month: "महीना",
+      week: "सप्ताह",
+      day: "दिन",
+      list: "कार्यसूची"
+    },
+    weekText: "हफ्ता",
+    allDayText: "सभी दिन",
+    moreLinkText: function(n) {
+      return "+अधिक " + n;
+    },
+    noEventsText: "कोई घटनाओं को प्रदर्शित करने के लिए"
+  };
+
+  return hi;
+
+}());

+ 29 - 0
public/fullcalendar/locales/hr.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hr = {
+    code: "hr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prijašnji",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Tjedan",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Tje",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikaz"
+  };
+
+  return hr;
+
+}());

+ 27 - 0
public/fullcalendar/locales/hu.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hu = {
+    code: "hu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "vissza",
+      next: "előre",
+      today: "ma",
+      month: "Hónap",
+      week: "Hét",
+      day: "Nap",
+      list: "Napló"
+    },
+    weekText: "Hét",
+    allDayText: "Egész nap",
+    moreLinkText: "további",
+    noEventsText: "Nincs megjeleníthető esemény"
+  };
+
+  return hu;
+
+}());

+ 27 - 0
public/fullcalendar/locales/id.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var id = {
+    code: "id",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "mundur",
+      next: "maju",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sehari penuh",
+    moreLinkText: "lebih",
+    noEventsText: "Tidak ada acara untuk ditampilkan"
+  };
+
+  return id;
+
+}());

+ 27 - 0
public/fullcalendar/locales/is.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var is = {
+    code: "is",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Fyrri",
+      next: "Næsti",
+      today: "Í dag",
+      month: "Mánuður",
+      week: "Vika",
+      day: "Dagur",
+      list: "Dagskrá"
+    },
+    weekText: "Vika",
+    allDayText: "Allan daginn",
+    moreLinkText: "meira",
+    noEventsText: "Engir viðburðir til að sýna"
+  };
+
+  return is;
+
+}());

+ 29 - 0
public/fullcalendar/locales/it.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var it = {
+    code: "it",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prec",
+      next: "Succ",
+      today: "Oggi",
+      month: "Mese",
+      week: "Settimana",
+      day: "Giorno",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Tutto il giorno",
+    moreLinkText: function(n) {
+      return "+altri " + n;
+    },
+    noEventsText: "Non ci sono eventi da visualizzare"
+  };
+
+  return it;
+
+}());

+ 25 - 0
public/fullcalendar/locales/ja.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ja = {
+    code: "ja",
+    buttonText: {
+      prev: "前",
+      next: "次",
+      today: "今日",
+      month: "月",
+      week: "週",
+      day: "日",
+      list: "予定リスト"
+    },
+    weekText: "週",
+    allDayText: "終日",
+    moreLinkText: function(n) {
+      return "他 " + n + " 件";
+    },
+    noEventsText: "表示する予定はありません"
+  };
+
+  return ja;
+
+}());

+ 29 - 0
public/fullcalendar/locales/ka.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ka = {
+    code: "ka",
+    week: {
+      dow: 1,
+      doy: 7
+    },
+    buttonText: {
+      prev: "წინა",
+      next: "შემდეგი",
+      today: "დღეს",
+      month: "თვე",
+      week: "კვირა",
+      day: "დღე",
+      list: "დღის წესრიგი"
+    },
+    weekText: "კვ",
+    allDayText: "მთელი დღე",
+    moreLinkText: function(n) {
+      return "+ კიდევ " + n;
+    },
+    noEventsText: "ღონისძიებები არ არის"
+  };
+
+  return ka;
+
+}());

+ 29 - 0
public/fullcalendar/locales/kk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var kk = {
+    code: "kk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Алдыңғы",
+      next: "Келесі",
+      today: "Бүгін",
+      month: "Ай",
+      week: "Апта",
+      day: "Күн",
+      list: "Күн тәртібі"
+    },
+    weekText: "Не",
+    allDayText: "Күні бойы",
+    moreLinkText: function(n) {
+      return "+ тағы " + n;
+    },
+    noEventsText: "Көрсету үшін оқиғалар жоқ"
+  };
+
+  return kk;
+
+}());

+ 23 - 0
public/fullcalendar/locales/ko.js

@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ko = {
+    code: "ko",
+    buttonText: {
+      prev: "이전달",
+      next: "다음달",
+      today: "오늘",
+      month: "월",
+      week: "주",
+      day: "일",
+      list: "일정목록"
+    },
+    weekText: "주",
+    allDayText: "종일",
+    moreLinkText: "개",
+    noEventsText: "일정이 없습니다"
+  };
+
+  return ko;
+
+}());

+ 27 - 0
public/fullcalendar/locales/lb.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lb = {
+    code: "lb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zréck",
+      next: "Weider",
+      today: "Haut",
+      month: "Mount",
+      week: "Woch",
+      day: "Dag",
+      list: "Terminiwwersiicht"
+    },
+    weekText: "W",
+    allDayText: "Ganzen Dag",
+    moreLinkText: "méi",
+    noEventsText: "Nee Evenementer ze affichéieren"
+  };
+
+  return lb;
+
+}());

+ 27 - 0
public/fullcalendar/locales/lt.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lt = {
+    code: "lt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Atgal",
+      next: "Pirmyn",
+      today: "Šiandien",
+      month: "Mėnuo",
+      week: "Savaitė",
+      day: "Diena",
+      list: "Darbotvarkė"
+    },
+    weekText: "SAV",
+    allDayText: "Visą dieną",
+    moreLinkText: "daugiau",
+    noEventsText: "Nėra įvykių rodyti"
+  };
+
+  return lt;
+
+}());

+ 29 - 0
public/fullcalendar/locales/lv.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lv = {
+    code: "lv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Iepr.",
+      next: "Nāk.",
+      today: "Šodien",
+      month: "Mēnesis",
+      week: "Nedēļa",
+      day: "Diena",
+      list: "Dienas kārtība"
+    },
+    weekText: "Ned.",
+    allDayText: "Visu dienu",
+    moreLinkText: function(n) {
+      return "+vēl " + n;
+    },
+    noEventsText: "Nav notikumu"
+  };
+
+  return lv;
+
+}());

+ 25 - 0
public/fullcalendar/locales/mk.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var mk = {
+    code: "mk",
+    buttonText: {
+      prev: "претходно",
+      next: "следно",
+      today: "Денес",
+      month: "Месец",
+      week: "Недела",
+      day: "Ден",
+      list: "График"
+    },
+    weekText: "Сед",
+    allDayText: "Цел ден",
+    moreLinkText: function(n) {
+      return "+повеќе " + n;
+    },
+    noEventsText: "Нема настани за прикажување"
+  };
+
+  return mk;
+
+}());

+ 29 - 0
public/fullcalendar/locales/ms.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ms = {
+    code: "ms",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Sebelum",
+      next: "Selepas",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sepanjang hari",
+    moreLinkText: function(n) {
+      return "masih ada " + n + " acara";
+    },
+    noEventsText: "Tiada peristiwa untuk dipaparkan"
+  };
+
+  return ms;
+
+}());

+ 27 - 0
public/fullcalendar/locales/nb.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nb = {
+    code: "nb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Neste",
+      today: "I dag",
+      month: "Måned",
+      week: "Uke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uke",
+    allDayText: "Hele dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  return nb;
+
+}());

+ 27 - 0
public/fullcalendar/locales/nl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nl = {
+    code: "nl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Voorgaand",
+      next: "Volgende",
+      today: "Vandaag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Hele dag",
+    moreLinkText: "extra",
+    noEventsText: "Geen evenementen om te laten zien"
+  };
+
+  return nl;
+
+}());

+ 27 - 0
public/fullcalendar/locales/nn.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nn = {
+    code: "nn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Førre",
+      next: "Neste",
+      today: "I dag",
+      month: "Månad",
+      week: "Veke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Veke",
+    allDayText: "Heile dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  return nn;
+
+}());

+ 27 - 0
public/fullcalendar/locales/pl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pl = {
+    code: "pl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Poprzedni",
+      next: "Następny",
+      today: "Dziś",
+      month: "Miesiąc",
+      week: "Tydzień",
+      day: "Dzień",
+      list: "Plan dnia"
+    },
+    weekText: "Tydz",
+    allDayText: "Cały dzień",
+    moreLinkText: "więcej",
+    noEventsText: "Brak wydarzeń do wyświetlenia"
+  };
+
+  return pl;
+
+}());

+ 25 - 0
public/fullcalendar/locales/pt-br.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ptBr = {
+    code: "pt-br",
+    buttonText: {
+      prev: "Anterior",
+      next: "Próximo",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Lista"
+    },
+    weekText: "Sm",
+    allDayText: "dia inteiro",
+    moreLinkText: function(n) {
+      return "mais +" + n;
+    },
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  return ptBr;
+
+}());

+ 27 - 0
public/fullcalendar/locales/pt.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pt = {
+    code: "pt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Seguinte",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Sem",
+    allDayText: "Todo o dia",
+    moreLinkText: "mais",
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  return pt;
+
+}());

+ 29 - 0
public/fullcalendar/locales/ro.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ro = {
+    code: "ro",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "precedentă",
+      next: "următoare",
+      today: "Azi",
+      month: "Lună",
+      week: "Săptămână",
+      day: "Zi",
+      list: "Agendă"
+    },
+    weekText: "Săpt",
+    allDayText: "Toată ziua",
+    moreLinkText: function(n) {
+      return "+alte " + n;
+    },
+    noEventsText: "Nu există evenimente de afișat"
+  };
+
+  return ro;
+
+}());

+ 29 - 0
public/fullcalendar/locales/ru.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ru = {
+    code: "ru",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Пред",
+      next: "След",
+      today: "Сегодня",
+      month: "Месяц",
+      week: "Неделя",
+      day: "День",
+      list: "Повестка дня"
+    },
+    weekText: "Нед",
+    allDayText: "Весь день",
+    moreLinkText: function(n) {
+      return "+ ещё " + n;
+    },
+    noEventsText: "Нет событий для отображения"
+  };
+
+  return ru;
+
+}());

+ 29 - 0
public/fullcalendar/locales/sk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sk = {
+    code: "sk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Predchádzajúci",
+      next: "Nasledujúci",
+      today: "Dnes",
+      month: "Mesiac",
+      week: "Týždeň",
+      day: "Deň",
+      list: "Rozvrh"
+    },
+    weekText: "Ty",
+    allDayText: "Celý deň",
+    moreLinkText: function(n) {
+      return "+ďalšie: " + n;
+    },
+    noEventsText: "Žiadne akcie na zobrazenie"
+  };
+
+  return sk;
+
+}());

+ 27 - 0
public/fullcalendar/locales/sl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sl = {
+    code: "sl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prejšnji",
+      next: "Naslednji",
+      today: "Trenutni",
+      month: "Mesec",
+      week: "Teden",
+      day: "Dan",
+      list: "Dnevni red"
+    },
+    weekText: "Teden",
+    allDayText: "Ves dan",
+    moreLinkText: "več",
+    noEventsText: "Ni dogodkov za prikaz"
+  };
+
+  return sl;
+
+}());

+ 29 - 0
public/fullcalendar/locales/sq.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sq = {
+    code: "sq",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "mbrapa",
+      next: "Përpara",
+      today: "sot",
+      month: "Muaj",
+      week: "Javë",
+      day: "Ditë",
+      list: "Listë"
+    },
+    weekText: "Ja",
+    allDayText: "Gjithë ditën",
+    moreLinkText: function(n) {
+      return "+më tepër " + n;
+    },
+    noEventsText: "Nuk ka evente për të shfaqur"
+  };
+
+  return sq;
+
+}());

+ 29 - 0
public/fullcalendar/locales/sr-cyrl.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var srCyrl = {
+    code: "sr-cyrl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Претходна",
+      next: "следећи",
+      today: "Данас",
+      month: "Месец",
+      week: "Недеља",
+      day: "Дан",
+      list: "Планер"
+    },
+    weekText: "Сед",
+    allDayText: "Цео дан",
+    moreLinkText: function(n) {
+      return "+ још " + n;
+    },
+    noEventsText: "Нема догађаја за приказ"
+  };
+
+  return srCyrl;
+
+}());

+ 29 - 0
public/fullcalendar/locales/sr.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sr = {
+    code: "sr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prethodna",
+      next: "Sledeći",
+      today: "Danas",
+      month: "Mеsеc",
+      week: "Nеdеlja",
+      day: "Dan",
+      list: "Planеr"
+    },
+    weekText: "Sed",
+    allDayText: "Cеo dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nеma događaja za prikaz"
+  };
+
+  return sr;
+
+}());

+ 27 - 0
public/fullcalendar/locales/sv.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sv = {
+    code: "sv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Förra",
+      next: "Nästa",
+      today: "Idag",
+      month: "Månad",
+      week: "Vecka",
+      day: "Dag",
+      list: "Program"
+    },
+    weekText: "v.",
+    allDayText: "Heldag",
+    moreLinkText: "till",
+    noEventsText: "Inga händelser att visa"
+  };
+
+  return sv;
+
+}());

+ 30 - 0
public/fullcalendar/locales/th.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var th = {
+    code: "th",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "ก่อนหน้า",
+      next: "ถัดไป",
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: "วันนี้",
+      month: "เดือน",
+      week: "สัปดาห์",
+      day: "วัน",
+      list: "กำหนดการ"
+    },
+    weekText: "สัปดาห์",
+    allDayText: "ตลอดวัน",
+    moreLinkText: "เพิ่มเติม",
+    noEventsText: "ไม่มีกิจกรรมที่จะแสดง"
+  };
+
+  return th;
+
+}());

+ 27 - 0
public/fullcalendar/locales/tr.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var tr = {
+    code: "tr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "geri",
+      next: "ileri",
+      today: "bugün",
+      month: "Ay",
+      week: "Hafta",
+      day: "Gün",
+      list: "Ajanda"
+    },
+    weekText: "Hf",
+    allDayText: "Tüm gün",
+    moreLinkText: "daha fazla",
+    noEventsText: "Gösterilecek etkinlik yok"
+  };
+
+  return tr;
+
+}());

+ 17 - 0
public/fullcalendar/locales/ug.js

@@ -0,0 +1,17 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ug = {
+    code: "ug",
+    buttonText: {
+      month: "ئاي",
+      week: "ھەپتە",
+      day: "كۈن",
+      list: "كۈنتەرتىپ"
+    },
+    allDayText: "پۈتۈن كۈن"
+  };
+
+  return ug;
+
+}());

+ 29 - 0
public/fullcalendar/locales/uk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uk = {
+    code: "uk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Попередній",
+      next: "далі",
+      today: "Сьогодні",
+      month: "Місяць",
+      week: "Тиждень",
+      day: "День",
+      list: "Порядок денний"
+    },
+    weekText: "Тиж",
+    allDayText: "Увесь день",
+    moreLinkText: function(n) {
+      return "+ще " + n + "...";
+    },
+    noEventsText: "Немає подій для відображення"
+  };
+
+  return uk;
+
+}());

+ 21 - 0
public/fullcalendar/locales/uz.js

@@ -0,0 +1,21 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uz = {
+    code: "uz",
+    buttonText: {
+      month: "Oy",
+      week: "Xafta",
+      day: "Kun",
+      list: "Kun tartibi"
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText: function(n) {
+      return "+ yana " + n;
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q"
+  };
+
+  return uz;
+
+}());

+ 29 - 0
public/fullcalendar/locales/vi.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var vi = {
+    code: "vi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Trước",
+      next: "Tiếp",
+      today: "Hôm nay",
+      month: "Tháng",
+      week: "Tuần",
+      day: "Ngày",
+      list: "Lịch biểu"
+    },
+    weekText: "Tu",
+    allDayText: "Cả ngày",
+    moreLinkText: function(n) {
+      return "+ thêm " + n;
+    },
+    noEventsText: "Không có sự kiện để hiển thị"
+  };
+
+  return vi;
+
+}());

+ 30 - 0
public/fullcalendar/locales/zh-cn.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhCn = {
+    code: "zh-cn",
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "周",
+      day: "日",
+      list: "日程"
+    },
+    weekText: "周",
+    allDayText: "全天",
+    moreLinkText: function(n) {
+      return "另外 " + n + " 个";
+    },
+    noEventsText: "没有事件显示"
+  };
+
+  return zhCn;
+
+}());

+ 23 - 0
public/fullcalendar/locales/zh-tw.js

@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhTw = {
+    code: "zh-tw",
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "週",
+      day: "天",
+      list: "活動列表"
+    },
+    weekText: "周",
+    allDayText: "整天",
+    moreLinkText: '顯示更多',
+    noEventsText: "没有任何活動"
+  };
+
+  return zhTw;
+
+}());

File diff suppressed because it is too large
+ 71 - 0
public/fullcalendar/main.css


File diff suppressed because it is too large
+ 56 - 0
public/fullcalendar/main.js


File diff suppressed because it is too large
+ 0 - 0
public/fullcalendar/main.min.css


File diff suppressed because it is too large
+ 5 - 0
public/fullcalendar/main.min.js


+ 14 - 0
resources/views/app/dashboard.blade.php

@@ -65,7 +65,21 @@
                         </div>
                     </div>
                 </div>
+                <div class="col-md-8">
+                    <div id='calendar'></div>
+                </div>
             </div>
         </div>
     </div>
+    <script>
+
+        document.addEventListener('DOMContentLoaded', function() {
+          var calendarEl = document.getElementById('calendar');
+          var calendar = new FullCalendar.Calendar(calendarEl, {
+            initialView: 'dayGridMonth'
+          });
+          calendar.render();
+        });
+  
+      </script>
 @endsection

Some files were not shown because too many files changed in this diff