2013-12-31 11:02:09 +00:00
/ * *
2014-08-06 05:10:17 +00:00
* @ preserve jQuery DateTimePicker plugin v2 . 3.4
2013-11-19 09:20:05 +00:00
* @ homepage http : //xdsoft.net/jqplugins/datetimepicker/
2014-01-09 08:21:23 +00:00
* ( c ) 2014 , Chupurnov Valeriy .
2013-11-03 10:11:36 +00:00
* /
2013-12-16 03:51:07 +00:00
( function ( $ ) {
2014-05-25 18:55:05 +00:00
'use strict' ;
2013-12-24 11:59:06 +00:00
var default _options = {
i18n : {
2014-08-12 16:24:53 +00:00
ar : { // Arabic
months : [
"كانون الثاني" , "شباط" , "آذار" , "نيسان" , "مايو" , "حزيران" , "تموز" , "آب" , "أيلول" , "تشرين الأول" , "تشرين الثاني" , "كانون الأول"
] ,
dayOfWeek : [
"ن" , "ث" , "ع" , "خ" , "ج" , "س" , "ح"
]
} ,
ro : { // Romanian
months : [
"ianuarie" , "februarie" , "martie" , "aprilie" , "mai" , "iunie" , "iulie" , "august" , "septembrie" , "octombrie" , "noiembrie" , "decembrie"
] ,
dayOfWeek : [
"l" , "ma" , "mi" , "j" , "v" , "s" , "d"
]
} ,
id : { // Indonesian
months : [
"Januari" , "Februari" , "Maret" , "April" , "Mei" , "Juni" , "Juli" , "Agustus" , "September" , "Oktober" , "November" , "Desember"
] ,
dayOfWeek : [
"Sen" , "Sel" , "Rab" , "Kam" , "Jum" , "Sab" , "Min"
]
} ,
2014-05-09 10:17:01 +00:00
bg : { // Bulgarian
months : [
"Януари" , "Февруари" , "Март" , "Април" , "Май" , "Юни" , "Юли" , "Август" , "Септември" , "Октомври" , "Ноември" , "Декември"
] ,
dayOfWeek : [
"Нд" , "Пн" , "Вт" , "С р " , "Чт" , "Пт" , "С б "
]
} ,
2014-05-21 04:40:09 +00:00
fa : { // Persian/Farsi
months : [
'فروردین' , 'اردیبهشت' , 'خرداد' , 'تیر' , 'مرداد' , 'شهریور' , 'مهر' , 'آبان' , 'آذر' , 'دی' , 'بهمن' , 'اسفند'
] ,
dayOfWeek : [
'یکشنبه' , 'دوشنبه' , 'سه شنبه' , 'چهارشنبه' , 'پنجشنبه' , 'جمعه' , 'شنبه'
]
} ,
2014-01-09 08:21:23 +00:00
ru : { // Russian
2013-12-24 11:59:06 +00:00
months : [
'Январь' , 'Февраль' , 'Март' , 'Апрель' , 'Май' , 'Июнь' , 'Июль' , 'Август' , 'Сентябрь' , 'Октябрь' , 'Ноябрь' , 'Декабрь'
] ,
dayOfWeek : [
"Вск" , "Пн" , "Вт" , "С р " , "Чт" , "Пт" , "С б "
]
} ,
2014-07-30 13:51:26 +00:00
uk : { // Ukrainian
months : [
'Січень' , 'Лютий' , 'Березень' , 'Квітень' , 'Травень' , 'Червень' , 'Липень' , 'Серпень' , 'Вересень' , 'Жовтень' , 'Листопад' , 'Грудень'
] ,
dayOfWeek : [
"Ндл" , "Пнд" , "Втр" , "Срд" , "Чтв" , "Птн" , "Сбт"
]
} ,
2014-01-09 08:21:23 +00:00
en : { // English
2013-12-24 11:59:06 +00:00
months : [
"January" , "February" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "November" , "December"
] ,
dayOfWeek : [
"Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat"
]
} ,
2014-05-27 21:01:58 +00:00
el : { // Ελληνικά
2014-06-05 00:20:35 +00:00
months : [
"Ιανουάριος" , "Φεβρουάριος" , "Μάρτιος" , "Απρίλιος" , "Μάιος" , "Ιούνιος" , "Ιούλιος" , "Αύγουστος" , "Σεπτέμβριος" , "Οκτώβριος" , "Νοέμβριος" , "Δεκέμβριος"
] ,
dayOfWeek : [
"Κ υ ρ " , "Δευ" , "Τ ρ ι " , "Τετ" , "Πεμ" , "Παρ" , "Σαβ"
]
} ,
2014-01-09 08:21:23 +00:00
de : { // German
2013-12-24 11:59:06 +00:00
months : [
'Januar' , 'Februar' , 'März' , 'April' , 'Mai' , 'Juni' , 'Juli' , 'August' , 'September' , 'Oktober' , 'November' , 'Dezember'
] ,
dayOfWeek : [
2014-02-14 04:06:13 +00:00
"So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"
2013-12-24 11:59:06 +00:00
]
} ,
2014-01-09 08:21:23 +00:00
nl : { // Dutch
2013-12-24 11:59:06 +00:00
months : [
"januari" , "februari" , "maart" , "april" , "mei" , "juni" , "juli" , "augustus" , "september" , "oktober" , "november" , "december"
] ,
dayOfWeek : [
"zo" , "ma" , "di" , "wo" , "do" , "vr" , "za"
]
2014-01-07 14:22:38 +00:00
} ,
2014-01-09 08:21:23 +00:00
tr : { // Turkish
2014-01-07 14:22:38 +00:00
months : [
"Ocak" , "Şubat" , "Mart" , "Nisan" , "Mayı s" , "Haziran" , "Temmuz" , "Ağustos" , "Eylül" , "Ekim" , "Kası m" , "Aralı k"
] ,
dayOfWeek : [
2014-01-07 23:19:57 +00:00
"Paz" , "Pts" , "Sal" , "Çar" , "Per" , "Cum" , "Cts"
2014-01-07 14:22:38 +00:00
]
2014-01-08 10:03:22 +00:00
} ,
2014-01-09 08:21:23 +00:00
fr : { //French
2014-01-08 10:03:22 +00:00
months : [
2014-01-08 14:35:47 +00:00
"Janvier" , "Février" , "Mars" , "Avril" , "Mai" , "Juin" , "Juillet" , "Août" , "Septembre" , "Octobre" , "Novembre" , "Décembre"
2014-01-08 10:03:22 +00:00
] ,
dayOfWeek : [
"Dim" , "Lun" , "Mar" , "Mer" , "Jeu" , "Ven" , "Sam"
]
2014-01-08 22:58:19 +00:00
} ,
2014-01-09 08:21:23 +00:00
es : { // Spanish
2014-01-08 22:58:19 +00:00
months : [
"Enero" , "Febrero" , "Marzo" , "Abril" , "Mayo" , "Junio" , "Julio" , "Agosto" , "Septiembre" , "Octubre" , "Noviembre" , "Diciembre"
] ,
dayOfWeek : [
"Dom" , "Lun" , "Mar" , "Mié" , "Jue" , "Vie" , "Sáb"
]
2014-01-09 08:21:23 +00:00
} ,
th : { // Thai
months : [
'มกราคม' , 'กุมภาพันธ์' , 'มีนาคม' , 'เมษายน' , 'พฤษภาคม' , 'มิถุนายน' , 'กรกฎาคม' , 'สิงหาคม' , 'กันยายน' , 'ตุลาคม' , 'พฤศจิกายน' , 'ธันวาคม'
] ,
dayOfWeek : [
'อา.' , 'จ.' , 'อ.' , 'พ.' , 'พฤ.' , 'ศ.' , 'ส.'
]
2014-01-12 12:34:31 +00:00
} ,
pl : { // Polish
months : [
"styczeń" , "luty" , "marzec" , "kwiecień" , "maj" , "czerwiec" , "lipiec" , "sierpień" , "wrzesień" , "październik" , "listopad" , "grudzień"
] ,
dayOfWeek : [
"nd" , "pn" , "wt" , "śr" , "cz" , "pt" , "sb"
]
2014-01-14 17:37:31 +00:00
} ,
pt : { // Portuguese
months : [
"Janeiro" , "Fevereiro" , "Março" , "Abril" , "Maio" , "Junho" , "Julho" , "Agosto" , "Setembro" , "Outubro" , "Novembro" , "Dezembro"
] ,
dayOfWeek : [
"Dom" , "Seg" , "Ter" , "Qua" , "Qui" , "Sex" , "Sab"
]
2014-01-19 04:01:57 +00:00
} ,
ch : { // Simplified Chinese
months : [
"一月" , "二月" , "三月" , "四月" , "五月" , "六月" , "七月" , "八月" , "九月" , "十月" , "十一月" , "十二月"
] ,
dayOfWeek : [
"日" , "一" , "二" , "三" , "四" , "五" , "六"
]
2014-01-31 11:12:01 +00:00
} ,
se : { // Swedish
months : [
"Januari" , "Februari" , "Mars" , "April" , "Maj" , "Juni" , "Juli" , "Augusti" , "September" , "Oktober" , "November" , "December"
] ,
dayOfWeek : [
"Sön" , "Mån" , "Tis" , "Ons" , "Tor" , "Fre" , "Lör"
]
2014-02-18 06:39:10 +00:00
} ,
kr : { // Korean
months : [
2014-06-05 00:20:35 +00:00
"1월" , "2월" , "3월" , "4월" , "5월" , "6월" , "7월" , "8월" , "9월" , "10월" , "11월" , "12월"
2014-02-18 06:39:10 +00:00
] ,
dayOfWeek : [
2014-06-05 00:20:35 +00:00
"일" , "월" , "화" , "수" , "목" , "금" , "토"
2014-02-18 06:39:10 +00:00
]
2014-02-27 05:31:17 +00:00
} ,
it : { // Italian
months : [
"Gennaio" , "Febbraio" , "Marzo" , "Aprile" , "Maggio" , "Giugno" , "Luglio" , "Agosto" , "Settembre" , "Ottobre" , "Novembre" , "Dicembre"
] ,
dayOfWeek : [
"Dom" , "Lun" , "Mar" , "Mer" , "Gio" , "Ven" , "Sab"
]
2014-03-24 19:52:20 +00:00
} ,
da : { // Dansk
months : [
"January" , "Februar" , "Marts" , "April" , "Maj" , "Juni" , "July" , "August" , "September" , "Oktober" , "November" , "December"
] ,
dayOfWeek : [
2014-08-03 12:49:10 +00:00
"Søn" , "Man" , "Tir" , "Ons" , "Tor" , "Fre" , "Lør"
2014-03-24 19:52:20 +00:00
]
} ,
2014-06-16 01:28:52 +00:00
no : { // Norwegian
months : [
"Januar" , "Februar" , "Mars" , "April" , "Mai" , "Juni" , "Juli" , "August" , "September" , "Oktober" , "November" , "Desember"
] ,
dayOfWeek : [
"Søn" , "Man" , "Tir" , "Ons" , "Tor" , "Fre" , "Lør"
]
} ,
2014-03-31 05:36:53 +00:00
ja : { // Japanese
months : [
"1月" , "2月" , "3月" , "4月" , "5月" , "6月" , "7月" , "8月" , "9月" , "10月" , "11月" , "12月"
] ,
dayOfWeek : [
"日" , "月" , "火" , "水" , "木" , "金" , "土"
]
2014-04-19 17:12:13 +00:00
} ,
2014-04-21 14:04:12 +00:00
vi : { // Vietnamese
2014-04-19 17:12:13 +00:00
months : [
"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"
] ,
dayOfWeek : [
"CN" , "T2" , "T3" , "T4" , "T5" , "T6" , "T7"
]
2014-05-29 10:16:15 +00:00
} ,
sl : { // Slovenščina
2014-06-05 00:20:35 +00:00
months : [
"Januar" , "Februar" , "Marec" , "April" , "Maj" , "Junij" , "Julij" , "Avgust" , "September" , "Oktober" , "November" , "December"
] ,
dayOfWeek : [
"Ned" , "Pon" , "Tor" , "Sre" , "Čet" , "Pet" , "Sob"
]
2014-06-05 00:21:23 +00:00
} ,
cs : { // Čeština
months : [
"Leden" , "Únor" , "Březen" , "Duben" , "Květen" , "Červen" , "Červenec" , "Srpen" , "Září" , "Říjen" , "Listopad" , "Prosinec"
] ,
dayOfWeek : [
"Ne" , "Po" , "Út" , "St" , "Čt" , "Pá" , "So"
]
2014-06-20 10:45:29 +00:00
} ,
hu : { // Hungarian
months : [
"Január" , "Február" , "Március" , "Április" , "Május" , "Június" , "Július" , "Augusztus" , "Szeptember" , "Október" , "November" , "December"
] ,
dayOfWeek : [
"Va" , "Hé" , "Ke" , "Sze" , "Cs" , "Pé" , "Szo"
]
2014-06-05 00:20:35 +00:00
}
2013-12-24 11:59:06 +00:00
} ,
value : '' ,
2014-05-23 06:16:07 +00:00
lang : 'en' ,
2014-03-24 19:52:20 +00:00
2014-05-23 06:16:07 +00:00
format : 'Y/m/d H:i' ,
2014-03-24 19:52:20 +00:00
formatTime : 'H:i' ,
formatDate : 'Y/m/d' ,
startDate : false , // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05',
2013-12-24 11:59:06 +00:00
step : 60 ,
2014-05-14 05:48:24 +00:00
monthChangeSpinner : true ,
2014-04-06 13:21:35 +00:00
closeOnDateSelect : false ,
2013-12-24 11:59:06 +00:00
closeOnWithoutClick : true ,
2014-06-04 06:53:58 +00:00
closeOnInputClick : true ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
timepicker : true ,
datepicker : true ,
2014-07-18 10:44:46 +00:00
weeks : false ,
2014-07-09 13:42:06 +00:00
defaultTime : false , // use formatTime format (ex. '10:00' for formatTime: 'H:i')
defaultDate : false , // use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05')
2013-12-24 11:59:06 +00:00
minDate : false ,
maxDate : false ,
minTime : false ,
maxTime : false ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
allowTimes : [ ] ,
opened : false ,
2014-03-11 14:22:29 +00:00
initTime : true ,
2013-12-24 11:59:06 +00:00
inline : false ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
onSelectDate : function ( ) { } ,
onSelectTime : function ( ) { } ,
onChangeMonth : function ( ) { } ,
onChangeDateTime : function ( ) { } ,
onShow : function ( ) { } ,
onClose : function ( ) { } ,
onGenerate : function ( ) { } ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
withoutCopyright : true ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
inverseButton : false ,
hours12 : false ,
next : 'xdsoft_next' ,
prev : 'xdsoft_prev' ,
dayOfWeekStart : 0 ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
timeHeightInTimePicker : 25 ,
timepickerScrollbar : true ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
todayButton : true , // 2.1.0
defaultSelect : true , // 2.1.0
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
scrollMonth : true ,
scrollTime : true ,
scrollInput : true ,
2014-03-24 19:52:20 +00:00
2014-03-25 06:30:56 +00:00
lazyInit : false ,
2014-03-25 05:58:52 +00:00
2013-12-24 11:59:06 +00:00
mask : false ,
validateOnBlur : true ,
2014-03-24 19:52:20 +00:00
allowBlank : true ,
2013-12-24 11:59:06 +00:00
yearStart : 1950 ,
yearEnd : 2050 ,
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
style : '' ,
id : '' ,
2014-03-24 19:52:20 +00:00
2014-05-30 06:07:02 +00:00
fixed : false ,
2013-12-24 11:59:06 +00:00
roundTime : 'round' , // ceil, floor
className : '' ,
2014-03-24 19:52:20 +00:00
2014-01-09 08:21:23 +00:00
weekends : [ ] ,
2014-03-06 21:27:33 +00:00
yearOffset : 0 ,
2014-03-06 21:56:06 +00:00
beforeShowDay : null
2013-12-24 11:59:06 +00:00
} ;
2014-03-24 19:52:20 +00:00
2013-12-12 09:17:06 +00:00
// fix for ie8
2014-01-09 08:21:23 +00:00
if ( ! Array . prototype . indexOf ) {
2013-12-12 09:17:06 +00:00
Array . prototype . indexOf = function ( obj , start ) {
for ( var i = ( start || 0 ) , j = this . length ; i < j ; i ++ ) {
if ( this [ i ] === obj ) { return i ; }
}
return - 1 ;
}
2014-06-04 13:46:24 +00:00
}
2014-03-24 19:52:20 +00:00
2014-05-23 10:37:24 +00:00
Date . prototype . countDaysInMonth = function ( ) {
return new Date ( this . getFullYear ( ) , this . getMonth ( ) + 1 , 0 ) . getDate ( ) ;
} ;
2013-12-16 03:51:07 +00:00
$ . fn . xdsoftScroller = function ( _percent ) {
return this . each ( function ( ) {
2013-12-04 14:16:19 +00:00
var timeboxparent = $ ( this ) ;
2013-12-16 03:51:07 +00:00
if ( ! $ ( this ) . hasClass ( 'xdsoft_scroller_box' ) ) {
var pointerEventToXY = function ( e ) {
2013-12-05 15:19:41 +00:00
var out = { x : 0 , y : 0 } ;
2013-12-16 03:51:07 +00:00
if ( e . type == 'touchstart' || e . type == 'touchmove' || e . type == 'touchend' || e . type == 'touchcancel' ) {
2013-12-05 15:19:41 +00:00
var touch = e . originalEvent . touches [ 0 ] || e . originalEvent . changedTouches [ 0 ] ;
out . x = touch . pageX ;
out . y = touch . pageY ;
} else if ( e . type == 'mousedown' || e . type == 'mouseup' || e . type == 'mousemove' || e . type == 'mouseover' || e . type == 'mouseout' || e . type == 'mouseenter' || e . type == 'mouseleave' ) {
out . x = e . pageX ;
out . y = e . pageY ;
}
return out ;
} ,
move = 0 ,
2013-12-04 14:16:19 +00:00
timebox = timeboxparent . children ( ) . eq ( 0 ) ,
2014-01-12 18:02:26 +00:00
parentHeight = timeboxparent [ 0 ] . clientHeight ,
2013-12-04 14:16:19 +00:00
height = timebox [ 0 ] . offsetHeight ,
scrollbar = $ ( '<div class="xdsoft_scrollbar"></div>' ) ,
scroller = $ ( '<div class="xdsoft_scroller"></div>' ) ,
maximumOffset = 100 ,
start = false ;
2013-12-31 11:02:09 +00:00
2013-12-04 14:16:19 +00:00
scrollbar . append ( scroller ) ;
2013-12-31 11:02:09 +00:00
2013-12-04 14:16:19 +00:00
timeboxparent . addClass ( 'xdsoft_scroller_box' ) . append ( scrollbar ) ;
2013-12-25 03:45:34 +00:00
scroller . on ( 'mousedown.xdsoft_scroller' , function ( event ) {
2014-01-12 18:02:26 +00:00
if ( ! parentHeight )
timeboxparent . trigger ( 'resize_scroll.xdsoft_scroller' , [ _percent ] ) ;
2013-12-04 14:16:19 +00:00
var pageY = event . pageY ,
top = parseInt ( scroller . css ( 'margin-top' ) ) ,
h1 = scrollbar [ 0 ] . offsetHeight ;
$ ( document . body ) . addClass ( 'xdsoft_noselect' ) ;
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . on ( 'mouseup.xdsoft_scroller' , function arguments _callee ( ) {
$ ( [ document . body , window ] ) . off ( 'mouseup.xdsoft_scroller' , arguments _callee )
2013-12-04 14:16:19 +00:00
. off ( 'mousemove.xdsoft_scroller' , move )
. removeClass ( 'xdsoft_noselect' ) ;
} ) ;
2013-12-16 03:51:07 +00:00
$ ( document . body ) . on ( 'mousemove.xdsoft_scroller' , move = function ( event ) {
2013-12-04 14:16:19 +00:00
var offset = event . pageY - pageY + top ;
if ( offset < 0 )
offset = 0 ;
if ( offset + scroller [ 0 ] . offsetHeight > h1 )
offset = h1 - scroller [ 0 ] . offsetHeight ;
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ maximumOffset ? offset / maximumOffset : 0 ] ) ;
} ) ;
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-04 14:16:19 +00:00
timeboxparent
2013-12-16 03:51:07 +00:00
. on ( 'scroll_element.xdsoft_scroller' , function ( event , percent ) {
2014-01-12 18:02:26 +00:00
if ( ! parentHeight )
timeboxparent . trigger ( 'resize_scroll.xdsoft_scroller' , [ percent , true ] ) ;
2013-12-05 15:19:41 +00:00
percent = percent > 1 ? 1 : ( percent < 0 || isNaN ( percent ) ) ? 0 : percent ;
scroller . css ( 'margin-top' , maximumOffset * percent ) ;
2014-08-31 18:08:48 +00:00
setTimeout ( function ( ) {
timebox . css ( 'marginTop' , - parseInt ( ( timebox [ 0 ] . offsetHeight - parentHeight ) * percent ) )
} , 10 ) ;
2013-12-05 15:19:41 +00:00
} )
2014-01-12 18:02:26 +00:00
. on ( 'resize_scroll.xdsoft_scroller' , function ( event , _percent , noTriggerScroll ) {
parentHeight = timeboxparent [ 0 ] . clientHeight ;
2013-12-05 15:19:41 +00:00
height = timebox [ 0 ] . offsetHeight ;
var percent = parentHeight / height ,
sh = percent * scrollbar [ 0 ] . offsetHeight ;
if ( percent > 1 )
scroller . hide ( ) ;
else {
scroller . show ( ) ;
scroller . css ( 'height' , parseInt ( sh > 10 ? sh : 10 ) ) ;
maximumOffset = scrollbar [ 0 ] . offsetHeight - scroller [ 0 ] . offsetHeight ;
2014-01-12 18:02:26 +00:00
if ( noTriggerScroll !== true )
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ _percent ? _percent : Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) ) / ( height - parentHeight ) ] ) ;
2013-12-05 15:19:41 +00:00
}
2014-01-09 08:21:23 +00:00
} ) ;
2013-12-04 14:16:19 +00:00
timeboxparent . mousewheel && timeboxparent . mousewheel ( function ( event , delta , deltaX , deltaY ) {
var top = Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) ) ;
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ ( top - delta * 20 ) / ( height - parentHeight ) ] ) ;
event . stopPropagation ( ) ;
return false ;
} ) ;
2013-12-16 03:51:07 +00:00
timeboxparent . on ( 'touchstart' , function ( event ) {
2013-12-04 14:16:19 +00:00
start = pointerEventToXY ( event ) ;
} ) ;
2013-12-16 03:51:07 +00:00
timeboxparent . on ( 'touchmove' , function ( event ) {
if ( start ) {
2013-12-04 14:16:19 +00:00
var coord = pointerEventToXY ( event ) , top = Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) ) ;
2013-12-04 14:39:41 +00:00
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ ( top - ( coord . y - start . y ) ) / ( height - parentHeight ) ] ) ;
2013-12-04 14:16:19 +00:00
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
2014-06-30 11:16:47 +00:00
start = pointerEventToXY ( event ) ;
2014-06-04 13:46:24 +00:00
}
2013-12-04 14:16:19 +00:00
} ) ;
2013-12-16 03:51:07 +00:00
timeboxparent . on ( 'touchend touchcancel' , function ( event ) {
2013-12-04 14:16:19 +00:00
start = false ;
} ) ;
}
timeboxparent . trigger ( 'resize_scroll.xdsoft_scroller' , [ _percent ] ) ;
} ) ;
} ;
2013-12-16 03:51:07 +00:00
$ . fn . datetimepicker = function ( opt ) {
2013-12-10 19:45:29 +00:00
var KEY0 = 48 ,
KEY9 = 57 ,
_KEY0 = 96 ,
_KEY9 = 105 ,
CTRLKEY = 17 ,
2013-11-28 12:16:07 +00:00
DEL = 46 ,
ENTER = 13 ,
ESC = 27 ,
BACKSPACE = 8 ,
ARROWLEFT = 37 ,
ARROWUP = 38 ,
ARROWRIGHT = 39 ,
ARROWDOWN = 40 ,
TAB = 9 ,
F5 = 116 ,
AKEY = 65 ,
CKEY = 67 ,
VKEY = 86 ,
ZKEY = 90 ,
2013-12-05 14:42:51 +00:00
YKEY = 89 ,
ctrlDown = false ,
2014-01-31 11:12:01 +00:00
options = ( $ . isPlainObject ( opt ) || ! opt ) ? $ . extend ( true , { } , default _options , opt ) : $ . extend ( { } , default _options ) ,
2014-03-25 05:58:52 +00:00
lazyInitTimer = 0 ,
lazyInit = function ( input ) {
input
. on ( 'open.xdsoft focusin.xdsoft mousedown.xdsoft' , function initOnActionCallback ( event ) {
if ( input . is ( ':disabled' ) || input . is ( ':hidden' ) || ! input . is ( ':visible' ) || input . data ( 'xdsoft_datetimepicker' ) )
return ;
clearTimeout ( lazyInitTimer ) ;
lazyInitTimer = setTimeout ( function ( ) {
if ( ! input . data ( 'xdsoft_datetimepicker' ) )
createDateTimePicker ( input ) ;
input
. off ( 'open.xdsoft focusin.xdsoft mousedown.xdsoft' , initOnActionCallback )
. trigger ( 'open.xdsoft' ) ;
} , 100 ) ;
} ) ;
} ,
2014-03-24 19:52:20 +00:00
2013-12-16 03:51:07 +00:00
createDateTimePicker = function ( input ) {
2014-03-25 05:58:52 +00:00
2014-07-18 10:44:46 +00:00
var datetimepicker = $ ( '<div ' + ( options . id ? 'id="' + options . id + '"' : '' ) + ' ' + ( options . style ? 'style="' + options . style + '"' : '' ) + ' class="xdsoft_datetimepicker xdsoft_noselect ' + ( options . weeks ? ' xdsoft_showweeks' : '' ) + options . className + '"></div>' ) ,
2013-12-05 14:42:51 +00:00
xdsoft _copyright = $ ( '<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>' ) ,
datepicker = $ ( '<div class="xdsoft_datepicker active"></div>' ) ,
2013-12-24 11:59:06 +00:00
mounth _picker = $ ( '<div class="xdsoft_mounthpicker"><button type="button" class="xdsoft_prev"></button><button type="button" class="xdsoft_today_button"></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>' ) ,
2013-12-05 14:42:51 +00:00
calendar = $ ( '<div class="xdsoft_calendar"></div>' ) ,
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>' ) ,
timeboxparent = timepicker . find ( '.xdsoft_time_box' ) . eq ( 0 ) ,
timebox = $ ( '<div class="xdsoft_time_variant"></div>' ) ,
scrollbar = $ ( '<div class="xdsoft_scrollbar"></div>' ) ,
scroller = $ ( '<div class="xdsoft_scroller"></div>' ) ,
monthselect = $ ( '<div class="xdsoft_select xdsoft_monthselect"><div></div></div>' ) ,
yearselect = $ ( '<div class="xdsoft_select xdsoft_yearselect"><div></div></div>' ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
//constructor lego
mounth _picker
. find ( '.xdsoft_month span' )
. after ( monthselect ) ;
mounth _picker
. find ( '.xdsoft_year span' )
. after ( yearselect ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
mounth _picker
. find ( '.xdsoft_month,.xdsoft_year' )
. on ( 'mousedown.xdsoft' , function ( event ) {
mounth _picker
. find ( '.xdsoft_select' )
. hide ( ) ;
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
var select = $ ( this ) . find ( '.xdsoft_select' ) . eq ( 0 ) ,
val = 0 ,
top = 0 ;
2013-12-31 11:02:09 +00:00
2013-12-10 19:45:29 +00:00
if ( _xdsoft _datetime . currentTime )
val = _xdsoft _datetime . currentTime [ $ ( this ) . hasClass ( 'xdsoft_month' ) ? 'getMonth' : 'getFullYear' ] ( ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
select . show ( ) ;
2014-03-24 19:52:20 +00:00
2013-12-16 03:51:07 +00:00
for ( var items = select . find ( 'div.xdsoft_option' ) , i = 0 ; i < items . length ; i ++ ) {
if ( items . eq ( i ) . data ( 'value' ) == val ) {
2013-12-05 14:42:51 +00:00
break ;
} else top += items [ 0 ] . offsetHeight ;
2013-11-28 12:16:07 +00:00
}
2013-12-31 11:02:09 +00:00
2014-01-12 18:02:26 +00:00
select . xdsoftScroller ( top / ( select . children ( ) [ 0 ] . offsetHeight - ( select [ 0 ] . clientHeight ) ) ) ;
2013-12-05 14:42:51 +00:00
event . stopPropagation ( ) ;
2014-03-24 19:52:20 +00:00
2013-11-28 12:16:07 +00:00
return false ;
2013-12-05 14:42:51 +00:00
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
mounth _picker
. find ( '.xdsoft_select' )
. xdsoftScroller ( )
. on ( 'mousedown.xdsoft' , function ( event ) {
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
} )
2013-12-16 03:51:07 +00:00
. on ( 'mousedown.xdsoft' , '.xdsoft_option' , function ( event ) {
2013-12-10 19:45:29 +00:00
if ( _xdsoft _datetime && _xdsoft _datetime . currentTime )
_xdsoft _datetime . currentTime [ $ ( this ) . parent ( ) . parent ( ) . hasClass ( 'xdsoft_monthselect' ) ? 'setMonth' : 'setFullYear' ] ( $ ( this ) . data ( 'value' ) ) ;
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
$ ( this ) . parent ( ) . parent ( ) . hide ( ) ;
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
2014-01-06 22:15:56 +00:00
options . onChangeMonth && options . onChangeMonth . call && options . onChangeMonth . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
// set options
2013-12-16 03:51:07 +00:00
datetimepicker . setOptions = function ( _options ) {
2014-01-31 11:12:01 +00:00
options = $ . extend ( true , { } , options , _options ) ;
2014-03-26 17:01:59 +00:00
if ( _options . allowTimes && $ . isArray ( _options . allowTimes ) && _options . allowTimes . length ) {
options [ 'allowTimes' ] = $ . extend ( true , [ ] , _options . allowTimes ) ;
}
if ( _options . weekends && $ . isArray ( _options . weekends ) && _options . weekends . length ) {
options [ 'weekends' ] = $ . extend ( true , [ ] , _options . weekends ) ;
}
2013-12-16 03:51:07 +00:00
if ( ( options . open || options . opened ) && ( ! options . inline ) ) {
2013-12-05 14:42:51 +00:00
input . trigger ( 'open.xdsoft' ) ;
}
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . inline ) {
2014-05-23 06:16:07 +00:00
triggerAfterOpen = true ;
2013-12-05 14:42:51 +00:00
datetimepicker . addClass ( 'xdsoft_inline' ) ;
input . after ( datetimepicker ) . hide ( ) ;
}
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . inverseButton ) {
2013-12-05 14:42:51 +00:00
options . next = 'xdsoft_prev' ;
options . prev = 'xdsoft_next' ;
}
2013-12-31 11:02:09 +00:00
2014-02-13 16:55:43 +00:00
if ( options . datepicker )
2014-02-13 16:55:02 +00:00
datepicker . addClass ( 'active' ) ;
else
2013-12-05 14:42:51 +00:00
datepicker . removeClass ( 'active' ) ;
2014-03-06 21:27:33 +00:00
2014-02-13 16:55:02 +00:00
if ( options . timepicker )
timepicker . addClass ( 'active' ) ;
else
2013-12-05 14:42:51 +00:00
timepicker . removeClass ( 'active' ) ;
2013-12-31 11:02:09 +00:00
2014-01-09 06:54:36 +00:00
if ( options . value ) {
2013-12-05 14:42:51 +00:00
input && input . val && input . val ( options . value ) ;
2014-01-09 06:54:36 +00:00
_xdsoft _datetime . setCurrentTime ( options . value ) ;
}
2013-12-31 11:02:09 +00:00
2014-08-06 05:10:17 +00:00
if ( isNaN ( options . dayOfWeekStart ) )
2013-12-05 14:42:51 +00:00
options . dayOfWeekStart = 0 ;
2013-12-31 11:02:09 +00:00
else
2014-08-06 05:10:17 +00:00
options . dayOfWeekStart = parseInt ( options . dayOfWeekStart ) % 7 ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
if ( ! options . timepickerScrollbar )
scrollbar . hide ( ) ;
2014-03-24 19:52:20 +00:00
if ( options . minDate && /^-(.*)$/ . test ( options . minDate ) ) {
options . minDate = _xdsoft _datetime . strToDateTime ( options . minDate ) . dateFormat ( options . formatDate ) ;
2013-12-05 14:42:51 +00:00
}
2014-03-24 19:52:20 +00:00
if ( options . maxDate && /^\+(.*)$/ . test ( options . maxDate ) ) {
options . maxDate = _xdsoft _datetime . strToDateTime ( options . maxDate ) . dateFormat ( options . formatDate ) ;
2013-12-05 14:42:51 +00:00
}
2014-03-24 19:52:20 +00:00
2013-12-24 11:59:06 +00:00
mounth _picker
. find ( '.xdsoft_today_button' )
. css ( 'visibility' , ! options . todayButton ? 'hidden' : 'visible' ) ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . mask ) {
2013-12-05 14:42:51 +00:00
var e ,
2013-12-16 03:51:07 +00:00
getCaretPos = function ( input ) {
2013-12-05 14:42:51 +00:00
try {
if ( document . selection && document . selection . createRange ) {
var range = document . selection . createRange ( ) ;
return range . getBookmark ( ) . charCodeAt ( 2 ) - 2 ;
} else
if ( input . setSelectionRange )
return input . selectionStart ;
2013-12-16 03:51:07 +00:00
} catch ( e ) {
2013-12-05 14:42:51 +00:00
return 0 ;
}
} ,
2013-12-16 03:51:07 +00:00
setCaretPos = function ( node , pos ) {
2014-06-05 08:35:15 +00:00
node = ( typeof node == "string" || node instanceof String ) ? document . getElementById ( node ) : node ;
2013-12-16 03:51:07 +00:00
if ( ! node ) {
2013-12-05 14:42:51 +00:00
return false ;
2013-12-16 03:51:07 +00:00
} else if ( node . createTextRange ) {
2013-12-05 14:42:51 +00:00
var textRange = node . createTextRange ( ) ;
textRange . collapse ( true ) ;
textRange . moveEnd ( pos ) ;
textRange . moveStart ( pos ) ;
textRange . select ( ) ;
return true ;
2013-12-16 03:51:07 +00:00
} else if ( node . setSelectionRange ) {
2013-12-05 14:42:51 +00:00
node . setSelectionRange ( pos , pos ) ;
return true ;
}
return false ;
} ,
2013-12-16 03:51:07 +00:00
isValidValue = function ( mask , value ) {
2013-12-05 14:42:51 +00:00
var reg = mask
. replace ( /([\[\]\/\{\}\(\)\-\.\+]{1})/g , '\\$1' )
. replace ( /_/g , '{digit+}' )
. replace ( /([0-9]{1})/g , '{digit$1}' )
. replace ( /\{digit([0-9]{1})\}/g , '[0-$1_]{1}' )
. replace ( /\{digit[\+]\}/g , '[0-9_]{1}' ) ;
return RegExp ( reg ) . test ( value ) ;
} ;
input . off ( 'keydown.xdsoft' ) ;
2013-12-16 03:51:07 +00:00
switch ( true ) {
2013-12-05 14:42:51 +00:00
case ( options . mask === true ) :
2014-03-24 19:52:20 +00:00
2013-12-11 15:45:22 +00:00
options . mask = options . format
2013-12-10 11:46:28 +00:00
. replace ( /Y/g , '9999' )
. replace ( /F/g , '9999' )
. replace ( /m/g , '19' )
. replace ( /d/g , '39' )
. replace ( /H/g , '29' )
. replace ( /i/g , '59' )
2013-12-11 15:45:22 +00:00
. replace ( /s/g , '59' ) ;
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
case ( $ . type ( options . mask ) == 'string' ) :
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
if ( ! isValidValue ( options . mask , input . val ( ) ) )
input . val ( options . mask . replace ( /[0-9]/g , '_' ) ) ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
input . on ( 'keydown.xdsoft' , function ( event ) {
2013-12-31 11:02:09 +00:00
var val = this . value ,
2013-12-05 14:42:51 +00:00
key = event . which ;
2014-03-24 19:52:20 +00:00
2013-12-16 03:51:07 +00:00
switch ( true ) {
2013-12-13 06:23:46 +00:00
case ( ( key >= KEY0 && key <= KEY9 ) || ( key >= _KEY0 && key <= _KEY9 ) ) || ( key == BACKSPACE || key == DEL ) :
2013-11-28 12:16:07 +00:00
var pos = getCaretPos ( this ) ,
2013-12-13 06:23:46 +00:00
digit = ( key != BACKSPACE && key != DEL ) ? String . fromCharCode ( ( _KEY0 <= key && key <= _KEY9 ) ? key - KEY0 : key ) : '_' ;
2014-03-24 19:52:20 +00:00
2013-12-16 03:51:07 +00:00
if ( ( key == BACKSPACE || key == DEL ) && pos ) {
2013-11-28 12:16:07 +00:00
pos -- ;
digit = '_' ;
}
2014-03-24 19:52:20 +00:00
2013-11-28 12:16:07 +00:00
while ( /[^0-9_]/ . test ( options . mask . substr ( pos , 1 ) ) && pos < options . mask . length && pos > 0 )
pos += ( key == BACKSPACE || key == DEL ) ? - 1 : 1 ;
2013-12-31 11:02:09 +00:00
2013-11-28 12:16:07 +00:00
val = val . substr ( 0 , pos ) + digit + val . substr ( pos + 1 ) ;
2014-03-24 19:52:20 +00:00
if ( $ . trim ( val ) == '' ) {
2013-11-28 12:16:07 +00:00
val = options . mask . replace ( /[0-9]/g , '_' ) ;
2014-03-24 19:52:20 +00:00
} else {
2013-11-28 12:16:07 +00:00
if ( pos == options . mask . length )
break ;
2014-03-24 19:52:20 +00:00
}
2013-11-28 12:16:07 +00:00
pos += ( key == BACKSPACE || key == DEL ) ? 0 : 1 ;
while ( /[^0-9_]/ . test ( options . mask . substr ( pos , 1 ) ) && pos < options . mask . length && pos > 0 )
pos += ( key == BACKSPACE || key == DEL ) ? - 1 : 1 ;
2014-03-24 19:52:20 +00:00
2013-12-16 03:51:07 +00:00
if ( isValidValue ( options . mask , val ) ) {
2013-11-28 12:16:07 +00:00
this . value = val ;
setCaretPos ( this , pos ) ;
} else if ( $ . trim ( val ) == '' )
this . value = options . mask . replace ( /[0-9]/g , '_' ) ;
else {
input . trigger ( 'error_input.xdsoft' ) ;
}
break ;
2013-12-12 09:17:06 +00:00
case ( ! ! ~ ( [ AKEY , CKEY , VKEY , ZKEY , YKEY ] . indexOf ( key ) ) && ctrlDown ) :
2013-12-12 09:31:32 +00:00
case ! ! ~ ( [ ESC , ARROWUP , ARROWDOWN , ARROWLEFT , ARROWRIGHT , F5 , CTRLKEY , TAB , ENTER ] . indexOf ( key ) ) :
2013-12-12 09:17:06 +00:00
return true ;
2013-11-28 12:16:07 +00:00
}
event . preventDefault ( ) ;
return false ;
} ) ;
2013-12-05 14:42:51 +00:00
break ;
}
2013-11-28 12:16:07 +00:00
}
2013-12-16 03:51:07 +00:00
if ( options . validateOnBlur ) {
2013-12-05 14:42:51 +00:00
input
. off ( 'blur.xdsoft' )
2013-12-16 03:51:07 +00:00
. on ( 'blur.xdsoft' , function ( ) {
if ( options . allowBlank && ! $ . trim ( $ ( this ) . val ( ) ) . length ) {
2013-12-31 11:03:34 +00:00
$ ( this ) . val ( null ) ;
2014-01-08 13:00:46 +00:00
datetimepicker . data ( 'xdsoft_datetime' ) . empty ( ) ;
2014-01-08 14:35:47 +00:00
} else if ( ! Date . parseDate ( $ ( this ) . val ( ) , options . format ) ) {
2014-01-09 08:21:23 +00:00
$ ( this ) . val ( ( _xdsoft _datetime . now ( ) ) . dateFormat ( options . format ) ) ;
2014-01-08 13:00:46 +00:00
datetimepicker . data ( 'xdsoft_datetime' ) . setCurrentTime ( $ ( this ) . val ( ) ) ;
2013-12-13 17:18:02 +00:00
}
2014-01-08 14:35:47 +00:00
else {
datetimepicker . data ( 'xdsoft_datetime' ) . setCurrentTime ( $ ( this ) . val ( ) ) ;
2014-01-08 13:00:46 +00:00
}
2013-12-31 11:03:34 +00:00
datetimepicker . trigger ( 'changedatetime.xdsoft' ) ;
2013-12-05 14:42:51 +00:00
} ) ;
2013-11-15 06:47:44 +00:00
}
2013-12-05 14:42:51 +00:00
options . dayOfWeekStartPrev = ( options . dayOfWeekStart == 0 ) ? 6 : options . dayOfWeekStart - 1 ;
2014-05-23 06:16:07 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker
2014-05-23 06:16:07 +00:00
. trigger ( 'xchange.xdsoft' )
. trigger ( 'afterOpen.xdsoft' )
2013-11-03 10:11:36 +00:00
} ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker
. data ( 'options' , options )
2013-12-16 03:51:07 +00:00
. on ( 'mousedown.xdsoft' , function ( event ) {
2013-12-05 14:42:51 +00:00
event . stopPropagation ( ) ;
event . preventDefault ( ) ;
yearselect . hide ( ) ;
monthselect . hide ( ) ;
2013-11-03 10:11:36 +00:00
return false ;
2013-12-05 14:42:51 +00:00
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
var scroll _element = timepicker . find ( '.xdsoft_time_box' ) ;
scroll _element . append ( timebox ) ;
scroll _element . xdsoftScroller ( ) ;
2014-05-23 06:16:07 +00:00
2013-12-16 03:51:07 +00:00
datetimepicker . on ( 'afterOpen.xdsoft' , function ( ) {
2013-12-05 14:42:51 +00:00
scroll _element . xdsoftScroller ( ) ;
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker
. append ( datepicker )
. append ( timepicker ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
if ( options . withoutCopyright !== true )
datetimepicker
. append ( xdsoft _copyright ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datepicker
. append ( mounth _picker )
. append ( calendar ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
$ ( 'body' ) . append ( datetimepicker ) ;
2013-12-31 11:02:09 +00:00
2014-01-09 06:54:36 +00:00
var _xdsoft _datetime = new function ( ) {
2013-12-05 14:42:51 +00:00
var _this = this ;
2014-07-09 13:42:06 +00:00
_this . now = function ( norecursion ) {
2014-01-09 08:21:23 +00:00
var d = new Date ( ) ;
2014-07-09 13:42:06 +00:00
if ( ! norecursion && options . defaultDate ) {
2014-08-06 05:25:50 +00:00
var date = _this . strToDate ( options . defaultDate ) ;
2014-07-09 13:42:06 +00:00
d . setFullYear ( date . getFullYear ( ) ) ;
d . setMonth ( date . getMonth ( ) ) ;
d . setDate ( date . getDate ( ) ) ;
}
if ( options . yearOffset ) {
2014-01-09 08:21:23 +00:00
d . setFullYear ( d . getFullYear ( ) + options . yearOffset ) ;
2014-07-09 13:42:06 +00:00
}
if ( ! norecursion && options . defaultTime ) {
var time = _this . strtotime ( options . defaultTime ) ;
d . setHours ( time . getHours ( ) ) ;
d . setMinutes ( time . getMinutes ( ) ) ;
}
2014-01-09 08:21:23 +00:00
return d ;
2013-12-05 14:42:51 +00:00
} ;
2013-12-31 11:02:09 +00:00
2014-07-09 13:42:06 +00:00
2013-12-05 14:42:51 +00:00
_this . isValidDate = function ( d ) {
if ( Object . prototype . toString . call ( d ) !== "[object Date]" )
return false ;
return ! isNaN ( d . getTime ( ) ) ;
} ;
2013-12-31 11:02:09 +00:00
2014-07-09 13:42:06 +00:00
_this . setCurrentTime = function ( dTime ) {
2014-03-24 19:52:20 +00:00
_this . currentTime = ( typeof dTime == 'string' ) ? _this . strToDateTime ( dTime ) : _this . isValidDate ( dTime ) ? dTime : _this . now ( ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
} ;
2013-12-31 11:02:09 +00:00
2014-01-08 13:00:46 +00:00
_this . empty = function ( ) {
2014-01-08 14:35:47 +00:00
_this . currentTime = null ;
} ;
2014-01-08 13:00:46 +00:00
2013-12-16 03:51:07 +00:00
_this . getCurrentTime = function ( dTime ) {
2013-12-05 14:42:51 +00:00
return _this . currentTime ;
} ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
_this . nextMonth = function ( ) {
2013-12-05 14:42:51 +00:00
var month = _this . currentTime . getMonth ( ) + 1 ;
2013-12-16 03:51:07 +00:00
if ( month == 12 ) {
2013-12-05 14:42:51 +00:00
_this . currentTime . setFullYear ( _this . currentTime . getFullYear ( ) + 1 ) ;
month = 0 ;
}
2014-01-30 21:13:06 +00:00
_this . currentTime . setDate (
Math . min (
2014-08-10 16:07:33 +00:00
// Day 0 is the last day in the previous month, but we want to know the number of days in the current month, so we need to evaluate the subsequent month (month+1)
new Date ( _this . currentTime . getFullYear ( ) , month + 1 , 0 ) . getDate ( ) ,
2014-01-30 21:13:06 +00:00
_this . currentTime . getDate ( )
)
2014-05-25 18:55:05 +00:00
) ;
2013-12-05 14:42:51 +00:00
_this . currentTime . setMonth ( month ) ;
2013-12-10 19:45:29 +00:00
options . onChangeMonth && options . onChangeMonth . call && options . onChangeMonth . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
return month ;
} ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
_this . prevMonth = function ( ) {
2013-12-05 14:42:51 +00:00
var month = _this . currentTime . getMonth ( ) - 1 ;
2013-12-16 03:51:07 +00:00
if ( month == - 1 ) {
2013-12-05 14:42:51 +00:00
_this . currentTime . setFullYear ( _this . currentTime . getFullYear ( ) - 1 ) ;
month = 11 ;
}
2014-01-30 21:13:06 +00:00
_this . currentTime . setDate (
Math . min (
2014-08-10 16:07:33 +00:00
// Day 0 is the last day in the previous month, but we want to know the number of days in the current month, so we need to evaluate the subsequent month (month+1)
new Date ( _this . currentTime . getFullYear ( ) , month + 1 , 0 ) . getDate ( ) ,
2014-01-30 21:13:06 +00:00
_this . currentTime . getDate ( )
)
2014-05-25 18:55:05 +00:00
) ;
2013-12-05 14:42:51 +00:00
_this . currentTime . setMonth ( month ) ;
2013-12-10 19:45:29 +00:00
options . onChangeMonth && options . onChangeMonth . call && options . onChangeMonth . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
return month ;
} ;
2013-12-31 11:02:09 +00:00
2014-03-24 19:52:20 +00:00
_this . strToDateTime = function ( sDateTime ) {
2014-06-11 04:33:32 +00:00
if ( sDateTime && sDateTime instanceof Date && _this . isValidDate ( sDateTime ) )
return sDateTime ;
2014-03-24 19:52:20 +00:00
var tmpDate = [ ] , timeOffset , currentTime ;
if ( ( tmpDate = /^(\+|\-)(.*)$/ . exec ( sDateTime ) ) && ( tmpDate [ 2 ] = Date . parseDate ( tmpDate [ 2 ] , options . formatDate ) ) ) {
2014-05-25 19:49:05 +00:00
timeOffset = tmpDate [ 2 ] . getTime ( ) - ( tmpDate [ 2 ] . getTimezoneOffset ( ) ) * 60000 ;
2014-03-24 19:52:20 +00:00
currentTime = new Date ( ( _xdsoft _datetime . now ( ) ) . getTime ( ) + parseInt ( tmpDate [ 1 ] + '1' ) * timeOffset ) ;
} else
currentTime = sDateTime ? Date . parseDate ( sDateTime , options . format ) : _this . now ( ) ;
2013-12-05 14:42:51 +00:00
if ( ! _this . isValidDate ( currentTime ) )
2014-01-09 08:21:23 +00:00
currentTime = _this . now ( ) ;
2014-03-24 19:52:20 +00:00
2013-12-05 14:42:51 +00:00
return currentTime ;
} ;
2013-12-31 11:02:09 +00:00
2014-08-06 05:25:50 +00:00
_this . strToDate = function ( sDate ) {
2014-06-11 04:28:41 +00:00
if ( sDate && sDate instanceof Date && _this . isValidDate ( sDate ) )
return sDate ;
2014-07-09 13:42:06 +00:00
var currentTime = sDate ? Date . parseDate ( sDate , options . formatDate ) : _this . now ( true ) ;
2013-12-05 14:42:51 +00:00
if ( ! _this . isValidDate ( currentTime ) )
2014-07-09 13:42:06 +00:00
currentTime = _this . now ( true ) ;
2014-06-11 04:28:41 +00:00
2013-12-05 14:42:51 +00:00
return currentTime ;
} ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
_this . strtotime = function ( sTime ) {
2014-06-11 04:28:41 +00:00
if ( sTime && sTime instanceof Date && _this . isValidDate ( sTime ) )
return sTime ;
2014-01-09 08:21:23 +00:00
var currentTime = sTime ? Date . parseDate ( sTime , options . formatTime ) : _this . now ( ) ;
2013-12-05 14:42:51 +00:00
if ( ! _this . isValidDate ( currentTime ) )
2014-07-09 13:42:06 +00:00
currentTime = _this . now ( true ) ;
2014-06-11 04:28:41 +00:00
2013-12-05 14:42:51 +00:00
return currentTime ;
} ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
_this . str = function ( ) {
2013-12-05 14:42:51 +00:00
return _this . currentTime . dateFormat ( options . format ) ;
2013-12-31 11:02:09 +00:00
} ;
2014-07-09 13:42:06 +00:00
_this . currentTime = this . now ( ) ;
2014-01-09 06:54:36 +00:00
} ;
2013-12-24 11:59:06 +00:00
mounth _picker
. find ( '.xdsoft_today_button' )
. on ( 'mousedown.xdsoft' , function ( ) {
datetimepicker . data ( 'changed' , true ) ;
2014-01-09 08:21:23 +00:00
_xdsoft _datetime . setCurrentTime ( 0 ) ;
2013-12-24 11:59:06 +00:00
datetimepicker . trigger ( 'afterOpen.xdsoft' ) ;
2013-12-24 12:11:46 +00:00
} ) . on ( 'dblclick.xdsoft' , function ( ) {
input . val ( _xdsoft _datetime . str ( ) ) ;
datetimepicker . trigger ( 'close.xdsoft' ) ;
2013-12-24 11:59:06 +00:00
} ) ;
2013-12-05 14:42:51 +00:00
mounth _picker
. find ( '.xdsoft_prev,.xdsoft_next' )
2013-12-16 03:51:07 +00:00
. on ( 'mousedown.xdsoft' , function ( ) {
2013-12-05 14:42:51 +00:00
var $this = $ ( this ) ,
timer = 0 ,
stop = false ;
2013-12-25 03:45:34 +00:00
( function arguments _callee1 ( v ) {
2013-12-10 19:45:29 +00:00
var month = _xdsoft _datetime . currentTime . getMonth ( ) ;
2013-12-16 03:51:07 +00:00
if ( $this . hasClass ( options . next ) ) {
2013-12-10 19:45:29 +00:00
_xdsoft _datetime . nextMonth ( ) ;
2013-12-16 03:51:07 +00:00
} else if ( $this . hasClass ( options . prev ) ) {
2013-12-10 19:45:29 +00:00
_xdsoft _datetime . prevMonth ( ) ;
2013-12-05 14:42:51 +00:00
}
2014-05-14 05:48:24 +00:00
if ( options . monthChangeSpinner ) {
! stop && ( timer = setTimeout ( arguments _callee1 , v ? v : 100 ) ) ;
}
2013-12-05 14:42:51 +00:00
} ) ( 500 ) ;
2013-12-31 11:02:09 +00:00
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . on ( 'mouseup.xdsoft' , function arguments _callee2 ( ) {
2013-12-05 14:42:51 +00:00
clearTimeout ( timer ) ;
stop = true ;
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . off ( 'mouseup.xdsoft' , arguments _callee2 ) ;
2013-12-05 14:42:51 +00:00
} ) ;
} ) ;
timepicker
. find ( '.xdsoft_prev,.xdsoft_next' )
2013-12-16 03:51:07 +00:00
. on ( 'mousedown.xdsoft' , function ( ) {
2013-12-05 14:42:51 +00:00
var $this = $ ( this ) ,
timer = 0 ,
stop = false ,
period = 110 ;
2013-12-25 03:45:34 +00:00
( function arguments _callee4 ( v ) {
2014-01-12 18:02:26 +00:00
var pheight = timeboxparent [ 0 ] . clientHeight ,
2013-12-05 14:42:51 +00:00
height = timebox [ 0 ] . offsetHeight ,
top = Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) ) ;
2013-12-16 03:51:07 +00:00
if ( $this . hasClass ( options . next ) && ( height - pheight ) - options . timeHeightInTimePicker >= top ) {
2013-12-05 14:42:51 +00:00
timebox . css ( 'marginTop' , '-' + ( top + options . timeHeightInTimePicker ) + 'px' )
2013-12-16 03:51:07 +00:00
} else if ( $this . hasClass ( options . prev ) && top - options . timeHeightInTimePicker >= 0 ) {
2013-12-05 14:42:51 +00:00
timebox . css ( 'marginTop' , '-' + ( top - options . timeHeightInTimePicker ) + 'px' )
}
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) / ( height - pheight ) ) ] ) ;
period = ( period > 10 ) ? 10 : period - 10 ;
2013-12-25 03:45:34 +00:00
! stop && ( timer = setTimeout ( arguments _callee4 , v ? v : period ) ) ;
2013-12-05 14:42:51 +00:00
} ) ( 500 ) ;
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . on ( 'mouseup.xdsoft' , function arguments _callee5 ( ) {
2013-12-05 14:42:51 +00:00
clearTimeout ( timer ) ;
stop = true ;
$ ( [ document . body , window ] )
2013-12-25 03:45:34 +00:00
. off ( 'mouseup.xdsoft' , arguments _callee5 ) ;
2013-12-05 14:42:51 +00:00
} ) ;
} ) ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
var xchangeTimer = 0 ;
2013-12-05 14:42:51 +00:00
// base handler - generating a calendar and timepicker
datetimepicker
2013-12-16 03:51:07 +00:00
. on ( 'xchange.xdsoft' , function ( event ) {
2014-04-06 13:21:35 +00:00
clearTimeout ( xchangeTimer ) ;
xchangeTimer = setTimeout ( function ( ) {
var table = '' ,
start = new Date ( _xdsoft _datetime . currentTime . getFullYear ( ) , _xdsoft _datetime . currentTime . getMonth ( ) , 1 , 12 , 0 , 0 ) ,
i = 0 ,
today = _xdsoft _datetime . now ( ) ;
while ( start . getDay ( ) != options . dayOfWeekStart )
start . setDate ( start . getDate ( ) - 1 ) ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
//generate calendar
table += '<table><thead><tr>' ;
2013-12-31 11:02:09 +00:00
2014-07-18 10:44:46 +00:00
if ( options . weeks ) {
table += '<th></th>' ;
}
2014-04-06 13:21:35 +00:00
// days
for ( var j = 0 ; j < 7 ; j ++ ) {
2014-08-06 05:10:17 +00:00
table += '<th>' + options . i18n [ options . lang ] . dayOfWeek [ ( j + options . dayOfWeekStart ) % 7 ] + '</th>' ;
2014-04-06 13:21:35 +00:00
}
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
table += '</tr></thead>' ;
2014-07-18 10:44:46 +00:00
table += '<tbody>' ;
2014-04-06 13:21:35 +00:00
var maxDate = false , minDate = false ;
if ( options . maxDate !== false ) {
2014-08-06 05:25:50 +00:00
maxDate = _xdsoft _datetime . strToDate ( options . maxDate ) ;
2014-04-06 13:21:35 +00:00
maxDate = new Date ( maxDate . getFullYear ( ) , maxDate . getMonth ( ) , maxDate . getDate ( ) , 23 , 59 , 59 , 999 ) ;
}
if ( options . minDate !== false ) {
2014-08-06 05:25:50 +00:00
minDate = _xdsoft _datetime . strToDate ( options . minDate ) ;
2014-04-06 13:21:35 +00:00
minDate = new Date ( minDate . getFullYear ( ) , minDate . getMonth ( ) , minDate . getDate ( ) ) ;
}
2014-07-18 10:44:46 +00:00
var d , y , m , w , classes = [ ] , customDateSettings , newRow = true ;
2014-04-06 13:21:35 +00:00
2014-05-23 10:37:24 +00:00
while ( i < _xdsoft _datetime . currentTime . countDaysInMonth ( ) || start . getDay ( ) != options . dayOfWeekStart || _xdsoft _datetime . currentTime . getMonth ( ) == start . getMonth ( ) ) {
2014-04-06 13:21:35 +00:00
classes = [ ] ;
i ++ ;
2013-12-31 11:02:09 +00:00
2014-07-18 10:44:46 +00:00
d = start . getDate ( ) ; y = start . getFullYear ( ) ; m = start . getMonth ( ) ; w = start . getWeekOfYear ( ) ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
classes . push ( 'xdsoft_date' ) ;
2013-12-31 11:02:09 +00:00
2014-06-30 11:45:25 +00:00
if ( options . beforeShowDay && options . beforeShowDay . call ) {
customDateSettings = options . beforeShowDay . call ( datetimepicker , start ) ;
} else {
customDateSettings = null ;
}
2013-12-31 11:02:09 +00:00
2014-06-30 11:45:25 +00:00
if ( ( maxDate !== false && start > maxDate ) || ( minDate !== false && start < minDate ) || ( customDateSettings && customDateSettings [ 0 ] === false ) ) {
2014-04-06 13:21:35 +00:00
classes . push ( 'xdsoft_disabled' ) ;
}
2013-12-31 11:02:09 +00:00
2014-06-30 11:45:25 +00:00
if ( customDateSettings && customDateSettings [ 1 ] != "" ) {
classes . push ( customDateSettings [ 1 ] ) ;
2014-04-06 13:21:35 +00:00
}
2013-12-31 11:02:09 +00:00
2014-06-30 11:45:25 +00:00
if ( _xdsoft _datetime . currentTime . getMonth ( ) != m ) classes . push ( 'xdsoft_other_month' ) ;
2013-12-31 11:02:09 +00:00
2014-05-23 10:45:36 +00:00
if ( ( options . defaultSelect || datetimepicker . data ( 'changed' ) ) && _xdsoft _datetime . currentTime . dateFormat ( options . formatDate ) == start . dateFormat ( options . formatDate ) ) {
2014-04-06 13:21:35 +00:00
classes . push ( 'xdsoft_current' ) ;
}
2013-12-31 11:02:09 +00:00
2014-05-23 10:45:36 +00:00
if ( today . dateFormat ( options . formatDate ) == start . dateFormat ( options . formatDate ) ) {
2014-04-06 13:21:35 +00:00
classes . push ( 'xdsoft_today' ) ;
}
2013-12-31 11:02:09 +00:00
2014-05-23 10:45:36 +00:00
if ( start . getDay ( ) == 0 || start . getDay ( ) == 6 || ~ options . weekends . indexOf ( start . dateFormat ( options . formatDate ) ) ) {
2014-04-06 13:21:35 +00:00
classes . push ( 'xdsoft_weekend' ) ;
}
2013-12-31 11:02:09 +00:00
2014-06-05 00:20:35 +00:00
if ( options . beforeShowDay && typeof options . beforeShowDay == 'function' ) {
classes . push ( options . beforeShowDay ( start ) )
}
2014-04-29 17:12:32 +00:00
2014-07-18 10:44:46 +00:00
if ( newRow ) {
table += '<tr>' ;
newRow = false ;
if ( options . weeks ) {
table += '<th>' + w + '</th>' ;
}
}
2014-04-06 13:21:35 +00:00
table += '<td data-date="' + d + '" data-month="' + m + '" data-year="' + y + '"' + ' class="xdsoft_date xdsoft_day_of_week' + start . getDay ( ) + ' ' + classes . join ( ' ' ) + '">' +
'<div>' + d + '</div>' +
'</td>' ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
if ( start . getDay ( ) == options . dayOfWeekStartPrev ) {
table += '</tr>' ;
2014-07-18 10:44:46 +00:00
newRow = true ;
2014-03-11 14:22:29 +00:00
}
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
start . setDate ( d + 1 ) ;
}
table += '</tbody></table>' ;
calendar . html ( table ) ;
mounth _picker . find ( '.xdsoft_label span' ) . eq ( 0 ) . text ( options . i18n [ options . lang ] . months [ _xdsoft _datetime . currentTime . getMonth ( ) ] ) ;
mounth _picker . find ( '.xdsoft_label span' ) . eq ( 1 ) . text ( _xdsoft _datetime . currentTime . getFullYear ( ) ) ;
// generate timebox
var time = '' ,
h = '' ,
m = '' ,
line _time = function line _time ( h , m ) {
var now = _xdsoft _datetime . now ( ) ;
now . setHours ( h ) ;
h = parseInt ( now . getHours ( ) ) ;
now . setMinutes ( m ) ;
m = parseInt ( now . getMinutes ( ) ) ;
classes = [ ] ;
if ( ( options . maxTime !== false && _xdsoft _datetime . strtotime ( options . maxTime ) . getTime ( ) < now . getTime ( ) ) || ( options . minTime !== false && _xdsoft _datetime . strtotime ( options . minTime ) . getTime ( ) > now . getTime ( ) ) )
classes . push ( 'xdsoft_disabled' ) ;
if ( ( options . initTime || options . defaultSelect || datetimepicker . data ( 'changed' ) ) && parseInt ( _xdsoft _datetime . currentTime . getHours ( ) ) == parseInt ( h ) && ( options . step > 59 || Math [ options . roundTime ] ( _xdsoft _datetime . currentTime . getMinutes ( ) / options . step ) * options . step == parseInt ( m ) ) ) {
if ( options . defaultSelect || datetimepicker . data ( 'changed' ) ) {
classes . push ( 'xdsoft_current' ) ;
} else if ( options . initTime ) {
classes . push ( 'xdsoft_init_time' ) ;
}
}
if ( parseInt ( today . getHours ( ) ) == parseInt ( h ) && parseInt ( today . getMinutes ( ) ) == parseInt ( m ) )
classes . push ( 'xdsoft_today' ) ;
time += '<div class="xdsoft_time ' + classes . join ( ' ' ) + '" data-hour="' + h + '" data-minute="' + m + '">' + now . dateFormat ( options . formatTime ) + '</div>' ;
} ;
if ( ! options . allowTimes || ! $ . isArray ( options . allowTimes ) || ! options . allowTimes . length ) {
for ( var i = 0 , j = 0 ; i < ( options . hours12 ? 12 : 24 ) ; i ++ ) {
for ( j = 0 ; j < 60 ; j += options . step ) {
h = ( i < 10 ? '0' : '' ) + i ;
m = ( j < 10 ? '0' : '' ) + j ;
line _time ( h , m ) ;
}
}
} else {
for ( var i = 0 ; i < options . allowTimes . length ; i ++ ) {
h = _xdsoft _datetime . strtotime ( options . allowTimes [ i ] ) . getHours ( ) ;
m = _xdsoft _datetime . strtotime ( options . allowTimes [ i ] ) . getMinutes ( ) ;
line _time ( h , m ) ;
}
2013-12-05 14:42:51 +00:00
}
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
timebox . html ( time ) ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
var opt = '' ,
i = 0 ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
for ( i = parseInt ( options . yearStart , 10 ) + options . yearOffset ; i <= parseInt ( options . yearEnd , 10 ) + options . yearOffset ; i ++ ) {
opt += '<div class="xdsoft_option ' + ( _xdsoft _datetime . currentTime . getFullYear ( ) == i ? 'xdsoft_current' : '' ) + '" data-value="' + i + '">' + i + '</div>' ;
}
yearselect . children ( ) . eq ( 0 )
. html ( opt ) ;
2013-12-31 11:02:09 +00:00
2014-04-06 13:21:35 +00:00
for ( i = 0 , opt = '' ; i <= 11 ; i ++ ) {
opt += '<div class="xdsoft_option ' + ( _xdsoft _datetime . currentTime . getMonth ( ) == i ? 'xdsoft_current' : '' ) + '" data-value="' + i + '">' + options . i18n [ options . lang ] . months [ i ] + '</div>' ;
}
monthselect . children ( ) . eq ( 0 ) . html ( opt ) ;
2014-05-23 06:16:07 +00:00
$ ( datetimepicker )
. trigger ( 'generate.xdsoft' ) ;
2014-04-06 13:21:35 +00:00
} , 10 ) ;
2013-12-05 14:42:51 +00:00
event . stopPropagation ( ) ;
} )
2013-12-16 03:51:07 +00:00
. on ( 'afterOpen.xdsoft' , function ( ) {
2014-03-11 14:22:29 +00:00
if ( options . timepicker ) {
var classType ;
if ( timebox . find ( '.xdsoft_current' ) . length ) {
classType = '.xdsoft_current' ;
} else if ( timebox . find ( '.xdsoft_init_time' ) . length ) {
classType = '.xdsoft_init_time' ;
}
if ( classType ) {
var pheight = timeboxparent [ 0 ] . clientHeight ,
height = timebox [ 0 ] . offsetHeight ,
top = timebox . find ( classType ) . index ( ) * options . timeHeightInTimePicker + 1 ;
if ( ( height - pheight ) < top )
top = height - pheight ;
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ parseInt ( top ) / ( height - pheight ) ] ) ;
2014-05-23 06:16:07 +00:00
} else {
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ 0 ] ) ;
2014-03-11 14:22:29 +00:00
}
2013-12-05 14:42:51 +00:00
}
} ) ;
2014-03-24 19:52:20 +00:00
2013-12-16 09:19:10 +00:00
var timerclick = 0 ;
2014-04-06 13:21:35 +00:00
2013-12-05 14:42:51 +00:00
calendar
2014-04-02 18:14:23 +00:00
. on ( 'click.xdsoft' , 'td' , function ( xdevent ) {
2014-04-06 13:21:35 +00:00
xdevent . stopPropagation ( ) ; // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
2013-12-16 09:19:10 +00:00
timerclick ++ ;
2013-12-05 14:42:51 +00:00
var $this = $ ( this ) ,
2013-12-10 19:45:29 +00:00
currentTime = _xdsoft _datetime . currentTime ;
2014-07-08 13:30:24 +00:00
if ( currentTime === undefined || currentTime === null ) {
_xdsoft _datetime . currentTime = _xdsoft _datetime . now ( ) ;
currentTime = _xdsoft _datetime . currentTime ;
}
2013-12-05 14:42:51 +00:00
if ( $this . hasClass ( 'xdsoft_disabled' ) )
return false ;
2013-12-31 11:02:09 +00:00
2014-05-22 12:01:39 +00:00
currentTime . setDate ( 1 ) ;
2014-04-06 13:21:35 +00:00
currentTime . setFullYear ( $this . data ( 'year' ) ) ;
2014-05-22 12:01:39 +00:00
currentTime . setMonth ( $this . data ( 'month' ) ) ;
currentTime . setDate ( $this . data ( 'date' ) ) ;
2014-04-06 13:21:35 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'select.xdsoft' , [ currentTime ] ) ;
2013-12-31 11:02:09 +00:00
2013-12-10 19:45:29 +00:00
input . val ( _xdsoft _datetime . str ( ) ) ;
2013-12-16 09:19:10 +00:00
if ( ( timerclick > 1 || ( options . closeOnDateSelect === true || ( options . closeOnDateSelect === 0 && ! options . timepicker ) ) ) && ! options . inline ) {
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'close.xdsoft' ) ;
}
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . onSelectDate && options . onSelectDate . call ) {
2013-12-10 19:45:29 +00:00
options . onSelectDate . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
}
2013-12-31 11:02:09 +00:00
2013-12-24 11:59:06 +00:00
datetimepicker . data ( 'changed' , true ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
datetimepicker . trigger ( 'changedatetime.xdsoft' ) ;
2013-12-16 09:19:10 +00:00
setTimeout ( function ( ) {
timerclick = 0 ;
} , 200 ) ;
2013-12-31 11:02:09 +00:00
} ) ;
2013-12-05 14:42:51 +00:00
timebox
2014-04-02 18:14:23 +00:00
. on ( 'click.xdsoft' , 'div' , function ( xdevent ) {
xdevent . stopPropagation ( ) ; // NAJ: Prevents closing of Pop-ups, Modals and Flyouts
2013-12-05 14:42:51 +00:00
var $this = $ ( this ) ,
2013-12-10 19:45:29 +00:00
currentTime = _xdsoft _datetime . currentTime ;
2014-07-08 13:30:24 +00:00
if ( currentTime === undefined || currentTime === null ) {
_xdsoft _datetime . currentTime = _xdsoft _datetime . now ( ) ;
currentTime = _xdsoft _datetime . currentTime ;
}
2013-12-05 14:42:51 +00:00
if ( $this . hasClass ( 'xdsoft_disabled' ) )
return false ;
currentTime . setHours ( $this . data ( 'hour' ) ) ;
currentTime . setMinutes ( $this . data ( 'minute' ) ) ;
datetimepicker . trigger ( 'select.xdsoft' , [ currentTime ] ) ;
2013-12-31 11:02:09 +00:00
2013-12-10 19:45:29 +00:00
datetimepicker . data ( 'input' ) . val ( _xdsoft _datetime . str ( ) ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
! options . inline && datetimepicker . trigger ( 'close.xdsoft' ) ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . onSelectTime && options . onSelectTime . call ) {
2013-12-10 19:45:29 +00:00
options . onSelectTime . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
}
2013-12-24 11:59:06 +00:00
datetimepicker . data ( 'changed' , true ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'xchange.xdsoft' ) ;
datetimepicker . trigger ( 'changedatetime.xdsoft' ) ;
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker . mousewheel && datepicker . mousewheel ( function ( event , delta , deltaX , deltaY ) {
if ( ! options . scrollMonth )
return true ;
if ( delta < 0 )
2013-12-10 19:45:29 +00:00
_xdsoft _datetime . nextMonth ( ) ;
2013-12-05 14:42:51 +00:00
else
2013-12-10 19:45:29 +00:00
_xdsoft _datetime . prevMonth ( ) ;
2013-12-05 14:42:51 +00:00
return false ;
2013-11-03 10:11:36 +00:00
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker . mousewheel && timeboxparent . unmousewheel ( ) . mousewheel ( function ( event , delta , deltaX , deltaY ) {
if ( ! options . scrollTime )
return true ;
2014-01-12 18:02:26 +00:00
var pheight = timeboxparent [ 0 ] . clientHeight ,
2013-11-15 06:47:44 +00:00
height = timebox [ 0 ] . offsetHeight ,
2013-12-05 14:42:51 +00:00
top = Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) ) ,
fl = true ;
2013-12-16 03:51:07 +00:00
if ( delta < 0 && ( height - pheight ) - options . timeHeightInTimePicker >= top ) {
2013-12-05 14:42:51 +00:00
timebox . css ( 'marginTop' , '-' + ( top + options . timeHeightInTimePicker ) + 'px' ) ;
fl = false ;
2013-12-16 03:51:07 +00:00
} else if ( delta > 0 && top - options . timeHeightInTimePicker >= 0 ) {
2013-12-05 14:42:51 +00:00
timebox . css ( 'marginTop' , '-' + ( top - options . timeHeightInTimePicker ) + 'px' ) ;
fl = false ;
2013-11-03 10:11:36 +00:00
}
2013-12-04 14:16:19 +00:00
timeboxparent . trigger ( 'scroll_element.xdsoft_scroller' , [ Math . abs ( parseInt ( timebox . css ( 'marginTop' ) ) / ( height - pheight ) ) ] ) ;
2013-12-05 14:42:51 +00:00
event . stopPropagation ( ) ;
return fl ;
2013-11-03 10:11:36 +00:00
} ) ;
2014-05-23 06:16:07 +00:00
var triggerAfterOpen = false ;
2013-12-05 14:42:51 +00:00
datetimepicker
2013-12-16 03:51:07 +00:00
. on ( 'changedatetime.xdsoft' , function ( ) {
2014-03-20 18:41:34 +00:00
if ( options . onChangeDateTime && options . onChangeDateTime . call ) {
var $input = datetimepicker . data ( 'input' ) ;
options . onChangeDateTime . call ( datetimepicker , _xdsoft _datetime . currentTime , $input ) ;
2014-08-06 05:10:17 +00:00
delete options . value ;
2014-03-20 18:41:34 +00:00
$input . trigger ( 'change' ) ;
}
2013-12-10 19:45:29 +00:00
} )
2013-12-16 03:51:07 +00:00
. on ( 'generate.xdsoft' , function ( ) {
2013-12-10 19:45:29 +00:00
if ( options . onGenerate && options . onGenerate . call )
options . onGenerate . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2014-05-23 06:16:07 +00:00
if ( triggerAfterOpen ) {
datetimepicker . trigger ( 'afterOpen.xdsoft' ) ;
triggerAfterOpen = false ;
}
2014-05-22 08:02:21 +00:00
} )
. on ( 'click.xdsoft' , function ( xdevent )
{
xdevent . stopPropagation ( ) ; // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
2013-12-05 14:42:51 +00:00
} ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
var current _time _index = 0 ;
2013-12-16 03:51:07 +00:00
input . mousewheel && input . mousewheel ( function ( event , delta , deltaX , deltaY ) {
2013-12-05 14:42:51 +00:00
if ( ! options . scrollInput )
return true ;
2013-12-16 03:51:07 +00:00
if ( ! options . datepicker && options . timepicker ) {
2013-12-05 14:42:51 +00:00
current _time _index = timebox . find ( '.xdsoft_current' ) . length ? timebox . find ( '.xdsoft_current' ) . eq ( 0 ) . index ( ) : 0 ;
if ( current _time _index + delta >= 0 && current _time _index + delta < timebox . children ( ) . length )
current _time _index += delta ;
timebox . children ( ) . eq ( current _time _index ) . length && timebox . children ( ) . eq ( current _time _index ) . trigger ( 'mousedown' ) ;
return false ;
2013-12-16 03:51:07 +00:00
} else if ( options . datepicker && ! options . timepicker ) {
2013-12-05 14:42:51 +00:00
datepicker . trigger ( event , [ delta , deltaX , deltaY ] ) ;
2013-12-10 19:45:29 +00:00
input . val && input . val ( _xdsoft _datetime . str ( ) ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'changedatetime.xdsoft' ) ;
return false ;
2013-11-03 10:11:36 +00:00
}
2013-12-05 14:42:51 +00:00
} ) ;
2013-12-16 03:51:07 +00:00
var setPos = function ( ) {
2014-05-30 06:07:02 +00:00
var offset = datetimepicker . data ( 'input' ) . offset ( ) , top = offset . top + datetimepicker . data ( 'input' ) [ 0 ] . offsetHeight - 1 , left = offset . left , position = "absolute" ;
if ( options . fixed ) {
top -= $ ( window ) . scrollTop ( ) ;
left -= $ ( window ) . scrollLeft ( ) ;
position = "fixed" ;
} else {
if ( top + datetimepicker [ 0 ] . offsetHeight > $ ( window ) . height ( ) + $ ( window ) . scrollTop ( ) )
top = offset . top - datetimepicker [ 0 ] . offsetHeight + 1 ;
if ( top < 0 )
top = 0 ;
if ( left + datetimepicker [ 0 ] . offsetWidth > $ ( window ) . width ( ) )
left = offset . left - datetimepicker [ 0 ] . offsetWidth + datetimepicker . data ( 'input' ) [ 0 ] . offsetWidth ;
}
2013-12-05 15:19:41 +00:00
datetimepicker . css ( {
2013-12-12 02:28:56 +00:00
left : left ,
2014-05-30 06:07:02 +00:00
top : top ,
position : position
2013-12-05 15:19:41 +00:00
} ) ;
} ;
2013-12-05 14:42:51 +00:00
datetimepicker
2013-12-16 03:51:07 +00:00
. on ( 'open.xdsoft' , function ( ) {
2013-12-05 14:42:51 +00:00
var onShow = true ;
2013-12-16 03:51:07 +00:00
if ( options . onShow && options . onShow . call ) {
2013-12-10 19:45:29 +00:00
onShow = options . onShow . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
}
2013-12-16 03:51:07 +00:00
if ( onShow !== false ) {
2013-12-05 14:42:51 +00:00
datetimepicker . show ( ) ;
setPos ( ) ;
2013-12-05 15:19:41 +00:00
$ ( window )
. off ( 'resize.xdsoft' , setPos )
. on ( 'resize.xdsoft' , setPos ) ;
2013-12-31 11:02:09 +00:00
2013-12-16 03:51:07 +00:00
if ( options . closeOnWithoutClick ) {
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . on ( 'mousedown.xdsoft' , function arguments _callee6 ( ) {
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'close.xdsoft' ) ;
2013-12-25 03:45:34 +00:00
$ ( [ document . body , window ] ) . off ( 'mousedown.xdsoft' , arguments _callee6 ) ;
2013-12-05 14:42:51 +00:00
} ) ;
}
}
} )
2013-12-16 03:51:07 +00:00
. on ( 'close.xdsoft' , function ( event ) {
2013-12-05 14:42:51 +00:00
var onClose = true ;
2013-12-16 03:51:07 +00:00
if ( options . onClose && options . onClose . call ) {
2013-12-10 19:45:29 +00:00
onClose = options . onClose . call ( datetimepicker , _xdsoft _datetime . currentTime , datetimepicker . data ( 'input' ) ) ;
2013-12-05 14:42:51 +00:00
}
2013-12-16 03:51:07 +00:00
if ( onClose !== false && ! options . opened && ! options . inline ) {
2013-12-05 14:42:51 +00:00
datetimepicker . hide ( ) ;
}
event . stopPropagation ( ) ;
} )
. data ( 'input' , input ) ;
2013-12-31 11:02:09 +00:00
2013-12-10 19:45:29 +00:00
var timer = 0 ,
2013-12-05 14:42:51 +00:00
timer1 = 0 ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
datetimepicker . data ( 'xdsoft_datetime' , _xdsoft _datetime ) ;
datetimepicker . setOptions ( options ) ;
2014-03-24 19:52:20 +00:00
function getCurrentValue ( ) {
2014-06-09 15:44:51 +00:00
var ct = false ;
2014-07-09 13:42:06 +00:00
if ( options . startDate ) {
2014-08-06 05:25:50 +00:00
ct = _xdsoft _datetime . strToDate ( options . startDate ) ;
2014-07-09 13:42:06 +00:00
} else {
2014-06-09 15:44:51 +00:00
ct = options . value ? options . value : ( input && input . val && input . val ( ) ) ? input . val ( ) : '' ;
2014-08-06 05:25:50 +00:00
if ( ct ) {
ct = _xdsoft _datetime . strToDateTime ( ct ) ;
} else if ( options . defaultDate ) {
ct = _xdsoft _datetime . strToDate ( options . defaultDate ) ;
}
2014-06-09 15:44:51 +00:00
}
if ( ct && _xdsoft _datetime . isValidDate ( ct ) ) {
2014-03-24 19:52:20 +00:00
datetimepicker . data ( 'changed' , true ) ;
2014-06-09 15:44:51 +00:00
} else {
ct = '' ;
}
2014-03-24 19:52:20 +00:00
return ct ? ct : 0 ;
}
2014-07-09 13:42:06 +00:00
//debugger
2014-03-24 19:52:20 +00:00
_xdsoft _datetime . setCurrentTime ( getCurrentValue ( ) ) ;
2013-12-31 11:02:09 +00:00
2013-12-05 14:42:51 +00:00
input
. data ( 'xdsoft_datetimepicker' , datetimepicker )
2013-12-16 03:51:07 +00:00
. on ( 'open.xdsoft focusin.xdsoft mousedown.xdsoft' , function ( event ) {
2014-06-04 06:53:58 +00:00
if ( input . is ( ':disabled' ) || input . is ( ':hidden' ) || ! input . is ( ':visible' ) || ( input . data ( 'xdsoft_datetimepicker' ) . is ( ':visible' ) && options . closeOnInputClick ) )
2013-12-05 14:42:51 +00:00
return ;
clearTimeout ( timer ) ;
2013-12-16 03:51:07 +00:00
timer = setTimeout ( function ( ) {
2013-12-05 14:42:51 +00:00
if ( input . is ( ':disabled' ) || input . is ( ':hidden' ) || ! input . is ( ':visible' ) )
return ;
2014-05-23 06:16:07 +00:00
triggerAfterOpen = true ;
2014-03-24 19:52:20 +00:00
_xdsoft _datetime . setCurrentTime ( getCurrentValue ( ) ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . trigger ( 'open.xdsoft' ) ;
} , 100 ) ;
} )
2013-12-16 03:51:07 +00:00
. on ( 'keydown.xdsoft' , function ( event ) {
2013-12-31 11:02:09 +00:00
var val = this . value ,
2013-12-12 09:17:06 +00:00
key = event . which ;
2013-12-16 03:51:07 +00:00
switch ( true ) {
2013-12-12 09:17:06 +00:00
case ! ! ~ ( [ ENTER ] . indexOf ( key ) ) :
var elementSelector = $ ( "input:visible,textarea:visible" ) ;
datetimepicker . trigger ( 'close.xdsoft' ) ;
elementSelector . eq ( elementSelector . index ( this ) + 1 ) . focus ( ) ;
return false ;
case ! ! ~ [ TAB ] . indexOf ( key ) :
datetimepicker . trigger ( 'close.xdsoft' ) ;
return true ;
}
} ) ;
2013-12-05 14:42:51 +00:00
} ,
2013-12-16 03:51:07 +00:00
destroyDateTimePicker = function ( input ) {
2013-12-05 14:42:51 +00:00
var datetimepicker = input . data ( 'xdsoft_datetimepicker' ) ;
2013-12-16 03:51:07 +00:00
if ( datetimepicker ) {
2013-12-25 03:45:34 +00:00
datetimepicker . data ( 'xdsoft_datetime' , null ) ;
2013-12-05 14:42:51 +00:00
datetimepicker . remove ( ) ;
input
. data ( 'xdsoft_datetimepicker' , null )
2013-12-11 15:45:22 +00:00
. off ( 'open.xdsoft focusin.xdsoft focusout.xdsoft mousedown.xdsoft blur.xdsoft keydown.xdsoft' ) ;
2013-12-05 14:42:51 +00:00
$ ( window ) . off ( 'resize.xdsoft' ) ;
$ ( [ window , document . body ] ) . off ( 'mousedown.xdsoft' ) ;
input . unmousewheel && input . unmousewheel ( ) ;
2013-11-03 10:11:36 +00:00
}
2013-12-05 14:42:51 +00:00
} ;
$ ( document )
2013-12-05 15:19:41 +00:00
. off ( 'keydown.xdsoftctrl keyup.xdsoftctrl' )
2013-12-16 03:51:07 +00:00
. on ( 'keydown.xdsoftctrl' , function ( e ) {
2013-12-31 11:02:09 +00:00
if ( e . keyCode == CTRLKEY )
2013-12-05 14:42:51 +00:00
ctrlDown = true ;
2013-12-05 15:19:41 +00:00
} )
2013-12-16 03:51:07 +00:00
. on ( 'keyup.xdsoftctrl' , function ( e ) {
2013-12-05 14:42:51 +00:00
if ( e . keyCode == CTRLKEY )
ctrlDown = false ;
} ) ;
2013-12-16 03:51:07 +00:00
return this . each ( function ( ) {
2013-11-07 04:24:58 +00:00
var datetimepicker ;
2013-12-16 03:51:07 +00:00
if ( datetimepicker = $ ( this ) . data ( 'xdsoft_datetimepicker' ) ) {
if ( $ . type ( opt ) === 'string' ) {
switch ( opt ) {
2013-11-07 04:24:58 +00:00
case 'show' :
2013-11-28 12:16:07 +00:00
$ ( this ) . select ( ) . focus ( ) ;
datetimepicker . trigger ( 'open.xdsoft' ) ;
2013-11-07 04:24:58 +00:00
break ;
case 'hide' :
2013-11-28 12:16:07 +00:00
datetimepicker . trigger ( 'close.xdsoft' ) ;
2013-11-07 04:24:58 +00:00
break ;
2013-11-19 09:20:05 +00:00
case 'destroy' :
destroyDateTimePicker ( $ ( this ) ) ;
break ;
2013-12-24 11:59:06 +00:00
case 'reset' :
this . value = this . defaultValue ;
if ( ! this . value || ! datetimepicker . data ( 'xdsoft_datetime' ) . isValidDate ( Date . parseDate ( this . value , options . format ) ) )
datetimepicker . data ( 'changed' , false ) ;
2013-12-31 11:02:09 +00:00
datetimepicker . data ( 'xdsoft_datetime' ) . setCurrentTime ( this . value ) ;
2013-12-24 11:59:06 +00:00
break ;
2013-11-07 04:24:58 +00:00
}
} else {
2013-12-05 14:42:51 +00:00
datetimepicker
2014-01-09 08:21:23 +00:00
. setOptions ( opt ) ;
2013-11-07 04:24:58 +00:00
}
2013-11-03 10:11:36 +00:00
return 0 ;
2013-11-19 09:20:05 +00:00
} else
2014-03-25 05:58:52 +00:00
if ( ( $ . type ( opt ) !== 'string' ) ) {
if ( ! options . lazyInit || options . open || options . inline ) {
createDateTimePicker ( $ ( this ) ) ;
} else
lazyInit ( $ ( this ) ) ;
}
2013-11-03 10:11:36 +00:00
} ) ;
} ;
2014-05-30 09:01:20 +00:00
$ . fn . datetimepicker . defaults = default _options ;
2013-11-03 10:11:36 +00:00
} ) ( jQuery ) ;
/ *
* Copyright ( c ) 2013 Brandon Aaron ( http : //brandonaaron.net)
*
* Licensed under the MIT License ( LICENSE . txt ) .
*
* Thanks to : http : //adomas.org/javascript-mouse-wheel/ for some pointers.
* Thanks to : Mathias Bank ( http : //www.mathias-bank.de) for a scope bug fix.
* Thanks to : Seamus Leahy for adding deltaX and deltaY
*
* Version : 3.1 . 3
*
* Requires : 1.2 . 2 +
* /
2013-12-16 03:51:07 +00:00
( 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 ) } } ) ) ;
2014-05-22 11:17:56 +00:00
// Parse and Format Library
//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/
/ *
* Copyright ( C ) 2004 Baron Schwartz < baron at sequent dot org >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation , version 2.1 .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE . See the GNU Lesser General Public License for more
* details .
* /
2014-05-25 18:55:05 +00:00
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