tenon 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tenon/version.rb +1 -1
  3. data/vendor/assets/images/Jcrop.gif +0 -0
  4. data/vendor/assets/javascripts/backstretch.js +4 -0
  5. data/vendor/assets/javascripts/bootstrap.collapse.js +179 -0
  6. data/vendor/assets/javascripts/bootstrap.datetimepicker.js +954 -0
  7. data/vendor/assets/javascripts/bootstrap.js +561 -0
  8. data/vendor/assets/javascripts/bootstrap.modal.js +246 -0
  9. data/vendor/assets/javascripts/bootstrap.tabs.js +135 -0
  10. data/vendor/assets/javascripts/canvasjs.min.js +343 -0
  11. data/vendor/assets/javascripts/cufon/Aller_400.font.js +7 -0
  12. data/vendor/assets/javascripts/cufon/Aller_700.font.js +7 -0
  13. data/vendor/assets/javascripts/cufon/cufon.js +7 -0
  14. data/vendor/assets/javascripts/imagesloaded.js +7 -0
  15. data/vendor/assets/javascripts/jquery.Jcrop.js +1704 -0
  16. data/vendor/assets/javascripts/jquery.corner.js +249 -0
  17. data/vendor/assets/javascripts/jquery.debounce.js +9 -0
  18. data/vendor/assets/javascripts/jquery.equalHeights.js +52 -0
  19. data/vendor/assets/javascripts/jquery.form.js +911 -0
  20. data/vendor/assets/javascripts/jquery.hoverIntent.js +115 -0
  21. data/vendor/assets/javascripts/jquery.mousewheel.js +78 -0
  22. data/vendor/assets/javascripts/jquery.radioSlider.js +55 -0
  23. data/vendor/assets/javascripts/jquery.twoLevelSort.js +57 -0
  24. data/vendor/assets/javascripts/jquery.ui.sortable.js +2252 -0
  25. data/vendor/assets/javascripts/jscrollpane.js +1435 -0
  26. data/vendor/assets/javascripts/moment.js +6 -0
  27. data/vendor/assets/javascripts/select2.js +3448 -0
  28. data/vendor/assets/javascripts/underscore.inflection.js +177 -0
  29. data/vendor/assets/javascripts/underscore.string.js +1 -0
  30. data/vendor/assets/javascripts/uri.js +53 -0
  31. data/vendor/assets/stylesheets/bootstrap.css.scss +560 -0
  32. data/vendor/assets/stylesheets/bootstrap.datetimepicker.css +152 -0
  33. data/vendor/assets/stylesheets/bootstrap.tables.css.scss +201 -0
  34. data/vendor/assets/stylesheets/jquery.Jcrop.css +204 -0
  35. data/vendor/assets/stylesheets/jscrollpane.css.scss +20 -0
  36. data/vendor/assets/stylesheets/select2.css +646 -0
  37. metadata +35 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a48cd137171550f98c7abf269b631c1b02357dc
4
- data.tar.gz: f89b928b9c8f72ee255125baa8cae88cfc6c414b
3
+ metadata.gz: 6e3a1b77fe5ccb90ec566fdf8010e3419ceccf42
4
+ data.tar.gz: d19cfe7f7b3c649ad6302d8ff3563e6b486d7306
5
5
  SHA512:
6
- metadata.gz: 386b74ef5ff2e4a90b9118fad2dc2a0e0b581794b9f87c5ad0d4ac83323e8719e64635313ba88288f5fc16b3f69653dc4efdd2e5a9e0ea461ed921887722054b
7
- data.tar.gz: b5fee0cd6dcd6a1f7c9a14c0d2370d18b74489a6e76980fa28f436c195eaac5b6941dc8a05adfd32e5b6342889e61ccfb15d54f74a1fc4cbffea2eaa9c076335
6
+ metadata.gz: f5149be892c91154d6a20ab03cc123b527c565ee995e309575357b18348af3f6280f1fba208dd58225eafa4d576569d14061b5bc596b81871dde4f8a65ec61a9
7
+ data.tar.gz: 35f49dc33e81bf385a31e72f2f20fefea91ee0b7f70ed9f603bd37c9249fba006e6a8a37efb4ee6447739b4412fe142f07b2c6f4f7dba91c9ab33ffa271bb71e
data/lib/tenon/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tenon
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
Binary file
@@ -0,0 +1,4 @@
1
+ /*! Backstretch - v2.0.4 - 2013-06-19
2
+ * http://srobbin.com/jquery-plugins/backstretch/
3
+ * Copyright (c) 2013 Scott Robbin; Licensed MIT */
4
+ (function(a,d,p){a.fn.backstretch=function(c,b){(c===p||0===c.length)&&a.error("No images were supplied for Backstretch");0===a(d).scrollTop()&&d.scrollTo(0,0);return this.each(function(){var d=a(this),g=d.data("backstretch");if(g){if("string"==typeof c&&"function"==typeof g[c]){g[c](b);return}b=a.extend(g.options,b);g.destroy(!0)}g=new q(this,c,b);d.data("backstretch",g)})};a.backstretch=function(c,b){return a("body").backstretch(c,b).data("backstretch")};a.expr[":"].backstretch=function(c){return a(c).data("backstretch")!==p};a.fn.backstretch.defaults={centeredX:!0,centeredY:!0,duration:5E3,fade:0};var r={left:0,top:0,overflow:"hidden",margin:0,padding:0,height:"100%",width:"100%",zIndex:-999999},s={position:"absolute",display:"none",margin:0,padding:0,border:"none",width:"auto",height:"auto",maxHeight:"none",maxWidth:"none",zIndex:-999999},q=function(c,b,e){this.options=a.extend({},a.fn.backstretch.defaults,e||{});this.images=a.isArray(b)?b:[b];a.each(this.images,function(){a("<img />")[0].src=this});this.isBody=c===document.body;this.$container=a(c);this.$root=this.isBody?l?a(d):a(document):this.$container;c=this.$container.children(".backstretch").first();this.$wrap=c.length?c:a('<div class="backstretch"></div>').css(r).appendTo(this.$container);this.isBody||(c=this.$container.css("position"),b=this.$container.css("zIndex"),this.$container.css({position:"static"===c?"relative":c,zIndex:"auto"===b?0:b,background:"none"}),this.$wrap.css({zIndex:-999998}));this.$wrap.css({position:this.isBody&&l?"fixed":"absolute"});this.index=0;this.show(this.index);a(d).on("resize.backstretch",a.proxy(this.resize,this)).on("orientationchange.backstretch",a.proxy(function(){this.isBody&&0===d.pageYOffset&&(d.scrollTo(0,1),this.resize())},this))};q.prototype={resize:function(){try{var a={left:0,top:0},b=this.isBody?this.$root.width():this.$root.innerWidth(),e=b,g=this.isBody?d.innerHeight?d.innerHeight:this.$root.height():this.$root.innerHeight(),j=e/this.$img.data("ratio"),f;j>=g?(f=(j-g)/2,this.options.centeredY&&(a.top="-"+f+"px")):(j=g,e=j*this.$img.data("ratio"),f=(e-b)/2,this.options.centeredX&&(a.left="-"+f+"px"));this.$wrap.css({width:b,height:g}).find("img:not(.deleteable)").css({width:e,height:j}).css(a)}catch(h){}return this},show:function(c){if(!(Math.abs(c)>this.images.length-1)){var b=this,e=b.$wrap.find("img").addClass("deleteable"),d={relatedTarget:b.$container[0]};b.$container.trigger(a.Event("backstretch.before",d),[b,c]);this.index=c;clearInterval(b.interval);b.$img=a("<img />").css(s).bind("load",function(f){var h=this.width||a(f.target).width();f=this.height||a(f.target).height();a(this).data("ratio",h/f);a(this).fadeIn(b.options.speed||b.options.fade,function(){e.remove();b.paused||b.cycle();a(["after","show"]).each(function(){b.$container.trigger(a.Event("backstretch."+this,d),[b,c])})});b.resize()}).appendTo(b.$wrap);b.$img.attr("src",b.images[c]);return b}},next:function(){return this.show(this.index<this.images.length-1?this.index+1:0)},prev:function(){return this.show(0===this.index?this.images.length-1:this.index-1)},pause:function(){this.paused=!0;return this},resume:function(){this.paused=!1;this.next();return this},cycle:function(){1<this.images.length&&(clearInterval(this.interval),this.interval=setInterval(a.proxy(function(){this.paused||this.next()},this),this.options.duration));return this},destroy:function(c){a(d).off("resize.backstretch orientationchange.backstretch");clearInterval(this.interval);c||this.$wrap.remove();this.$container.removeData("backstretch")}};var l,f=navigator.userAgent,m=navigator.platform,e=f.match(/AppleWebKit\/([0-9]+)/),e=!!e&&e[1],h=f.match(/Fennec\/([0-9]+)/),h=!!h&&h[1],n=f.match(/Opera Mobi\/([0-9]+)/),t=!!n&&n[1],k=f.match(/MSIE ([0-9]+)/),k=!!k&&k[1];l=!((-1<m.indexOf("iPhone")||-1<m.indexOf("iPad")||-1<m.indexOf("iPod"))&&e&&534>e||d.operamini&&"[object OperaMini]"==={}.toString.call(d.operamini)||n&&7458>t||-1<f.indexOf("Android")&&e&&533>e||h&&6>h||"palmGetResource"in d&&e&&534>e||-1<f.indexOf("MeeGo")&&-1<f.indexOf("NokiaBrowser/8.5.0")||k&&6>=k)})(jQuery,window);
@@ -0,0 +1,179 @@
1
+ /* ========================================================================
2
+ * Bootstrap: collapse.js v3.0.2
3
+ * http://getbootstrap.com/javascript/#collapse
4
+ * ========================================================================
5
+ * Copyright 2013 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ======================================================================== */
19
+
20
+
21
+ +function ($) { "use strict";
22
+
23
+ // COLLAPSE PUBLIC CLASS DEFINITION
24
+ // ================================
25
+
26
+ var Collapse = function (element, options) {
27
+ this.$element = $(element)
28
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
29
+ this.transitioning = null
30
+
31
+ if (this.options.parent) this.$parent = $(this.options.parent)
32
+ if (this.options.toggle) this.toggle()
33
+ }
34
+
35
+ Collapse.DEFAULTS = {
36
+ toggle: true
37
+ }
38
+
39
+ Collapse.prototype.dimension = function () {
40
+ var hasWidth = this.$element.hasClass('width')
41
+ return hasWidth ? 'width' : 'height'
42
+ }
43
+
44
+ Collapse.prototype.show = function () {
45
+ if (this.transitioning || this.$element.hasClass('in')) return
46
+
47
+ var startEvent = $.Event('show.bs.collapse')
48
+ this.$element.trigger(startEvent)
49
+ if (startEvent.isDefaultPrevented()) return
50
+
51
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
52
+
53
+ if (actives && actives.length) {
54
+ var hasData = actives.data('bs.collapse')
55
+ if (hasData && hasData.transitioning) return
56
+ actives.collapse('hide')
57
+ hasData || actives.data('bs.collapse', null)
58
+ }
59
+
60
+ var dimension = this.dimension()
61
+
62
+ this.$element
63
+ .removeClass('collapse')
64
+ .addClass('collapsing')
65
+ [dimension](0)
66
+
67
+ this.transitioning = 1
68
+
69
+ var complete = function () {
70
+ this.$element
71
+ .removeClass('collapsing')
72
+ .addClass('in')
73
+ [dimension]('auto')
74
+ this.transitioning = 0
75
+ this.$element.trigger('shown.bs.collapse')
76
+ }
77
+
78
+ if (!$.support.transition) return complete.call(this)
79
+
80
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
81
+
82
+ this.$element
83
+ .one($.support.transition.end, $.proxy(complete, this))
84
+ .emulateTransitionEnd(350)
85
+ [dimension](this.$element[0][scrollSize])
86
+ }
87
+
88
+ Collapse.prototype.hide = function () {
89
+ if (this.transitioning || !this.$element.hasClass('in')) return
90
+
91
+ var startEvent = $.Event('hide.bs.collapse')
92
+ this.$element.trigger(startEvent)
93
+ if (startEvent.isDefaultPrevented()) return
94
+
95
+ var dimension = this.dimension()
96
+
97
+ this.$element
98
+ [dimension](this.$element[dimension]())
99
+ [0].offsetHeight
100
+
101
+ this.$element
102
+ .addClass('collapsing')
103
+ .removeClass('collapse')
104
+ .removeClass('in')
105
+
106
+ this.transitioning = 1
107
+
108
+ var complete = function () {
109
+ this.transitioning = 0
110
+ this.$element
111
+ .trigger('hidden.bs.collapse')
112
+ .removeClass('collapsing')
113
+ .addClass('collapse')
114
+ }
115
+
116
+ if (!$.support.transition) return complete.call(this)
117
+
118
+ this.$element
119
+ [dimension](0)
120
+ .one($.support.transition.end, $.proxy(complete, this))
121
+ .emulateTransitionEnd(350)
122
+ }
123
+
124
+ Collapse.prototype.toggle = function () {
125
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
126
+ }
127
+
128
+
129
+ // COLLAPSE PLUGIN DEFINITION
130
+ // ==========================
131
+
132
+ var old = $.fn.collapse
133
+
134
+ $.fn.collapse = function (option) {
135
+ return this.each(function () {
136
+ var $this = $(this)
137
+ var data = $this.data('bs.collapse')
138
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
139
+
140
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
141
+ if (typeof option == 'string') data[option]()
142
+ })
143
+ }
144
+
145
+ $.fn.collapse.Constructor = Collapse
146
+
147
+
148
+ // COLLAPSE NO CONFLICT
149
+ // ====================
150
+
151
+ $.fn.collapse.noConflict = function () {
152
+ $.fn.collapse = old
153
+ return this
154
+ }
155
+
156
+
157
+ // COLLAPSE DATA-API
158
+ // =================
159
+
160
+ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
161
+ var $this = $(this), href
162
+ var target = $this.attr('data-target')
163
+ || e.preventDefault()
164
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
165
+ var $target = $(target)
166
+ var data = $target.data('bs.collapse')
167
+ var option = data ? 'toggle' : $this.data()
168
+ var parent = $this.attr('data-parent')
169
+ var $parent = parent && $(parent)
170
+
171
+ if (!data || !data.transitioning) {
172
+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
173
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
174
+ }
175
+
176
+ $target.collapse(option)
177
+ })
178
+
179
+ }(jQuery);
@@ -0,0 +1,954 @@
1
+ /**
2
+ * version 2.1.11
3
+ * @license
4
+ * =========================================================
5
+ * bootstrap-datetimepicker.js
6
+ * http://www.eyecon.ro/bootstrap-datepicker
7
+ * =========================================================
8
+ * Copyright 2012 Stefan Petre
9
+ *
10
+ * Contributions:
11
+ * - updated for Bootstrap v3 by Jonathan Peterson (@Eonasdan) and (almost)
12
+ * completely rewritten to use Momentjs
13
+ * - based on tarruda's bootstrap-datepicker
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ * =========================================================
27
+ */
28
+ ; (function ($) {
29
+
30
+ if (typeof moment === 'undefined') {
31
+ alert("momentjs is requried");
32
+ throw new Error('momentjs is requried');
33
+ };
34
+
35
+ var dpgId = 0,
36
+
37
+ pMoment = moment,
38
+
39
+ // ReSharper disable once InconsistentNaming
40
+ DateTimePicker = function (element, options) {
41
+ var defaults = {
42
+ pickDate: true,
43
+ pickTime: true,
44
+ startDate: new pMoment({ y: 1970 }),
45
+ endDate: new pMoment().add(50, "y"),
46
+ collapse: true,
47
+ language: "en",
48
+ defaultDate: "",
49
+ disabledDates: [],
50
+ icons: {},
51
+ useStrict: false
52
+ },
53
+
54
+ icons = {
55
+ time: 'fa fa-clock-o',
56
+ date: 'fa fa-calendar',
57
+ up: 'fa fa-chevron-up',
58
+ down: 'fa fa-chevron-down'
59
+ },
60
+
61
+ picker = this,
62
+
63
+ init = function () {
64
+
65
+ var icon = false, i, dDate, longDateFormat;
66
+ picker.options = $.extend({}, defaults, options);
67
+ picker.options.icons = $.extend({}, icons, picker.options.icons);
68
+
69
+ if (!(picker.options.pickTime || picker.options.pickDate))
70
+ throw new Error('Must choose at least one picker');
71
+
72
+ picker.id = dpgId++;
73
+ pMoment.lang(picker.options.language);
74
+ picker.date = pMoment();
75
+ picker.element = $(element);
76
+ picker.unset = false;
77
+ picker.isInput = picker.element.is('input');
78
+ picker.component = false;
79
+
80
+ if (picker.element.hasClass('input-group')) {
81
+ if (picker.element.find('.datepickerbutton').size() == 0) {//in case there is more then one 'input-group-addon` #48
82
+ picker.component = picker.element.find('.input-group-addon');
83
+ }
84
+ else {
85
+ picker.component = picker.element.find('.datepickerbutton');
86
+ }
87
+ }
88
+ picker.format = picker.options.format;
89
+
90
+ longDateFormat = pMoment()._lang._longDateFormat;
91
+
92
+ if (!picker.format) {
93
+ if (picker.isInput) picker.format = picker.element.data('format');
94
+ else picker.format = picker.element.find('input').data('format');
95
+ if (!picker.format) {
96
+ picker.format = (picker.options.pickDate ? longDateFormat.L : '');
97
+ if (picker.options.pickDate && picker.options.pickTime) picker.format += ' ';
98
+ picker.format += (picker.options.pickTime ? longDateFormat.LT : '');
99
+ }
100
+ }
101
+
102
+ picker.use24hours = picker.format.toLowerCase().indexOf("a") < 1;
103
+
104
+ if (picker.component) icon = picker.component.find('span');
105
+
106
+ if (picker.options.pickTime) {
107
+ if (icon) icon.addClass(picker.options.icons.time);
108
+ }
109
+ if (picker.options.pickDate) {
110
+ if (icon) {
111
+ icon.removeClass(picker.options.icons.time);
112
+ icon.addClass(picker.options.icons.date);
113
+ }
114
+ }
115
+
116
+ picker.widget = $(getTemplate(picker.options.pickDate, picker.options.pickTime, picker.options.collapse)).appendTo('body');
117
+ picker.minViewMode = picker.options.minViewMode || picker.element.data('date-minviewmode') || 0;
118
+ if (typeof picker.minViewMode === 'string') {
119
+ switch (picker.minViewMode) {
120
+ case 'months':
121
+ picker.minViewMode = 1;
122
+ break;
123
+ case 'years':
124
+ picker.minViewMode = 2;
125
+ break;
126
+ default:
127
+ picker.minViewMode = 0;
128
+ break;
129
+ }
130
+ }
131
+ picker.viewMode = picker.options.viewMode || picker.element.data('date-viewmode') || 0;
132
+ if (typeof picker.viewMode === 'string') {
133
+ switch (picker.viewMode) {
134
+ case 'months':
135
+ picker.viewMode = 1;
136
+ break;
137
+ case 'years':
138
+ picker.viewMode = 2;
139
+ break;
140
+ default:
141
+ picker.viewMode = 0;
142
+ break;
143
+ }
144
+ }
145
+
146
+ for (i = 0; i < picker.options.disabledDates.length; i++) {
147
+ dDate = picker.options.disabledDates[i];
148
+ dDate = pMoment(dDate);
149
+ //if this is not a valid date then set it to the startdate -1 day so it's disabled.
150
+ if (!dDate.isValid()) dDate = pMoment(picker.options.startDate).subtract(1, "day");
151
+ picker.options.disabledDates[i] = dDate.format("L");
152
+ }
153
+
154
+ picker.startViewMode = picker.viewMode;
155
+ picker.setStartDate(picker.options.startDate || picker.element.data('date-startdate'));
156
+ picker.setEndDate(picker.options.endDate || picker.element.data('date-enddate'));
157
+ fillDow();
158
+ fillMonths();
159
+ fillHours();
160
+ fillMinutes();
161
+ update();
162
+ showMode();
163
+ attachDatePickerEvents();
164
+ if (picker.options.defaultDate !== "") picker.setValue(picker.options.defaultDate);
165
+ },
166
+
167
+ place = function () {
168
+ var position = 'absolute',
169
+ offset = picker.component ? picker.component.offset() : picker.element.offset(), $window = $(window);
170
+ picker.width = picker.component ? picker.component.outerWidth() : picker.element.outerWidth();
171
+ offset.top = offset.top + picker.element.outerHeight();
172
+
173
+ //if (offset.top + picker.widget.height() > $window.height()) offset.top = offset.top - (picker.widget.height() + picker.height + 10);
174
+
175
+ if (picker.options.width !== undefined) {
176
+ picker.widget.width(picker.options.width);
177
+ }
178
+
179
+ if (picker.options.orientation === 'left') {
180
+ picker.widget.addClass('left-oriented');
181
+ offset.left = offset.left - picker.widget.width() + 20;
182
+ }
183
+
184
+ if (isInFixed()) {
185
+ position = 'fixed';
186
+ offset.top -= $window.scrollTop();
187
+ offset.left -= $window.scrollLeft();
188
+ }
189
+
190
+ if ($window.width() < offset.left + picker.widget.outerWidth()) {
191
+ offset.right = $window.width() - offset.left - picker.width;
192
+ offset.left = 'auto';
193
+ picker.widget.addClass('pull-right');
194
+ } else {
195
+ offset.right = 'auto';
196
+ picker.widget.removeClass('pull-right');
197
+ }
198
+
199
+ picker.widget.css({
200
+ position: position,
201
+ top: offset.top,
202
+ left: offset.left,
203
+ right: offset.right
204
+ });
205
+ },
206
+
207
+ notifyChange = function (oldDate) {
208
+ picker.element.trigger({
209
+ type: 'change.dp',
210
+ date: picker.getDate(),
211
+ oldDate: oldDate
212
+ });
213
+ },
214
+
215
+ notifyError = function (date) {
216
+ picker.element.trigger({
217
+ type: 'error.dp',
218
+ date: date
219
+ });
220
+ },
221
+
222
+ update = function (newDate) {
223
+ pMoment.lang(picker.options.language);
224
+ var dateStr = newDate;
225
+ if (!dateStr) {
226
+ if (picker.isInput) {
227
+ dateStr = picker.element.val();
228
+ } else {
229
+ dateStr = picker.element.find('input').val();
230
+ }
231
+ if (dateStr) picker.date = pMoment(dateStr, picker.format, picker.options.useStrict);
232
+ if (!picker.date) picker.date = pMoment();
233
+ }
234
+ picker.viewDate = pMoment(picker.date).startOf("month");
235
+ fillDate();
236
+ fillTime();
237
+ },
238
+
239
+ fillDow = function () {
240
+ pMoment.lang(picker.options.language);
241
+ var html = $('<tr>'), weekdaysMin = pMoment.weekdaysMin(), i;
242
+ if (pMoment()._lang._week.dow == 0) { // starts on Sunday
243
+ for(i = 0; i < 7; i++) {
244
+ html.append('<th class="dow">' + weekdaysMin[i] + '</th>');
245
+ }
246
+ } else {
247
+ for (i = 1; i < 8; i++) {
248
+ if (i == 7) {
249
+ html.append('<th class="dow">' + weekdaysMin[0] + '</th>');
250
+ } else {
251
+ html.append('<th class="dow">' + weekdaysMin[i] + '</th>');
252
+ }
253
+ }
254
+ }
255
+ picker.widget.find('.datepicker-days thead').append(html);
256
+ },
257
+
258
+ fillMonths = function () {
259
+ pMoment.lang(picker.options.language);
260
+ var html = '', i = 0, monthsShort = pMoment.monthsShort();
261
+ while (i < 12) {
262
+ html += '<span class="month">' + monthsShort[i++] + '</span>';
263
+ }
264
+ picker.widget.find('.datepicker-months td').append(html);
265
+ },
266
+
267
+ fillDate = function () {
268
+ pMoment.lang(picker.options.language);
269
+ var year = picker.viewDate.year(),
270
+ month = picker.viewDate.month(),
271
+ startYear = picker.options.startDate.year(),
272
+ startMonth = picker.options.startDate.month(),
273
+ endYear = picker.options.endDate.year(),
274
+ endMonth = picker.options.endDate.month(),
275
+ prevMonth, nextMonth, html = [], row, clsName, i, days, yearCont, currentYear, months = pMoment.months();
276
+
277
+ picker.widget.find('.datepicker-days').find('.disabled').removeClass('disabled');
278
+ picker.widget.find('.datepicker-months').find('.disabled').removeClass('disabled');
279
+ picker.widget.find('.datepicker-years').find('.disabled').removeClass('disabled');
280
+
281
+ picker.widget.find('.datepicker-days th:eq(1)').text(
282
+ months[month] + ' ' + year);
283
+
284
+ prevMonth = pMoment(picker.viewDate).subtract("months", 1);
285
+ days = prevMonth.daysInMonth();
286
+ prevMonth.date(days).startOf('week');
287
+ if ((year == startYear && month <= startMonth) || year < startYear) {
288
+ picker.widget.find('.datepicker-days th:eq(0)').addClass('disabled');
289
+ }
290
+ if ((year == endYear && month >= endMonth) || year > endYear) {
291
+ picker.widget.find('.datepicker-days th:eq(2)').addClass('disabled');
292
+ }
293
+
294
+ nextMonth = pMoment(prevMonth).add(42, "d");
295
+ while (prevMonth.isBefore(nextMonth)) {
296
+ if (prevMonth.weekday() === pMoment().startOf('week').weekday()) {
297
+ row = $('<tr>');
298
+ html.push(row);
299
+ }
300
+ clsName = '';
301
+ if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) {
302
+ clsName += ' old';
303
+ } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) {
304
+ clsName += ' new';
305
+ }
306
+ if (prevMonth.isSame(pMoment({ y: picker.date.year(), M: picker.date.month(), d: picker.date.date() }))) {
307
+ clsName += ' active';
308
+ }
309
+ if ((pMoment(prevMonth).add(1, "d") <= picker.options.startDate) || (prevMonth > picker.options.endDate) || isInDisableDates(prevMonth)) {
310
+ clsName += ' disabled';
311
+ }
312
+ row.append('<td class="day' + clsName + '">' + prevMonth.date() + '</td>');
313
+ prevMonth.add(1, "d");
314
+ }
315
+ picker.widget.find('.datepicker-days tbody').empty().append(html);
316
+ currentYear = pMoment().year(), months = picker.widget.find('.datepicker-months')
317
+ .find('th:eq(1)').text(year).end().find('span').removeClass('active');
318
+ if (currentYear === year) {
319
+ months.eq(pMoment().month()).addClass('active');
320
+ }
321
+ if (currentYear - 1 < startYear) {
322
+ picker.widget.find('.datepicker-months th:eq(0)').addClass('disabled');
323
+ }
324
+ if (currentYear + 1 > endYear) {
325
+ picker.widget.find('.datepicker-months th:eq(2)').addClass('disabled');
326
+ }
327
+ for (i = 0; i < 12; i++) {
328
+ if ((year == startYear && startMonth > i) || (year < startYear)) {
329
+ $(months[i]).addClass('disabled');
330
+ } else if ((year == endYear && endMonth < i) || (year > endYear)) {
331
+ $(months[i]).addClass('disabled');
332
+ }
333
+ }
334
+
335
+ html = '';
336
+ year = parseInt(year / 10, 10) * 10;
337
+ yearCont = picker.widget.find('.datepicker-years').find(
338
+ 'th:eq(1)').text(year + '-' + (year + 9)).end().find('td');
339
+ picker.widget.find('.datepicker-years').find('th').removeClass('disabled');
340
+ if (startYear > year) {
341
+ picker.widget.find('.datepicker-years').find('th:eq(0)').addClass('disabled');
342
+ }
343
+ if (endYear < year + 9) {
344
+ picker.widget.find('.datepicker-years').find('th:eq(2)').addClass('disabled');
345
+ }
346
+ year -= 1;
347
+ for (i = -1; i < 11; i++) {
348
+ html += '<span class="year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + ((year < startYear || year > endYear) ? ' disabled' : '') + '">' + year + '</span>';
349
+ year += 1;
350
+ }
351
+ yearCont.html(html);
352
+ },
353
+
354
+ fillHours = function () {
355
+ pMoment.lang(picker.options.language);
356
+ var table = picker.widget.find('.timepicker .timepicker-hours table'), html = '', current, i, j;
357
+ table.parent().hide();
358
+ if (picker.use24hours) {
359
+ current = 0;
360
+ for (i = 0; i < 6; i += 1) {
361
+ html += '<tr>';
362
+ for (j = 0; j < 4; j += 1) {
363
+ html += '<td class="hour">' + padLeft(current.toString()) + '</td>';
364
+ current++;
365
+ }
366
+ html += '</tr>';
367
+ }
368
+ }
369
+ else {
370
+ current = 1;
371
+ for (i = 0; i < 3; i += 1) {
372
+ html += '<tr>';
373
+ for (j = 0; j < 4; j += 1) {
374
+ html += '<td class="hour">' + padLeft(current.toString()) + '</td>';
375
+ current++;
376
+ }
377
+ html += '</tr>';
378
+ }
379
+ }
380
+ table.html(html);
381
+ },
382
+
383
+ fillMinutes = function () {
384
+ var table = picker.widget.find('.timepicker .timepicker-minutes table'), html = '', current = 0, i, j;
385
+ table.parent().hide();
386
+ for (i = 0; i < 5; i++) {
387
+ html += '<tr>';
388
+ for (j = 0; j < 4; j += 1) {
389
+ html += '<td class="minute">' + padLeft(current.toString()) + '</td>';
390
+ current += 3;
391
+ }
392
+ html += '</tr>';
393
+ }
394
+ table.html(html);
395
+ },
396
+
397
+ fillTime = function () {
398
+ if (!picker.date) return;
399
+ var timeComponents = picker.widget.find('.timepicker span[data-time-component]'),
400
+ hour = picker.date.hours(),
401
+ period = 'AM';
402
+ if (!picker.use24hours) {
403
+ if (hour >= 12) period = 'PM';
404
+ if (hour === 0) hour = 12;
405
+ else if (hour != 12) hour = hour % 12;
406
+ picker.widget.find('.timepicker [data-action=togglePeriod]').text(period);
407
+ }
408
+ timeComponents.filter('[data-time-component=hours]').text(padLeft(hour));
409
+ timeComponents.filter('[data-time-component=minutes]').text(padLeft(picker.date.minutes()));
410
+ },
411
+
412
+ click = function (e) {
413
+ e.stopPropagation();
414
+ e.preventDefault();
415
+ picker.unset = false;
416
+ var target = $(e.target).closest('span, td, th'), month, year, step, day, oldDate = picker.date;
417
+ if (target.length === 1) {
418
+ if (!target.is('.disabled')) {
419
+ switch (target[0].nodeName.toLowerCase()) {
420
+ case 'th':
421
+ switch (target[0].className) {
422
+ case 'switch':
423
+ showMode(1);
424
+ break;
425
+ case 'prev':
426
+ case 'next':
427
+ step = dpGlobal.modes[picker.viewMode].navStep;
428
+ if (target[0].className === 'prev') step = step * -1;
429
+ picker.viewDate.add(step, dpGlobal.modes[picker.viewMode].navFnc);
430
+ fillDate();
431
+ break;
432
+ }
433
+ break;
434
+ case 'span':
435
+ if (target.is('.month')) {
436
+ month = target.parent().find('span').index(target);
437
+ picker.viewDate.month(month);
438
+ } else {
439
+ year = parseInt(target.text(), 10) || 0;
440
+ picker.viewDate.year(year);
441
+ }
442
+ if (picker.viewMode !== 0) {
443
+ picker.date = pMoment({
444
+ y: picker.viewDate.year(),
445
+ M: picker.viewDate.month(),
446
+ d: picker.viewDate.date(),
447
+ h: picker.date.hours(),
448
+ m: picker.date.minutes()
449
+ });
450
+ notifyChange(oldDate);
451
+ }
452
+ showMode(-1);
453
+ fillDate();
454
+ break;
455
+ case 'td':
456
+ if (target.is('.day')) {
457
+ day = parseInt(target.text(), 10) || 1;
458
+ month = picker.viewDate.month();
459
+ year = picker.viewDate.year();
460
+ if (target.is('.old')) {
461
+ if (month === 0) {
462
+ month = 11;
463
+ year -= 1;
464
+ } else {
465
+ month -= 1;
466
+ }
467
+ } else if (target.is('.new')) {
468
+ if (month == 11) {
469
+ month = 0;
470
+ year += 1;
471
+ } else {
472
+ month += 1;
473
+ }
474
+ }
475
+ picker.date = pMoment({
476
+ y: year,
477
+ M: month,
478
+ d: day,
479
+ h: picker.date.hours(),
480
+ m: picker.date.minutes()
481
+ }
482
+ );
483
+ picker.viewDate = pMoment({
484
+ y: year, M: month, d: Math.min(28, day)
485
+ });
486
+ fillDate();
487
+ set();
488
+ notifyChange(oldDate);
489
+ }
490
+ break;
491
+ }
492
+ }
493
+ }
494
+ },
495
+
496
+ actions = {
497
+ incrementHours: function () {
498
+ checkDate("add", "hours");
499
+ },
500
+
501
+ incrementMinutes: function () {
502
+ checkDate("add", "minutes");
503
+ },
504
+
505
+ decrementHours: function () {
506
+ checkDate("subtract", "hours");
507
+ },
508
+
509
+ decrementMinutes: function () {
510
+ checkDate("subtract", "minutes");
511
+ },
512
+
513
+ togglePeriod: function () {
514
+ var hour = picker.date.hours();
515
+ if (hour >= 12) hour -= 12;
516
+ else hour += 12;
517
+ picker.date.hours(hour);
518
+ },
519
+
520
+ showPicker: function () {
521
+ picker.widget.find('.timepicker > div:not(.timepicker-picker)').hide();
522
+ picker.widget.find('.timepicker .timepicker-picker').show();
523
+ },
524
+
525
+ showHours: function () {
526
+ picker.widget.find('.timepicker .timepicker-picker').hide();
527
+ picker.widget.find('.timepicker .timepicker-hours').show();
528
+ },
529
+
530
+ showMinutes: function () {
531
+ picker.widget.find('.timepicker .timepicker-picker').hide();
532
+ picker.widget.find('.timepicker .timepicker-minutes').show();
533
+ },
534
+
535
+ selectHour: function (e) {
536
+ picker.date.hours(parseInt($(e.target).text(), 10));
537
+ actions.showPicker.call(picker);
538
+ },
539
+
540
+ selectMinute: function (e) {
541
+ picker.date.minutes(parseInt($(e.target).text(), 10));
542
+ actions.showPicker.call(picker);
543
+ }
544
+ },
545
+
546
+ doAction = function (e) {
547
+ var action = $(e.currentTarget).data('action'), rv = actions[action].apply(picker, arguments), oldDate = picker.date;
548
+ stopEvent(e);
549
+ if (!picker.date) picker.date = pMoment({ y: 1970 });
550
+ set();
551
+ fillTime();
552
+ notifyChange(oldDate);
553
+ return rv;
554
+ },
555
+
556
+ stopEvent = function (e) {
557
+ e.stopPropagation();
558
+ e.preventDefault();
559
+ },
560
+
561
+ change = function (e) {
562
+ pMoment.lang(picker.options.language);
563
+ var input = $(e.target), oldDate = picker.date, d = pMoment(input.val(), picker.format, picker.options.useStrict);
564
+ if (d.isValid()) {
565
+ update();
566
+ picker.setValue(d);
567
+ notifyChange(oldDate);
568
+ set();
569
+ }
570
+ else {
571
+ picker.viewDate = oldDate;
572
+ //picker.setValue(""); // unset the date when the input is erased
573
+ notifyChange(oldDate);
574
+ notifyError(d);
575
+ picker.unset = true;
576
+ input.val('');
577
+ }
578
+ },
579
+
580
+ showMode = function (dir) {
581
+ if (dir) {
582
+ picker.viewMode = Math.max(picker.minViewMode, Math.min(2, picker.viewMode + dir));
583
+ }
584
+
585
+ picker.widget.find('.datepicker > div').hide().filter('.datepicker-' + dpGlobal.modes[picker.viewMode].clsName).show();
586
+ },
587
+
588
+ attachDatePickerEvents = function () {
589
+ var $this, $parent, expanded, closed, collapseData;
590
+ picker.widget.on('click', '.datepicker *', $.proxy(click, this)); // this handles date picker clicks
591
+ picker.widget.on('click', '[data-action]', $.proxy(doAction, this)); // this handles time picker clicks
592
+ picker.widget.on('mousedown', $.proxy(stopEvent, this));
593
+ if (picker.options.pickDate && picker.options.pickTime) {
594
+ picker.widget.on('click.togglePicker', '.accordion-toggle', function (e) {
595
+ e.stopPropagation();
596
+ $this = $(this);
597
+ $parent = $this.closest('ul');
598
+ expanded = $parent.find('.in');
599
+ closed = $parent.find('.collapse:not(.in)');
600
+
601
+ if (expanded && expanded.length) {
602
+ collapseData = expanded.data('collapse');
603
+ if (collapseData && collapseData.transitioning) return;
604
+ expanded.collapse('hide');
605
+ closed.collapse('show');
606
+ $this.find('span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
607
+ picker.element.find('.input-group-addon span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
608
+ }
609
+ });
610
+ }
611
+ if (picker.isInput) {
612
+ picker.element.on({
613
+ 'focus': $.proxy(picker.show, this),
614
+ 'change': $.proxy(change, this),
615
+ 'blur': $.proxy(picker.hide, this)
616
+ });
617
+ } else {
618
+ picker.element.on({
619
+ 'change': $.proxy(change, this)
620
+ }, 'input');
621
+ if (picker.component) {
622
+ picker.component.on('click', $.proxy(picker.show, this));
623
+ } else {
624
+ picker.element.on('click', $.proxy(picker.show, this));
625
+ }
626
+ }
627
+ },
628
+
629
+ attachDatePickerGlobalEvents = function () {
630
+ $(window).on(
631
+ 'resize.datetimepicker' + picker.id, $.proxy(place, this));
632
+ if (!picker.isInput) {
633
+ $(document).on(
634
+ 'mousedown.datetimepicker' + picker.id, $.proxy(picker.hide, this));
635
+ }
636
+ },
637
+
638
+ detachDatePickerEvents = function () {
639
+ picker.widget.off('click', '.datepicker *', picker.click);
640
+ picker.widget.off('click', '[data-action]');
641
+ picker.widget.off('mousedown', picker.stopEvent);
642
+ if (picker.options.pickDate && picker.options.pickTime) {
643
+ picker.widget.off('click.togglePicker');
644
+ }
645
+ if (picker.isInput) {
646
+ picker.element.off({
647
+ 'focus': picker.show,
648
+ 'change': picker.change
649
+ });
650
+ } else {
651
+ picker.element.off({
652
+ 'change': picker.change
653
+ }, 'input');
654
+ if (picker.component) {
655
+ picker.component.off('click', picker.show);
656
+ } else {
657
+ picker.element.off('click', picker.show);
658
+ }
659
+ }
660
+ },
661
+
662
+ detachDatePickerGlobalEvents = function () {
663
+ $(window).off('resize.datetimepicker' + picker.id);
664
+ if (!picker.isInput) {
665
+ $(document).off('mousedown.datetimepicker' + picker.id);
666
+ }
667
+ },
668
+
669
+ isInFixed = function () {
670
+ if (picker.element) {
671
+ var parents = picker.element.parents(), inFixed = false, i;
672
+ for (i = 0; i < parents.length; i++) {
673
+ if ($(parents[i]).css('position') == 'fixed') {
674
+ inFixed = true;
675
+ break;
676
+ }
677
+ }
678
+ ;
679
+ return inFixed;
680
+ } else {
681
+ return false;
682
+ }
683
+ },
684
+
685
+ set = function () {
686
+ pMoment.lang(picker.options.language);
687
+ var formatted = '', input;
688
+ if (!picker.unset) formatted = pMoment(picker.date).format(picker.format);
689
+ if (!picker.isInput) {
690
+ if (picker.component) {
691
+ input = picker.element.find('input');
692
+ input.val(formatted);
693
+ }
694
+ picker.element.data('date', formatted);
695
+ } else {
696
+ picker.element.val(formatted);
697
+ }
698
+ if (!picker.options.pickTime) picker.hide();
699
+ },
700
+
701
+ checkDate = function (direction, unit) {
702
+ pMoment.lang(picker.options.language);
703
+ var newDate;
704
+ if (direction == "add") {
705
+ newDate = pMoment(picker.date);
706
+ if (newDate.hours() == 23) newDate.add(1, unit);
707
+ newDate.add(1, unit);
708
+ }
709
+ else {
710
+ newDate = pMoment(picker.date).subtract(1, unit);
711
+ }
712
+ if (newDate.isAfter(picker.options.endDate) || newDate.subtract(1, unit).isBefore(picker.options.startDate) || isInDisableDates(newDate)) {
713
+ notifyError(newDate.format(picker.format));
714
+ return;
715
+ }
716
+
717
+ if (direction == "add") {
718
+ picker.date.add(1, unit);
719
+ }
720
+ else {
721
+ picker.date.subtract(1, unit);
722
+ }
723
+ },
724
+
725
+ isInDisableDates = function (date) {
726
+ pMoment.lang(picker.options.language);
727
+ var disabled = picker.options.disabledDates, i;
728
+ for (i in disabled) {
729
+ if (disabled[i] == pMoment(date).format("L")) {
730
+ return true;
731
+ }
732
+ }
733
+ return false;
734
+ },
735
+
736
+ padLeft = function (string) {
737
+ string = string.toString();
738
+ if (string.length >= 2) return string;
739
+ else return '0' + string;
740
+ },
741
+
742
+ getTemplate = function (pickDate, pickTime, collapse) {
743
+ if (pickDate && pickTime) {
744
+ return (
745
+ '<div class="bootstrap-datetimepicker-widget dropdown-menu" style="z-index:9999 !important;">' +
746
+ '<ul class="list-unstyled">' +
747
+ '<li' + (collapse ? ' class="collapse in"' : '') + '>' +
748
+ '<div class="datepicker">' + dpGlobal.template + '</div>' +
749
+ '</li>' +
750
+ '<li class="picker-switch accordion-toggle"><a class="btn" style="width:100%"><i class="' + picker.options.icons.time + '"></i></a></li>' +
751
+ '<li' + (collapse ? ' class="collapse"' : '') + '>' +
752
+ '<div class="timepicker">' + tpGlobal.getTemplate() + '</div>' +
753
+ '</li>' +
754
+ '</ul>' +
755
+ '</div>'
756
+ );
757
+ } else if (pickTime) {
758
+ return (
759
+ '<div class="bootstrap-datetimepicker-widget dropdown-menu">' +
760
+ '<div class="timepicker">' + tpGlobal.getTemplate() + '</div>' +
761
+ '</div>'
762
+ );
763
+ } else {
764
+ return (
765
+ '<div class="bootstrap-datetimepicker-widget dropdown-menu">' +
766
+ '<div class="datepicker">' + dpGlobal.template + '</div>' +
767
+ '</div>'
768
+ );
769
+ }
770
+ },
771
+
772
+ dpGlobal = {
773
+ modes: [
774
+ {
775
+ clsName: 'days',
776
+ navFnc: 'month',
777
+ navStep: 1
778
+ },
779
+ {
780
+ clsName: 'months',
781
+ navFnc: 'year',
782
+ navStep: 1
783
+ },
784
+ {
785
+ clsName: 'years',
786
+ navFnc: 'year',
787
+ navStep: 10
788
+ }],
789
+ headTemplate:
790
+ '<thead>' +
791
+ '<tr>' +
792
+ '<th class="prev">&lsaquo;</th><th colspan="5" class="switch"></th><th class="next">&rsaquo;</th>' +
793
+ '</tr>' +
794
+ '</thead>',
795
+ contTemplate:
796
+ '<tbody><tr><td colspan="7"></td></tr></tbody>'
797
+ },
798
+
799
+ tpGlobal = {
800
+ hourTemplate: '<span data-action="showHours" data-time-component="hours" class="timepicker-hour"></span>',
801
+ minuteTemplate: '<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>'
802
+ };
803
+
804
+ dpGlobal.template =
805
+ '<div class="datepicker-days">' +
806
+ '<table class="table-condensed">' + dpGlobal.headTemplate + '<tbody></tbody></table>' +
807
+ '</div>' +
808
+ '<div class="datepicker-months">' +
809
+ '<table class="table-condensed">' + dpGlobal.headTemplate + dpGlobal.contTemplate + '</table>' +
810
+ '</div>' +
811
+ '<div class="datepicker-years">' +
812
+ '<table class="table-condensed">' + dpGlobal.headTemplate + dpGlobal.contTemplate + '</table>' +
813
+ '</div>';
814
+
815
+ tpGlobal.getTemplate = function () {
816
+ return (
817
+ '<div class="timepicker-picker">' +
818
+ '<table class="table-condensed">' +
819
+ '<tr>' +
820
+ '<td><a href="#" class="btn" data-action="incrementHours"><span class="' + picker.options.icons.up + '"></span></a></td>' +
821
+ '<td class="separator"></td>' +
822
+ '<td><a href="#" class="btn" data-action="incrementMinutes"><span class="' + picker.options.icons.up + '"></span></a></td>' +
823
+ (!picker.use24hours ? '<td class="separator"></td>' : '') +
824
+ '</tr>' +
825
+ '<tr>' +
826
+ '<td>' + tpGlobal.hourTemplate + '</td> ' +
827
+ '<td class="separator">:</td>' +
828
+ '<td>' + tpGlobal.minuteTemplate + '</td> ' +
829
+ (!picker.use24hours ? '<td class="separator"></td>' +
830
+ '<td><button type="button" class="btn btn-comp" data-action="togglePeriod"></button></td>' : '') +
831
+ '</tr>' +
832
+ '<tr>' +
833
+ '<td><a href="#" class="btn" data-action="decrementHours"><span class="' + picker.options.icons.down + '"></span></a></td>' +
834
+ '<td class="separator"></td>' +
835
+ '<td><a href="#" class="btn" data-action="decrementMinutes"><span class="' + picker.options.icons.down + '"></span></a></td>' +
836
+ (!picker.use24hours ? '<td class="separator"></td>' : '') +
837
+ '</tr>' +
838
+ '</table>' +
839
+ '</div>' +
840
+ '<div class="timepicker-hours" data-action="selectHour">' +
841
+ '<table class="table-condensed"></table>' +
842
+ '</div>' +
843
+ '<div class="timepicker-minutes" data-action="selectMinute">' +
844
+ '<table class="table-condensed"></table>' +
845
+ '</div>'
846
+ );
847
+ };
848
+
849
+ picker.destroy = function () {
850
+ detachDatePickerEvents();
851
+ detachDatePickerGlobalEvents();
852
+ picker.widget.remove();
853
+ picker.element.removeData('DateTimePicker');
854
+ picker.component.removeData('DateTimePicker');
855
+ };
856
+
857
+ picker.show = function (e) {
858
+ picker.widget.show();
859
+ picker.height = picker.component ? picker.component.outerHeight() : picker.element.outerHeight();
860
+ place();
861
+ picker.element.trigger({
862
+ type: 'show.dp',
863
+ date: picker.date
864
+ });
865
+ attachDatePickerGlobalEvents();
866
+ if (e) {
867
+ stopEvent(e);
868
+ }
869
+ },
870
+
871
+ picker.disable = function () {
872
+ picker.element.find('input').prop('disabled', true);
873
+ detachDatePickerEvents();
874
+ },
875
+
876
+ picker.enable = function () {
877
+ picker.element.find('input').prop('disabled', false);
878
+ attachDatePickerEvents();
879
+ },
880
+
881
+ picker.hide = function () {
882
+ // Ignore event if in the middle of a picker transition
883
+ var collapse = picker.widget.find('.collapse'), i, collapseData;
884
+ for (i = 0; i < collapse.length; i++) {
885
+ collapseData = collapse.eq(i).data('collapse');
886
+ if (collapseData && collapseData.transitioning)
887
+ return;
888
+ }
889
+ picker.widget.hide();
890
+ picker.viewMode = picker.startViewMode;
891
+ showMode();
892
+ picker.element.trigger({
893
+ type: 'hide.dp',
894
+ date: picker.date
895
+ });
896
+ detachDatePickerGlobalEvents();
897
+ },
898
+
899
+ picker.setValue = function (newDate) {
900
+ pMoment.lang(picker.options.language);
901
+ if (!newDate) {
902
+ picker.unset = true;
903
+ } else {
904
+ picker.unset = false;
905
+ }
906
+ if (!pMoment.isMoment(newDate)) newDate = pMoment(newDate);
907
+ if (newDate.isValid()) {
908
+ picker.date = newDate;
909
+ set();
910
+ picker.viewDate = pMoment({ y: picker.date.year(), M: picker.date.month() });
911
+ fillDate();
912
+ fillTime();
913
+ }
914
+ else {
915
+ notifyError(newDate);
916
+ }
917
+ },
918
+
919
+ picker.getDate = function () {
920
+ if (picker.unset) return null;
921
+ return picker.date;
922
+ },
923
+
924
+ picker.setDate = function (date) {
925
+ if (!date) picker.setValue(null);
926
+ else picker.setValue(date);
927
+ },
928
+
929
+ picker.setEndDate = function (date) {
930
+ picker.options.endDate = pMoment(date);
931
+ if (!picker.options.endDate.isValid()) {
932
+ picker.options.endDate = pMoment().add(50, "y");
933
+ }
934
+ if (picker.viewDate) update();
935
+ },
936
+
937
+ picker.setStartDate = function (date) {
938
+ picker.options.startDate = pMoment(date);
939
+ if (!picker.options.startDate.isValid()) {
940
+ picker.options.startDate = pMoment({ y: 1970 });
941
+ }
942
+ if (picker.viewDate) update();
943
+ };
944
+
945
+ init();
946
+ };
947
+
948
+ $.fn.datetimepicker = function (options) {
949
+ return this.each(function () {
950
+ var $this = $(this), data = $this.data('DateTimePicker');
951
+ if (!data) $this.data('DateTimePicker', new DateTimePicker(this, options));
952
+ });
953
+ };
954
+ })(jQuery);