Răsfoiți Sursa

Minor - add js lib "bootstrap-year-calendar" see BT#14608

Julio 6 ani în urmă
părinte
comite
86afa9588b
16 a modificat fișierele cu 1787 adăugiri și 2 ștergeri
  1. 14 0
      app/Resources/public/assets/bootstrap-year-calendar/.bower.json
  2. 202 0
      app/Resources/public/assets/bootstrap-year-calendar/LICENSE
  3. 27 0
      app/Resources/public/assets/bootstrap-year-calendar/README.md
  4. 253 0
      app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.css
  5. 6 0
      app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.min.css
  6. 1110 0
      app/Resources/public/assets/bootstrap-year-calendar/js/bootstrap-year-calendar.js
  7. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.de.js
  8. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.es.js
  9. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.fr.js
  10. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.it.js
  11. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ja.js
  12. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.nl.js
  13. 20 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.pt.js
  14. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ru.js
  15. 20 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.tr.js
  16. 2 2
      bower.json

+ 14 - 0
app/Resources/public/assets/bootstrap-year-calendar/.bower.json

@@ -0,0 +1,14 @@
+{
+  "name": "bootstrap-year-calendar",
+  "homepage": "https://github.com/Paul-DS/bootstrap-year-calendar",
+  "version": "1.1.0",
+  "_release": "1.1.0",
+  "_resolution": {
+    "type": "version",
+    "tag": "v1.1.0",
+    "commit": "48ef9450d47c63fce8b0d7628bc313ad279a66e0"
+  },
+  "_source": "https://github.com/Paul-DS/bootstrap-year-calendar.git",
+  "_target": "1.1.*",
+  "_originalSource": "bootstrap-year-calendar"
+}

+ 202 - 0
app/Resources/public/assets/bootstrap-year-calendar/LICENSE

@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

+ 27 - 0
app/Resources/public/assets/bootstrap-year-calendar/README.md

@@ -0,0 +1,27 @@
+# bootstrap-year-calendar
+A fully customizable year calendar widget, for boostrap !
+You can find all details on the [official website](http://www.bootstrap-year-calendar.com/).
+
+
+![alt tag](http://www.bootstrap-year-calendar.com/img/calendar.png)
+
+## Requirements
+
+This plugin requires the following libraries :
+- Bootstrap v3.0.0 or later
+- jQuery v1.8.0 or later
+
+## Usage
+
+You can create a calendar using the following javascript code :
+```
+$('.calendar').calendar()
+```
+or
+```
+$('.calendar').calendar(options)
+```
+or with the `data-provide` html attribute 
+```
+<div data-provide="calendar"></div>
+```

+ 253 - 0
app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.css

@@ -0,0 +1,253 @@
+/* =========================================================
+ * Bootstrap year calendar v1.1.0
+ * Repo: https://github.com/Paul-DS/bootstrap-year-calendar
+ * =========================================================
+ * Created by Paul David-Sivelle
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+/* Main */
+.calendar {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  overflow: auto;
+  direction: ltr;
+  
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.calendar.calendar-rtl {
+  direction: rtl;
+}
+.calendar.calendar-rtl table tr td span {
+  float: right;
+}
+
+.calendar table {
+  margin: auto;
+}
+
+.calendar table td,
+.calendar table th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  border: none;
+  padding: 4px 5px;
+  font-size:12px;
+}
+
+/* Header */
+.calendar .calendar-header
+{
+	width:100%;
+	margin-bottom:20px;
+}
+
+.calendar .calendar-header table
+{
+	width:100%;
+}
+
+.calendar .calendar-header table th
+{
+	font-size:22px;
+	padding:5px 10px;
+}
+
+.calendar .calendar-header table th:hover {
+  background: #eeeeee;
+  cursor: pointer;
+}
+
+.calendar .calendar-header table th.disabled,
+.calendar .calendar-header table th.disabled:hover {
+  background: none;
+  cursor: default;
+  color:white;
+}
+
+.calendar .calendar-header table th.prev,
+.calendar .calendar-header table th.next
+{
+	width:20px;
+}
+
+.calendar .year-title {
+	font-weight:bold;
+	text-align:center;
+	height:20px;
+	width:auto;
+}
+
+.calendar .year-neighbor
+{
+	color:#aaaaaa;
+}
+
+.calendar .year-neighbor2
+{
+	color:#dddddd;
+}
+
+/* Months */
+.calendar .months-container {
+	width:100%;
+	display:none;
+}
+
+.calendar .month-container {
+	min-width:180px;
+	text-align:center;
+	height:200px;
+	padding:0;
+}
+
+.calendar table.month th.month-title
+{
+	font-size:16px;
+	padding-bottom: 5px;
+}
+
+.calendar table.month th.day-header
+{
+	font-size:14px;
+}
+
+
+.calendar table.month tr td,
+.calendar table.month tr th
+{
+	padding:0;
+}
+
+.calendar table.month td.week-number {
+	cursor: default;
+	font-weight:bold;
+	border-right:1px solid #eee;
+	padding:5px;
+}
+
+.calendar .round-left {
+	-webkit-border-radius: 8px 0 0 8px;
+	-moz-border-radius: 8px 0 0 8px;
+	border-radius: 8px 0 0 8px;
+}
+
+.calendar .round-right {
+	webkit-border-radius: 0 8px 8px 0 ;
+	-moz-border-radius: 0 8px 8px 0;
+	border-radius: 0 8px 8px 0;
+}
+
+.calendar table.month tr td .day-content {
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+	padding: 5px 6px;
+}
+
+.table-striped .calendar table.month tr td,
+.table-striped .calendar table.month tr th {
+  background-color: transparent;
+}
+
+.calendar table.month td.day .day-content:hover {
+  background: rgba(0, 0, 0, 0.2);
+  cursor: pointer;
+}
+.calendar table.month tr td.old,
+.calendar table.month tr td.new,
+.calendar table.month tr td.old:hover,
+.calendar table.month tr td.new:hover {
+  background: none;
+  cursor: default;
+}
+.calendar table.month tr td.disabled,
+.calendar table.month tr td.disabled:hover {
+  color: #dddddd;
+}
+
+.calendar table.month td.day.disabled .day-content:hover {
+	background: none;
+	cursor: default;
+}
+
+.calendar table.month tr td.range .day-content {
+   background: rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+
+.calendar table.month tr td.range.range-start .day-content  {
+  border-top-left-radius:4px;
+  border-bottom-left-radius:4px;
+}
+
+.calendar table.month tr td.range.range-end .day-content  {
+  border-top-right-radius:4px;
+  border-bottom-right-radius:4px;
+}
+
+.calendar-context-menu,
+.calendar-context-menu  .submenu {
+	border: 1px solid #ddd;
+	background-color: white;
+	box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);
+	-webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);
+	position:absolute;
+	display:none;
+}
+
+.calendar-context-menu .item {
+	padding:5px 10px;
+	cursor:pointer;
+	display:table;
+	width:100%;
+}
+
+.calendar-context-menu .item:hover {
+	background:#eee;
+}
+
+.calendar-context-menu .item .content {
+	display:table-cell;
+}
+
+.calendar-context-menu .item span {
+	display:table-cell;
+	padding-left:10px;
+	text-align:right;
+}
+
+.calendar-context-menu .item span:last-child {
+	display:none;
+}
+
+.calendar-context-menu  .submenu {
+	left: 100%;
+	margin-top: -6px;
+}
+
+.calendar-context-menu  .item:hover > .submenu {
+	display:block;
+}

Fișier diff suprimat deoarece este prea mare
+ 6 - 0
app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.min.css


+ 1110 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/bootstrap-year-calendar.js

@@ -0,0 +1,1110 @@
+/* =========================================================
+ * Bootstrap year calendar v1.1.0
+ * Repo: https://github.com/Paul-DS/bootstrap-year-calendar
+ * =========================================================
+ * Created by Paul David-Sivelle
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+(function($) {
+    var Calendar = function(element, options) {
+        this.element = element;
+        this.element.addClass('calendar');
+
+        this._initializeEvents(options);
+        this._initializeOptions(options);
+        this.setYear(this.options.startYear);
+    };
+
+    Calendar.prototype = {
+        constructor: Calendar,
+        _initializeOptions: function(opt) {
+            if(opt == null) {
+                opt = [];
+            }
+
+            this.options = {
+                startYear: !isNaN(parseInt(opt.startYear)) ? parseInt(opt.startYear) : new Date().getFullYear(),
+                minDate: opt.minDate instanceof Date ? opt.minDate : null,
+                maxDate: opt.maxDate instanceof Date ? opt.maxDate : null,
+                language: (opt.language != null && dates[opt.language] != null) ? opt.language : 'en',
+                allowOverlap: opt.allowOverlap != null ? opt.allowOverlap : true,
+                displayWeekNumber: opt.displayWeekNumber != null ? opt.displayWeekNumber : false,
+                displayDisabledDataSource: opt.displayDisabledDataSource != null ? opt.displayDisabledDataSource : false,
+                displayHeader: opt.displayHeader != null ? opt.displayHeader : true,
+                alwaysHalfDay: opt.alwaysHalfDay != null ? opt.alwaysHalfDay : false,
+                enableRangeSelection: opt.enableRangeSelection != null ? opt.enableRangeSelection : false,
+                disabledDays: opt.disabledDays instanceof Array ? opt.disabledDays : [],
+                disabledWeekDays: opt.disabledWeekDays instanceof Array ? opt.disabledWeekDays : [],
+                hiddenWeekDays: opt.hiddenWeekDays instanceof Array ? opt.hiddenWeekDays : [],
+                roundRangeLimits: opt.roundRangeLimits != null ? opt.roundRangeLimits : false,
+                dataSource: opt.dataSource instanceof Array ? opt.dataSource : [],
+                style: opt.style == 'background' || opt.style == 'border' || opt.style == 'custom' ? opt.style : 'border',
+                enableContextMenu: opt.enableContextMenu != null ? opt.enableContextMenu : false,
+                contextMenuItems: opt.contextMenuItems instanceof Array ? opt.contextMenuItems : [],
+                customDayRenderer : $.isFunction(opt.customDayRenderer) ? opt.customDayRenderer : null,
+                customDataSourceRenderer : $.isFunction(opt.customDataSourceRenderer) ? opt.customDataSourceRenderer : null,
+                weekStart: !isNaN(parseInt(opt.weekStart)) ? parseInt(opt.weekStart) : null
+            };
+
+            this._initializeDatasourceColors();
+        },
+        _initializeEvents: function(opt) {
+            if(opt == null) {
+                opt = [];
+            }
+
+            if(opt.yearChanged) { this.element.bind('yearChanged', opt.yearChanged); }
+            if(opt.renderEnd) { this.element.bind('renderEnd', opt.renderEnd); }
+            if(opt.clickDay) { this.element.bind('clickDay', opt.clickDay); }
+            if(opt.dayContextMenu) { this.element.bind('dayContextMenu', opt.dayContextMenu); }
+            if(opt.selectRange) { this.element.bind('selectRange', opt.selectRange); }
+            if(opt.mouseOnDay) { this.element.bind('mouseOnDay', opt.mouseOnDay); }
+            if(opt.mouseOutDay) { this.element.bind('mouseOutDay', opt.mouseOutDay); }
+        },
+        _initializeDatasourceColors: function() {
+            for(var i = 0; i < this.options.dataSource.length; i++) {
+                if(this.options.dataSource[i].color == null) {
+                    this.options.dataSource[i].color = colors[i % colors.length];
+                }
+            }
+        },
+        render: function() {
+            this.element.empty();
+
+            if(this.options.displayHeader) {
+                this._renderHeader();
+            }
+
+            this._renderBody();
+            this._renderDataSource();
+
+            this._applyEvents();
+            this.element.find('.months-container').fadeIn(500);
+
+            this._triggerEvent('renderEnd', { currentYear: this.options.startYear });
+        },
+        _renderHeader: function() {
+            var header = $(document.createElement('div'));
+            header.addClass('calendar-header panel panel-default');
+
+            var headerTable = $(document.createElement('table'));
+
+            var prevDiv = $(document.createElement('th'));
+            prevDiv.addClass('prev');
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {
+                prevDiv.addClass('disabled');
+            }
+
+            var prevIcon = $(document.createElement('span'));
+            prevIcon.addClass('glyphicon glyphicon-chevron-left');
+
+            prevDiv.append(prevIcon);
+
+            headerTable.append(prevDiv);
+
+            var prev2YearDiv = $(document.createElement('th'));
+            prev2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs');
+            prev2YearDiv.text(this.options.startYear - 2);
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 2, 11, 31)) {
+                prev2YearDiv.addClass('disabled');
+            }
+
+            headerTable.append(prev2YearDiv);
+
+            var prevYearDiv = $(document.createElement('th'));
+            prevYearDiv.addClass('year-title year-neighbor hidden-xs');
+            prevYearDiv.text(this.options.startYear - 1);
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {
+                prevYearDiv.addClass('disabled');
+            }
+
+            headerTable.append(prevYearDiv);
+
+            var yearDiv = $(document.createElement('th'));
+            yearDiv.addClass('year-title');
+            yearDiv.text(this.options.startYear);
+
+            headerTable.append(yearDiv);
+
+            var nextYearDiv = $(document.createElement('th'));
+            nextYearDiv.addClass('year-title year-neighbor hidden-xs');
+            nextYearDiv.text(this.options.startYear + 1);
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {
+                nextYearDiv.addClass('disabled');
+            }
+
+            headerTable.append(nextYearDiv);
+
+            var next2YearDiv = $(document.createElement('th'));
+            next2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs');
+            next2YearDiv.text(this.options.startYear + 2);
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 2, 0, 1)) {
+                next2YearDiv.addClass('disabled');
+            }
+
+            headerTable.append(next2YearDiv);
+
+            var nextDiv = $(document.createElement('th'));
+            nextDiv.addClass('next');
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {
+                nextDiv.addClass('disabled');
+            }
+
+            var nextIcon = $(document.createElement('span'));
+            nextIcon.addClass('glyphicon glyphicon-chevron-right');
+
+            nextDiv.append(nextIcon);
+
+            headerTable.append(nextDiv);
+
+            header.append(headerTable);
+
+            this.element.append(header);
+        },
+        _renderBody: function() {
+            var monthsDiv = $(document.createElement('div'));
+            monthsDiv.addClass('months-container');
+
+            for(var m = 0; m < 12; m++) {
+                /* Container */
+                var monthDiv = $(document.createElement('div'));
+                monthDiv.addClass('month-container');
+                monthDiv.data('month-id', m);
+
+                var firstDate = new Date(this.options.startYear, m, 1);
+
+                var table = $(document.createElement('table'));
+                table.addClass('month');
+
+                /* Month header */
+                var thead = $(document.createElement('thead'));
+
+                var titleRow = $(document.createElement('tr'));
+
+                var titleCell = $(document.createElement('th'));
+                titleCell.addClass('month-title');
+                titleCell.attr('colspan', this.options.displayWeekNumber ? 8 : 7);
+                titleCell.text(dates[this.options.language].months[m]);
+
+                titleRow.append(titleCell);
+                thead.append(titleRow);
+
+                var headerRow = $(document.createElement('tr'));
+
+                if(this.options.displayWeekNumber) {
+                    var weekNumberCell = $(document.createElement('th'));
+                    weekNumberCell.addClass('week-number');
+                    weekNumberCell.text(dates[this.options.language].weekShort);
+                    headerRow.append(weekNumberCell);
+                }
+
+                var weekStart = this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;
+                var d = weekStart;
+                do
+                {
+                    var headerCell = $(document.createElement('th'));
+                    headerCell.addClass('day-header');
+                    headerCell.text(dates[this.options.language].daysMin[d]);
+
+                    if(this._isHidden(d)) {
+                        headerCell.addClass('hidden');
+                    }
+
+                    headerRow.append(headerCell);
+
+                    d++;
+                    if(d >= 7)
+                        d = 0;
+                }
+                while(d != weekStart)
+
+                thead.append(headerRow);
+                table.append(thead);
+
+                /* Days */
+                var currentDate = new Date(firstDate.getTime());
+                var lastDate = new Date(this.options.startYear, m + 1, 0);
+
+                while(currentDate.getDay() != weekStart)
+                {
+                    currentDate.setDate(currentDate.getDate() - 1);
+                }
+
+                while(currentDate <= lastDate)
+                {
+                    var row = $(document.createElement('tr'));
+
+                    if(this.options.displayWeekNumber) {
+                        var weekNumberCell = $(document.createElement('td'));
+                        weekNumberCell.addClass('week-number');
+                        weekNumberCell.text(this.getWeekNumber(currentDate));
+                        row.append(weekNumberCell);
+                    }
+
+                    do
+                    {
+                        var cell = $(document.createElement('td'));
+                        cell.addClass('day');
+
+                        if(this._isHidden(currentDate.getDay())) {
+                            cell.addClass('hidden');
+                        }
+
+                        if(currentDate < firstDate) {
+                            cell.addClass('old');
+                        }
+                        else if(currentDate > lastDate) {
+                            cell.addClass('new');
+                        }
+                        else {
+                            if(this._isDisabled(currentDate)) {
+                                cell.addClass('disabled');
+                            }
+
+                            var cellContent = $(document.createElement('div'));
+                            cellContent.addClass('day-content');
+                            cellContent.text(currentDate.getDate());
+                            cell.append(cellContent);
+
+                            if(this.options.customDayRenderer) {
+                                this.options.customDayRenderer(cellContent, currentDate);
+                            }
+                        }
+
+                        row.append(cell);
+
+                        currentDate.setDate(currentDate.getDate() + 1);
+                    }
+                    while(currentDate.getDay() != weekStart)
+
+                    table.append(row);
+                }
+
+                monthDiv.append(table);
+
+                monthsDiv.append(monthDiv);
+            }
+
+            this.element.append(monthsDiv);
+        },
+        _renderDataSource: function() {
+            var _this = this;
+            if(this.options.dataSource != null && this.options.dataSource.length > 0) {
+                this.element.find('.month-container').each(function() {
+                    var month = $(this).data('month-id');
+
+                    var firstDate = new Date(_this.options.startYear, month, 1);
+                    var lastDate = new Date(_this.options.startYear, month + 1, 1);
+
+                    if((_this.options.minDate == null || lastDate > _this.options.minDate) && (_this.options.maxDate == null || firstDate <= _this.options.maxDate))
+                    {
+                        var monthData = [];
+
+                        for(var i = 0; i < _this.options.dataSource.length; i++) {
+                            if(!(_this.options.dataSource[i].startDate >= lastDate) || (_this.options.dataSource[i].endDate < firstDate)) {
+                                monthData.push(_this.options.dataSource[i]);
+                            }
+                        }
+
+                        if(monthData.length > 0) {
+                            $(this).find('.day-content').each(function() {
+                                var currentDate = new Date(_this.options.startYear, month, $(this).text());
+                                var nextDate = new Date(_this.options.startYear, month, currentDate.getDate() + 1);
+
+                                var dayData = [];
+
+                                if((_this.options.minDate == null || currentDate >= _this.options.minDate) && (_this.options.maxDate == null || currentDate <= _this.options.maxDate))
+                                {
+                                    for(var i = 0; i < monthData.length; i++) {
+                                        if(monthData[i].startDate < nextDate && monthData[i].endDate >= currentDate) {
+                                            dayData.push(monthData[i]);
+                                        }
+                                    }
+
+                                    if(dayData.length > 0 && (_this.options.displayDisabledDataSource || !_this._isDisabled(currentDate)))
+                                    {
+                                        _this._renderDataSourceDay($(this), currentDate, dayData);
+                                    }
+                                }
+                            });
+                        }
+                    }
+                });
+            }
+        },
+        _renderDataSourceDay: function(elt, currentDate, events) {
+            switch(this.options.style)
+            {
+                case 'border':
+                    var weight = 0;
+
+                    if(events.length == 1) {
+                        weight = 4;
+                    }
+                    else if(events.length <= 3) {
+                        weight = 2;
+                    }
+                    else {
+                        elt.parent().css('box-shadow', 'inset 0 -4px 0 0 black');
+                    }
+
+                    if(weight > 0)
+                    {
+                        var boxShadow = '';
+
+                        for (var i = 0; i < events.length; i++)
+                        {
+                            if(boxShadow != '') {
+                                boxShadow += ",";
+                            }
+
+                            boxShadow += 'inset 0 -' + (parseInt(i) + 1) * weight + 'px 0 0 ' + events[i].color;
+                        }
+
+                        elt.parent().css('box-shadow', boxShadow);
+                    }
+                    break;
+
+                case 'background':
+                    elt.parent().css('background-color', events[events.length - 1].color);
+
+                    var currentTime = currentDate.getTime();
+
+                    if(events[events.length - 1].startDate.getTime() == currentTime)
+                    {
+                        elt.parent().addClass('day-start');
+
+                        if(events[events.length - 1].startHalfDay || this.options.alwaysHalfDay) {
+                            elt.parent().addClass('day-half');
+
+                            // Find color for other half
+                            var otherColor = 'transparent';
+                            for(var i = events.length - 2; i >= 0; i--) {
+                                if(events[i].startDate.getTime() != currentTime || (!events[i].startHalfDay && !this.options.alwaysHalfDay)) {
+                                    otherColor = events[i].color;
+                                    break;
+                                }
+                            }
+
+                            elt.parent().css('background', 'linear-gradient(-45deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');
+                        }
+                        else if(this.options.roundRangeLimits) {
+                            elt.parent().addClass('round-left');
+                        }
+                    }
+                    else if(events[events.length - 1].endDate.getTime() == currentTime)
+                    {
+                        elt.parent().addClass('day-end');
+
+                        if(events[events.length - 1].endHalfDay || this.options.alwaysHalfDay) {
+                            elt.parent().addClass('day-half');
+
+                            // Find color for other half
+                            var otherColor = 'transparent';
+                            for(var i = events.length - 2; i >= 0; i--) {
+                                if(events[i].endDate.getTime() != currentTime || (!events[i].endHalfDay &&  !this.options.alwaysHalfDay)) {
+                                    otherColor = events[i].color;
+                                    break;
+                                }
+                            }
+
+                            elt.parent().css('background', 'linear-gradient(135deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');
+                        }
+                        else if(this.options.roundRangeLimits) {
+                            elt.parent().addClass('round-right');
+                        }
+                    }
+                    break;
+
+                case 'custom':
+                    if(this.options.customDataSourceRenderer) {
+                        this.options.customDataSourceRenderer.call(this, elt, currentDate, events);
+                    }
+                    break;
+            }
+        },
+        _applyEvents: function () {
+            var _this = this;
+
+            /* Header buttons */
+            this.element.find('.year-neighbor, .year-neighbor2').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.setYear(parseInt($(this).text()));
+                }
+            });
+
+            this.element.find('.calendar-header .prev').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.element.find('.months-container').animate({'margin-left':'100%'},100, function() {
+                        _this.element.find('.months-container').css('visibility', 'hidden');
+                        _this.element.find('.months-container').css('margin-left', '0');
+
+                        setTimeout(function() {
+                            _this.setYear(_this.options.startYear - 1);
+                        }, 50);
+                    });
+                }
+            });
+
+            this.element.find('.calendar-header .next').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.element.find('.months-container').animate({'margin-left':'-100%'},100, function() {
+                        _this.element.find('.months-container').css('visibility', 'hidden');
+                        _this.element.find('.months-container').css('margin-left', '0');
+
+                        setTimeout(function() {
+                            _this.setYear(_this.options.startYear + 1);
+                        }, 50);
+                    });
+                }
+            });
+
+            var cells = this.element.find('.day:not(.old, .new, .disabled)');
+
+            /* Click on date */
+            cells.click(function(e) {
+                e.stopPropagation();
+                var date = _this._getDate($(this));
+                _this._triggerEvent('clickDay', {
+                    element: $(this),
+                    which: e.which,
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Click right on date */
+
+            cells.bind('contextmenu', function(e) {
+                if(_this.options.enableContextMenu)
+                {
+                    e.preventDefault();
+                    if(_this.options.contextMenuItems.length > 0)
+                    {
+                        _this._openContextMenu($(this));
+                    }
+                }
+
+                var date = _this._getDate($(this));
+                _this._triggerEvent('dayContextMenu', {
+                    element: $(this),
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Range selection */
+            if(this.options.enableRangeSelection) {
+                cells.mousedown(function (e) {
+                    if(e.which == 1) {
+                        var currentDate = _this._getDate($(this));
+
+                        if(_this.options.allowOverlap || _this.getEvents(currentDate).length == 0)
+                        {
+                            _this._mouseDown = true;
+                            _this._rangeStart = _this._rangeEnd = currentDate;
+                            _this._refreshRange();
+                        }
+                    }
+                });
+
+                cells.mouseenter(function (e) {
+                    if (_this._mouseDown) {
+                        var currentDate = _this._getDate($(this));
+
+                        if(!_this.options.allowOverlap)
+                        {
+                            var newDate =  new Date(_this._rangeStart.getTime());
+
+                            if(newDate < currentDate) {
+                                var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() + 1);
+                                while(newDate < currentDate) {
+                                    if(_this.getEvents(nextDate).length > 0)
+                                    {
+                                        break;
+                                    }
+
+                                    newDate.setDate(newDate.getDate() + 1);
+                                    nextDate.setDate(nextDate.getDate() + 1);
+                                }
+                            }
+                            else {
+                                var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() - 1);
+                                while(newDate > currentDate) {
+                                    if(_this.getEvents(nextDate).length > 0)
+                                    {
+                                        break;
+                                    }
+
+                                    newDate.setDate(newDate.getDate() - 1);
+                                    nextDate.setDate(nextDate.getDate() - 1);
+                                }
+                            }
+
+                            currentDate = newDate;
+                        }
+
+                        var oldValue = _this._rangeEnd;
+                        _this._rangeEnd = currentDate;
+
+                        if (oldValue.getTime() != _this._rangeEnd.getTime()) {
+                            _this._refreshRange();
+                        }
+                    }
+                });
+
+                $(window).mouseup(function (e) {
+                    if (_this._mouseDown) {
+                        _this._mouseDown = false;
+                        _this._refreshRange();
+
+                        var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;
+                        var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;
+
+                        _this._triggerEvent('selectRange', {
+                            startDate: minDate,
+                            endDate: maxDate,
+                            events: _this.getEventsOnRange(minDate, new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate() + 1))
+                        });
+                    }
+                });
+            }
+
+            /* Hover date */
+            cells.mouseenter(function(e) {
+                if(!_this._mouseDown)
+                {
+                    var date = _this._getDate($(this));
+                    _this._triggerEvent('mouseOnDay', {
+                        element: $(this),
+                        date: date,
+                        events: _this.getEvents(date)
+                    });
+                }
+            });
+
+            cells.mouseleave(function(e) {
+                var date = _this._getDate($(this));
+                _this._triggerEvent('mouseOutDay', {
+                    element: $(this),
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Responsive management */
+
+            setInterval(function() {
+                var calendarSize = $(_this.element).width();
+                var monthSize = $(_this.element).find('.month').first().width() + 10;
+                var monthContainerClass = 'month-container';
+
+                if(monthSize * 6 < calendarSize) {
+                    monthContainerClass += ' col-xs-2';
+                }
+                else if(monthSize * 4 < calendarSize) {
+                    monthContainerClass += ' col-xs-3';
+                }
+                else if(monthSize * 3 < calendarSize) {
+                    monthContainerClass += ' col-xs-4';
+                }
+                else if(monthSize * 2 < calendarSize) {
+                    monthContainerClass += ' col-xs-6';
+                }
+                else {
+                    monthContainerClass += ' col-xs-12';
+                }
+
+                $(_this.element).find('.month-container').attr('class', monthContainerClass);
+            }, 300);
+        },
+        _refreshRange: function () {
+            var _this = this;
+
+            this.element.find('td.day.range').removeClass('range')
+            this.element.find('td.day.range-start').removeClass('range-start');
+            this.element.find('td.day.range-end').removeClass('range-end');
+
+            if (this._mouseDown) {
+                var beforeRange = true;
+                var afterRange = false;
+                var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;
+                var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;
+
+                this.element.find('.month-container').each(function () {
+                    var monthId = $(this).data('month-id');
+                    if (minDate.getMonth() <= monthId && maxDate.getMonth() >= monthId) {
+                        $(this).find('td.day:not(.old, .new)').each(function () {
+                            var date = _this._getDate($(this));
+                            if (date >= minDate && date <= maxDate) {
+                                $(this).addClass('range');
+
+                                if (date.getTime() == minDate.getTime()) {
+                                    $(this).addClass('range-start');
+                                }
+
+                                if (date.getTime() == maxDate.getTime()) {
+                                    $(this).addClass('range-end');
+                                }
+                            }
+                        });
+                    }
+                });
+            }
+        },
+        _openContextMenu: function(elt) {
+            var contextMenu = $('.calendar-context-menu');
+
+            if(contextMenu.length > 0) {
+                contextMenu.hide();
+                contextMenu.empty();
+            }
+            else {
+                contextMenu = $(document.createElement('div'));
+                contextMenu.addClass('calendar-context-menu');
+                $('body').append(contextMenu);
+            }
+
+            var date = this._getDate(elt);
+            var events = this.getEvents(date);
+
+            for(var i = 0; i < events.length; i++) {
+                var eventItem = $(document.createElement('div'));
+                eventItem.addClass('item');
+                eventItem.css('border-left', '4px solid ' + events[i].color);
+
+                var eventItemContent = $(document.createElement('div'));
+                eventItemContent.addClass('content');
+                eventItemContent.text(events[i].name);
+
+                eventItem.append(eventItemContent);
+
+                var icon = $(document.createElement('span'));
+                icon.addClass('glyphicon glyphicon-chevron-right');
+
+                eventItem.append(icon);
+
+                this._renderContextMenuItems(eventItem, this.options.contextMenuItems, events[i]);
+
+                contextMenu.append(eventItem);
+            }
+
+            if(contextMenu.children().length > 0)
+            {
+                contextMenu.css('left', elt.offset().left + 25 + 'px');
+                contextMenu.css('top', elt.offset().top + 25 + 'px');
+                contextMenu.show();
+
+                $(window).one('mouseup', function() {
+                    contextMenu.hide();
+                });
+            }
+        },
+        _renderContextMenuItems: function(parent, items, evt) {
+            var subMenu = $(document.createElement('div'));
+            subMenu.addClass('submenu');
+
+            for(var i = 0; i < items.length; i++) {
+                if(!items[i].visible || items[i].visible(evt)) {
+                    var menuItem = $(document.createElement('div'));
+                    menuItem.addClass('item');
+
+                    var menuItemContent = $(document.createElement('div'));
+                    menuItemContent.addClass('content');
+                    menuItemContent.text(items[i].text);
+
+                    menuItem.append(menuItemContent);
+
+                    if(items[i].click) {
+                        (function(index) {
+                            menuItem.click(function() {
+                                items[index].click(evt);
+                            });
+                        })(i);
+                    }
+
+                    var icon = $(document.createElement('span'));
+                    icon.addClass('glyphicon glyphicon-chevron-right');
+
+                    menuItem.append(icon);
+
+                    if(items[i].items && items[i].items.length > 0) {
+                        this._renderContextMenuItems(menuItem, items[i].items, evt);
+                    }
+
+                    subMenu.append(menuItem);
+                }
+            }
+
+            if(subMenu.children().length > 0)
+            {
+                parent.append(subMenu);
+            }
+        },
+        _getColor: function(colorString) {
+            var div = $('<div />');
+            div.css('color', colorString);
+
+        },
+        _getDate: function(elt) {
+            var day = elt.children('.day-content').text();
+            var month = elt.closest('.month-container').data('month-id');
+            var year = this.options.startYear;
+
+            return new Date(year, month, day);
+        },
+        _triggerEvent: function(eventName, parameters) {
+            var event = $.Event(eventName);
+
+            for(var i in parameters) {
+                event[i] = parameters[i];
+            }
+
+            this.element.trigger(event);
+
+            return event;
+        },
+        _isDisabled: function(date) {
+            if((this.options.minDate != null && date < this.options.minDate) || (this.options.maxDate != null && date > this.options.maxDate))
+            {
+                return true;
+            }
+
+            if(this.options.disabledWeekDays.length > 0) {
+                for(var d = 0; d < this.options.disabledWeekDays.length; d++){
+                    if(date.getDay() == this.options.disabledWeekDays[d]) {
+                        return true;
+                    }
+                }
+            }
+
+            if(this.options.disabledDays.length > 0) {
+                for(var d = 0; d < this.options.disabledDays.length; d++){
+                    if(date.getTime() == this.options.disabledDays[d].getTime()) {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        },
+        _isHidden: function(day) {
+            if(this.options.hiddenWeekDays.length > 0) {
+                for(var d = 0; d < this.options.hiddenWeekDays.length; d++) {
+                    if(day == this.options.hiddenWeekDays[d]) {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        },
+        getWeekNumber: function(date) {
+            var tempDate = new Date(date.getTime());
+            tempDate.setHours(0, 0, 0, 0);
+            tempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7);
+            var week1 = new Date(tempDate.getFullYear(), 0, 4);
+            return 1 + Math.round(((tempDate.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
+        },
+        getEvents: function(date) {
+            return this.getEventsOnRange(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1));
+        },
+        getEventsOnRange: function(startDate, endDate) {
+            var events = [];
+
+            if(this.options.dataSource && startDate && endDate) {
+                for(var i = 0; i < this.options.dataSource.length; i++) {
+                    if(this.options.dataSource[i].startDate < endDate && this.options.dataSource[i].endDate >= startDate) {
+                        events.push(this.options.dataSource[i]);
+                    }
+                }
+            }
+
+            return events;
+        },
+        getYear: function() {
+            return this.options.startYear;
+        },
+        setYear: function(year) {
+            var parsedYear = parseInt(year);
+            if(!isNaN(parsedYear)) {
+                this.options.startYear = parsedYear;
+
+                this.element.empty();
+
+                if(this.options.displayHeader) {
+                    this._renderHeader();
+                }
+
+                var eventResult = this._triggerEvent('yearChanged', { currentYear: this.options.startYear, preventRendering: false });
+
+                if(!eventResult.preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getMinDate: function() {
+            return this.options.minDate;
+        },
+        setMinDate: function(date, preventRendering) {
+            if(date instanceof Date) {
+                this.options.minDate = date;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getMaxDate: function() {
+            return this.options.maxDate;
+        },
+        setMaxDate: function(date, preventRendering) {
+            if(date instanceof Date) {
+                this.options.maxDate = date;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getStyle: function() {
+            return this.options.style;
+        },
+        setStyle: function(style, preventRendering) {
+            this.options.style = style == 'background' || style == 'border' || style == 'custom' ? style : 'border';
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getAllowOverlap: function() {
+            return this.options.allowOverlap;
+        },
+        setAllowOverlap: function(allowOverlap) {
+            this.options.allowOverlap = allowOverlap;
+        },
+        getDisplayWeekNumber: function() {
+            return this.options.displayWeekNumber;
+        },
+        setDisplayWeekNumber: function(displayWeekNumber, preventRendering) {
+            this.options.displayWeekNumber = displayWeekNumber;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisplayHeader: function() {
+            return this.options.displayHeader;
+        },
+        setDisplayHeader: function(displayHeader, preventRendering) {
+            this.options.displayHeader = displayHeader;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisplayDisabledDataSource: function() {
+            return this.options.displayDisabledDataSource;
+        },
+        setDisplayDisabledDataSource: function(displayDisabledDataSource, preventRendering) {
+            this.options.displayDisabledDataSource = displayDisabledDataSource;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getAlwaysHalfDay: function() {
+            return this.options.alwaysHalfDay;
+        },
+        setAlwaysHalfDay: function(alwaysHalfDay, preventRendering) {
+            this.options.alwaysHalfDay = alwaysHalfDay;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getEnableRangeSelection: function() {
+            return this.options.enableRangeSelection;
+        },
+        setEnableRangeSelection: function(enableRangeSelection, preventRendering) {
+            this.options.enableRangeSelection = enableRangeSelection;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisabledDays: function() {
+            return this.options.disabledDays;
+        },
+        setDisabledDays: function(disabledDays, preventRendering) {
+            this.options.disabledDays = disabledDays instanceof Array ? disabledDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisabledWeekDays: function() {
+            return this.options.disabledWeekDays;
+        },
+        setDisabledWeekDays: function(disabledWeekDays, preventRendering) {
+            this.options.disabledWeekDays = disabledWeekDays instanceof Array ? disabledWeekDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getHiddenWeekDays: function() {
+            return this.options.hiddenWeekDays;
+        },
+        setHiddenWeekDays: function(hiddenWeekDays, preventRendering) {
+            this.options.hiddenWeekDays = hiddenWeekDays instanceof Array ? hiddenWeekDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getRoundRangeLimits: function() {
+            return this.options.roundRangeLimits;
+        },
+        setRoundRangeLimits: function(roundRangeLimits, preventRendering) {
+            this.options.roundRangeLimits = roundRangeLimits;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getEnableContextMenu: function() {
+            return this.options.enableContextMenu;
+        },
+        setEnableContextMenu: function(enableContextMenu, preventRendering) {
+            this.options.enableContextMenu = enableContextMenu;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getContextMenuItems: function() {
+            return this.options.contextMenuItems;
+        },
+        setContextMenuItems: function(contextMenuItems, preventRendering) {
+            this.options.contextMenuItems = contextMenuItems instanceof Array ? contextMenuItems : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getCustomDayRenderer: function() {
+            return this.options.customDayRenderer;
+        },
+        setCustomDayRenderer: function(customDayRenderer, preventRendering) {
+            this.options.customDayRenderer = $.isFunction(customDayRenderer) ? customDayRenderer : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getCustomDataSourceRenderer: function() {
+            return this.options.customDataSourceRenderer;
+        },
+        setCustomDataSourceRenderer: function(customDataSourceRenderer, preventRendering) {
+            this.options.customDataSourceRenderer = $.isFunction(customDataSourceRenderer) ? customDataSourceRenderer : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getLanguage: function() {
+            return this.options.language;
+        },
+        setLanguage: function(language, preventRendering) {
+            if(language != null && dates[language] != null) {
+                this.options.language = language;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getDataSource: function() {
+            return this.options.dataSource;
+        },
+        setDataSource: function(dataSource, preventRendering) {
+            this.options.dataSource = dataSource instanceof Array ? dataSource : [];
+            this._initializeDatasourceColors();
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getWeekStart: function() {
+            return this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;
+        },
+        setWeekStart: function(weekStart, preventRendering) {
+            this.options.weekStart = !isNaN(parseInt(weekStart)) ? parseInt(weekStart) : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        addEvent: function(evt, preventRendering) {
+            this.options.dataSource.push(evt);
+
+            if(!preventRendering) {
+                this.render();
+            }
+        }
+    }
+
+    $.fn.calendar = function (options) {
+        var calendar = new Calendar($(this) ,options);
+        $(this).data('calendar', calendar);
+        return calendar;
+    }
+
+    /* Events binding management */
+    $.fn.yearChanged = function(fct) { $(this).bind('yearChanged', fct); }
+    $.fn.renderEnd = function(fct) { $(this).bind('renderEnd', fct); }
+    $.fn.clickDay = function(fct) { $(this).bind('clickDay', fct); }
+    $.fn.dayContextMenu = function(fct) { $(this).bind('dayContextMenu', fct); }
+    $.fn.selectRange = function(fct) { $(this).bind('selectRange', fct); }
+    $.fn.mouseOnDay = function(fct) { $(this).bind('mouseOnDay', fct); }
+    $.fn.mouseOutDay = function(fct) { $(this).bind('mouseOutDay', fct); }
+
+    var dates = $.fn.calendar.dates = {
+        en: {
+            days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+            daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+            daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+            monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+            weekShort: 'W',
+            weekStart:0
+        }
+    };
+
+    var colors = $.fn.calendar.colors = ['#2C8FC9', '#9CB703', '#F5BB00', '#FF4A32', '#B56CE2', '#45A597'];
+
+    $(function(){
+        $('[data-provide="calendar"]').each(function() {
+            $(this).calendar();
+        });
+    });
+}(window.jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.de.js

@@ -0,0 +1,19 @@
+/**
+ * German translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * German translation for bootstrap-datepicker
+ * Sam Zurcher <sam@orelias.ch>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['de'] = {
+		days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
+		daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
+		daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
+		months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
+		monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
+		weekShort: 'W',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.es.js

@@ -0,0 +1,19 @@
+/**
+ * Spanish translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Spanish translation for bootstrap-datepicker
+ * Bruno Bonamin <bruno.bonamin@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['es'] = {
+		days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
+		daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
+		daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
+		months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
+		monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
+		weekShort: 'S',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.fr.js

@@ -0,0 +1,19 @@
+/**
+ * French translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * French translation for bootstrap-datepicker
+ * Nico Mollet <nico.mollet@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['fr'] = {
+		days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"],
+		daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"],
+		daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"],
+		months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
+		monthsShort: ["Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc"],
+		weekShort:'S',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.it.js

@@ -0,0 +1,19 @@
+/**
+ * Italian translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Italian translation for bootstrap-datepicker
+ * Enrico Rubboli <rubboli@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['it'] = {
+		days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
+		daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
+		daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
+		months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
+		monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
+		weekShort: 'S',
+		weekStart: 1,
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ja.js

@@ -0,0 +1,19 @@
+/**
+ * Japanese translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Japanese translation for bootstrap-datepicker
+ * Norio Suzuki <https://github.com/suzuki/>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['ja'] = {
+		days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"],
+		daysShort: ["日", "月", "火", "水", "木", "金", "土"],
+		daysMin: ["日", "月", "火", "水", "木", "金", "土"],
+		months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
+		monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
+		weekShort: '週',
+		weekStart:0
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.nl.js

@@ -0,0 +1,19 @@
+/**
+ * Dutch translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Dutch translation for bootstrap-datepicker
+ * Reinier Goltstein <mrgoltstein@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['nl'] = {
+		days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
+		daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
+		daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
+		months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
+		monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
+		weekShort: 'w',
+		weekStart: 1
+	};
+}(jQuery));

+ 20 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.pt.js

@@ -0,0 +1,20 @@
+/**
+ * Portuguese translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Portuguese translation for bootstrap-datepicker
+ * Original code: Cauan Cabral <cauan@radig.com.br>
+ * Tiago Melo <tiago.blackcode@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['pt'] = {
+		days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
+		daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
+		daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
+		months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
+		monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
+		weekShort: 'S',
+		weekStart:0
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ru.js

@@ -0,0 +1,19 @@
+/**
+ * Russian translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Russian translation for bootstrap-datepicker
+ * Victor Taranenko <darwin@snowdale.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['ru'] = {
+		days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
+		daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
+		daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
+		months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
+		monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
+		weekShort: 'н',
+		weekStart: 1
+	};
+}(jQuery));

+ 20 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.tr.js

@@ -0,0 +1,20 @@
+/**
+ * Turkish translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Turkish translation for bootstrap-datepicker
+ * Serkan Algur <kaisercrazy_2@hotmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['tr'] = {
+		days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"],
+		daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts"],
+		daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct"],
+		months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
+		monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"],
+		weekShort: 'H',
+		weekStart: 1
+	};
+}(jQuery));
+

+ 2 - 2
bower.json

@@ -35,8 +35,8 @@
     "flag-icon-css": "*",
     "jquery.easy-pie-chart": "^2.1.6",
     "jqueryui-touch-punch": "*",
-    "multiselect-two-sides": "*"
-
+    "multiselect-two-sides": "2.5.*",
+    "bootstrap-year-calendar": "1.1.*"
   },
   "resolutions": {
     "jquery": "2.1.4"

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff