jquery-datetimepicker-rails 2.0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/jquery-datetimepicker-rails.gemspec +23 -0
- data/lib/assets/javascripts/jquery.datetimepicker.js +933 -0
- data/lib/assets/stylesheets/jquery.datetimepicker.css +281 -0
- data/lib/jquery/datetimepicker/rails.rb +11 -0
- data/lib/jquery/datetimepicker/rails/version.rb +7 -0
- metadata +82 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ac18bf686ea46e59eef4ddb6e4abc4b1e5b1c834
|
4
|
+
data.tar.gz: c255e8d35674dc62addc8cf5e3ed0962c02541f4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 587c5f7d6de64b7a1c3f56662148398a8e527db004db1e8076871ffd2d3ffa5ab1a39486c883eb1ac31e83862693689a13023a6535bc2e1eb412c6c574f1ee60
|
7
|
+
data.tar.gz: 1fe762a3a4adf1fb95ba35fec9f9776827c2d216cf1b6f7be0ed307bc9f165d5a468896f197df1da8537cfc6aabeda92e569f71705179cc90e425f2c1d993e83
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Novikov Andrey
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
jQuery date and time picker for rails
|
2
|
+
=====================================
|
3
|
+
|
4
|
+
[jQuery Date and Time picker plugin] [plugin] by [@xdan] [author] for Ruby on Rails asset pipeline.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'jquery-datetimepicker-rails'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Add this line to `app/assets/stylesheets/application.css`:
|
18
|
+
|
19
|
+
*= require jquery.datetimepicker
|
20
|
+
|
21
|
+
Add this line to `app/assets/javascripts/application.js`:
|
22
|
+
|
23
|
+
//= require jquery.datetimepicker
|
24
|
+
|
25
|
+
You can autoinitialize datetime picker on page load for elements with class `datetimepicker` by also adding to js manifest:
|
26
|
+
|
27
|
+
//= require jquery.datetimepicker/init
|
28
|
+
|
29
|
+
Usage
|
30
|
+
-----
|
31
|
+
|
32
|
+
$('.datetimepicker').datetimepicker();
|
33
|
+
|
34
|
+
See the official [documentation] for examples and options.
|
35
|
+
|
36
|
+
Contributing
|
37
|
+
------------
|
38
|
+
|
39
|
+
1. Fork it
|
40
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
41
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
42
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
43
|
+
5. Create new Pull Request
|
44
|
+
|
45
|
+
### Version policy
|
46
|
+
|
47
|
+
This gem version number is in form of **X.Y.Z.P**, where **X.Y.Z** is a version of original [plugin] and **P** is a gem-specific patch level.
|
48
|
+
|
49
|
+
[plugin]: https://github.com/xdan/datetimepicker
|
50
|
+
[author]: https://github.com/xdan
|
51
|
+
[documentation]: http://xdsoft.net/jqplugins/datetimepicker/ "Official site docs"
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jquery/datetimepicker/rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'jquery-datetimepicker-rails'
|
8
|
+
spec.version = Jquery::Datetimepicker::Rails::VERSION
|
9
|
+
spec.authors = ['Andrey Novikov']
|
10
|
+
spec.email = ['envek@envek.name']
|
11
|
+
spec.description = %q{A date and time picker for jQuery and Rails}
|
12
|
+
spec.summary = %q{This gem packages the datetimepicker jQuery plugin for Rails 3.1+ asset pipeline}
|
13
|
+
spec.homepage = 'https://github.com/Envek/jquery-datetimepicker-rails'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
end
|
@@ -0,0 +1,933 @@
|
|
1
|
+
/**
|
2
|
+
* @preserve jQuery DateTimePicker plugin v2.0.2
|
3
|
+
* @homepage http://xdsoft.net/jqplugins/datetimepicker/
|
4
|
+
* (c) 2013, Chupurnov Valeriy.
|
5
|
+
*/
|
6
|
+
(function( $ ){
|
7
|
+
$.fn.xdsoftScroller = function( _percent ){
|
8
|
+
return this.each(function(){
|
9
|
+
var timeboxparent = $(this);
|
10
|
+
if( !$(this).hasClass('xdsoft_scroller_box') ){
|
11
|
+
var pointerEventToXY = function( e ){
|
12
|
+
var out = {x:0, y:0};
|
13
|
+
if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){
|
14
|
+
var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
|
15
|
+
out.x = touch.pageX;
|
16
|
+
out.y = touch.pageY;
|
17
|
+
}else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') {
|
18
|
+
out.x = e.pageX;
|
19
|
+
out.y = e.pageY;
|
20
|
+
}
|
21
|
+
return out;
|
22
|
+
},
|
23
|
+
move = 0,
|
24
|
+
timebox = timeboxparent.children().eq(0),
|
25
|
+
parentHeight = timeboxparent[0].offsetHeight-2,
|
26
|
+
height = timebox[0].offsetHeight,
|
27
|
+
scrollbar = $('<div class="xdsoft_scrollbar"></div>'),
|
28
|
+
scroller = $('<div class="xdsoft_scroller"></div>'),
|
29
|
+
maximumOffset = 100,
|
30
|
+
start = false;
|
31
|
+
|
32
|
+
scrollbar.append(scroller);
|
33
|
+
|
34
|
+
timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar);
|
35
|
+
scroller.on('mousedown.xdsoft_scroller',function( event ){
|
36
|
+
var pageY = event.pageY,
|
37
|
+
top = parseInt(scroller.css('margin-top')),
|
38
|
+
h1 = scrollbar[0].offsetHeight;
|
39
|
+
$(document.body).addClass('xdsoft_noselect');
|
40
|
+
$([document.body,window]).on('mouseup.xdsoft_scroller',function(){
|
41
|
+
$([document.body,window]).off('mouseup.xdsoft_scroller',arguments.callee)
|
42
|
+
.off('mousemove.xdsoft_scroller',move)
|
43
|
+
.removeClass('xdsoft_noselect');
|
44
|
+
});
|
45
|
+
$(document.body).on('mousemove.xdsoft_scroller',move = function(event){
|
46
|
+
var offset = event.pageY-pageY+top;
|
47
|
+
if( offset<0 )
|
48
|
+
offset = 0;
|
49
|
+
if( offset+scroller[0].offsetHeight>h1 )
|
50
|
+
offset = h1-scroller[0].offsetHeight;
|
51
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[maximumOffset?offset/maximumOffset:0]);
|
52
|
+
});
|
53
|
+
});
|
54
|
+
|
55
|
+
timeboxparent
|
56
|
+
.on('scroll_element.xdsoft_scroller',function( event,percent ){
|
57
|
+
percent = percent>1?1:(percent<0||isNaN(percent))?0:percent;
|
58
|
+
scroller.css('margin-top',maximumOffset*percent);
|
59
|
+
timebox.css('marginTop',-parseInt((height-parentHeight)*percent))
|
60
|
+
})
|
61
|
+
.on('resize_scroll.xdsoft_scroller',function( event,_percent ){
|
62
|
+
parentHeight = timeboxparent[0].offsetHeight-2;
|
63
|
+
height = timebox[0].offsetHeight;
|
64
|
+
var percent = parentHeight/height,
|
65
|
+
sh = percent*scrollbar[0].offsetHeight;
|
66
|
+
if( percent>1 )
|
67
|
+
scroller.hide();
|
68
|
+
else{
|
69
|
+
scroller.show();
|
70
|
+
scroller.css('height',parseInt(sh>10?sh:10));
|
71
|
+
maximumOffset = scrollbar[0].offsetHeight-scroller[0].offsetHeight;
|
72
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[_percent?_percent:Math.abs(parseInt(timebox.css('marginTop')))/(height-parentHeight)]);
|
73
|
+
}
|
74
|
+
})
|
75
|
+
timeboxparent.mousewheel&&timeboxparent.mousewheel(function(event, delta, deltaX, deltaY) {
|
76
|
+
var top = Math.abs(parseInt(timebox.css('marginTop')));
|
77
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-delta*20)/(height-parentHeight)]);
|
78
|
+
event.stopPropagation();
|
79
|
+
return false;
|
80
|
+
});
|
81
|
+
timeboxparent.on('touchstart',function( event ){
|
82
|
+
start = pointerEventToXY(event);
|
83
|
+
});
|
84
|
+
timeboxparent.on('touchmove',function( event ){
|
85
|
+
if( start ){
|
86
|
+
var coord = pointerEventToXY(event), top = Math.abs(parseInt(timebox.css('marginTop')));
|
87
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-(coord.y-start.y))/(height-parentHeight)]);
|
88
|
+
event.stopPropagation();
|
89
|
+
event.preventDefault();
|
90
|
+
};
|
91
|
+
});
|
92
|
+
timeboxparent.on('touchend touchcancel',function( event ){
|
93
|
+
start = false;
|
94
|
+
});
|
95
|
+
}
|
96
|
+
timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]);
|
97
|
+
});
|
98
|
+
};
|
99
|
+
$.fn.datetimepicker = function( opt ){
|
100
|
+
var CTRLKEY = 17,
|
101
|
+
DEL = 46,
|
102
|
+
ENTER = 13,
|
103
|
+
ESC = 27,
|
104
|
+
BACKSPACE = 8,
|
105
|
+
ARROWLEFT = 37,
|
106
|
+
ARROWUP = 38,
|
107
|
+
ARROWRIGHT = 39,
|
108
|
+
ARROWDOWN = 40,
|
109
|
+
TAB = 9,
|
110
|
+
F5 = 116,
|
111
|
+
AKEY = 65,
|
112
|
+
CKEY = 67,
|
113
|
+
VKEY = 86,
|
114
|
+
ZKEY = 90,
|
115
|
+
YKEY = 89,
|
116
|
+
ctrlDown = false,
|
117
|
+
default_options = {
|
118
|
+
i18n:{
|
119
|
+
ru:{
|
120
|
+
months:[
|
121
|
+
'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'
|
122
|
+
],
|
123
|
+
dayOfWeek:[
|
124
|
+
"Вск", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
|
125
|
+
]
|
126
|
+
},
|
127
|
+
en:{
|
128
|
+
months: [
|
129
|
+
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
|
130
|
+
],
|
131
|
+
dayOfWeek: [
|
132
|
+
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
133
|
+
]
|
134
|
+
},
|
135
|
+
de:{
|
136
|
+
months:[
|
137
|
+
'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'
|
138
|
+
],
|
139
|
+
dayOfWeek:[
|
140
|
+
"So.", "Mo", "Di", "Mi", "Do", "Fr", "Sa."
|
141
|
+
]
|
142
|
+
},
|
143
|
+
nl:{
|
144
|
+
months:[
|
145
|
+
"januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"
|
146
|
+
],
|
147
|
+
dayOfWeek:[
|
148
|
+
"zo", "ma", "di", "wo", "do", "vr", "za"
|
149
|
+
]
|
150
|
+
}
|
151
|
+
},
|
152
|
+
value:'',
|
153
|
+
lang:'en',
|
154
|
+
format:'Y/m/d H:i',
|
155
|
+
formatTime:'H:i',
|
156
|
+
formatDate:'Y/m/d',
|
157
|
+
step:60,
|
158
|
+
closeOnDateSelect:0,
|
159
|
+
closeOnWithoutClick:true,
|
160
|
+
timepicker:true,
|
161
|
+
datepicker:true,
|
162
|
+
minDate:false,
|
163
|
+
maxDate:false,
|
164
|
+
minTime:false,
|
165
|
+
maxTime:false,
|
166
|
+
allowTimes:[],
|
167
|
+
opened:false,
|
168
|
+
inline:false,
|
169
|
+
onSelectDate:function(){},
|
170
|
+
onSelectTime:function(){},
|
171
|
+
onChangeMonth:function(){},
|
172
|
+
onChangeDateTime:function(){},
|
173
|
+
onShow:function(){},
|
174
|
+
onClose:function(){},
|
175
|
+
withoutCopyright:true,
|
176
|
+
inverseButton:false,
|
177
|
+
hours12:false,
|
178
|
+
next: 'xdsoft_next',
|
179
|
+
prev : 'xdsoft_prev',
|
180
|
+
dayOfWeekStart:0,
|
181
|
+
timeHeightInTimePicker:25,
|
182
|
+
timepickerScrollbar:true,
|
183
|
+
scrollMonth:true,
|
184
|
+
scrollTime:true,
|
185
|
+
scrollInput:true,
|
186
|
+
mask:false,
|
187
|
+
validateOnBlur:true,
|
188
|
+
yearStart:1950,
|
189
|
+
yearEnd:2050,
|
190
|
+
style:'',
|
191
|
+
id:'',
|
192
|
+
className:''
|
193
|
+
},
|
194
|
+
options = ($.isPlainObject(opt)||!opt)?$.extend({},default_options,opt):$.extend({},default_options),
|
195
|
+
createDateTimePicker = function( input ){
|
196
|
+
var datetimepicker = $('<div '+(options.id?'id="'+options.id+'"':'')+' '+(options.style?'style="'+options.style+'"':'')+' class="xdsoft_datetimepicker '+options.className+'"></div>'),
|
197
|
+
xdsoft_copyright = $('<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>'),
|
198
|
+
datepicker = $('<div class="xdsoft_datepicker active"></div>'),
|
199
|
+
mounth_picker = $('<div class="xdsoft_mounthpicker"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_label xdsoft_month"><span></span></div><div class="xdsoft_label xdsoft_year"><span></span></div><button type="button" class="xdsoft_next"></button></div>'),
|
200
|
+
calendar = $('<div class="xdsoft_calendar"></div>'),
|
201
|
+
timepicker = $('<div class="xdsoft_timepicker active"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_time_box"></div><button type="button" class="xdsoft_next"></button></div>'),
|
202
|
+
timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
|
203
|
+
timebox = $('<div class="xdsoft_time_variant"></div>'),
|
204
|
+
scrollbar = $('<div class="xdsoft_scrollbar"></div>'),
|
205
|
+
scroller = $('<div class="xdsoft_scroller"></div>'),
|
206
|
+
monthselect =$('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
|
207
|
+
yearselect =$('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>');
|
208
|
+
|
209
|
+
//constructor lego
|
210
|
+
mounth_picker
|
211
|
+
.find('.xdsoft_month span')
|
212
|
+
.after(monthselect);
|
213
|
+
mounth_picker
|
214
|
+
.find('.xdsoft_year span')
|
215
|
+
.after(yearselect);
|
216
|
+
|
217
|
+
mounth_picker
|
218
|
+
.find('.xdsoft_month,.xdsoft_year')
|
219
|
+
.on('mousedown.xdsoft',function(event) {
|
220
|
+
mounth_picker
|
221
|
+
.find('.xdsoft_select')
|
222
|
+
.hide();
|
223
|
+
var select = $(this).find('.xdsoft_select').eq(0),
|
224
|
+
xd = datetimepicker.data('xdsoft_datetime'),
|
225
|
+
val = 0,
|
226
|
+
top = 0;
|
227
|
+
|
228
|
+
if( xd&&xd.currentTime )
|
229
|
+
val = xd.currentTime[$(this).hasClass('xdsoft_month')?'getMonth':'getFullYear']();
|
230
|
+
|
231
|
+
select.show();
|
232
|
+
for(var items = select.find('div.xdsoft_option'),i = 0;i<items.length;i++){
|
233
|
+
if( items.eq(i).data('value')==val ){
|
234
|
+
break;
|
235
|
+
}else top+=items[0].offsetHeight;
|
236
|
+
}
|
237
|
+
|
238
|
+
select.xdsoftScroller(top/(select.children()[0].offsetHeight-(select[0].offsetHeight-2)));
|
239
|
+
event.stopPropagation();
|
240
|
+
return false;
|
241
|
+
});
|
242
|
+
|
243
|
+
mounth_picker
|
244
|
+
.find('.xdsoft_select')
|
245
|
+
.xdsoftScroller()
|
246
|
+
.on('mousedown.xdsoft',function( event ) {
|
247
|
+
event.stopPropagation();
|
248
|
+
event.preventDefault();
|
249
|
+
})
|
250
|
+
.on('mousedown.xdsoft','.xdsoft_option',function( event ){
|
251
|
+
var xd = datetimepicker.data('xdsoft_datetime');
|
252
|
+
if( xd&&xd.currentTime )
|
253
|
+
xd.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect')?'setMonth':'setFullYear']($(this).data('value'));
|
254
|
+
$(this).parent().parent().hide();
|
255
|
+
datetimepicker.trigger('xchange.xdsoft');
|
256
|
+
});
|
257
|
+
|
258
|
+
|
259
|
+
// set options
|
260
|
+
datetimepicker.setOptions = function( _options ){
|
261
|
+
options = $.extend({},options,_options);
|
262
|
+
if( (options.open||options.opened)&&(!options.inline) ){
|
263
|
+
input.trigger('open.xdsoft');
|
264
|
+
}
|
265
|
+
|
266
|
+
if( options.inline ){
|
267
|
+
datetimepicker.addClass('xdsoft_inline');
|
268
|
+
input.after(datetimepicker).hide();
|
269
|
+
datetimepicker.trigger('afterOpen.xdsoft');
|
270
|
+
}
|
271
|
+
|
272
|
+
if( options.inverseButton ){
|
273
|
+
options.next = 'xdsoft_prev';
|
274
|
+
options.prev = 'xdsoft_next';
|
275
|
+
}
|
276
|
+
|
277
|
+
if( !options.datepicker && options.timepicker )
|
278
|
+
datepicker.removeClass('active');
|
279
|
+
|
280
|
+
if( options.datepicker && !options.timepicker )
|
281
|
+
timepicker.removeClass('active');
|
282
|
+
|
283
|
+
if( options.value )
|
284
|
+
input&&input.val&&input.val(options.value);
|
285
|
+
|
286
|
+
if( isNaN(options.dayOfWeekStart)||parseInt(options.dayOfWeekStart)<0||parseInt(options.dayOfWeekStart)>6 )
|
287
|
+
options.dayOfWeekStart = 0;
|
288
|
+
else
|
289
|
+
options.dayOfWeekStart = parseInt(options.dayOfWeekStart);
|
290
|
+
|
291
|
+
if( !options.timepickerScrollbar )
|
292
|
+
scrollbar.hide();
|
293
|
+
|
294
|
+
var tmpDate = [];
|
295
|
+
if( options.minDate && ( tmpDate = /^-(.*)$/.exec(options.minDate) ) && (tmpDate=Date.parseDate(tmpDate[1], options.formatDate)) ){
|
296
|
+
options.minDate = new Date((new Date).getTime()-tmpDate.getTime()).dateFormat( options.formatDate );
|
297
|
+
}
|
298
|
+
if( options.maxDate && ( tmpDate = /^\+(.*)$/.exec(options.maxDate) ) && (tmpDate=Date.parseDate(tmpDate[1], options.formatDate)) ){
|
299
|
+
options.maxDate = new Date((new Date).getTime()+tmpDate.getTime()).dateFormat( options.formatDate );
|
300
|
+
}
|
301
|
+
if( options.mask ){
|
302
|
+
var e,
|
303
|
+
getCaretPos = function( input ) {
|
304
|
+
try{
|
305
|
+
if ( document.selection && document.selection.createRange ) {
|
306
|
+
var range = document.selection.createRange();
|
307
|
+
return range.getBookmark().charCodeAt(2) - 2;
|
308
|
+
}else
|
309
|
+
if ( input.setSelectionRange )
|
310
|
+
return input.selectionStart;
|
311
|
+
}catch(e){
|
312
|
+
return 0;
|
313
|
+
}
|
314
|
+
},
|
315
|
+
setCaretPos = function (node,pos){
|
316
|
+
var node = (typeof node == "string" || node instanceof String) ? document.getElementById(node) : node;
|
317
|
+
if(!node){
|
318
|
+
return false;
|
319
|
+
}else if(node.createTextRange){
|
320
|
+
var textRange = node.createTextRange();
|
321
|
+
textRange.collapse(true);
|
322
|
+
textRange.moveEnd(pos);
|
323
|
+
textRange.moveStart(pos);
|
324
|
+
textRange.select();
|
325
|
+
return true;
|
326
|
+
}else if(node.setSelectionRange){
|
327
|
+
node.setSelectionRange(pos,pos);
|
328
|
+
return true;
|
329
|
+
}
|
330
|
+
return false;
|
331
|
+
},
|
332
|
+
isValidValue = function( mask,value ){
|
333
|
+
var reg = mask
|
334
|
+
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g,'\\$1')
|
335
|
+
.replace(/_/g,'{digit+}')
|
336
|
+
.replace(/([0-9]{1})/g,'{digit$1}')
|
337
|
+
.replace(/\{digit([0-9]{1})\}/g,'[0-$1_]{1}')
|
338
|
+
.replace(/\{digit[\+]\}/g,'[0-9_]{1}');
|
339
|
+
return RegExp(reg).test(value);
|
340
|
+
};
|
341
|
+
input.off('keydown.xdsoft');
|
342
|
+
switch(true){
|
343
|
+
case ( options.mask===true ):
|
344
|
+
options.mask = (new Date()).dateFormat( options.format );
|
345
|
+
options.mask = options.mask.replace(/[0-9]/g,'_');
|
346
|
+
case ( $.type(options.mask) == 'string' ):
|
347
|
+
if( !isValidValue( options.mask,input.val() ) )
|
348
|
+
input.val(options.mask.replace(/[0-9]/g,'_'));
|
349
|
+
|
350
|
+
input.on('keydown.xdsoft',function( event ){
|
351
|
+
var val = this.value,
|
352
|
+
key = event.which;
|
353
|
+
switch(true){
|
354
|
+
case ((key>=48&&key<=57)||(key>=96&&key<=105))||(key==BACKSPACE||key==DEL):
|
355
|
+
var pos = getCaretPos(this),
|
356
|
+
digit = ( key!=BACKSPACE&&key!=DEL )?String.fromCharCode(key):'_';
|
357
|
+
if( (key==BACKSPACE||key==DEL)&&pos ){
|
358
|
+
pos--;
|
359
|
+
digit='_';
|
360
|
+
}
|
361
|
+
while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos<options.mask.length&&pos>0 )
|
362
|
+
pos+=( key==BACKSPACE||key==DEL )?-1:1;
|
363
|
+
|
364
|
+
val = val.substr(0,pos)+digit+val.substr(pos+1);
|
365
|
+
if( $.trim(val)=='' )
|
366
|
+
val = options.mask.replace(/[0-9]/g,'_');
|
367
|
+
else
|
368
|
+
if( pos==options.mask.length )
|
369
|
+
break;
|
370
|
+
|
371
|
+
pos+=(key==BACKSPACE||key==DEL)?0:1;
|
372
|
+
while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos<options.mask.length&&pos>0 )
|
373
|
+
pos+=(key==BACKSPACE||key==DEL)?-1:1;
|
374
|
+
if( isValidValue( options.mask,val ) ){
|
375
|
+
this.value = val;
|
376
|
+
setCaretPos(this,pos);
|
377
|
+
}else if( $.trim(val)=='' )
|
378
|
+
this.value = options.mask.replace(/[0-9]/g,'_');
|
379
|
+
else{
|
380
|
+
input.trigger('error_input.xdsoft');
|
381
|
+
}
|
382
|
+
break;
|
383
|
+
case ( ~[AKEY,CKEY,VKEY,ZKEY,YKEY].indexOf(key)&&ctrlDown ):
|
384
|
+
case ~[ESC,ARROWUP,ARROWDOWN,ARROWLEFT,ARROWRIGHT,F5,CTRLKEY].indexOf(key):
|
385
|
+
return true;
|
386
|
+
case ~[ENTER].indexOf(key):
|
387
|
+
var elementSelector = "input:visible,textarea:visible";
|
388
|
+
$(elementSelector ).eq($(elementSelector ).index(this) + 1).focus();
|
389
|
+
return false;
|
390
|
+
case ~[TAB].indexOf(key):return true;
|
391
|
+
}
|
392
|
+
event.preventDefault();
|
393
|
+
return false;
|
394
|
+
});
|
395
|
+
break;
|
396
|
+
}
|
397
|
+
}
|
398
|
+
if( options.validateOnBlur ){
|
399
|
+
input
|
400
|
+
.off('blur.xdsoft')
|
401
|
+
.on('blur.xdsoft', function(){
|
402
|
+
if( !Date.parseDate( $(this).val(), options.format ) )
|
403
|
+
$(this).val((new Date()).dateFormat( options.format ));
|
404
|
+
});
|
405
|
+
}
|
406
|
+
options.dayOfWeekStartPrev = (options.dayOfWeekStart==0)?6:options.dayOfWeekStart-1;
|
407
|
+
datetimepicker
|
408
|
+
.trigger('xchange.xdsoft');
|
409
|
+
};
|
410
|
+
|
411
|
+
datetimepicker
|
412
|
+
.data('options',options)
|
413
|
+
.on('mousedown.xdsoft',function( event ){
|
414
|
+
event.stopPropagation();
|
415
|
+
event.preventDefault();
|
416
|
+
yearselect.hide();
|
417
|
+
monthselect.hide();
|
418
|
+
return false;
|
419
|
+
});
|
420
|
+
|
421
|
+
var scroll_element = timepicker.find('.xdsoft_time_box');
|
422
|
+
scroll_element.append(timebox);
|
423
|
+
scroll_element.xdsoftScroller();
|
424
|
+
datetimepicker.on('afterOpen.xdsoft',function(){
|
425
|
+
scroll_element.xdsoftScroller();
|
426
|
+
});
|
427
|
+
|
428
|
+
datetimepicker
|
429
|
+
.append(datepicker)
|
430
|
+
.append(timepicker);
|
431
|
+
|
432
|
+
if( options.withoutCopyright!==true )
|
433
|
+
datetimepicker
|
434
|
+
.append(xdsoft_copyright);
|
435
|
+
|
436
|
+
datepicker
|
437
|
+
.append(mounth_picker)
|
438
|
+
.append(calendar);
|
439
|
+
|
440
|
+
$('body').append(datetimepicker);
|
441
|
+
|
442
|
+
var XDSoftDateTime = function(){
|
443
|
+
var _this = this;
|
444
|
+
_this.now = function(){
|
445
|
+
return new Date();
|
446
|
+
};
|
447
|
+
|
448
|
+
_this.currentTime = this.now();
|
449
|
+
_this.isValidDate = function (d) {
|
450
|
+
if ( Object.prototype.toString.call(d) !== "[object Date]" )
|
451
|
+
return false;
|
452
|
+
return !isNaN(d.getTime());
|
453
|
+
};
|
454
|
+
|
455
|
+
_this.setCurrentTime = function( dTime){
|
456
|
+
_this.currentTime = (typeof dTime == 'string')? _this.strtodatetime(dTime) : _this.isValidDate(dTime) ? dTime: _this.now();
|
457
|
+
datetimepicker.trigger('xchange.xdsoft');
|
458
|
+
};
|
459
|
+
|
460
|
+
_this.getCurrentTime = function( dTime){
|
461
|
+
return _this.currentTime;
|
462
|
+
};
|
463
|
+
|
464
|
+
_this.nextMonth = function(){
|
465
|
+
var month = _this.currentTime.getMonth()+1;
|
466
|
+
if( month==12 ){
|
467
|
+
_this.currentTime.setFullYear(_this.currentTime.getFullYear()+1);
|
468
|
+
month = 0;
|
469
|
+
}
|
470
|
+
_this.currentTime.setMonth(month);
|
471
|
+
options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
472
|
+
datetimepicker.trigger('xchange.xdsoft');
|
473
|
+
return month;
|
474
|
+
};
|
475
|
+
|
476
|
+
_this.prevMonth = function(){
|
477
|
+
var month = _this.currentTime.getMonth()-1;
|
478
|
+
if( month==-1 ){
|
479
|
+
_this.currentTime.setFullYear(_this.currentTime.getFullYear()-1);
|
480
|
+
month = 11;
|
481
|
+
}
|
482
|
+
_this.currentTime.setMonth(month);
|
483
|
+
options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
484
|
+
datetimepicker.trigger('xchange.xdsoft');
|
485
|
+
return month;
|
486
|
+
};
|
487
|
+
|
488
|
+
_this.strtodatetime = function( sDateTime ){
|
489
|
+
var currentTime = sDateTime?Date.parseDate(sDateTime, options.format):new Date;
|
490
|
+
if( !_this.isValidDate(currentTime) )
|
491
|
+
currentTime = new Date;
|
492
|
+
return currentTime;
|
493
|
+
};
|
494
|
+
|
495
|
+
_this.strtodate = function( sDate ){
|
496
|
+
var currentTime = sDate?Date.parseDate(sDate, options.formatDate):new Date;
|
497
|
+
if( !_this.isValidDate(currentTime) )
|
498
|
+
currentTime = new Date;
|
499
|
+
return currentTime;
|
500
|
+
};
|
501
|
+
|
502
|
+
_this.strtotime = function( sTime ){
|
503
|
+
var currentTime = sTime?Date.parseDate(sTime, options.formatTime):new Date;
|
504
|
+
if( !_this.isValidDate(currentTime) )
|
505
|
+
currentTime = new Date;
|
506
|
+
return currentTime;
|
507
|
+
};
|
508
|
+
|
509
|
+
_this.str = function(){
|
510
|
+
return _this.currentTime.dateFormat(options.format);
|
511
|
+
};
|
512
|
+
};
|
513
|
+
|
514
|
+
mounth_picker
|
515
|
+
.find('.xdsoft_prev,.xdsoft_next')
|
516
|
+
.on('mousedown.xdsoft',function(){
|
517
|
+
var $this = $(this),
|
518
|
+
timer = 0,
|
519
|
+
stop = false;
|
520
|
+
|
521
|
+
(function(v){
|
522
|
+
var month = datetimepicker.data('xdsoft_datetime')
|
523
|
+
.currentTime.getMonth();
|
524
|
+
if( $this.hasClass( options.next ) ){
|
525
|
+
datetimepicker.data('xdsoft_datetime').nextMonth();
|
526
|
+
}else if( $this.hasClass( options.prev ) ){
|
527
|
+
datetimepicker.data('xdsoft_datetime').prevMonth();
|
528
|
+
}
|
529
|
+
!stop&&(timer = setTimeout(arguments.callee,v?v:100));
|
530
|
+
})(500);
|
531
|
+
|
532
|
+
$([document.body,window]).on('mouseup.xdsoft',function(){
|
533
|
+
clearTimeout(timer);
|
534
|
+
stop = true;
|
535
|
+
$([document.body,window]).off('mouseup.xdsoft',arguments.callee);
|
536
|
+
});
|
537
|
+
});
|
538
|
+
|
539
|
+
timepicker
|
540
|
+
.find('.xdsoft_prev,.xdsoft_next')
|
541
|
+
.on('mousedown.xdsoft',function(){
|
542
|
+
var $this = $(this),
|
543
|
+
timer = 0,
|
544
|
+
stop = false,
|
545
|
+
period = 110;
|
546
|
+
(function(v){
|
547
|
+
var pheight = timeboxparent[0].offsetHeight-2,
|
548
|
+
height = timebox[0].offsetHeight,
|
549
|
+
top = Math.abs(parseInt(timebox.css('marginTop')));
|
550
|
+
if( $this.hasClass(options.next) && (height-pheight)- options.timeHeightInTimePicker>=top ){
|
551
|
+
timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px')
|
552
|
+
}else if( $this.hasClass(options.prev) && top-options.timeHeightInTimePicker>=0 ){
|
553
|
+
timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px')
|
554
|
+
}
|
555
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]);
|
556
|
+
period= ( period>10 )?10:period-10;
|
557
|
+
!stop&&(timer = setTimeout(arguments.callee,v?v:period));
|
558
|
+
})(500);
|
559
|
+
$([document.body,window]).on('mouseup.xdsoft',function(){
|
560
|
+
clearTimeout(timer);
|
561
|
+
stop = true;
|
562
|
+
$([document.body,window])
|
563
|
+
.off('mouseup.xdsoft',arguments.callee);
|
564
|
+
});
|
565
|
+
});
|
566
|
+
|
567
|
+
// base handler - generating a calendar and timepicker
|
568
|
+
datetimepicker
|
569
|
+
.on('xchange.xdsoft',function(event){
|
570
|
+
var xd = $(this).data('xdsoft_datetime'),
|
571
|
+
table = '',
|
572
|
+
start = new Date(xd.currentTime.getFullYear(),xd.currentTime.getMonth(),1),
|
573
|
+
i = 0,
|
574
|
+
today = new Date;
|
575
|
+
|
576
|
+
while( start.getDay()!=options.dayOfWeekStart )
|
577
|
+
start.setDate(start.getDate()-1);
|
578
|
+
|
579
|
+
//generate calendar
|
580
|
+
table+='<table><thead><tr>';
|
581
|
+
|
582
|
+
// days
|
583
|
+
for(var j = 0; j<7; j++){
|
584
|
+
table+='<th>'+options.i18n[options.lang].dayOfWeek[(j+options.dayOfWeekStart)>6?0:j+options.dayOfWeekStart]+'</th>';
|
585
|
+
}
|
586
|
+
|
587
|
+
table+='</tr></thead>';
|
588
|
+
table+='<tbody><tr>';
|
589
|
+
while( i<xd.currentTime.getDaysInMonth()||start.getDay()!=options.dayOfWeekStart||xd.currentTime.getMonth()==start.getMonth() ){
|
590
|
+
i++;
|
591
|
+
table+='<td data-date="'+start.getDate()+'" data-month="'+start.getMonth()+'" data-year="'+start.getFullYear()+'"'+
|
592
|
+
' class="'+
|
593
|
+
(
|
594
|
+
(options.maxDate!==false&&Math.round(xd.strtodate(options.maxDate).getTime()/86400000)<Math.round(start.getTime()/86400000))||
|
595
|
+
(options.minDate!==false&&Math.round(xd.strtodate(options.minDate).getTime()/86400000)>Math.round(start.getTime()/86400000))
|
596
|
+
?'xdsoft_disabled ':' ')+
|
597
|
+
(xd.currentTime.getMonth()!=start.getMonth()?' xdsoft_other_month ':' ')+
|
598
|
+
(xd.currentTime.dateFormat('d.m.Y')==start.dateFormat('d.m.Y')?' xdsoft_current ':' ')+
|
599
|
+
(today.dateFormat('d.m.Y')==start.dateFormat('d.m.Y')?' xdsoft_today ':' ')
|
600
|
+
+'"><div>'+start.getDate()+'</div></td>';
|
601
|
+
if( start.getDay()==options.dayOfWeekStartPrev )
|
602
|
+
table+='</tr>';
|
603
|
+
start.setDate(start.getDate()+1);
|
604
|
+
}
|
605
|
+
table+='</tbody></table>';
|
606
|
+
|
607
|
+
calendar.html(table);
|
608
|
+
|
609
|
+
mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[xd.currentTime.getMonth()]);
|
610
|
+
mounth_picker.find('.xdsoft_label span').eq(1).text(xd.currentTime.getFullYear());
|
611
|
+
|
612
|
+
// generate timebox
|
613
|
+
var time = '',
|
614
|
+
h = '',
|
615
|
+
m ='',
|
616
|
+
line_time = function line_time( h,m ){
|
617
|
+
var now = new Date();
|
618
|
+
now.setHours(h);
|
619
|
+
h = parseInt(now.getHours());
|
620
|
+
now.setMinutes(m);
|
621
|
+
m = parseInt(now.getMinutes());
|
622
|
+
time+= '<div class="'+
|
623
|
+
(
|
624
|
+
(options.maxTime!==false&&xd.strtotime(options.maxTime).getTime()<now.getTime())||
|
625
|
+
(options.minTime!==false&&xd.strtotime(options.minTime).getTime()>now.getTime())
|
626
|
+
?'xdsoft_disabled ':' ')+
|
627
|
+
(
|
628
|
+
(parseInt(xd.currentTime.getHours())==parseInt(h)
|
629
|
+
&&
|
630
|
+
parseInt(xd.currentTime.getMinutes()/options.step)*options.step==parseInt(m)
|
631
|
+
)?' xdsoft_current ':'')+
|
632
|
+
((parseInt(today.getHours())==parseInt(h)&&parseInt(today.getMinutes())==parseInt(m))?' xdsoft_today ':'')+
|
633
|
+
'" data-hour="'+h+'" data-minute="'+m+'">'+now.dateFormat(options.formatTime)+'</div>';
|
634
|
+
};
|
635
|
+
if( !options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length ){
|
636
|
+
for(var i=0,j=0;i<(options.hours12?12:24);i++){
|
637
|
+
for(j=0;j<60;j+=options.step){
|
638
|
+
h = (i<10?'0':'')+i;
|
639
|
+
m = (j<10?'0':'')+j;
|
640
|
+
line_time( h,m );
|
641
|
+
}
|
642
|
+
}
|
643
|
+
}else{
|
644
|
+
for(var i=0;i<options.allowTimes.length;i++){
|
645
|
+
h = xd.strtotime(options.allowTimes[i]).getHours();
|
646
|
+
m = xd.strtotime(options.allowTimes[i]).getMinutes();
|
647
|
+
line_time( h,m );
|
648
|
+
}
|
649
|
+
}
|
650
|
+
timebox.html(time);
|
651
|
+
|
652
|
+
var opt = '',
|
653
|
+
i = 0;
|
654
|
+
|
655
|
+
for( i = parseInt(options.yearStart,10);i<= parseInt(options.yearEnd,10);i++ ){
|
656
|
+
opt+='<div class="xdsoft_option '+(xd.currentTime.getFullYear()==i?'xdsoft_current':'')+'" data-value="'+i+'">'+i+'</div>';
|
657
|
+
}
|
658
|
+
yearselect.children().eq(0)
|
659
|
+
.html(opt);
|
660
|
+
|
661
|
+
for( i = 0,opt = '';i<= 11;i++ ){
|
662
|
+
opt+='<div class="xdsoft_option '+(xd.currentTime.getMonth()==i?'xdsoft_current':'')+'" data-value="'+i+'">'+options.i18n[options.lang].months[i]+'</div>';
|
663
|
+
}
|
664
|
+
monthselect.children().eq(0).html(opt);
|
665
|
+
event.stopPropagation();
|
666
|
+
})
|
667
|
+
.on('afterOpen.xdsoft',function(){
|
668
|
+
if( options.timepicker && timebox.find('.xdsoft_current').length ){
|
669
|
+
var pheight = timeboxparent[0].offsetHeight-2,
|
670
|
+
height = timebox[0].offsetHeight,
|
671
|
+
top = timebox.find('.xdsoft_current').index()*options.timeHeightInTimePicker+1;
|
672
|
+
if( (height-pheight)<top )
|
673
|
+
top = height-pheight;
|
674
|
+
timebox.css('marginTop','-'+parseInt(top)+'px');
|
675
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[parseInt(top)/(height-pheight)]);
|
676
|
+
}
|
677
|
+
});
|
678
|
+
calendar
|
679
|
+
.on('mousedown.xdsoft','td',function(){
|
680
|
+
var $this = $(this),
|
681
|
+
currentTime = datetimepicker.data('xdsoft_datetime').currentTime;
|
682
|
+
if( $this.hasClass('xdsoft_disabled') )
|
683
|
+
return false;
|
684
|
+
currentTime.setFullYear( $this.data('year') );
|
685
|
+
currentTime.setMonth( $this.data('month') );
|
686
|
+
currentTime.setDate( $this.data('date') );
|
687
|
+
datetimepicker.trigger('select.xdsoft',[currentTime]);
|
688
|
+
|
689
|
+
input.val( datetimepicker.data('xdsoft_datetime').str() );
|
690
|
+
if( (options.closeOnDateSelect===true||( options.closeOnDateSelect===0&&!options.timepicker ))&&!options.inline ){
|
691
|
+
datetimepicker.trigger('close.xdsoft');
|
692
|
+
}
|
693
|
+
|
694
|
+
if( options.onSelectDate && options.onSelectDate.call ){
|
695
|
+
options.onSelectDate.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
696
|
+
}
|
697
|
+
|
698
|
+
datetimepicker.trigger('xchange.xdsoft');
|
699
|
+
datetimepicker.trigger('changedatetime.xdsoft');
|
700
|
+
});
|
701
|
+
|
702
|
+
timebox
|
703
|
+
.on('mousedown.xdsoft','div',function(){
|
704
|
+
var $this = $(this),
|
705
|
+
currentTime = datetimepicker.data('xdsoft_datetime').currentTime;
|
706
|
+
if( $this.hasClass('xdsoft_disabled') )
|
707
|
+
return false;
|
708
|
+
currentTime.setHours($this.data('hour'));
|
709
|
+
currentTime.setMinutes($this.data('minute'));
|
710
|
+
datetimepicker.trigger('select.xdsoft',[currentTime]);
|
711
|
+
|
712
|
+
datetimepicker.data('input').val( datetimepicker.data('xdsoft_datetime').str() );
|
713
|
+
|
714
|
+
!options.inline&&datetimepicker.trigger('close.xdsoft');
|
715
|
+
|
716
|
+
if( options.onSelectTime&&options.onSelectTime.call ){
|
717
|
+
options.onSelectTime.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
718
|
+
}
|
719
|
+
|
720
|
+
datetimepicker.trigger('xchange.xdsoft');
|
721
|
+
datetimepicker.trigger('changedatetime.xdsoft');
|
722
|
+
});
|
723
|
+
|
724
|
+
datetimepicker.mousewheel&&datepicker.mousewheel(function(event, delta, deltaX, deltaY) {
|
725
|
+
if( !options.scrollMonth )
|
726
|
+
return true;
|
727
|
+
if( delta<0 )
|
728
|
+
datetimepicker.data('xdsoft_datetime').nextMonth();
|
729
|
+
else
|
730
|
+
datetimepicker.data('xdsoft_datetime').prevMonth();
|
731
|
+
return false;
|
732
|
+
});
|
733
|
+
|
734
|
+
datetimepicker.mousewheel&&timeboxparent.unmousewheel().mousewheel(function(event, delta, deltaX, deltaY) {
|
735
|
+
if( !options.scrollTime )
|
736
|
+
return true;
|
737
|
+
var pheight = timeboxparent[0].offsetHeight-2,
|
738
|
+
height = timebox[0].offsetHeight,
|
739
|
+
top = Math.abs(parseInt(timebox.css('marginTop'))),
|
740
|
+
fl = true;
|
741
|
+
if( delta<0 && (height-pheight)-options.timeHeightInTimePicker>=top ){
|
742
|
+
timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px');
|
743
|
+
fl = false;
|
744
|
+
}else if( delta>0&&top-options.timeHeightInTimePicker>=0 ){
|
745
|
+
timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px');
|
746
|
+
fl = false;
|
747
|
+
}
|
748
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]);
|
749
|
+
event.stopPropagation();
|
750
|
+
return fl;
|
751
|
+
});
|
752
|
+
|
753
|
+
datetimepicker
|
754
|
+
.on('changedatetime.xdsoft',function(){
|
755
|
+
if( options.onChangeDateTime&&options.onChangeDateTime.call )
|
756
|
+
options.onChangeDateTime.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
757
|
+
});
|
758
|
+
|
759
|
+
var current_time_index = 0;
|
760
|
+
input.mousewheel&&input.mousewheel(function( event, delta, deltaX, deltaY ){
|
761
|
+
if( !options.scrollInput )
|
762
|
+
return true;
|
763
|
+
if( !options.datepicker && options.timepicker ){
|
764
|
+
current_time_index = timebox.find('.xdsoft_current').length?timebox.find('.xdsoft_current').eq(0).index():0;
|
765
|
+
if( current_time_index+delta>=0&¤t_time_index+delta<timebox.children().length )
|
766
|
+
current_time_index+=delta;
|
767
|
+
timebox.children().eq(current_time_index).length&&timebox.children().eq(current_time_index).trigger('mousedown');
|
768
|
+
return false;
|
769
|
+
}else if( options.datepicker && !options.timepicker ){
|
770
|
+
datepicker.trigger( event, [delta, deltaX, deltaY]);
|
771
|
+
input.val&&input.val( datetimepicker.data('xdsoft_datetime').str() );
|
772
|
+
datetimepicker.trigger('changedatetime.xdsoft');
|
773
|
+
return false;
|
774
|
+
}
|
775
|
+
});
|
776
|
+
var setPos = function(){
|
777
|
+
var offset = datetimepicker.data('input').offset(), top = offset.top+datetimepicker.data('input')[0].offsetHeight-1, left = offset.left;
|
778
|
+
if( top+datetimepicker[0].offsetHeight>$('body').height() )
|
779
|
+
top = offset.top-datetimepicker[0].offsetHeight+1;
|
780
|
+
if( left+datetimepicker[0].offsetWidth>$('body').width() )
|
781
|
+
left = offset.left-datetimepicker[0].offsetWidth+datetimepicker.data('input')[0].offsetWidth;
|
782
|
+
datetimepicker.css({
|
783
|
+
left:offset.left,
|
784
|
+
top:top
|
785
|
+
});
|
786
|
+
};
|
787
|
+
datetimepicker
|
788
|
+
.on('open.xdsoft', function(){
|
789
|
+
var onShow = true;
|
790
|
+
if( options.onShow&&options.onShow.call){
|
791
|
+
onShow = options.onShow.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
792
|
+
}
|
793
|
+
if( onShow!==false ){
|
794
|
+
datetimepicker.show();
|
795
|
+
datetimepicker.trigger('afterOpen.xdsoft');
|
796
|
+
setPos();
|
797
|
+
$(window)
|
798
|
+
.off('resize.xdsoft',setPos)
|
799
|
+
.on('resize.xdsoft',setPos);
|
800
|
+
|
801
|
+
if( options.closeOnWithoutClick ){
|
802
|
+
$([document.body,window]).on('mousedown.xdsoft',function(){
|
803
|
+
datetimepicker.trigger('close.xdsoft');
|
804
|
+
$([document.body,window]).off('mousedown.xdsoft',arguments.callee);
|
805
|
+
});
|
806
|
+
}
|
807
|
+
}
|
808
|
+
})
|
809
|
+
.on('close.xdsoft', function( event ){
|
810
|
+
var onClose = true;
|
811
|
+
if( options.onClose&&options.onClose.call ){
|
812
|
+
onClose=options.onClose.call(datetimepicker,datetimepicker.data('xdsoft_datetime').currentTime,datetimepicker.data('input'));
|
813
|
+
}
|
814
|
+
if( onClose!==false&&!options.opened&&!options.inline ){
|
815
|
+
datetimepicker.hide();
|
816
|
+
}
|
817
|
+
event.stopPropagation();
|
818
|
+
})
|
819
|
+
.data('input',input);
|
820
|
+
|
821
|
+
var _xdsoft_datetime = new XDSoftDateTime,
|
822
|
+
timer = 0,
|
823
|
+
timer1 = 0;
|
824
|
+
|
825
|
+
datetimepicker.data('xdsoft_datetime',_xdsoft_datetime);
|
826
|
+
datetimepicker.setOptions(options);
|
827
|
+
_xdsoft_datetime.setCurrentTime( options.value?options.value:(input&&input.val&&input.val())?input.val():new Date );
|
828
|
+
|
829
|
+
datetimepicker.trigger('afterOpen.xdsoft');
|
830
|
+
|
831
|
+
input
|
832
|
+
.data( 'xdsoft_datetimepicker',datetimepicker )
|
833
|
+
.on('open.xdsoft focusin.xdsoft mousedown.xdsoft',function(event){
|
834
|
+
if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible') )
|
835
|
+
return;
|
836
|
+
clearTimeout(timer);
|
837
|
+
timer = setTimeout(function(){
|
838
|
+
if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible') )
|
839
|
+
return;
|
840
|
+
_xdsoft_datetime.setCurrentTime((input&&input.val&&input.val())?input.val():new Date);
|
841
|
+
datetimepicker.trigger('open.xdsoft');
|
842
|
+
},100);
|
843
|
+
})
|
844
|
+
.on('focusout.xdsoft',function(event){
|
845
|
+
clearTimeout(timer1);
|
846
|
+
timer1 = setTimeout(function(){
|
847
|
+
datetimepicker.trigger('close.xdsoft');
|
848
|
+
},100);
|
849
|
+
});
|
850
|
+
},
|
851
|
+
destroyDateTimePicker = function( input ){
|
852
|
+
var datetimepicker = input.data('xdsoft_datetimepicker');
|
853
|
+
if( datetimepicker ){
|
854
|
+
var _xdsoft_datetime = datetimepicker.data('xdsoft_datetime');
|
855
|
+
delete _xdsoft_datetime;
|
856
|
+
datetimepicker.remove();
|
857
|
+
delete datetimepicker;
|
858
|
+
input
|
859
|
+
.data( 'xdsoft_datetimepicker',null )
|
860
|
+
.off( 'open.xdsoft focusin.xdsoft focusout.xdsoft mousedown.xdsoft blur.xdsoft' );
|
861
|
+
$(window).off('resize.xdsoft');
|
862
|
+
$([window,document.body]).off('mousedown.xdsoft');
|
863
|
+
input.unmousewheel&&input.unmousewheel();
|
864
|
+
delete options;
|
865
|
+
}
|
866
|
+
};
|
867
|
+
$(document)
|
868
|
+
.off('keydown.xdsoftctrl keyup.xdsoftctrl')
|
869
|
+
.on('keydown.xdsoftctrl',function(e){
|
870
|
+
if ( e.keyCode == CTRLKEY )
|
871
|
+
ctrlDown = true;
|
872
|
+
})
|
873
|
+
.on('keyup.xdsoftctrl',function(e){
|
874
|
+
if ( e.keyCode == CTRLKEY )
|
875
|
+
ctrlDown = false;
|
876
|
+
});
|
877
|
+
return this.each(function(){
|
878
|
+
var datetimepicker;
|
879
|
+
if( datetimepicker = $(this).data('xdsoft_datetimepicker') ){
|
880
|
+
if( $.type(opt) === 'string' ){
|
881
|
+
switch(opt){
|
882
|
+
case 'show':
|
883
|
+
$(this).select().focus();
|
884
|
+
datetimepicker.trigger( 'open.xdsoft' );
|
885
|
+
break;
|
886
|
+
case 'hide':
|
887
|
+
datetimepicker.trigger('close.xdsoft');
|
888
|
+
break;
|
889
|
+
case 'destroy':
|
890
|
+
destroyDateTimePicker($(this));
|
891
|
+
break;
|
892
|
+
}
|
893
|
+
}else{
|
894
|
+
datetimepicker
|
895
|
+
.setOptions(options);
|
896
|
+
}
|
897
|
+
return 0;
|
898
|
+
}else
|
899
|
+
($.type(opt) !== 'string')&&createDateTimePicker($(this));
|
900
|
+
});
|
901
|
+
};
|
902
|
+
})( jQuery );
|
903
|
+
|
904
|
+
//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/
|
905
|
+
/*
|
906
|
+
* Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
|
907
|
+
*
|
908
|
+
* This program is free software; you can redistribute it and/or modify it
|
909
|
+
* under the terms of the GNU Lesser General Public License as published by the
|
910
|
+
* Free Software Foundation, version 2.1.
|
911
|
+
*
|
912
|
+
* This program is distributed in the hope that it will be useful, but WITHOUT
|
913
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
914
|
+
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
915
|
+
* details.
|
916
|
+
*/
|
917
|
+
Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(format){if(Date.formatFunctions[format]==null){Date.createNewFormat(format)}var func=Date.formatFunctions[format];return this[func]()};Date.createNewFormat=function(format){var funcName="format"+Date.formatFunctions.count++;Date.formatFunctions[format]=funcName;var code="Date.prototype."+funcName+" = function(){return ";var special=false;var ch='';for(var i=0;i<format.length;++i){ch=format.charAt(i);if(!special&&ch=="\\"){special=true}else if(special){special=false;code+="'"+String.escape(ch)+"' + "}else{code+=Date.getFormatCode(ch)}}eval(code.substring(0,code.length-3)+";}")};Date.getFormatCode=function(character){switch(character){case"d":return"String.leftPad(this.getDate(), 2, '0') + ";case"D":return"Date.dayNames[this.getDay()].substring(0, 3) + ";case"j":return"this.getDate() + ";case"l":return"Date.dayNames[this.getDay()] + ";case"S":return"this.getSuffix() + ";case"w":return"this.getDay() + ";case"z":return"this.getDayOfYear() + ";case"W":return"this.getWeekOfYear() + ";case"F":return"Date.monthNames[this.getMonth()] + ";case"m":return"String.leftPad(this.getMonth() + 1, 2, '0') + ";case"M":return"Date.monthNames[this.getMonth()].substring(0, 3) + ";case"n":return"(this.getMonth() + 1) + ";case"t":return"this.getDaysInMonth() + ";case"L":return"(this.isLeapYear() ? 1 : 0) + ";case"Y":return"this.getFullYear() + ";case"y":return"('' + this.getFullYear()).substring(2, 4) + ";case"a":return"(this.getHours() < 12 ? 'am' : 'pm') + ";case"A":return"(this.getHours() < 12 ? 'AM' : 'PM') + ";case"g":return"((this.getHours() %12) ? this.getHours() % 12 : 12) + ";case"G":return"this.getHours() + ";case"h":return"String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";case"H":return"String.leftPad(this.getHours(), 2, '0') + ";case"i":return"String.leftPad(this.getMinutes(), 2, '0') + ";case"s":return"String.leftPad(this.getSeconds(), 2, '0') + ";case"O":return"this.getGMTOffset() + ";case"T":return"this.getTimezone() + ";case"Z":return"(this.getTimezoneOffset() * -60) + ";default:return"'"+String.escape(character)+"' + "}};Date.parseDate=function(input,format){if(Date.parseFunctions[format]==null){Date.createParser(format)}var func=Date.parseFunctions[format];return Date[func](input)};Date.createParser=function(format){var funcName="parse"+Date.parseFunctions.count++;var regexNum=Date.parseRegexes.length;var currentGroup=1;Date.parseFunctions[format]=funcName;var code="Date."+funcName+" = function(input){\n"+"var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"+"var d = new Date();\n"+"y = d.getFullYear();\n"+"m = d.getMonth();\n"+"d = d.getDate();\n"+"var results = input.match(Date.parseRegexes["+regexNum+"]);\n"+"if (results && results.length > 0) {";var regex="";var special=false;var ch='';for(var i=0;i<format.length;++i){ch=format.charAt(i);if(!special&&ch=="\\"){special=true}else if(special){special=false;regex+=String.escape(ch)}else{obj=Date.formatCodeToRegex(ch,currentGroup);currentGroup+=obj.g;regex+=obj.s;if(obj.g&&obj.c){code+=obj.c}}}code+="if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"+"{return new Date(y, m, d, h, i, s);}\n"+"else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"+"{return new Date(y, m, d, h, i);}\n"+"else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"+"{return new Date(y, m, d, h);}\n"+"else if (y > 0 && m >= 0 && d > 0)\n"+"{return new Date(y, m, d);}\n"+"else if (y > 0 && m >= 0)\n"+"{return new Date(y, m);}\n"+"else if (y > 0)\n"+"{return new Date(y);}\n"+"}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code)};Date.formatCodeToRegex=function(character,currentGroup){switch(character){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:0,c:null,s:"(?:\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+currentGroup+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+currentGroup+"], 10);\n"+"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+currentGroup+"] == 'am') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+currentGroup+"] == 'AM') {\n"+"if (h == 12) { h = 0; }\n"+"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(character)}}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3")};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+")+String.leftPad(Math.floor(this.getTimezoneOffset()/60),2,"0")+String.leftPad(this.getTimezoneOffset()%60,2,"0")};Date.prototype.getDayOfYear=function(){var num=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var i=0;i<this.getMonth();++i){num+=Date.daysInMonth[i]}return num+this.getDate()-1};Date.prototype.getWeekOfYear=function(){var now=this.getDayOfYear()+(4-this.getDay());var jan1=new Date(this.getFullYear(),0,1);var then=(7-jan1.getDay()+4);document.write(then);return String.leftPad(((now-then)/7)+1,2,"0")};Date.prototype.isLeapYear=function(){var year=this.getFullYear();return((year&3)==0&&(year%100||(year%400==0&&year)))};Date.prototype.getFirstDayOfMonth=function(){var day=(this.getDay()-(this.getDate()-1))%7;return(day<0)?(day+7):day};Date.prototype.getLastDayOfMonth=function(){var day=(this.getDay()+(Date.daysInMonth[this.getMonth()]-this.getDate()))%7;return(day<0)?(day+7):day};Date.prototype.getDaysInMonth=function(){Date.daysInMonth[1]=this.isLeapYear()?29:28;return Date.daysInMonth[this.getMonth()]};Date.prototype.getSuffix=function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th"}};String.escape=function(string){return string.replace(/('|\\)/g,"\\$1")};String.leftPad=function(val,size,ch){var result=new String(val);if(ch==null){ch=" "}while(result.length<size){result=ch+result}return result};Date.daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];Date.monthNames=["January","February","March","April","May","June","July","August","September","October","November","December"];Date.dayNames=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Date.y2kYear=50;Date.monthNumbers={Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11};Date.patterns={ISO8601LongPattern:"Y-m-d H:i:s",ISO8601ShortPattern:"Y-m-d",ShortDatePattern:"n/j/Y",LongDatePattern:"l, F d, Y",FullDateTimePattern:"l, F d, Y g:i:s A",MonthDayPattern:"F d",ShortTimePattern:"g:i A",LongTimePattern:"g:i:s A",SortableDateTimePattern:"Y-m-d\\TH:i:s",UniversalSortableDateTimePattern:"Y-m-d H:i:sO",YearMonthPattern:"F, Y"};
|
918
|
+
|
919
|
+
//https://github.com/brandonaaron/jquery-mousewheel/blob/master/jquery.mousewheel.js
|
920
|
+
/*
|
921
|
+
* Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net)
|
922
|
+
*
|
923
|
+
* Licensed under the MIT License (LICENSE.txt).
|
924
|
+
*
|
925
|
+
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
926
|
+
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
927
|
+
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
928
|
+
*
|
929
|
+
* Version: 3.1.3
|
930
|
+
*
|
931
|
+
* Requires: 1.2.2+
|
932
|
+
*/
|
933
|
+
(function(factory){if(typeof define==='function'&&define.amd){define(['jquery'],factory)}else if(typeof exports==='object'){module.exports=factory}else{factory(jQuery)}}(function($){var toFix=['wheel','mousewheel','DOMMouseScroll','MozMousePixelScroll'];var toBind='onwheel'in document||document.documentMode>=9?['wheel']:['mousewheel','DomMouseScroll','MozMousePixelScroll'];var lowestDelta,lowestDeltaXY;if($.event.fixHooks){for(var i=toFix.length;i;){$.event.fixHooks[toFix[--i]]=$.event.mouseHooks}}$.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var i=toBind.length;i;){this.addEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=handler}},teardown:function(){if(this.removeEventListener){for(var i=toBind.length;i;){this.removeEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=null}}};$.fn.extend({mousewheel:function(fn){return fn?this.bind("mousewheel",fn):this.trigger("mousewheel")},unmousewheel:function(fn){return this.unbind("mousewheel",fn)}});function handler(event){var orgEvent=event||window.event,args=[].slice.call(arguments,1),delta=0,deltaX=0,deltaY=0,absDelta=0,absDeltaXY=0,fn;event=$.event.fix(orgEvent);event.type="mousewheel";if(orgEvent.wheelDelta){delta=orgEvent.wheelDelta}if(orgEvent.detail){delta=orgEvent.detail*-1}if(orgEvent.deltaY){deltaY=orgEvent.deltaY*-1;delta=deltaY}if(orgEvent.deltaX){deltaX=orgEvent.deltaX;delta=deltaX*-1}if(orgEvent.wheelDeltaY!==undefined){deltaY=orgEvent.wheelDeltaY}if(orgEvent.wheelDeltaX!==undefined){deltaX=orgEvent.wheelDeltaX*-1}absDelta=Math.abs(delta);if(!lowestDelta||absDelta<lowestDelta){lowestDelta=absDelta}absDeltaXY=Math.max(Math.abs(deltaY),Math.abs(deltaX));if(!lowestDeltaXY||absDeltaXY<lowestDeltaXY){lowestDeltaXY=absDeltaXY}fn=delta>0?'floor':'ceil';delta=Math[fn](delta/lowestDelta);deltaX=Math[fn](deltaX/lowestDeltaXY);deltaY=Math[fn](deltaY/lowestDeltaXY);args.unshift(event,delta,deltaX,deltaY);return($.event.dispatch||$.event.handle).apply(this,args)}}));
|