web_interface/astpp/assets/js/jquery.datetimepicker.js   F
last analyzed

Complexity

Total Complexity 552
Complexity/F 4.68

Size

Lines of Code 1845
Function Count 118

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 0
nc 0
dl 0
loc 1845
rs 2.4
c 0
b 0
f 0
wmc 552
mnd 5
bc 330
fnc 118
bpm 2.7966
cpm 4.6779
noi 39

30 Functions

Rating   Name   Duplication   Size   Complexity  
B $.fn.xdsoftScroller 0 156 1
B jquery.datetimepicker.js ➔ ?!? 0 1 5
A default_options.onSelectDate 0 1 1
B $.fn.datetimepicker 0 1157 3
A Date.getGMTOffset 0 1 2
A Date.isLeapYear 0 1 1
A default_options.onChangeDateTime 0 1 1
A default_options.onShow 0 1 1
A Date.parseDate 0 1 4
C Date.createParser 0 1 7
D Date.getSuffix 0 1 9
A Date.countDaysInMonth 0 3 1
A Date.getWeekOfYear 0 1 1
A Date.dateFormat 0 1 3
A default_options.onClose 0 1 1
A Date.getTimezone 0 1 1
A default_options.onChangeMonth 0 1 1
A Date.getDayOfYear 0 1 3
A default_options.onGenerate 0 1 1
A Date.getLastDayOfMonth 0 1 2
D Date.getFormatCode 0 1 29
A String.escape 0 1 1
A default_options.onSelectTime 0 1 1
B Date.createNewFormat 0 1 5
A Date.getDaysInMonth 0 1 2
A String.leftPad 0 1 3
D Date.formatCodeToRegex 0 1 29
A default_options.onChangeYear 0 1 1
A Date.getFirstDayOfMonth 0 1 2
A Array.indexOf 0 7 3

How to fix   Complexity   

Complexity

Complex classes like web_interface/astpp/assets/js/jquery.datetimepicker.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/**
2
 * @preserve jQuery DateTimePicker plugin v2.4.1
3
 * @homepage http://xdsoft.net/jqplugins/datetimepicker/
4
 * (c) 2014, Chupurnov Valeriy.
5
 */
6
/*global document,window,jQuery,setTimeout,clearTimeout*/
7
(function ($) {
8
	'use strict';
9
	var default_options  = {
10
		i18n: {
11
			ar: { // Arabic
12
				months: [
13
					"كانون الثاني", "شباط", "آذار", "نيسان", "مايو", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"
14
				],
15
				dayOfWeek: [
16
					"ن", "ث", "ع", "خ", "ج", "س", "ح"
17
				]
18
			},
19
			ro: { // Romanian
20
				months: [
21
					"ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"
22
				],
23
				dayOfWeek: [
24
					"l", "ma", "mi", "j", "v", "s", "d"
25
				]
26
			},
27
			id: { // Indonesian
28
				months: [
29
					"Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"
30
				],
31
				dayOfWeek: [
32
					"Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Min"
33
				]
34
			},
35
			bg: { // Bulgarian
36
				months: [
37
					"Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"
38
				],
39
				dayOfWeek: [
40
					"Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
41
				]
42
			},
43
			fa: { // Persian/Farsi
44
				months: [
45
					'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'
46
				],
47
				dayOfWeek: [
48
					'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'
49
				]
50
			},
51
			ru: { // Russian
52
				months: [
53
					'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
54
				],
55
				dayOfWeek: [
56
					"Вск", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
57
				]
58
			},
59
			uk: { // Ukrainian
60
				months: [
61
					'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'
62
				],
63
				dayOfWeek: [
64
					"Ндл", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт"
65
				]
66
			},
67
			en: { // English
68
				months: [
69
					"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
70
				],
71
				dayOfWeek: [
72
					"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
73
				]
74
			},
75
			el: { // Ελληνικά
76
				months: [
77
					"Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"
78
				],
79
				dayOfWeek: [
80
					"Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"
81
				]
82
			},
83
			de: { // German
84
				months: [
85
					'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
86
				],
87
				dayOfWeek: [
88
					"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"
89
				]
90
			},
91
			nl: { // Dutch
92
				months: [
93
					"januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"
94
				],
95
				dayOfWeek: [
96
					"zo", "ma", "di", "wo", "do", "vr", "za"
97
				]
98
			},
99
			tr: { // Turkish
100
				months: [
101
					"Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
102
				],
103
				dayOfWeek: [
104
					"Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts"
105
				]
106
			},
107
			fr: { //French
108
				months: [
109
					"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
110
				],
111
				dayOfWeek: [
112
					"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"
113
				]
114
			},
115
			es: { // Spanish
116
				months: [
117
					"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
118
				],
119
				dayOfWeek: [
120
					"Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"
121
				]
122
			},
123
			th: { // Thai
124
				months: [
125
					'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
126
				],
127
				dayOfWeek: [
128
					'อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'
129
				]
130
			},
131
			pl: { // Polish
132
				months: [
133
					"styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"
134
				],
135
				dayOfWeek: [
136
					"nd", "pn", "wt", "śr", "cz", "pt", "sb"
137
				]
138
			},
139
			pt: { // Portuguese
140
				months: [
141
					"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
142
				],
143
				dayOfWeek: [
144
					"Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"
145
				]
146
			},
147
			ch: { // Simplified Chinese
148
				months: [
149
					"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
150
				],
151
				dayOfWeek: [
152
					"日", "一", "二", "三", "四", "五", "六"
153
				]
154
			},
155
			se: { // Swedish
156
				months: [
157
					"Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September",  "Oktober", "November", "December"
158
				],
159
				dayOfWeek: [
160
					"Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
161
				]
162
			},
163
			kr: { // Korean
164
				months: [
165
					"1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
166
				],
167
				dayOfWeek: [
168
					"일", "월", "화", "수", "목", "금", "토"
169
				]
170
			},
171
			it: { // Italian
172
				months: [
173
					"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"
174
				],
175
				dayOfWeek: [
176
					"Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"
177
				]
178
			},
179
			da: { // Dansk
180
				months: [
181
					"January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December"
182
				],
183
				dayOfWeek: [
184
					"Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
185
				]
186
			},
187
			no: { // Norwegian
188
				months: [
189
					"Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"
190
				],
191
				dayOfWeek: [
192
					"Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
193
				]
194
			},
195
			ja: { // Japanese
196
				months: [
197
					"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"
198
				],
199
				dayOfWeek: [
200
					"日", "月", "火", "水", "木", "金", "土"
201
				]
202
			},
203
			vi: { // Vietnamese
204
				months: [
205
					"Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"
206
				],
207
				dayOfWeek: [
208
					"CN", "T2", "T3", "T4", "T5", "T6", "T7"
209
				]
210
			},
211
			sl: { // Slovenščina
212
				months: [
213
					"Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"
214
				],
215
				dayOfWeek: [
216
					"Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"
217
				]
218
			},
219
			cs: { // Čeština
220
				months: [
221
					"Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"
222
				],
223
				dayOfWeek: [
224
					"Ne", "Po", "Út", "St", "Čt", "Pá", "So"
225
				]
226
			},
227
			hu: { // Hungarian
228
				months: [
229
					"Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"
230
				],
231
				dayOfWeek: [
232
					"Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo"
233
				]
234
			},
235
			az: { //Azerbaijanian (Azeri)
236
				months: [
237
					"Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"
238
				],
239
				dayOfWeek: [
240
					"B", "Be", "Ça", "Ç", "Ca", "C", "Ş"
241
				]
242
			},
243
			bs: { //Bosanski
244
				months: [
245
					"Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
246
				],
247
				dayOfWeek: [
248
					"Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
249
				]
250
			},
251
			ca: { //Català
252
				months: [
253
					"Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"
254
				],
255
				dayOfWeek: [
256
					"Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds"
257
				]
258
			},
259
			'en-GB': { //English (British)
260
				months: [
261
					"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
262
				],
263
				dayOfWeek: [
264
					"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
265
				]
266
			},
267
			et: { //"Eesti"
268
				months: [
269
					"Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"
270
				],
271
				dayOfWeek: [
272
					"P", "E", "T", "K", "N", "R", "L"
273
				]
274
			},
275
			eu: { //Euskara
276
				months: [
277
					"Urtarrila", "Otsaila", "Martxoa", "Apirila", "Maiatza", "Ekaina", "Uztaila", "Abuztua", "Iraila", "Urria", "Azaroa", "Abendua"
278
				],
279
				dayOfWeek: [
280
					"Ig.", "Al.", "Ar.", "Az.", "Og.", "Or.", "La."
281
				]
282
			},
283
			fi: { //Finnish (Suomi)
284
				months: [
285
					"Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"
286
				],
287
				dayOfWeek: [
288
					"Su", "Ma", "Ti", "Ke", "To", "Pe", "La"
289
				]
290
			},
291
			gl: { //Galego
292
				months: [
293
					"Xan", "Feb", "Maz", "Abr", "Mai", "Xun", "Xul", "Ago", "Set", "Out", "Nov", "Dec"
294
				],
295
				dayOfWeek: [
296
					"Dom", "Lun", "Mar", "Mer", "Xov", "Ven", "Sab"
297
				]
298
			},
299
			hr: { //Hrvatski
300
				months: [
301
					"Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"
302
				],
303
				dayOfWeek: [
304
					"Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
305
				]
306
			},
307
			ko: { //Korean (한국어)
308
				months: [
309
					"1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
310
				],
311
				dayOfWeek: [
312
					"일", "월", "화", "수", "목", "금", "토"
313
				]
314
			},
315
			lt: { //Lithuanian (lietuvių)
316
				months: [
317
					"Sausio", "Vasario", "Kovo", "Balandžio", "Gegužės", "Birželio", "Liepos", "Rugpjūčio", "Rugsėjo", "Spalio", "Lapkričio", "Gruodžio"
318
				],
319
				dayOfWeek: [
320
					"Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš"
321
				]
322
			},
323
			lv: { //Latvian (Latviešu)
324
				months: [
325
					"Janvāris", "Februāris", "Marts", "Aprīlis ", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"
326
				],
327
				dayOfWeek: [
328
					"Sv", "Pr", "Ot", "Tr", "Ct", "Pk", "St"
329
				]
330
			},
331
			mk: { //Macedonian (Македонски)
332
				months: [
333
					"јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"
334
				],
335
				dayOfWeek: [
336
					"нед", "пон", "вто", "сре", "чет", "пет", "саб"
337
				]
338
			},
339
			mn: { //Mongolian (Монгол)
340
				months: [
341
					"1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"
342
				],
343
				dayOfWeek: [
344
					"Дав", "Мяг", "Лха", "Пүр", "Бсн", "Бям", "Ням"
345
				]
346
			},
347
			'pt-BR': { //Português(Brasil)
348
				months: [
349
					"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
350
				],
351
				dayOfWeek: [
352
					"Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"
353
				]
354
			},
355
			sk: { //Slovenčina
356
				months: [
357
					"Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"
358
				],
359
				dayOfWeek: [
360
					"Ne", "Po", "Ut", "St", "Št", "Pi", "So"
361
				]
362
			},
363
			sq: { //Albanian (Shqip)
364
				months: [
365
					"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
366
				],
367
				dayOfWeek: [
368
					"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
369
				]
370
			},
371
			'sr-YU': { //Serbian (Srpski)
372
				months: [
373
					"Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
374
				],
375
				dayOfWeek: [
376
					"Ned", "Pon", "Uto", "Sre", "čet", "Pet", "Sub"
377
				]
378
			},
379
			sr: { //Serbian Cyrillic (Српски)
380
				months: [
381
					"јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"
382
				],
383
				dayOfWeek: [
384
					"нед", "пон", "уто", "сре", "чет", "пет", "суб"
385
				]
386
			},
387
			sv: { //Svenska
388
				months: [
389
					"Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"
390
				],
391
				dayOfWeek: [
392
					"Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
393
				]
394
			},
395
			'zh-TW': { //Traditional Chinese (繁體中文)
396
				months: [
397
					"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
398
				],
399
				dayOfWeek: [
400
					"日", "一", "二", "三", "四", "五", "六"
401
				]
402
			},
403
			zh: { //Simplified Chinese (简体中文)
404
				months: [
405
					"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
406
				],
407
				dayOfWeek: [
408
					"日", "一", "二", "三", "四", "五", "六"
409
				]
410
			},
411
			he: { //Hebrew (עברית)
412
				months: [
413
					'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'
414
				],
415
				dayOfWeek: [
416
					'א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת'
417
				]
418
			}
419
		},
420
		value: '',
421
		lang: 'en',
422
423
		format:	'Y/m/d H:i',
424
		formatTime:	'H:i',
425
		formatDate:	'Y/m/d',
426
427
		startDate:	false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05',
428
		step: 60,
429
		monthChangeSpinner: true,
430
431
		closeOnDateSelect: false,
432
		closeOnWithoutClick: true,
433
		closeOnInputClick: true,
434
435
		timepicker: true,
436
		datepicker: true,
437
		weeks: false,
438
439
		defaultTime: false,	// use formatTime format (ex. '10:00' for formatTime:	'H:i')
440
		defaultDate: false,	// use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05')
441
442
		minDate: false,
443
		maxDate: false,
444
		minTime: false,
445
		maxTime: false,
446
447
		allowTimes: [],
448
		opened: false,
449
		initTime: true,
450
		inline: false,
451
		theme: '',
452
453
		onSelectDate: function () {},
454
		onSelectTime: function () {},
455
		onChangeMonth: function () {},
456
		onChangeYear: function () {},
457
		onChangeDateTime: function () {},
458
		onShow: function () {},
459
		onClose: function () {},
460
		onGenerate: function () {},
461
462
		withoutCopyright: true,
463
		inverseButton: false,
464
		hours12: false,
465
		next:	'xdsoft_next',
466
		prev : 'xdsoft_prev',
467
		dayOfWeekStart: 0,
468
		parentID: 'body',
469
		timeHeightInTimePicker: 25,
470
		timepickerScrollbar: true,
471
		todayButton: true,
472
		defaultSelect: true,
473
474
		scrollMonth: true,
475
		scrollTime: true,
476
		scrollInput: true,
477
478
		lazyInit: false,
479
		mask: false,
480
		validateOnBlur: true,
481
		allowBlank: true,
482
		yearStart: 1950,
483
		yearEnd: 2050,
484
		style: '',
485
		id: '',
486
		fixed: false,
487
		roundTime: 'round', // ceil, floor
488
		className: '',
489
		weekends: [],
490
		disabledDates : [],
491
		yearOffset: 0,
492
		beforeShowDay: null,
493
494
		enterLikeTab: true
495
	};
496
	// fix for ie8
497
	if (!Array.prototype.indexOf) {
498
		Array.prototype.indexOf = function (obj, start) {
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Array. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
499
			var i, j;
500
			for (i = (start || 0), j = this.length; i < j; i += 1) {
501
				if (this[i] === obj) { return i; }
502
			}
503
			return -1;
504
		};
505
	}
506
	Date.prototype.countDaysInMonth = function () {
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Date. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
507
		return new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
508
	};
509
	$.fn.xdsoftScroller = function (percent) {
510
		return this.each(function () {
511
			var timeboxparent = $(this),
512
				pointerEventToXY = function (e) {
513
					var out = {x: 0, y: 0},
514
						touch;
515
					if (e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend' || e.type === 'touchcancel') {
516
						touch  = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
517
						out.x = touch.clientX;
518
						out.y = touch.clientY;
519
					} else if (e.type === 'mousedown' || e.type === 'mouseup' || e.type === 'mousemove' || e.type === 'mouseover' || e.type === 'mouseout' || e.type === 'mouseenter' || e.type === 'mouseleave') {
520
						out.x = e.clientX;
521
						out.y = e.clientY;
522
					}
523
					return out;
524
				},
525
				move = 0,
0 ignored issues
show
Unused Code introduced by
The variable move seems to be never used. Consider removing it.
Loading history...
526
				timebox,
527
				parentHeight,
528
				height,
529
				scrollbar,
530
				scroller,
531
				maximumOffset = 100,
532
				start = false,
533
				startY = 0,
534
				startTop = 0,
535
				h1 = 0,
536
				touchStart = false,
537
				startTopScroll = 0,
538
				calcOffset = function () {};
539
			if (percent === 'hide') {
540
				timeboxparent.find('.xdsoft_scrollbar').hide();
541
				return;
542
			}
543
			if (!$(this).hasClass('xdsoft_scroller_box')) {
544
				timebox = timeboxparent.children().eq(0);
545
				parentHeight = timeboxparent[0].clientHeight;
546
				height = timebox[0].offsetHeight;
547
				scrollbar = $('<div class="xdsoft_scrollbar"></div>');
548
				scroller = $('<div class="xdsoft_scroller"></div>');
549
				scrollbar.append(scroller);
550
551
				timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar);
552
				calcOffset = function calcOffset(event) {
553
					var offset = pointerEventToXY(event).y - startY + startTopScroll;
554
					if (offset < 0) {
555
						offset = 0;
556
					}
557
					if (offset + scroller[0].offsetHeight > h1) {
558
						offset = h1 - scroller[0].offsetHeight;
559
					}
560
					timeboxparent.trigger('scroll_element.xdsoft_scroller', [maximumOffset ? offset / maximumOffset : 0]);
561
				};
562
563
				scroller
564
					.on('touchstart.xdsoft_scroller mousedown.xdsoft_scroller', function (event) {
565
						if (!parentHeight) {
566
							timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
567
						}
568
569
						startY = pointerEventToXY(event).y;
570
						startTopScroll = parseInt(scroller.css('margin-top'), 10);
571
						h1 = scrollbar[0].offsetHeight;
572
573
						if (event.type === 'mousedown') {
574
							if (document) {
575
								$(document.body).addClass('xdsoft_noselect');
576
							}
577
							$([document.body, window]).on('mouseup.xdsoft_scroller', function arguments_callee() {
578
								$([document.body, window]).off('mouseup.xdsoft_scroller', arguments_callee)
579
									.off('mousemove.xdsoft_scroller', calcOffset)
580
									.removeClass('xdsoft_noselect');
581
							});
582
							$(document.body).on('mousemove.xdsoft_scroller', calcOffset);
583
						} else {
584
							touchStart = true;
585
							event.stopPropagation();
586
							event.preventDefault();
587
						}
588
					})
589
					.on('touchmove', function (event) {
590
						if (touchStart) {
591
							event.preventDefault();
592
							calcOffset(event);
593
						}
594
					})
595
					.on('touchend touchcancel', function (event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
596
						touchStart =  false;
597
						startTopScroll = 0;
598
					});
599
600
				timeboxparent
601
					.on('scroll_element.xdsoft_scroller', function (event, percentage) {
602
						if (!parentHeight) {
603
							timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percentage, true]);
604
						}
605
						percentage = percentage > 1 ? 1 : (percentage < 0 || isNaN(percentage)) ? 0 : percentage;
606
607
						scroller.css('margin-top', maximumOffset * percentage);
608
609
						setTimeout(function () {
610
							timebox.css('marginTop', -parseInt((timebox[0].offsetHeight - parentHeight) * percentage, 10));
611
						}, 10);
612
					})
613
					.on('resize_scroll.xdsoft_scroller', function (event, percentage, noTriggerScroll) {
614
						var percent, sh;
615
						parentHeight = timeboxparent[0].clientHeight;
616
						height = timebox[0].offsetHeight;
617
						percent = parentHeight / height;
618
						sh = percent * scrollbar[0].offsetHeight;
619
						if (percent > 1) {
620
							scroller.hide();
621
						} else {
622
							scroller.show();
623
							scroller.css('height', parseInt(sh > 10 ? sh : 10, 10));
624
							maximumOffset = scrollbar[0].offsetHeight - scroller[0].offsetHeight;
625
							if (noTriggerScroll !== true) {
626
								timeboxparent.trigger('scroll_element.xdsoft_scroller', [percentage || Math.abs(parseInt(timebox.css('marginTop'), 10)) / (height - parentHeight)]);
627
							}
628
						}
629
					});
630
631
				timeboxparent.on('mousewheel', function (event) {
632
					var top = Math.abs(parseInt(timebox.css('marginTop'), 10));
633
634
					top = top - (event.deltaY * 20);
635
					if (top < 0) {
636
						top = 0;
637
					}
638
639
					timeboxparent.trigger('scroll_element.xdsoft_scroller', [top / (height - parentHeight)]);
640
					event.stopPropagation();
641
					return false;
642
				});
643
644
				timeboxparent.on('touchstart', function (event) {
645
					start = pointerEventToXY(event);
646
					startTop = Math.abs(parseInt(timebox.css('marginTop'), 10));
647
				});
648
649
				timeboxparent.on('touchmove', function (event) {
650
					if (start) {
651
						event.preventDefault();
652
						var coord = pointerEventToXY(event);
653
						timeboxparent.trigger('scroll_element.xdsoft_scroller', [(startTop - (coord.y - start.y)) / (height - parentHeight)]);
654
					}
655
				});
656
657
				timeboxparent.on('touchend touchcancel', function (event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
658
					start = false;
659
					startTop = 0;
660
				});
661
			}
662
			timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
663
		});
664
	};
665
666
	$.fn.datetimepicker = function (opt) {
667
		var KEY0 = 48,
668
			KEY9 = 57,
669
			_KEY0 = 96,
670
			_KEY9 = 105,
671
			CTRLKEY = 17,
672
			DEL = 46,
673
			ENTER = 13,
674
			ESC = 27,
675
			BACKSPACE = 8,
676
			ARROWLEFT = 37,
677
			ARROWUP = 38,
678
			ARROWRIGHT = 39,
679
			ARROWDOWN = 40,
680
			TAB = 9,
681
			F5 = 116,
682
			AKEY = 65,
683
			CKEY = 67,
684
			VKEY = 86,
685
			ZKEY = 90,
686
			YKEY = 89,
687
			ctrlDown	=	false,
688
			options = ($.isPlainObject(opt) || !opt) ? $.extend(true, {}, default_options, opt) : $.extend(true, {}, default_options),
689
690
			lazyInitTimer = 0,
691
			createDateTimePicker,
692
			destroyDateTimePicker,
693
694
			lazyInit = function (input) {
695
				input
696
					.on('open.xdsoft focusin.xdsoft mousedown.xdsoft', function initOnActionCallback(event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
697
						if (input.is(':disabled') || input.is(':hidden') || !input.is(':visible') || input.data('xdsoft_datetimepicker')) {
698
							return;
699
						}
700
						clearTimeout(lazyInitTimer);
701
						lazyInitTimer = setTimeout(function () {
702
703
							if (!input.data('xdsoft_datetimepicker')) {
704
								createDateTimePicker(input);
705
							}
706
							input
707
								.off('open.xdsoft focusin.xdsoft mousedown.xdsoft', initOnActionCallback)
708
								.trigger('open.xdsoft');
709
						}, 100);
710
					});
711
			};
712
713
		createDateTimePicker = function (input) {
714
			var datetimepicker = $('<div ' + (options.id ? 'id="' + options.id + '"' : '') + ' ' + (options.style ? 'style="' + options.style + '"' : '') + ' class="xdsoft_datetimepicker xdsoft_' + options.theme + ' xdsoft_noselect ' + (options.weeks ? ' xdsoft_showweeks' : '') + options.className + '"></div>'),
715
				xdsoft_copyright = $('<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>'),
716
				datepicker = $('<div class="xdsoft_datepicker active"></div>'),
717
				mounth_picker = $('<div class="xdsoft_mounthpicker"><button type="button" class="xdsoft_prev"></button><button type="button" class="xdsoft_today_button"></button>' +
718
					'<div class="xdsoft_label xdsoft_month"><span></span><i></i></div>' +
719
					'<div class="xdsoft_label xdsoft_year"><span></span><i></i></div>' +
720
					'<button type="button" class="xdsoft_next"></button></div>'),
721
				calendar = $('<div class="xdsoft_calendar"></div>'),
722
				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>'),
723
				timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
724
				timebox = $('<div class="xdsoft_time_variant"></div>'),
725
				/*scrollbar = $('<div class="xdsoft_scrollbar"></div>'),
726
				scroller = $('<div class="xdsoft_scroller"></div>'),*/
727
				monthselect = $('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
728
				yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
729
				triggerAfterOpen = false,
730
				XDSoft_datetime,
731
				//scroll_element,
732
				xchangeTimer,
733
				timerclick,
734
				current_time_index,
735
				setPos,
736
				timer = 0,
737
				timer1 = 0,
738
				_xdsoft_datetime;
739
740
			mounth_picker
741
				.find('.xdsoft_month span')
742
					.after(monthselect);
743
			mounth_picker
744
				.find('.xdsoft_year span')
745
					.after(yearselect);
746
747
			mounth_picker
748
				.find('.xdsoft_month,.xdsoft_year')
749
					.on('mousedown.xdsoft', function (event) {
750
					var select = $(this).find('.xdsoft_select').eq(0),
751
						val = 0,
752
						top = 0,
753
						visible = select.is(':visible'),
754
						items,
755
						i;
756
757
					mounth_picker
758
						.find('.xdsoft_select')
759
							.hide();
760
					if (_xdsoft_datetime.currentTime) {
761
						val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month') ? 'getMonth' : 'getFullYear']();
762
					}
763
764
					select[visible ? 'hide' : 'show']();
765
					for (items = select.find('div.xdsoft_option'), i = 0; i < items.length; i += 1) {
766
						if (items.eq(i).data('value') === val) {
767
							break;
768
						} else {
769
							top += items[0].offsetHeight;
770
						}
771
					}
772
773
					select.xdsoftScroller(top / (select.children()[0].offsetHeight - (select[0].clientHeight)));
774
					event.stopPropagation();
775
					return false;
776
				});
777
778
			mounth_picker
779
				.find('.xdsoft_select')
780
					.xdsoftScroller()
781
				.on('mousedown.xdsoft', function (event) {
782
					event.stopPropagation();
783
					event.preventDefault();
784
				})
785
				.on('mousedown.xdsoft', '.xdsoft_option', function (event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
786
					var year = _xdsoft_datetime.currentTime.getFullYear();
787
					if (_xdsoft_datetime && _xdsoft_datetime.currentTime) {
788
						_xdsoft_datetime.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect') ? 'setMonth' : 'setFullYear']($(this).data('value'));
789
					}
790
791
					$(this).parent().parent().hide();
792
793
					datetimepicker.trigger('xchange.xdsoft');
794
					if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
795
						options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
0 ignored issues
show
Bug introduced by
The variable _xdsoft_datetime does not seem to be initialized in case _xdsoft_datetime && _xdsoft_datetime.currentTime on line 787 is false. Are you sure this can never be the case?
Loading history...
796
					}
797
798
					if (year !== _xdsoft_datetime.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
799
						options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
800
					}
801
				});
802
803
			datetimepicker.setOptions = function (_options) {
804
				options = $.extend(true, {}, options, _options);
805
806
				if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
807
					options.allowTimes = $.extend(true, [], _options.allowTimes);
808
				}
809
810
				if (_options.weekends && $.isArray(_options.weekends) && _options.weekends.length) {
811
					options.weekends = $.extend(true, [], _options.weekends);
812
				}
813
814
				if (_options.disabledDates && $.isArray(_options.disabledDates) && _options.disabledDates.length) {
815
                    options.disabledDates = $.extend(true, [], _options.disabledDates);
816
                }
817
818
				if ((options.open || options.opened) && (!options.inline)) {
819
					input.trigger('open.xdsoft');
820
				}
821
822
				if (options.inline) {
823
					triggerAfterOpen = true;
824
					datetimepicker.addClass('xdsoft_inline');
825
					input.after(datetimepicker).hide();
826
				}
827
828
				if (options.inverseButton) {
829
					options.next = 'xdsoft_prev';
830
					options.prev = 'xdsoft_next';
831
				}
832
833
				if (options.datepicker) {
834
					datepicker.addClass('active');
835
				} else {
836
					datepicker.removeClass('active');
837
				}
838
839
				if (options.timepicker) {
840
					timepicker.addClass('active');
841
				} else {
842
					timepicker.removeClass('active');
843
				}
844
845
				if (options.value) {
846
					if (input && input.val) {
847
						input.val(options.value);
848
					}
849
					_xdsoft_datetime.setCurrentTime(options.value);
850
				}
851
852
				if (isNaN(options.dayOfWeekStart)) {
853
					options.dayOfWeekStart = 0;
854
				} else {
855
					options.dayOfWeekStart = parseInt(options.dayOfWeekStart, 10) % 7;
856
				}
857
858
				if (!options.timepickerScrollbar) {
859
					timeboxparent.xdsoftScroller('hide');
860
				}
861
862
				if (options.minDate && /^-(.*)$/.test(options.minDate)) {
863
					options.minDate = _xdsoft_datetime.strToDateTime(options.minDate).dateFormat(options.formatDate);
864
				}
865
866
				if (options.maxDate &&  /^\+(.*)$/.test(options.maxDate)) {
867
					options.maxDate = _xdsoft_datetime.strToDateTime(options.maxDate).dateFormat(options.formatDate);
868
				}
869
870
				mounth_picker
871
					.find('.xdsoft_today_button')
872
						.css('visibility', !options.todayButton ? 'hidden' : 'visible');
873
874
				if (options.mask) {
875
					var e,
0 ignored issues
show
Unused Code introduced by
The variable e seems to be never used. Consider removing it.
Loading history...
876
						getCaretPos = function (input) {
877
							try {
878
								if (document.selection && document.selection.createRange) {
879
									var range = document.selection.createRange();
880
									return range.getBookmark().charCodeAt(2) - 2;
881
								}
882
								if (input.setSelectionRange) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if input.setSelectionRange is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
883
									return input.selectionStart;
884
								}
885
							} catch (e) {
886
								return 0;
887
							}
888
						},
889
						setCaretPos = function (node, pos) {
890
							node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
891
							if (!node) {
892
								return false;
893
							}
894
							if (node.createTextRange) {
895
								var textRange = node.createTextRange();
896
								textRange.collapse(true);
897
								textRange.moveEnd('character', pos);
898
								textRange.moveStart('character', pos);
899
								textRange.select();
900
								return true;
901
							}
902
							if (node.setSelectionRange) {
903
								node.setSelectionRange(pos, pos);
904
								return true;
905
							}
906
							return false;
907
						},
908
						isValidValue = function (mask, value) {
909
							var reg = mask
910
								.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
911
								.replace(/_/g, '{digit+}')
912
								.replace(/([0-9]{1})/g, '{digit$1}')
913
								.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
914
								.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
915
							return (new RegExp(reg)).test(value);
916
						};
917
					input.off('keydown.xdsoft');
918
919
					if (options.mask === true) {
920
						options.mask = options.format
921
							.replace(/Y/g, '9999')
922
							.replace(/F/g, '9999')
923
							.replace(/m/g, '19')
924
							.replace(/d/g, '39')
925
							.replace(/H/g, '29')
926
							.replace(/i/g, '59')
927
							.replace(/s/g, '59');
928
					}
929
930
					if ($.type(options.mask) === 'string') {
931
						if (!isValidValue(options.mask, input.val())) {
932
							input.val(options.mask.replace(/[0-9]/g, '_'));
933
						}
934
935
						input.on('keydown.xdsoft', function (event) {
936
							var val = this.value,
937
								key = event.which,
938
								pos,
939
								digit;
940
941
							if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
942
								pos = getCaretPos(this);
943
								digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
944
945
								if ((key === BACKSPACE || key === DEL) && pos) {
946
									pos -= 1;
947
									digit = '_';
948
								}
949
950
								while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
951
									pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
952
								}
953
954
								val = val.substr(0, pos) + digit + val.substr(pos + 1);
955
								if ($.trim(val) === '') {
956
									val = options.mask.replace(/[0-9]/g, '_');
957
								} else {
958
									if (pos === options.mask.length) {
959
										event.preventDefault();
960
										return false;
961
									}
962
								}
963
964
								pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
965
								while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
966
									pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
967
								}
968
969
								if (isValidValue(options.mask, val)) {
970
									this.value = val;
971
									setCaretPos(this, pos);
972
								} else if ($.trim(val) === '') {
973
									this.value = options.mask.replace(/[0-9]/g, '_');
974
								} else {
975
									input.trigger('error_input.xdsoft');
976
								}
977
							} else {
978
								if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
979
									return true;
980
								}
981
							}
982
983
							event.preventDefault();
984
							return false;
985
						});
986
					}
987
				}
988
				if (options.validateOnBlur) {
989
					input
990
						.off('blur.xdsoft')
991
						.on('blur.xdsoft', function () {
992
							if (options.allowBlank && !$.trim($(this).val()).length) {
993
								$(this).val(null);
994
								datetimepicker.data('xdsoft_datetime').empty();
995
							} else if (!Date.parseDate($(this).val(), options.format)) {
996
								$(this).val((_xdsoft_datetime.now()).dateFormat(options.format));
997
								datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val());
998
							} else {
999
								datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val());
1000
							}
1001
							datetimepicker.trigger('changedatetime.xdsoft');
1002
						});
1003
				}
1004
				options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
1005
1006
				datetimepicker
1007
					.trigger('xchange.xdsoft')
1008
					.trigger('afterOpen.xdsoft');
1009
			};
1010
1011
			datetimepicker
1012
				.data('options', options)
1013
				.on('mousedown.xdsoft', function (event) {
1014
					event.stopPropagation();
1015
					event.preventDefault();
1016
					yearselect.hide();
1017
					monthselect.hide();
1018
					return false;
1019
				});
1020
1021
			//scroll_element = timepicker.find('.xdsoft_time_box');
1022
			timeboxparent.append(timebox);
1023
			timeboxparent.xdsoftScroller();
1024
1025
			datetimepicker.on('afterOpen.xdsoft', function () {
1026
				timeboxparent.xdsoftScroller();
1027
			});
1028
1029
			datetimepicker
1030
				.append(datepicker)
1031
				.append(timepicker);
1032
1033
			if (options.withoutCopyright !== true) {
1034
				datetimepicker
1035
					.append(xdsoft_copyright);
1036
			}
1037
1038
			datepicker
1039
				.append(mounth_picker)
1040
				.append(calendar);
1041
1042
			$(options.parentID)
1043
				.append(datetimepicker);
1044
1045
			XDSoft_datetime = function () {
1046
				var _this = this;
1047
				_this.now = function (norecursion) {
1048
					var d = new Date(),
1049
						date,
1050
						time;
1051
1052
					if (!norecursion && options.defaultDate) {
1053
						date = _this.strToDate(options.defaultDate);
1054
						d.setFullYear(date.getFullYear());
1055
						d.setMonth(date.getMonth());
1056
						d.setDate(date.getDate());
1057
					}
1058
1059
					if (options.yearOffset) {
1060
						d.setFullYear(d.getFullYear() + options.yearOffset);
1061
					}
1062
1063
					if (!norecursion && options.defaultTime) {
1064
						time = _this.strtotime(options.defaultTime);
1065
						d.setHours(time.getHours());
1066
						d.setMinutes(time.getMinutes());
1067
					}
1068
1069
					return d;
1070
				};
1071
1072
				_this.isValidDate = function (d) {
1073
					if (Object.prototype.toString.call(d) !== "[object Date]") {
1074
						return false;
1075
					}
1076
					return !isNaN(d.getTime());
1077
				};
1078
1079
				_this.setCurrentTime = function (dTime) {
1080
					_this.currentTime = (typeof dTime === 'string') ? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime : _this.now();
1081
					datetimepicker.trigger('xchange.xdsoft');
1082
				};
1083
1084
				_this.empty = function () {
1085
					_this.currentTime = null;
1086
				};
1087
1088
				_this.getCurrentTime = function (dTime) {
0 ignored issues
show
Unused Code introduced by
The parameter dTime is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
1089
					return _this.currentTime;
1090
				};
1091
1092
				_this.nextMonth = function () {
1093
					var month = _this.currentTime.getMonth() + 1,
1094
						year;
1095
					if (month === 12) {
1096
						_this.currentTime.setFullYear(_this.currentTime.getFullYear() + 1);
1097
						month = 0;
1098
					}
1099
1100
					year = _this.currentTime.getFullYear();
1101
1102
					_this.currentTime.setDate(
1103
						Math.min(
1104
							new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1105
							_this.currentTime.getDate()
1106
						)
1107
					);
1108
					_this.currentTime.setMonth(month);
1109
1110
					if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1111
						options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1112
					}
1113
1114
					if (year !== _this.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1115
						options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1116
					}
1117
1118
					datetimepicker.trigger('xchange.xdsoft');
1119
					return month;
1120
				};
1121
1122
				_this.prevMonth = function () {
1123
					var month = _this.currentTime.getMonth() - 1;
1124
					if (month === -1) {
1125
						_this.currentTime.setFullYear(_this.currentTime.getFullYear() - 1);
1126
						month = 11;
1127
					}
1128
					_this.currentTime.setDate(
1129
						Math.min(
1130
							new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1131
							_this.currentTime.getDate()
1132
						)
1133
					);
1134
					_this.currentTime.setMonth(month);
1135
					if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1136
						options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1137
					}
1138
					datetimepicker.trigger('xchange.xdsoft');
1139
					return month;
1140
				};
1141
1142
				_this.getWeekOfYear = function (datetime) {
1143
					var onejan = new Date(datetime.getFullYear(), 0, 1);
1144
					return Math.ceil((((datetime - onejan) / 86400000) + onejan.getDay() + 1) / 7);
1145
				};
1146
1147
				_this.strToDateTime = function (sDateTime) {
1148
					var tmpDate = [], timeOffset, currentTime;
0 ignored issues
show
Unused Code introduced by
The assignment to variable tmpDate seems to be never used. Consider removing it.
Loading history...
1149
1150
					if (sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime)) {
1151
						return sDateTime;
1152
					}
1153
1154
					tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime);
1155
					if (tmpDate) {
1156
						tmpDate[2] = Date.parseDate(tmpDate[2], options.formatDate);
1157
					}
1158
					if (tmpDate  && tmpDate[2]) {
1159
						timeOffset = tmpDate[2].getTime() - (tmpDate[2].getTimezoneOffset()) * 60000;
1160
						currentTime = new Date((_xdsoft_datetime.now()).getTime() + parseInt(tmpDate[1] + '1', 10) * timeOffset);
1161
					} else {
1162
						currentTime = sDateTime ? Date.parseDate(sDateTime, options.format) : _this.now();
1163
					}
1164
1165
					if (!_this.isValidDate(currentTime)) {
1166
						currentTime = _this.now();
1167
					}
1168
1169
					return currentTime;
1170
				};
1171
1172
				_this.strToDate = function (sDate) {
1173
					if (sDate && sDate instanceof Date && _this.isValidDate(sDate)) {
1174
						return sDate;
1175
					}
1176
1177
					var currentTime = sDate ? Date.parseDate(sDate, options.formatDate) : _this.now(true);
1178
					if (!_this.isValidDate(currentTime)) {
1179
						currentTime = _this.now(true);
1180
					}
1181
					return currentTime;
1182
				};
1183
1184
				_this.strtotime = function (sTime) {
1185
					if (sTime && sTime instanceof Date && _this.isValidDate(sTime)) {
1186
						return sTime;
1187
					}
1188
					var currentTime = sTime ? Date.parseDate(sTime, options.formatTime) : _this.now(true);
1189
					if (!_this.isValidDate(currentTime)) {
1190
						currentTime = _this.now(true);
1191
					}
1192
					return currentTime;
1193
				};
1194
1195
				_this.str = function () {
1196
					return _this.currentTime.dateFormat(options.format);
1197
				};
1198
				_this.currentTime = this.now();
1199
			};
1200
1201
			_xdsoft_datetime = new XDSoft_datetime();
1202
1203
			mounth_picker
1204
				.find('.xdsoft_today_button')
1205
				.on('mousedown.xdsoft', function () {
1206
					datetimepicker.data('changed', true);
1207
					_xdsoft_datetime.setCurrentTime(0);
1208
					datetimepicker.trigger('afterOpen.xdsoft');
1209
				}).on('dblclick.xdsoft', function () {
1210
					input.val(_xdsoft_datetime.str());
1211
					datetimepicker.trigger('close.xdsoft');
1212
				});
1213
			mounth_picker
1214
				.find('.xdsoft_prev,.xdsoft_next')
1215
				.on('mousedown.xdsoft', function () {
1216
					var $this = $(this),
1217
						timer = 0,
1218
						stop = false;
1219
1220
					(function arguments_callee1(v) {
1221
						var month =  _xdsoft_datetime.currentTime.getMonth();
0 ignored issues
show
Unused Code introduced by
The variable month seems to be never used. Consider removing it.
Loading history...
1222
						if ($this.hasClass(options.next)) {
1223
							_xdsoft_datetime.nextMonth();
1224
						} else if ($this.hasClass(options.prev)) {
1225
							_xdsoft_datetime.prevMonth();
1226
						}
1227
						if (options.monthChangeSpinner) {
1228
							if (!stop) {
1229
								timer = setTimeout(arguments_callee1, v || 100);
1230
							}
1231
						}
1232
					}(500));
1233
1234
					$([document.body, window]).on('mouseup.xdsoft', function arguments_callee2() {
1235
						clearTimeout(timer);
1236
						stop = true;
1237
						$([document.body, window]).off('mouseup.xdsoft', arguments_callee2);
1238
					});
1239
				});
1240
1241
			timepicker
1242
				.find('.xdsoft_prev,.xdsoft_next')
1243
				.on('mousedown.xdsoft', function () {
1244
					var $this = $(this),
1245
						timer = 0,
1246
						stop = false,
1247
						period = 110;
1248
					(function arguments_callee4(v) {
1249
						var pheight = timeboxparent[0].clientHeight,
1250
							height = timebox[0].offsetHeight,
1251
							top = Math.abs(parseInt(timebox.css('marginTop'), 10));
1252
						if ($this.hasClass(options.next) && (height - pheight) - options.timeHeightInTimePicker >= top) {
1253
							timebox.css('marginTop', '-' + (top + options.timeHeightInTimePicker) + 'px');
1254
						} else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) {
1255
							timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px');
1256
						}
1257
						timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox.css('marginTop'), 10) / (height - pheight))]);
1258
						period = (period > 10) ? 10 : period - 10;
1259
						if (!stop) {
1260
							timer = setTimeout(arguments_callee4, v || period);
1261
						}
1262
					}(500));
1263
					$([document.body, window]).on('mouseup.xdsoft', function arguments_callee5() {
1264
						clearTimeout(timer);
1265
						stop = true;
1266
						$([document.body, window])
1267
							.off('mouseup.xdsoft', arguments_callee5);
1268
					});
1269
				});
1270
1271
			xchangeTimer = 0;
1272
			// base handler - generating a calendar and timepicker
1273
			datetimepicker
1274
				.on('xchange.xdsoft', function (event) {
1275
					clearTimeout(xchangeTimer);
1276
					xchangeTimer = setTimeout(function () {
1277
						var table =	'',
1278
							start = new Date(_xdsoft_datetime.currentTime.getFullYear(), _xdsoft_datetime.currentTime.getMonth(), 1, 12, 0, 0),
1279
							i = 0,
1280
							j,
1281
							today = _xdsoft_datetime.now(),
1282
							maxDate = false,
1283
							minDate = false,
1284
							d,
1285
							y,
1286
							m,
1287
							w,
1288
							classes = [],
0 ignored issues
show
Unused Code introduced by
The assignment to variable classes seems to be never used. Consider removing it.
Loading history...
1289
							customDateSettings,
1290
							newRow = true,
1291
							time = '',
1292
							h = '',
1293
							line_time;
1294
1295
						while (start.getDay() !== options.dayOfWeekStart) {
1296
							start.setDate(start.getDate() - 1);
1297
						}
1298
1299
						table += '<table><thead><tr>';
1300
1301
						if (options.weeks) {
1302
							table += '<th></th>';
1303
						}
1304
1305
						for (j = 0; j < 7; j += 1) {
1306
							table += '<th>' + options.i18n[options.lang].dayOfWeek[(j + options.dayOfWeekStart) % 7] + '</th>';
1307
						}
1308
1309
						table += '</tr></thead>';
1310
						table += '<tbody>';
1311
1312
						if (options.maxDate !== false) {
1313
							maxDate = _xdsoft_datetime.strToDate(options.maxDate);
1314
							maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59, 59, 999);
1315
						}
1316
1317
						if (options.minDate !== false) {
1318
							minDate = _xdsoft_datetime.strToDate(options.minDate);
1319
							minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
1320
						}
1321
1322
						while (i < _xdsoft_datetime.currentTime.countDaysInMonth() || start.getDay() !== options.dayOfWeekStart || _xdsoft_datetime.currentTime.getMonth() === start.getMonth()) {
1323
							classes = [];
1324
							i += 1;
1325
1326
							d = start.getDate();
1327
							y = start.getFullYear();
1328
							m = start.getMonth();
1329
							w = _xdsoft_datetime.getWeekOfYear(start);
1330
1331
							classes.push('xdsoft_date');
1332
1333
							if (options.beforeShowDay && $.isFunction(options.beforeShowDay.call)) {
1334
								customDateSettings = options.beforeShowDay.call(datetimepicker, start);
1335
							} else {
1336
								customDateSettings = null;
1337
							}
1338
1339
							if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
1340
								classes.push('xdsoft_disabled');
1341
							} else if (options.disabledDates.indexOf(start.dateFormat(options.formatDate)) !== -1) {
1342
								classes.push('xdsoft_disabled');
1343
							}
1344
1345
							if (customDateSettings && customDateSettings[1] !== "") {
1346
								classes.push(customDateSettings[1]);
1347
							}
1348
1349
							if (_xdsoft_datetime.currentTime.getMonth() !== m) {
1350
								classes.push('xdsoft_other_month');
1351
							}
1352
1353
							if ((options.defaultSelect || datetimepicker.data('changed')) && _xdsoft_datetime.currentTime.dateFormat(options.formatDate) === start.dateFormat(options.formatDate)) {
1354
								classes.push('xdsoft_current');
1355
							}
1356
1357
							if (today.dateFormat(options.formatDate) === start.dateFormat(options.formatDate)) {
1358
								classes.push('xdsoft_today');
1359
							}
1360
1361
							if (start.getDay() === 0 || start.getDay() === 6 || options.weekends.indexOf(start.dateFormat(options.formatDate)) === -1) {
1362
								classes.push('xdsoft_weekend');
1363
							}
1364
1365
							if (options.beforeShowDay && $.isFunction(options.beforeShowDay)) {
1366
								classes.push(options.beforeShowDay(start));
1367
							}
1368
1369
							if (newRow) {
1370
								table += '<tr>';
1371
								newRow = false;
1372
								if (options.weeks) {
1373
									table += '<th>' + w + '</th>';
1374
								}
1375
							}
1376
1377
							table += '<td data-date="' + d + '" data-month="' + m + '" data-year="' + y + '"' + ' class="xdsoft_date xdsoft_day_of_week' + start.getDay() + ' ' + classes.join(' ') + '">' +
1378
										'<div>' + d + '</div>' +
1379
									'</td>';
1380
1381
							if (start.getDay() === options.dayOfWeekStartPrev) {
1382
								table += '</tr>';
1383
								newRow = true;
1384
							}
1385
1386
							start.setDate(d + 1);
1387
						}
1388
						table += '</tbody></table>';
1389
1390
						calendar.html(table);
1391
1392
						mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[_xdsoft_datetime.currentTime.getMonth()]);
1393
						mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear());
1394
1395
						// generate timebox
1396
						time = '';
1397
						h = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable h seems to be never used. Consider removing it.
Loading history...
1398
						m = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable m seems to be never used. Consider removing it.
Loading history...
1399
						line_time = function line_time(h, m) {
1400
							var now = _xdsoft_datetime.now();
1401
							now.setHours(h);
1402
							h = parseInt(now.getHours(), 10);
1403
							now.setMinutes(m);
1404
							m = parseInt(now.getMinutes(), 10);
1405
							var optionDateTime = new Date(_xdsoft_datetime.currentTime)
1406
							optionDateTime.setHours(h);
1407
							optionDateTime.setMinutes(m);
1408
							classes = [];
1409
							if((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) {
1410
								classes.push('xdsoft_disabled');
1411
							}
1412
							if ((options.initTime || options.defaultSelect || datetimepicker.data('changed')) && parseInt(_xdsoft_datetime.currentTime.getHours(), 10) === parseInt(h, 10) && (options.step > 59 || Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes() / options.step) * options.step === parseInt(m, 10))) {
1413
								if (options.defaultSelect || datetimepicker.data('changed')) {
1414
									classes.push('xdsoft_current');
1415
								} else if (options.initTime) {
1416
									classes.push('xdsoft_init_time');
1417
								}
1418
							}
1419
							if (parseInt(today.getHours(), 10) === parseInt(h, 10) && parseInt(today.getMinutes(), 10) === parseInt(m, 10)) {
1420
								classes.push('xdsoft_today');
1421
							}
1422
							time += '<div class="xdsoft_time ' + classes.join(' ') + '" data-hour="' + h + '" data-minute="' + m + '">' + now.dateFormat(options.formatTime) + '</div>';
1423
						};
1424
1425
						if (!options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length) {
1426
							for (i = 0, j = 0; i < (options.hours12 ? 12 : 24); i += 1) {
0 ignored issues
show
Unused Code introduced by
The assignment to variable j seems to be never used. Consider removing it.
Loading history...
1427
								for (j = 0; j < 60; j += options.step) {
1428
									h = (i < 10 ? '0' : '') + i;
1429
									m = (j < 10 ? '0' : '') + j;
1430
									line_time(h, m);
1431
								}
1432
							}
1433
						} else {
1434
							for (i = 0; i < options.allowTimes.length; i += 1) {
1435
								h = _xdsoft_datetime.strtotime(options.allowTimes[i]).getHours();
1436
								m = _xdsoft_datetime.strtotime(options.allowTimes[i]).getMinutes();
1437
								line_time(h, m);
1438
							}
1439
						}
1440
1441
						timebox.html(time);
1442
1443
						opt = '';
1444
						i = 0;
0 ignored issues
show
Unused Code introduced by
The assignment to variable i seems to be never used. Consider removing it.
Loading history...
1445
1446
						for (i = parseInt(options.yearStart, 10) + options.yearOffset; i <= parseInt(options.yearEnd, 10) + options.yearOffset; i += 1) {
1447
							opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getFullYear() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + i + '</div>';
0 ignored issues
show
Bug introduced by
The variable opt is changed as part of the for loop for example by "<div class="xdsoft_opti...i + "">" + i + "</div>" on line 1447. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
1448
						}
1449
						yearselect.children().eq(0)
1450
												.html(opt);
1451
1452
						for (i = 0, opt = ''; i <= 11; i += 1) {
1453
							opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getMonth() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + options.i18n[options.lang].months[i] + '</div>';
1454
						}
1455
						monthselect.children().eq(0).html(opt);
1456
						$(datetimepicker)
1457
							.trigger('generate.xdsoft');
1458
					}, 10);
1459
					event.stopPropagation();
1460
				})
1461
				.on('afterOpen.xdsoft', function () {
1462
					if (options.timepicker) {
1463
						var classType, pheight, height, top;
1464
						if (timebox.find('.xdsoft_current').length) {
1465
							classType = '.xdsoft_current';
1466
						} else if (timebox.find('.xdsoft_init_time').length) {
1467
							classType = '.xdsoft_init_time';
1468
						}
1469
						if (classType) {
1470
							pheight = timeboxparent[0].clientHeight;
1471
							height = timebox[0].offsetHeight;
1472
							top = timebox.find(classType).index() * options.timeHeightInTimePicker + 1;
1473
							if ((height - pheight) < top) {
1474
								top = height - pheight;
1475
							}
1476
							timeboxparent.trigger('scroll_element.xdsoft_scroller', [parseInt(top, 10) / (height - pheight)]);
1477
						} else {
1478
							timeboxparent.trigger('scroll_element.xdsoft_scroller', [0]);
1479
						}
1480
					}
1481
				});
1482
1483
			timerclick = 0;
1484
			calendar
1485
				.on('click.xdsoft', 'td', function (xdevent) {
1486
					xdevent.stopPropagation();  // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
1487
					timerclick += 1;
1488
					var $this = $(this),
1489
						currentTime = _xdsoft_datetime.currentTime;
1490
1491
					if (currentTime === undefined || currentTime === null) {
1492
						_xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1493
						currentTime = _xdsoft_datetime.currentTime;
1494
					}
1495
1496
					if ($this.hasClass('xdsoft_disabled')) {
1497
						return false;
1498
					}
1499
1500
					currentTime.setDate(1);
1501
					currentTime.setFullYear($this.data('year'));
1502
					currentTime.setMonth($this.data('month'));
1503
					currentTime.setDate($this.data('date'));
1504
1505
					datetimepicker.trigger('select.xdsoft', [currentTime]);
1506
1507
					input.val(_xdsoft_datetime.str());
1508
					if ((timerclick > 1 || (options.closeOnDateSelect === true || (options.closeOnDateSelect === 0 && !options.timepicker))) && !options.inline) {
1509
						datetimepicker.trigger('close.xdsoft');
1510
					}
1511
1512
					if (options.onSelectDate &&	$.isFunction(options.onSelectDate)) {
1513
						options.onSelectDate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
1514
					}
1515
1516
					datetimepicker.data('changed', true);
1517
					datetimepicker.trigger('xchange.xdsoft');
1518
					datetimepicker.trigger('changedatetime.xdsoft');
1519
					setTimeout(function () {
1520
						timerclick = 0;
1521
					}, 200);
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1522
				});
1523
1524
			timebox
1525
				.on('click.xdsoft', 'div', function (xdevent) {
1526
					xdevent.stopPropagation();
1527
					var $this = $(this),
1528
						currentTime = _xdsoft_datetime.currentTime;
1529
1530
					if (currentTime === undefined || currentTime === null) {
1531
						_xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1532
						currentTime = _xdsoft_datetime.currentTime;
1533
					}
1534
1535
					if ($this.hasClass('xdsoft_disabled')) {
1536
						return false;
1537
					}
1538
					currentTime.setHours($this.data('hour'));
1539
					currentTime.setMinutes($this.data('minute'));
1540
					datetimepicker.trigger('select.xdsoft', [currentTime]);
1541
1542
					datetimepicker.data('input').val(_xdsoft_datetime.str());
1543
					if (!options.inline) {
1544
						datetimepicker.trigger('close.xdsoft');
1545
					}
1546
1547
					if (options.onSelectTime && $.isFunction(options.onSelectTime)) {
1548
						options.onSelectTime.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
1549
					}
1550
					datetimepicker.data('changed', true);
1551
					datetimepicker.trigger('xchange.xdsoft');
1552
					datetimepicker.trigger('changedatetime.xdsoft');
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1553
				});
1554
1555
1556
			datepicker
1557
				.on('mousewheel.xdsoft', function (event) {
1558
					if (!options.scrollMonth) {
1559
						return true;
1560
					}
1561
					if (event.deltaY < 0) {
1562
						_xdsoft_datetime.nextMonth();
1563
					} else {
1564
						_xdsoft_datetime.prevMonth();
1565
					}
1566
					return false;
1567
				});
1568
1569
			input
1570
				.on('mousewheel.xdsoft', function (event) {
1571
					if (!options.scrollInput) {
1572
						return true;
1573
					}
1574
					if (!options.datepicker && options.timepicker) {
1575
						current_time_index = timebox.find('.xdsoft_current').length ? timebox.find('.xdsoft_current').eq(0).index() : 0;
1576
						if (current_time_index + event.deltaY >= 0 && current_time_index + event.deltaY < timebox.children().length) {
1577
							current_time_index += event.deltaY;
1578
						}
1579
						if (timebox.children().eq(current_time_index).length) {
1580
							timebox.children().eq(current_time_index).trigger('mousedown');
1581
						}
1582
						return false;
1583
					}
1584
					if (options.datepicker && !options.timepicker) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if options.datepicker && !options.timepicker is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1585
						datepicker.trigger(event, [event.deltaY, event.deltaX, event.deltaY]);
1586
						if (input.val) {
1587
							input.val(_xdsoft_datetime.str());
1588
						}
1589
						datetimepicker.trigger('changedatetime.xdsoft');
1590
						return false;
1591
					}
1592
				});
1593
1594
			datetimepicker
1595
				.on('changedatetime.xdsoft', function (event) {
1596
					if (options.onChangeDateTime && $.isFunction(options.onChangeDateTime)) {
1597
						var $input = datetimepicker.data('input');
1598
						options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input, event);
1599
						delete options.value;
1600
						$input.trigger('change');
1601
					}
1602
				})
1603
				.on('generate.xdsoft', function () {
1604
					if (options.onGenerate && $.isFunction(options.onGenerate)) {
1605
						options.onGenerate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1606
					}
1607
					if (triggerAfterOpen) {
1608
						datetimepicker.trigger('afterOpen.xdsoft');
1609
						triggerAfterOpen = false;
1610
					}
1611
				})
1612
				.on('click.xdsoft', function (xdevent) {
1613
					xdevent.stopPropagation();
1614
				});
1615
1616
			current_time_index = 0;
1617
1618
			setPos = function () {
1619
				var offset = datetimepicker.data('input').offset(), top = offset.top + datetimepicker.data('input')[0].offsetHeight - 1, left = offset.left, position = "absolute";
1620
				if (options.fixed) {
1621
					top -= $(window).scrollTop();
1622
					left -= $(window).scrollLeft();
1623
					position = "fixed";
1624
				} else {
1625
					if (top + datetimepicker[0].offsetHeight > $(window).height() + $(window).scrollTop()) {
1626
						top = offset.top - datetimepicker[0].offsetHeight + 1;
1627
					}
1628
					if (top < 0) {
1629
						top = 0;
1630
					}
1631
					if (left + datetimepicker[0].offsetWidth > $(window).width()) {
1632
						left = $(window).width() - datetimepicker[0].offsetWidth;
1633
					}
1634
				}
1635
				datetimepicker.css({
1636
					left: left,
1637
					top: top,
1638
					position: position
1639
				});
1640
			};
1641
			datetimepicker
1642
				.on('open.xdsoft', function (event) {
1643
					var onShow = true;
1644
					if (options.onShow && $.isFunction(options.onShow)) {
1645
						onShow = options.onShow.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
1646
					}
1647
					if (onShow !== false) {
1648
						datetimepicker.show();
1649
						setPos();
1650
						$(window)
1651
							.off('resize.xdsoft', setPos)
1652
							.on('resize.xdsoft', setPos);
1653
1654
						if (options.closeOnWithoutClick) {
1655
							$([document.body, window]).on('mousedown.xdsoft', function arguments_callee6() {
1656
								datetimepicker.trigger('close.xdsoft');
1657
								$([document.body, window]).off('mousedown.xdsoft', arguments_callee6);
1658
							});
1659
						}
1660
					}
1661
				})
1662
				.on('close.xdsoft', function (event) {
1663
					var onClose = true;
1664
					mounth_picker
1665
						.find('.xdsoft_month,.xdsoft_year')
1666
							.find('.xdsoft_select')
1667
								.hide();
1668
					if (options.onClose && $.isFunction(options.onClose)) {
1669
						onClose = options.onClose.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
1670
					}
1671
					if (onClose !== false && !options.opened && !options.inline) {
1672
						datetimepicker.hide();
1673
					}
1674
					event.stopPropagation();
1675
				})
1676
				.on('toggle.xdsoft', function (event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
1677
					if (datetimepicker.is(':visible')) {
1678
						datetimepicker.trigger('close.xdsoft');
1679
					} else {
1680
						datetimepicker.trigger('open.xdsoft');
1681
					}
1682
				})
1683
				.data('input', input);
1684
1685
			timer = 0;
1686
			timer1 = 0;
0 ignored issues
show
Unused Code introduced by
The variable timer1 seems to be never used. Consider removing it.
Loading history...
1687
1688
			datetimepicker.data('xdsoft_datetime', _xdsoft_datetime);
1689
			datetimepicker.setOptions(options);
1690
1691
			function getCurrentValue() {
1692
1693
				var ct = false, time;
0 ignored issues
show
Unused Code introduced by
The assignment to variable ct seems to be never used. Consider removing it.
Loading history...
1694
1695
				if (options.startDate) {
1696
					ct = _xdsoft_datetime.strToDate(options.startDate);
1697
				} else {
1698
					ct = options.value || ((input && input.val && input.val()) ? input.val() : '');
1699
					if (ct) {
1700
						ct = _xdsoft_datetime.strToDateTime(ct);
1701
					} else if (options.defaultDate) {
1702
						ct = _xdsoft_datetime.strToDate(options.defaultDate);
1703
						if (options.defaultTime) {
1704
							time = _xdsoft_datetime.strtotime(options.defaultTime);
1705
							ct.setHours(time.getHours());
1706
							ct.setMinutes(time.getMinutes());
1707
						}
1708
					}
1709
				}
1710
1711
				if (ct && _xdsoft_datetime.isValidDate(ct)) {
1712
					datetimepicker.data('changed', true);
1713
				} else {
1714
					ct = '';
1715
				}
1716
1717
				return ct || 0;
1718
			}
1719
1720
			_xdsoft_datetime.setCurrentTime(getCurrentValue());
1721
1722
			input
1723
				.data('xdsoft_datetimepicker', datetimepicker)
1724
				.on('open.xdsoft focusin.xdsoft mousedown.xdsoft', function (event) {
0 ignored issues
show
Unused Code introduced by
The parameter event is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
1725
					if (input.is(':disabled') || input.is(':hidden') || !input.is(':visible') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) {
1726
						return;
1727
					}
1728
					clearTimeout(timer);
1729
					timer = setTimeout(function () {
1730
						if (input.is(':disabled') || input.is(':hidden') || !input.is(':visible')) {
1731
							return;
1732
						}
1733
1734
						triggerAfterOpen = true;
1735
						_xdsoft_datetime.setCurrentTime(getCurrentValue());
1736
1737
						datetimepicker.trigger('open.xdsoft');
1738
					}, 100);
1739
				})
1740
				.on('keydown.xdsoft', function (event) {
1741
					var val = this.value, elementSelector,
0 ignored issues
show
Unused Code introduced by
The variable val seems to be never used. Consider removing it.
Loading history...
1742
						key = event.which;
1743
					if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) {
1744
						elementSelector = $("input:visible,textarea:visible");
1745
						datetimepicker.trigger('close.xdsoft');
1746
						elementSelector.eq(elementSelector.index(this) + 1).focus();
1747
						return false;
1748
					}
1749
					if ([TAB].indexOf(key) !== -1) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if [TAB].indexOf(key) !== -1 is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1750
						datetimepicker.trigger('close.xdsoft');
1751
						return true;
1752
					}
1753
				});
1754
		};
1755
		destroyDateTimePicker = function (input) {
1756
			var datetimepicker = input.data('xdsoft_datetimepicker');
1757
			if (datetimepicker) {
1758
				datetimepicker.data('xdsoft_datetime', null);
1759
				datetimepicker.remove();
1760
				input
1761
					.data('xdsoft_datetimepicker', null)
1762
					.off('.xdsoft');
1763
				$(window).off('resize.xdsoft');
1764
				$([window, document.body]).off('mousedown.xdsoft');
1765
				if (input.unmousewheel) {
1766
					input.unmousewheel();
1767
				}
1768
			}
1769
		};
1770
		$(document)
1771
			.off('keydown.xdsoftctrl keyup.xdsoftctrl')
1772
			.on('keydown.xdsoftctrl', function (e) {
1773
				if (e.keyCode === CTRLKEY) {
1774
					ctrlDown = true;
1775
				}
1776
			})
1777
			.on('keyup.xdsoftctrl', function (e) {
1778
				if (e.keyCode === CTRLKEY) {
1779
					ctrlDown = false;
1780
				}
1781
			});
1782
		return this.each(function () {
1783
			var datetimepicker = $(this).data('xdsoft_datetimepicker');
1784
			if (datetimepicker) {
1785
				if ($.type(opt) === 'string') {
1786
					switch (opt) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, switch statements should have a default case.
Loading history...
1787
					case 'show':
1788
						$(this).select().focus();
1789
						datetimepicker.trigger('open.xdsoft');
1790
						break;
1791
					case 'hide':
1792
						datetimepicker.trigger('close.xdsoft');
1793
						break;
1794
					case 'toggle':
1795
						datetimepicker.trigger('toggle.xdsoft');
1796
						break;
1797
					case 'destroy':
1798
						destroyDateTimePicker($(this));
1799
						break;
1800
					case 'reset':
1801
						this.value = this.defaultValue;
1802
						if (!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(Date.parseDate(this.value, options.format))) {
1803
							datetimepicker.data('changed', false);
1804
						}
1805
						datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value);
1806
						break;
1807
					}
1808
				} else {
1809
					datetimepicker
1810
						.setOptions(opt);
1811
				}
1812
				return 0;
1813
			}
1814
			if ($.type(opt) !== 'string') {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if $.type(opt) !== "string" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1815
				if (!options.lazyInit || options.open || options.inline) {
1816
					createDateTimePicker($(this));
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1817
				} else {
1818
					lazyInit($(this));
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1819
				}
1820
			}
1821
		});
1822
	};
1823
	$.fn.datetimepicker.defaults = default_options;
1824
}(jQuery));
1825
(function () {
1826
1827
/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
1828
 * Licensed under the MIT License (LICENSE.txt).
1829
 *
1830
 * Version: 3.1.12
1831
 *
1832
 * Requires: jQuery 1.2.2+
1833
 */
1834
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if b = a.event.fix(g), b.ty...* l, 0 !== m || 0 !== l is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
Comprehensibility introduced by
Usage of the sequence operator is discouraged, since it may lead to obfuscated code.

The sequence or comma operator allows the inclusion of multiple expressions where only is permitted. The result of the sequence is the value of the last expression.

This operator is most often used in for statements.

Used in another places it can make code hard to read, especially when people do not realize it even exists as a seperate operator.

This check looks for usage of the sequence operator in locations where it is not necessary and could be replaced by a series of expressions or statements.

var a,b,c;

a = 1, b = 1,  c= 3;

could just as well be written as:

var a,b,c;

a = 1;
b = 1;
c = 3;

To learn more about the sequence operator, please refer to the MDN.

Loading history...
Bug introduced by
The variable define seems to be never declared. If this is a global, consider adding a /** global: define */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
1835
1836
// Parse and Format Library
1837
//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/
1838
/*
1839
 * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
1840
 *
1841
 * This program is free software; you can redistribute it and/or modify it
1842
 * under the terms of the GNU Lesser General Public License as published by the
1843
 * Free Software Foundation, version 2.1.
1844
 *
1845
 * This program is distributed in the hope that it will be useful, but WITHOUT
1846
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1847
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
1848
 * details.
1849
 */
1850
Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(b){if(b=="unixtime"){return parseInt(this.getTime()/1000);}if(Date.formatFunctions[b]==null){Date.createNewFormat(b);}var a=Date.formatFunctions[b];return this[a]();};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(a){switch(a){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(a)+"' + ";}};Date.parseDate=function(a,c){if(c=="unixtime"){return new Date(!isNaN(parseInt(a))?parseInt(a)*1000:0);}if(Date.parseFunctions[c]==null){Date.createParser(c);}var b=Date.parseFunctions[c];return Date[b](a);};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) {\nvar y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, z = -1;\nvar d = new Date();\ny = d.getFullYear();\nm = d.getMonth();\nd = d.getDate();\nvar results = input.match(Date.parseRegexes["+regexNum+"]);\nif (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 && z > 0){\nvar doyDate = new Date(y,0);\ndoyDate.setDate(z);\nm = doyDate.getMonth();\nd = doyDate.getDate();\n}";code+="if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n{return new Date(y, m, d, h, i, s);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n{return new Date(y, m, d, h, i);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0)\n{return new Date(y, m, d, h);}\nelse if (y > 0 && m >= 0 && d > 0)\n{return new Date(y, m, d);}\nelse if (y > 0 && m >= 0)\n{return new Date(y, m);}\nelse if (y > 0)\n{return new Date(y);}\n}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(b,a){switch(b){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["+a+"], 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:1,c:"z = parseInt(results["+a+"], 10);\n",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["+a+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"]], 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["+a+"], 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["+a+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+a+"], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+a+"] == 'am') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+a+"] == 'AM') {\nif (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["+a+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+a+"], 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(b)};}};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(Math.abs(this.getTimezoneOffset())/60),2,"0")+String.leftPad(Math.abs(this.getTimezoneOffset())%60,2,"0");};Date.prototype.getDayOfYear=function(){var a=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var b=0;b<this.getMonth();++b){a+=Date.daysInMonth[b];}return a+this.getDate();};Date.prototype.getWeekOfYear=function(){var b=this.getDayOfYear()+(4-this.getDay());var a=new Date(this.getFullYear(),0,1);var c=(7-a.getDay()+4);return String.leftPad(Math.ceil((b-c)/7)+1,2,"0");};Date.prototype.isLeapYear=function(){var a=this.getFullYear();return((a&3)==0&&(a%100||(a%400==0&&a)));};Date.prototype.getFirstDayOfMonth=function(){var a=(this.getDay()-(this.getDate()-1))%7;return(a<0)?(a+7):a;};Date.prototype.getLastDayOfMonth=function(){var a=(this.getDay()+(Date.daysInMonth[this.getMonth()]-this.getDate()))%7;return(a<0)?(a+7):a;};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(a){return a.replace(/('|\\)/g,"\\$1");};String.leftPad=function(d,b,c){var a=new String(d);if(c==null){c=" ";}while(a.length<b){a=c+a;}return a;};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"};
0 ignored issues
show
Security Performance introduced by
Calls to eval are slow and potentially dangerous, especially on untrusted code. Please consider whether there is another way to achieve your goal.
Loading history...
Bug introduced by
The variable obj seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.obj.
Loading history...
Compatibility Best Practice introduced by
You are extending the built-in type String. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
Compatibility Best Practice introduced by
You are extending the built-in type Date. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
1851
}());
1852