(function($){
var PROP_NAME='datepick'
function Datepick(){
this._uuid=new Date().getTime()
this._curInst=null
this._keyEvent=false
this._disabledInputs=[]
this._datepickerShowing=false
this._inDialog=false
this.regional=[]
this.regional['']={
clearText: 'Clear',
clearStatus: 'Erase the current date',
closeText: 'Close',
closeStatus: 'Close without change',
prevText: '&#x3c;Prev',
prevStatus: 'Show the previous month',
prevBigText: '&#x3c;&#x3c;',
prevBigStatus: 'Show the previous year',
nextText: 'Next&#x3e;',
nextStatus: 'Show the next month',
nextBigText: '&#x3e;&#x3e;',
nextBigStatus: 'Show the next year',
currentText: 'Month',
currentStatus: 'Show the current month',
monthNames: ['January','February','March','April','May','June',
'July','August','September','October','November','December'],
monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
monthStatus: 'Show a different month',
yearStatus: 'Show a different year',
weekHeader: 'Wk',
weekStatus: 'Week of the year',
dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
dayStatus: 'Set DD as first week day',
dateStatus: 'DD, M d',
dateFormat: 'mm/dd/yy',
firstDay: 0,
initStatus: 'Select a date',
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''}
this._defaults={
useThemeRoller: false,
showOn: 'focus',
showAnim: 'slideDown',
showOptions:{},
duration: 'fast',
buttonText: 'Select a date',
buttonImage: '',
buttonImageOnly: false,
alignment: 'bottom',
defaultDate: null,
showDefault: false,
appendText: '',
closeAtTop: false,
mandatory: false,
hideIfNoPrevNext: false,
navigationAsDateFormat: false,
showBigPrevNext: false,
stepMonths: 1,
stepBigMonths: 12,
gotoCurrent: false,
changeMonth: true,
changeYear: true,
yearRange: '-0:+5',
changeFirstDay: false,
showOtherMonths: false,
selectOtherMonths: false,
highlightWeek: false,
showWeeks: false,
calculateWeek: this.iso8601Week,
shortYearCutoff: '+10',
showStatus: false,
statusForDate: this.dateStatus,
minDate: '-0W',
maxDate: null,
numberOfMonths: 1,
showCurrentAtPos: 0,
rangeSelect: false,
rangeSeparator: ' - ',
multiSelect: 0,
multiSeparator: ',',
beforeShow: null,
beforeShowDay: null,
onChangeMonthYear: null,
onHover: null,
onSelect: null,
onClose: null,
altField: '',
altFormat: '',
constrainInput: true}
$.extend(this._defaults,this.regional[''])
this.dpDiv=$('<div style="display: none;"></div>')}
$.extend(Datepick.prototype,{
version: '3.7.0',
markerClassName: 'hasDatepick',
_mainDivId: ['datepick-div','ui-datepicker-div'],
_mainDivClass: ['','ui-datepicker '+
'ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'],
_inlineClass: ['datepick-inline','ui-datepicker-inline ui-datepicker '+
'ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'],
_multiClass: ['datepick-multi','ui-datepicker-multi'],
_rtlClass: ['datepick-rtl','ui-datepicker-rtl'],
_appendClass: ['datepick-append','ui-datepicker-append'],
_triggerClass: ['datepick-trigger','ui-datepicker-trigger'],
_dialogClass: ['datepick-dialog','ui-datepicker-dialog'],
_promptClass: ['datepick-prompt','ui-datepicker-prompt'],
_disableClass: ['datepick-disabled','ui-datepicker-disabled'],
_controlClass: ['datepick-control','ui-datepicker-header '+
'ui-widget-header ui-helper-clearfix ui-corner-all'],
_clearClass: ['datepick-clear','ui-datepicker-clear'],
_closeClass: ['datepick-close','ui-datepicker-close'],
_linksClass: ['datepick-links','ui-datepicker-header '+
'ui-widget-header ui-helper-clearfix ui-corner-all'],
_prevClass: ['datepick-prev','ui-datepicker-prev'],
_nextClass: ['datepick-next','ui-datepicker-next'],
_currentClass: ['datepick-current','ui-datepicker-current'],
_oneMonthClass: ['datepick-one-month','ui-datepicker-group'],
_newRowClass: ['datepick-new-row','ui-datepicker-row-break'],
_monthYearClass: ['datepick-header','ui-datepicker-header '+
'ui-widget-header ui-helper-clearfix ui-corner-all'],
_monthSelectClass: ['datepick-new-month','ui-datepicker-month'],
_monthClass: ['','ui-datepicker-month'],
_yearSelectClass: ['datepick-new-year','ui-datepicker-year'],
_yearClass: ['','ui-datepicker-year'],
_tableClass: ['datepick','ui-datepicker-calendar'],
_tableHeaderClass: ['datepick-title-row',''],
_weekColClass: ['datepick-week-col','ui-datepicker-week-col'],
_weekRowClass: ['datepick-days-row',''],
_weekendClass: ['datepick-week-end-cell','ui-datepicker-week-end'],
_dayClass: ['datepick-days-cell',''],
_otherMonthClass: ['datepick-other-month','ui-datepicker-other-month'],
_todayClass: ['datepick-today','ui-state-highlight'],
_selectableClass: ['','ui-state-default'],
_unselectableClass: ['datepick-unselectable',
'ui-datepicker-unselectable ui-state-disabled'],
_selectedClass: ['datepick-current-day','ui-state-active'],
_dayOverClass: ['datepick-days-cell-over','ui-state-hover'],
_weekOverClass: ['datepick-week-over','ui-state-hover'],
_statusClass: ['datepick-status','ui-datepicker-status'],
_statusId: ['datepick-status-','ui-datepicker-status-'],
_coverClass: ['datepick-cover','ui-datepicker-cover'],
setDefaults: function(settings){
extendRemove(this._defaults,settings ||{})
return this
},
_attachDatepick: function(target,settings){
if(!target.id)
target.id='dp'+(++this._uuid)
var nodeName=target.nodeName.toLowerCase()
var inst=this._newInst($(target),(nodeName=='div' || nodeName=='span'))
var inlineSettings=($.fn.metadata ? $(target).metadata():{})
inst.settings=$.extend({},settings ||{},inlineSettings ||{})
if(inst.inline){
inst.dpDiv.addClass(this._inlineClass[
this._get(inst,'useThemeRoller')? 1 : 0])
this._inlineDatepick(target,inst)}
else
this._connectDatepick(target,inst)
},
_newInst: function(target,inline){
var id=target[0].id.replace(/([:\[\]\.])/g,'\\\\$1')
return{id: id,input: target,
cursorDate: this._daylightSavingAdjust(new Date()),
drawMonth: 0,drawYear: 0,
dates: [],
inline: inline,
dpDiv:(!inline ? this.dpDiv : $('<div></div>')),
siblings: $([])}
},
_connectDatepick: function(target,inst){
var input=$(target)
if(input.hasClass(this.markerClassName))
return
var appendText=this._get(inst,'appendText')
var isRTL=this._get(inst,'isRTL')
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
if(appendText){
var append=$('<span class="'+this._appendClass[useTR]+'">'+appendText+'</span>')
input[isRTL ? 'before' : 'after'](append)
inst.siblings=inst.siblings.add(append)}
var showOn=this._get(inst,'showOn')
if(showOn=='focus' || showOn=='both')
input.focus(this._showDatepick)
if(showOn=='button' || showOn=='both'){
var buttonText=this._get(inst,'buttonText')
var buttonImage=this._get(inst,'buttonImage')
var trigger=$(this._get(inst,'buttonImageOnly')?
$('<img/>').addClass(this._triggerClass[useTR]).
attr({src: buttonImage,alt: buttonText,title: buttonText}):
$('<button type="button"></button>').addClass(this._triggerClass[useTR]).
html(buttonImage=='' ? buttonText : $('<img/>').attr(
{src: buttonImage,alt: buttonText,title: buttonText})))
input[isRTL ? 'before' : 'after'](trigger)
inst.siblings=inst.siblings.add(trigger)
trigger.click(function(){
if($.datepick._datepickerShowing&&$.datepick._lastInput==target)
$.datepick._hideDatepick()
else
$.datepick._showDatepick(target)
return false
})}
input.addClass(this.markerClassName).keydown(this._doKeyDown).
keypress(this._doKeyPress).keyup(this._doKeyUp)
if(this._get(inst,'showDefault')&&!inst.input.val()){
inst.dates=[this._getDefaultDate(inst)]
this._showDate(inst)}
$.data(target,PROP_NAME,inst)
},
_inlineDatepick: function(target,inst){
var divSpan=$(target)
if(divSpan.hasClass(this.markerClassName))
return
divSpan.addClass(this.markerClassName)
$.data(target,PROP_NAME,inst)
inst.drawMonth=inst.cursorDate.getMonth()
inst.drawYear=inst.cursorDate.getFullYear()
$('body').append(inst.dpDiv)
this._updateDatepick(inst)
inst.dpDiv.width(this._getNumberOfMonths(inst)[1]*
$('.'+this._oneMonthClass[this._get(inst,'useThemeRoller')? 1 : 0],
inst.dpDiv)[0].offsetWidth)
divSpan.append(inst.dpDiv)
this._updateAlternate(inst)
},
_dialogDatepick: function(input,date,onSelect,settings,pos){
var inst=this._dialogInst
if(!inst){
var id='dp'+(++this._uuid)
this._dialogInput=$('<input type="text" id="'+id+
'" style="position: absolute; width: 1px; z-index: -1"/>')
this._dialogInput.keydown(this._doKeyDown)
$('body').append(this._dialogInput)
inst=this._dialogInst=this._newInst(this._dialogInput,false)
inst.settings={}
$.data(this._dialogInput[0],PROP_NAME,inst)}
extendRemove(inst.settings,settings ||{})
date=(date&&date.constructor==Date ? this._formatDate(inst,date): date)
this._dialogInput.val(date)
this._pos=(pos ?(isArray(pos)? pos : [pos.pageX,pos.pageY]): null)
if(!this._pos){
var scrollX=document.documentElement.scrollLeft || document.body.scrollLeft
var scrollY=document.documentElement.scrollTop || document.body.scrollTop
this._pos=
[(document.documentElement.clientWidth/2)-100+scrollX,
(document.documentElement.clientHeight/2)-150+scrollY]}
this._dialogInput.css('left',(this._pos[0]+20)+'px').css('top',this._pos[1]+'px')
inst.settings.onSelect=onSelect
this._inDialog=true
this.dpDiv.addClass(this._dialogClass[this._get(inst,'useThemeRoller')? 1 : 0])
this._showDatepick(this._dialogInput[0])
if($.blockUI)
$.blockUI(this.dpDiv)
$.data(this._dialogInput[0],PROP_NAME,inst)
},
_destroyDatepick: function(target){
var $target=$(target)
if(!$target.hasClass(this.markerClassName)){
return}
var inst=$.data(target,PROP_NAME)
$.removeData(target,PROP_NAME)
if(inst.inline)
$target.removeClass(this.markerClassName).empty()
else{
$(inst.siblings).remove()
$target.removeClass(this.markerClassName).
unbind('focus',this._showDatepick).unbind('keydown',this._doKeyDown).
unbind('keypress',this._doKeyPress).unbind('keyup',this._doKeyUp)}
},
_enableDatepick: function(target){
var $target=$(target)
if(!$target.hasClass(this.markerClassName))
return
var inst=$.data(target,PROP_NAME)
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
if(inst.inline)
$target.children('.'+this._disableClass[useTR]).remove().end().
find('select').attr('disabled','')
else{
target.disabled=false
inst.siblings.filter('button.'+this._triggerClass[useTR]).
each(function(){this.disabled=false;}).end().
filter('img.'+this._triggerClass[useTR]).
css({opacity: '1.0',cursor: ''})}
this._disabledInputs=$.map(this._disabledInputs,
function(value){return(value==target ? null : value);})
},
_disableDatepick: function(target){
var $target=$(target)
if(!$target.hasClass(this.markerClassName))
return
var inst=$.data(target,PROP_NAME)
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
if(inst.inline){
var inline=$target.children('.'+this._inlineClass[useTR])
var offset=inline.offset()
var relOffset={left: 0,top: 0}
inline.parents().each(function(){
if($(this).css('position')=='relative'){
relOffset=$(this).offset()
return false}
})
$target.prepend('<div class="'+this._disableClass[useTR]+'" style="'+
'width: '+inline.width()+'px; height: '+inline.height()+
'px; left: '+(offset.left-relOffset.left)+
'px; top: '+(offset.top-relOffset.top)+'px;"></div>').
find('select').attr('disabled','disabled')}
else{
target.disabled=true
inst.siblings.filter('button.'+this._triggerClass[useTR]).
each(function(){this.disabled=true;}).end().
filter('img.'+this._triggerClass[useTR]).
css({opacity: '0.5',cursor: 'default'})}
this._disabledInputs=$.map(this._disabledInputs,
function(value){return(value==target ? null : value);})
this._disabledInputs.push(target)
},
_isDisabledDatepick: function(target){
return(!target ? false : $.inArray(target,this._disabledInputs)>-1)
},
_getInst: function(target){
try{
return $.data(target,PROP_NAME)}
catch(err){
throw 'Missing instance data for this datepicker'}
},
_optionDatepick: function(target,name,value){
var inst=this._getInst(target)
if(arguments.length==2&&typeof name=='string'){
return(name=='defaults' ? $.extend({},$.datepick._defaults):
(inst ?(name=='all' ? $.extend({},inst.settings):
this._get(inst,name)): null))}
var settings=name ||{}
if(typeof name=='string'){
settings={}
settings[name]=value}
if(inst){
if(this._curInst==inst){
this._hideDatepick(null)}
var dates=this._getDateDatepick(target)
extendRemove(inst.settings,settings)
extendRemove(inst,{dates: []})
var blank=(!dates || isArray(dates))
if(isArray(dates))
for(var i=0;i<dates.length;i++)
if(dates[i]){
blank=false
break}
if(!blank)
this._setDateDatepick(target,dates)
if(inst.inline)
$(target).children('div').removeClass(this._inlineClass.join(' ')).
addClass(this._inlineClass[this._get(inst,'useThemeRoller')? 1 : 0])
this._updateDatepick(inst)}
},
_changeDatepick: function(target,name,value){
this._optionDatepick(target,name,value)
},
_refreshDatepick: function(target){
var inst=this._getInst(target)
if(inst){
this._updateDatepick(inst)}
},
_setDateDatepick: function(target,date,endDate){
var inst=this._getInst(target)
if(inst){
this._setDate(inst,date,endDate)
this._updateDatepick(inst)
this._updateAlternate(inst)}
},
_getDateDatepick: function(target){
var inst=this._getInst(target)
if(inst&&!inst.inline)
this._setDateFromField(inst)
return(inst ? this._getDate(inst): null)
},
_doKeyDown: function(event){
var inst=$.datepick._getInst(event.target)
inst.keyEvent=true
var handled=true
var isRTL=$.datepick._get(inst,'isRTL')
var useTR=$.datepick._get(inst,'useThemeRoller')? 1 : 0
if($.datepick._datepickerShowing)
switch(event.keyCode){
case 9: $.datepick._hideDatepick(null,'')
break
case 13: var sel=$('td.'+$.datepick._dayOverClass[useTR],inst.dpDiv)
if(sel.length==0)
sel=$('td.'+$.datepick._selectedClass[useTR]+':first',inst.dpDiv)
if(sel[0])
$.datepick._selectDay(sel[0],event.target,inst.cursorDate.getTime())
else
$.datepick._hideDatepick(null,$.datepick._get(inst,'duration'))
break
case 27: $.datepick._hideDatepick(null,$.datepick._get(inst,'duration'))
break
case 33: $.datepick._adjustDate(event.target,(event.ctrlKey ?
-$.datepick._get(inst,'stepBigMonths'):
-$.datepick._get(inst,'stepMonths')),'M')
break
case 34: $.datepick._adjustDate(event.target,(event.ctrlKey ?
+$.datepick._get(inst,'stepBigMonths'):
+$.datepick._get(inst,'stepMonths')),'M')
break
case 35: if(event.ctrlKey || event.metaKey)
$.datepick._clearDate(event.target)
handled=event.ctrlKey || event.metaKey
break
case 36: if(event.ctrlKey || event.metaKey)
$.datepick._gotoToday(event.target)
handled=event.ctrlKey || event.metaKey
break
case 37: if(event.ctrlKey || event.metaKey)
$.datepick._adjustDate(event.target,(isRTL ?+1 :-1),'D')
handled=event.ctrlKey || event.metaKey
if(event.originalEvent.altKey)
$.datepick._adjustDate(event.target,
(event.ctrlKey ?-$.datepick._get(inst,'stepBigMonths'):
-$.datepick._get(inst,'stepMonths')),'M')
break
case 38: if(event.ctrlKey || event.metaKey)
$.datepick._adjustDate(event.target,-7,'D')
handled=event.ctrlKey || event.metaKey
break
case 39: if(event.ctrlKey || event.metaKey)
$.datepick._adjustDate(event.target,(isRTL ?-1 :+1),'D')
handled=event.ctrlKey || event.metaKey
if(event.originalEvent.altKey)
$.datepick._adjustDate(event.target,
(event.ctrlKey ?+$.datepick._get(inst,'stepBigMonths'):
+$.datepick._get(inst,'stepMonths')),'M')
break
case 40: if(event.ctrlKey || event.metaKey)
$.datepick._adjustDate(event.target,+7,'D')
handled=event.ctrlKey || event.metaKey
break
default: handled=false}
else if(event.keyCode==36&&event.ctrlKey)
$.datepick._showDatepick(this)
else
handled=false
if(handled){
event.preventDefault()
event.stopPropagation()}
inst.ctrlKey=(event.keyCode<48)
return !handled
},
_doKeyPress: function(event){
var inst=$.datepick._getInst(event.target)
if($.datepick._get(inst,'constrainInput')){
var chars=$.datepick._possibleChars(inst)
var chr=String.fromCharCode(event.keyCode || event.charCode)
return inst.ctrlKey ||(chr<' ' || !chars || chars.indexOf(chr)>-1)}
},
_doKeyUp: function(event){
var inst=$.datepick._getInst(event.target)
if(inst.input.val()!=inst.lastVal){
try{
var separator=($.datepick._get(inst,'rangeSelect')?
$.datepick._get(inst,'rangeSeparator'):
($.datepick._get(inst,'multiSelect')?
$.datepick._get(inst,'multiSeparator'): ''))
var dates=(inst.input ? inst.input.val(): '')
dates=(separator ? dates.split(separator): [dates])
var ok=true
for(var i=0;i<dates.length;i++){
if(!$.datepick.parseDate($.datepick._get(inst,'dateFormat'),
dates[i],$.datepick._getFormatConfig(inst))){
ok=false
break}}
if(ok){
$.datepick._setDateFromField(inst)
$.datepick._updateAlternate(inst)
$.datepick._updateDatepick(inst)}}
catch(event){}}
return true
},
_possibleChars: function(inst){
var dateFormat=$.datepick._get(inst,'dateFormat')
var chars=($.datepick._get(inst,'rangeSelect')?
$.datepick._get(inst,'rangeSeparator'):
($.datepick._get(inst,'multiSelect')?
$.datepick._get(inst,'multiSeparator'): ''))
var literal=false
for(var iFormat=0;iFormat<dateFormat.length;iFormat++)
if(literal)
if(dateFormat.charAt(iFormat)=="'"&&!lookAhead("'"))
literal=false
else
chars+=dateFormat.charAt(iFormat)
else
switch(dateFormat.charAt(iFormat)){
case 'd': case 'm': case 'y': case '@':
chars+='0123456789'
break
case 'D': case 'M':
return null
case "'":
if(lookAhead("'"))
chars+="'"
else
literal=true
break
default:
chars+=dateFormat.charAt(iFormat)}
return chars
},
_doMouseOver: function(td,id,timestamp){
var inst=$.datepick._getInst($('#'+id)[0])
var useTR=$.datepick._get(inst,'useThemeRoller')? 1 : 0
$(td).parents('tbody').find('td').
removeClass($.datepick._dayOverClass[useTR]).end().end().
addClass($.datepick._dayOverClass[useTR])
if($.datepick._get(inst,'highlightWeek'))
$(td).parent().parent().find('tr').
removeClass($.datepick._weekOverClass[useTR]).end().end().
addClass($.datepick._weekOverClass[useTR])
if($(td).text()){
var date=new Date(timestamp)
if($.datepick._get(inst,'showStatus')){
var status=($.datepick._get(inst,'statusForDate').apply(
(inst.input ? inst.input[0] : null),[date,inst])||
$.datepick._get(inst,'initStatus'))
$('#'+$.datepick._statusId[useTR]+id).html(status)}
if($.datepick._get(inst,'onHover'))
$.datepick._doHover(td,'#'+id,date.getFullYear(),date.getMonth())}
},
_doMouseOut: function(td,id){
var inst=$.datepick._getInst($('#'+id)[0])
var useTR=$.datepick._get(inst,'useThemeRoller')? 1 : 0
$(td).removeClass($.datepick._dayOverClass[useTR]).
removeClass($.datepick._weekOverClass[useTR])
if($.datepick._get(inst,'showStatus'))
$('#'+$.datepick._statusId[useTR]+id).html($.datepick._get(inst,'initStatus'))
if($.datepick._get(inst,'onHover'))
$.datepick._doHover(td,'#'+id)
},
_doHover: function(td,id,year,month){
var inst=this._getInst($(id)[0])
var useTR=$.datepick._get(inst,'useThemeRoller')? 1 : 0
if($(td).hasClass(this._unselectableClass[useTR]))
return
var onHover=this._get(inst,'onHover')
var date=(year ?
this._daylightSavingAdjust(new Date(year,month,$(td).text())): null)
onHover.apply((inst.input ? inst.input[0] : null),
[(date ? this._formatDate(inst,date): ''),date,inst])
},
_showDatepick: function(input){
input=input.target || input
if($.datepick._isDisabledDatepick(input)|| $.datepick._lastInput==input)
return
var inst=$.datepick._getInst(input)
var beforeShow=$.datepick._get(inst,'beforeShow')
var useTR=$.datepick._get(inst,'useThemeRoller')? 1 : 0
extendRemove(inst.settings,(beforeShow ? beforeShow.apply(input,[input,inst]):{}))
$.datepick._hideDatepick(null,'')
$.datepick._lastInput=input
$.datepick._setDateFromField(inst)
if($.datepick._inDialog)
input.value=''
if(!$.datepick._pos){
$.datepick._pos=$.datepick._findPos(input)
$.datepick._pos[1]+=input.offsetHeight}
var isFixed=false
$(input).parents().each(function(){
isFixed |=$(this).css('position')=='fixed'
return !isFixed
})
if(isFixed&&$.browser.opera){
$.datepick._pos[0]-=document.documentElement.scrollLeft
$.datepick._pos[1]-=document.documentElement.scrollTop}
var offset={left: $.datepick._pos[0],top: $.datepick._pos[1]}
$.datepick._pos=null
inst.dpDiv.css({position: 'absolute',display: 'block',top: '-1000px'})
$.datepick._updateDatepick(inst)
inst.dpDiv.width($.datepick._getNumberOfMonths(inst)[1]*
$('.'+$.datepick._oneMonthClass[useTR],inst.dpDiv).width())
offset=$.datepick._checkOffset(inst,offset,isFixed)
inst.dpDiv.css({position:($.datepick._inDialog&&$.blockUI ?
'static' :(isFixed ? 'fixed' : 'absolute')),display: 'none',
left: offset.left+'px',top: offset.top+'px'})
if(!inst.inline){
var showAnim=$.datepick._get(inst,'showAnim')|| 'show'
var duration=$.datepick._get(inst,'duration')
var postProcess=function(){
$.datepick._datepickerShowing=true
var borders=$.datepick._getBorders(inst.dpDiv)
inst.dpDiv.find('iframe.'+$.datepick._coverClass[useTR]).
css({left:-borders[0],top:-borders[1],
width: inst.dpDiv.outerWidth(),height: inst.dpDiv.outerHeight()})}
if($.effects&&$.effects[showAnim])
inst.dpDiv.show(showAnim,$.datepick._get(inst,'showOptions'),duration,postProcess)
else
inst.dpDiv[showAnim](duration,postProcess)
if(duration=='')
postProcess()
if(inst.input[0].type !='hidden')
inst.input.focus()
$.datepick._curInst=inst}
},
_updateDatepick: function(inst){
var borders=this._getBorders(inst.dpDiv)
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
inst.dpDiv.empty().append(this._generateHTML(inst)).
find('iframe.'+this._coverClass[useTR]).
css({left:-borders[0],top:-borders[1],
width: inst.dpDiv.outerWidth(),height: inst.dpDiv.outerHeight()})
var numMonths=this._getNumberOfMonths(inst)
if(!inst.inline)
inst.dpDiv.attr('id',this._mainDivId[useTR])
inst.dpDiv.removeClass(this._mainDivClass[1-useTR]).
addClass(this._mainDivClass[useTR]).
removeClass(this._multiClass.join(' ')).
addClass(numMonths[0] !=1 || numMonths[1] !=1 ? this._multiClass[useTR] : '').
removeClass(this._rtlClass.join(' ')).
addClass(this._get(inst,'isRTL')? this._rtlClass[useTR] : '')
if(inst.input&&inst.input[0].type !='hidden'&&inst==$.datepick._curInst)
$(inst.input).focus()
},
_getBorders: function(elem){
var convert=function(value){
var extra=($.browser.msie ? 1 : 0)
return{thin: 1+extra,medium: 3+extra,thick: 5+extra}[value] || value}
return [parseFloat(convert(elem.css('border-left-width'))),
parseFloat(convert(elem.css('border-top-width')))]
},
_checkOffset: function(inst,offset,isFixed){
var alignment=this._get(inst,'alignment')
var isRTL=this._get(inst,'isRTL')
var pos=inst.input ? this._findPos(inst.input[0]): null
var browserWidth=document.documentElement.clientWidth
var browserHeight=document.documentElement.clientHeight
if(browserWidth==0)
return offset
var scrollX=document.documentElement.scrollLeft || document.body.scrollLeft
var scrollY=document.documentElement.scrollTop || document.body.scrollTop
var above=pos[1]-(this._inDialog ? 0 : inst.dpDiv.outerHeight())-
(isFixed&&$.browser.opera ? document.documentElement.scrollTop : 0)
var below=offset.top
var alignL=offset.left
var alignR=pos[0]+(inst.input ? inst.input.outerWidth(): 0)-inst.dpDiv.outerWidth()-
(isFixed&&$.browser.opera ? document.documentElement.scrollLeft : 0)
var tooWide=(offset.left+inst.dpDiv.outerWidth()-scrollX)>browserWidth
var tooHigh=(offset.top+inst.dpDiv.outerHeight()-scrollY)>browserHeight
if(alignment=='topLeft'){
offset={left: alignL,top: above}}
else if(alignment=='topRight'){
offset={left: alignR,top: above}}
else if(alignment=='bottomLeft'){
offset={left: alignL,top: below}}
else if(alignment=='bottomRight'){
offset={left: alignR,top: below}}
else if(alignment=='top'){
offset={left:(isRTL || tooWide ? alignR : alignL),top: above}}
else{
offset={left:(isRTL || tooWide ? alignR : alignL),
top:(tooHigh ? above : below)}}
offset.left=Math.max((isFixed ? 0 : scrollX),offset.left-(isFixed ? scrollX : 0))
offset.top=Math.max((isFixed ? 0 : scrollY),offset.top-(isFixed ? scrollY : 0))
return offset
},
_findPos: function(elem){
while(elem&&(elem.type=='hidden' || elem.nodeType !=1)){
elem=elem.nextSibling}
var position=$(elem).offset()
return [position.left,position.top]
},
_hideDatepick: function(input,duration){
var inst=this._curInst
if(!inst ||(input&&inst !=$.data(input,PROP_NAME)))
return false
var rangeSelect=this._get(inst,'rangeSelect')
if(rangeSelect&&inst.stayOpen)
this._updateInput('#'+inst.id)
inst.stayOpen=false
if(this._datepickerShowing){
duration=(duration !=null ? duration : this._get(inst,'duration'))
var showAnim=this._get(inst,'showAnim')
var postProcess=function(){
$.datepick._tidyDialog(inst)}
if(duration !=''&&$.effects&&$.effects[showAnim])
inst.dpDiv.hide(showAnim,$.datepick._get(inst,'showOptions'),
duration,postProcess)
else
inst.dpDiv[(duration=='' ? 'hide' :(showAnim=='slideDown' ? 'slideUp' :
(showAnim=='fadeIn' ? 'fadeOut' : 'hide')))](duration,postProcess)
if(duration=='')
this._tidyDialog(inst)
var onClose=this._get(inst,'onClose')
if(onClose)
onClose.apply((inst.input ? inst.input[0] : null),
[(inst.input ? inst.input.val(): ''),this._getDate(inst),inst])
this._datepickerShowing=false
this._lastInput=null
inst.settings.prompt=null
if(this._inDialog){
this._dialogInput.css({position: 'absolute',left: '0',top: '-100px'})
this.dpDiv.removeClass(this._dialogClass[this._get(inst,'useThemeRoller')? 1 : 0])
if($.blockUI){
$.unblockUI()
$('body').append(this.dpDiv)}}
this._inDialog=false}
this._curInst=null
return false
},
_tidyDialog: function(inst){
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
inst.dpDiv.removeClass(this._dialogClass[useTR]).unbind('.datepick')
$('.'+this._promptClass[useTR],inst.dpDiv).remove()
},
_checkExternalClick: function(event){
if(!$.datepick._curInst)
return
var $target=$(event.target)
var useTR=$.datepick._get($.datepick._curInst,'useThemeRoller')? 1 : 0
if(!$target.parents().andSelf().is('#'+$.datepick._mainDivId[useTR])&&
!$target.hasClass($.datepick.markerClassName)&&
!$target.parents().andSelf().hasClass($.datepick._triggerClass[useTR])&&
$.datepick._datepickerShowing&&!($.datepick._inDialog&&$.blockUI))
$.datepick._hideDatepick(null,'')
},
_adjustDate: function(id,offset,period){
var inst=this._getInst($(id)[0])
this._adjustInstDate(inst,offset+
(period=='M' ? this._get(inst,'showCurrentAtPos'): 0),
period)
this._updateDatepick(inst)
return false
},
_gotoToday: function(id){
var target=$(id)
var inst=this._getInst(target[0])
if(this._get(inst,'gotoCurrent')&&inst.dates[0])
inst.cursorDate=new Date(inst.dates[0].getTime())
else
inst.cursorDate=this._daylightSavingAdjust(new Date())
inst.drawMonth=inst.cursorDate.getMonth()
inst.drawYear=inst.cursorDate.getFullYear()
this._notifyChange(inst)
this._adjustDate(target)
return false
},
_selectMonthYear: function(id,select,period){
var target=$(id)
var inst=this._getInst(target[0])
inst.selectingMonthYear=false
var value=parseInt(select.options[select.selectedIndex].value,10)
inst['selected'+(period=='M' ? 'Month' : 'Year')]=
inst['draw'+(period=='M' ? 'Month' : 'Year')]=value
inst.cursorDate.setDate(Math.min(inst.cursorDate.getDate(),
$.datepick._getDaysInMonth(inst.drawYear,inst.drawMonth)))
inst.cursorDate['set'+(period=='M' ? 'Month' : 'FullYear')](value)
this._notifyChange(inst)
this._adjustDate(target)
},
_clickMonthYear: function(id){
var inst=this._getInst($(id)[0])
if(inst.input&&inst.selectingMonthYear&&!$.browser.msie)
inst.input.focus()
inst.selectingMonthYear=!inst.selectingMonthYear
},
_changeFirstDay: function(id,day){
var inst=this._getInst($(id)[0])
inst.settings.firstDay=day
this._updateDatepick(inst)
return false
},
_selectDay: function(td,id,timestamp){
var inst=this._getInst($(id)[0])
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
if($(td).hasClass(this._unselectableClass[useTR]))
return false
var rangeSelect=this._get(inst,'rangeSelect')
var multiSelect=this._get(inst,'multiSelect')
if(rangeSelect)
inst.stayOpen=!inst.stayOpen
else if(multiSelect)
inst.stayOpen=true
if(inst.stayOpen){
$('.datepick td',inst.dpDiv).removeClass(this._selectedClass[useTR])
$(td).addClass(this._selectedClass[useTR])}
inst.cursorDate=this._daylightSavingAdjust(new Date(timestamp))
var date=new Date(inst.cursorDate.getTime())
if(rangeSelect&&!inst.stayOpen)
inst.dates[1]=date
else if(multiSelect){
var pos=-1
for(var i=0;i<inst.dates.length;i++)
if(inst.dates[i]&&date.getTime()==inst.dates[i].getTime()){
pos=i
break}
if(pos>-1)
inst.dates.splice(pos,1)
else if(inst.dates.length<multiSelect){
if(inst.dates[0])
inst.dates.push(date)
else
inst.dates=[date]
inst.stayOpen=(inst.dates.length !=multiSelect)}}
else
inst.dates=[date]
this._updateInput(id)
if(inst.stayOpen)
this._updateDatepick(inst)
else if((rangeSelect || multiSelect)&&inst.inline)
this._updateDatepick(inst)
return false
},
_clearDate: function(id){
var target=$(id)
var inst=this._getInst(target[0])
if(this._get(inst,'mandatory'))
return false
inst.stayOpen=false
inst.dates=(this._get(inst,'showDefault')?
[this._getDefaultDate(inst)] : [])
this._updateInput(target)
return false
},
_updateInput: function(id){
var inst=this._getInst($(id)[0])
var dateStr=this._showDate(inst)
this._updateAlternate(inst)
var onSelect=this._get(inst,'onSelect')
if(onSelect)
onSelect.apply((inst.input ? inst.input[0] : null),
[dateStr,this._getDate(inst),inst])
else if(inst.input)
inst.input.trigger('change')
if(inst.inline)
this._updateDatepick(inst)
else if(!inst.stayOpen){
this._hideDatepick(null,this._get(inst,'duration'))
this._lastInput=inst.input[0]
if(typeof(inst.input[0])!='object')
inst.input.focus()
this._lastInput=null}
return false
},
_showDate: function(inst){
var dateStr=''
if(inst.input){
dateStr=(inst.dates.length==0 ? '' : this._formatDate(inst,inst.dates[0]))
if(dateStr){
if(this._get(inst,'rangeSelect'))
dateStr+=this._get(inst,'rangeSeparator')+
this._formatDate(inst,inst.dates[1] || inst.dates[0])
else if(this._get(inst,'multiSelect'))
for(var i=1;i<inst.dates.length;i++)
dateStr+=this._get(inst,'multiSeparator')+
this._formatDate(inst,inst.dates[i])}
inst.input.val(dateStr)}
return dateStr
},
_updateAlternate: function(inst){
var altField=this._get(inst,'altField')
if(altField){
var altFormat=this._get(inst,'altFormat')|| this._get(inst,'dateFormat')
var settings=this._getFormatConfig(inst)
var dateStr=this.formatDate(altFormat,inst.dates[0],settings)
if(dateStr&&this._get(inst,'rangeSelect'))
dateStr+=this._get(inst,'rangeSeparator')+this.formatDate(
altFormat,inst.dates[1] || inst.dates[0],settings)
else if(this._get(inst,'multiSelect'))
for(var i=1;i<inst.dates.length;i++)
dateStr+=this._get(inst,'multiSeparator')+
this.formatDate(altFormat,inst.dates[i],settings)
$(altField).val(dateStr)}
},
noWeekends: function(date){
return [(date.getDay()|| 7)<6,'']
},
iso8601Week: function(date){
var checkDate=new Date(date.getTime())
checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()|| 7))
var time=checkDate.getTime()
checkDate.setMonth(0)
checkDate.setDate(1)
return Math.floor(Math.round((time-checkDate)/86400000)/7)+1
},
dateStatus: function(date,inst){
return $.datepick.formatDate($.datepick._get(inst,'dateStatus'),
date,$.datepick._getFormatConfig(inst))
},
parseDate: function(format,value,settings){
if(format==null || value==null)
throw 'Invalid arguments'
value=(typeof value=='object' ? value.toString(): value+'')
if(value=='')
return null
settings=settings ||{}
var shortYearCutoff=settings.shortYearCutoff || this._defaults.shortYearCutoff
shortYearCutoff=(typeof shortYearCutoff !='string' ? shortYearCutoff :
new Date().getFullYear()% 100+parseInt(shortYearCutoff,10))
var dayNamesShort=settings.dayNamesShort || this._defaults.dayNamesShort
var dayNames=settings.dayNames || this._defaults.dayNames
var monthNamesShort=settings.monthNamesShort || this._defaults.monthNamesShort
var monthNames=settings.monthNames || this._defaults.monthNames
var year=-1
var month=-1
var day=-1
var doy=-1
var literal=false
var lookAhead=function(match){
var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match)
if(matches)
iFormat++
return matches}
var getNumber=function(match){
lookAhead(match)
var size=(match=='@' ? 14 :(match=='!' ? 20 :
(match=='y' ? 4 :(match=='o' ? 3 : 2))))
var digits=new RegExp('^\\d{1,'+size+'}')
var num=value.substring(iValue).match(digits)
if(!num)
throw 'Missing number at position '+iValue
iValue+=num[0].length
return parseInt(num[0],10)}
var getName=function(match,shortNames,longNames){
var names=(lookAhead(match)? longNames : shortNames)
for(var i=0;i<names.length;i++){
if(value.substr(iValue,names[i].length)==names[i]){
iValue+=names[i].length
return i+1}}
throw 'Unknown name at position '+iValue}
var checkLiteral=function(){
if(value.charAt(iValue)!=format.charAt(iFormat))
throw 'Unexpected literal at position '+iValue
iValue++}
var iValue=0
for(var iFormat=0;iFormat<format.length;iFormat++){
if(literal)
if(format.charAt(iFormat)=="'"&&!lookAhead("'"))
literal=false
else
checkLiteral()
else
switch(format.charAt(iFormat)){
case 'd':
day=getNumber('d')
break
case 'D':
getName('D',dayNamesShort,dayNames)
break
case 'o':
doy=getNumber('o')
break
case 'w':
getNumber('w')
break
case 'm':
month=getNumber('m')
break
case 'M':
month=getName('M',monthNamesShort,monthNames)
break
case 'y':
year=getNumber('y')
break
case '@':
var date=new Date(getNumber('@'))
year=date.getFullYear()
month=date.getMonth()+1
day=date.getDate()
break
case '!':
var date=new Date((getNumber('!')-this._ticksTo1970)/10000)
year=date.getFullYear()
month=date.getMonth()+1
day=date.getDate()
break
case "'":
if(lookAhead("'"))
checkLiteral()
else
literal=true
break
default:
checkLiteral()}}
if(iValue<value.length)
throw 'Additional text found at end'
if(year==-1)
year=new Date().getFullYear()
else if(year<100)
year+=(shortYearCutoff==-1 ? 1900 : new Date().getFullYear()-
new Date().getFullYear()% 100-(year<=shortYearCutoff ? 0 : 100))
if(doy>-1){
month=1
day=doy
do{
var dim=this._getDaysInMonth(year,month-1)
if(day<=dim)
break
month++
day-=dim
}while(true)}
var date=this._daylightSavingAdjust(new Date(year,month-1,day))
if(date.getFullYear()!=year || date.getMonth()+1 !=month || date.getDate()!=day)
throw 'Invalid date'
return date
},
ATOM: 'yy-mm-dd',
COOKIE: 'D, dd M yy',
ISO_8601: 'yy-mm-dd',
RFC_822: 'D, d M y',
RFC_850: 'DD, dd-M-y',
RFC_1036: 'D, d M y',
RFC_1123: 'D, d M yy',
RFC_2822: 'D, d M yy',
RSS: 'D, d M y',
TICKS: '!',
TIMESTAMP: '@',
W3C: 'yy-mm-dd',
_ticksTo1970:(((1970-1)*365+Math.floor(1970/4)-Math.floor(1970/100)+
Math.floor(1970/400))*24*60*60*10000000),
formatDate: function(format,date,settings){
if(!date)
return ''
settings=settings ||{}
var dayNamesShort=settings.dayNamesShort || this._defaults.dayNamesShort
var dayNames=settings.dayNames || this._defaults.dayNames
var monthNamesShort=settings.monthNamesShort || this._defaults.monthNamesShort
var monthNames=settings.monthNames || this._defaults.monthNames
var calculateWeek=settings.calculateWeek || this._defaults.calculateWeek
var lookAhead=function(match){
var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match)
if(matches)
iFormat++
return matches}
var formatNumber=function(match,value,len){
var num=''+value
if(lookAhead(match))
while(num.length<len)
num='0'+num
return num}
var formatName=function(match,value,shortNames,longNames){
return(lookAhead(match)? longNames[value] : shortNames[value])}
var output=''
var literal=false
if(date)
for(var iFormat=0;iFormat<format.length;iFormat++){
if(literal)
if(format.charAt(iFormat)=="'"&&!lookAhead("'"))
literal=false
else
output+=format.charAt(iFormat)
else
switch(format.charAt(iFormat)){
case 'd':
output+=formatNumber('d',date.getDate(),2)
break
case 'D':
output+=formatName('D',date.getDay(),dayNamesShort,dayNames)
break
case 'o':
output+=formatNumber('o',
(date.getTime()-new Date(date.getFullYear(),0,0).getTime())/86400000,3)
break
case 'w':
output+=formatNumber('w',calculateWeek(date),2)
break
case 'm':
output+=formatNumber('m',date.getMonth()+1,2)
break
case 'M':
output+=formatName('M',date.getMonth(),monthNamesShort,monthNames)
break
case 'y':
output+=(lookAhead('y')? date.getFullYear():
(date.getFullYear()% 100<10 ? '0' : '')+date.getFullYear()% 100)
break
case '@':
output+=date.getTime()
break
case '!':
output+=date.getTime()*10000+this._ticksTo1970
break
case "'":
if(lookAhead("'"))
output+="'"
else
literal=true
break
default:
output+=format.charAt(iFormat)}}
return output
},
_get: function(inst,name){
return inst.settings[name] !==undefined ?
inst.settings[name] : this._defaults[name]
},
_setDateFromField: function(inst){
var dateFormat=this._get(inst,'dateFormat')
var rangeSelect=this._get(inst,'rangeSelect')
var multiSelect=this._get(inst,'multiSelect')
inst.lastVal=(inst.input ? inst.input.val(): '')
var dates=inst.lastVal
dates=(rangeSelect ? dates.split(this._get(inst,'rangeSeparator')):
(multiSelect ? dates.split(this._get(inst,'multiSeparator')): [dates]))
inst.dates=[]
var settings=this._getFormatConfig(inst)
for(var i=0;i<dates.length;i++)
try{
inst.dates[i]=this.parseDate(dateFormat,dates[i],settings)}
catch(event){
inst.dates[i]=null}
for(var i=inst.dates.length-1;i>=0;i--)
if(!inst.dates[i])
inst.dates.splice(i,1)
if(rangeSelect&&inst.dates.length<2)
inst.dates[1]=inst.dates[0]
if(multiSelect&&inst.dates.length>multiSelect)
inst.dates.splice(multiSelect,inst.dates.length)
inst.cursorDate=new Date((inst.dates[0] || this._getDefaultDate(inst)).getTime())
inst.drawMonth=inst.cursorDate.getMonth()
inst.drawYear=inst.cursorDate.getFullYear()
this._adjustInstDate(inst)
},
_getDefaultDate: function(inst){
return this._restrictMinMax(inst,
this._determineDate(inst,this._get(inst,'defaultDate'),new Date()))
},
_determineDate: function(inst,date,defaultDate){
var offsetNumeric=function(offset){
var date=new Date()
date.setDate(date.getDate()+offset)
return date}
var offsetString=function(offset){
try{
return $.datepick.parseDate($.datepick._get(inst,'dateFormat'),
offset,$.datepick._getFormatConfig(inst))}
catch(e){}
var date=new Date()
var year=date.getFullYear()
var month=date.getMonth()
var day=date.getDate()
var pattern=/([+-]?[0-9]+)\s*(d|w|m|y)?/g
var matches=pattern.exec(offset.toLowerCase())
while(matches){
switch(matches[2] || 'd'){
case 'd':
day+=parseInt(matches[1],10);break
case 'w':
day+=parseInt(matches[1],10)*7;break
case 'm':
month+=parseInt(matches[1],10)
day=Math.min(day,$.datepick._getDaysInMonth(year,month))
break
case 'y':
year+=parseInt(matches[1],10)
day=Math.min(day,$.datepick._getDaysInMonth(year,month))
break}
matches=pattern.exec(offset.toLowerCase())}
return new Date(year,month,day)}
date=(date==null ? defaultDate :(typeof date=='string' ? offsetString(date):
(typeof date=='number' ?(isNaN(date)|| date==Infinity || date==-Infinity ?
defaultDate : offsetNumeric(date)): date)))
date=(date&&(date.toString()=='Invalid Date' ||
date.toString()=='NaN')? defaultDate : date)
if(date){
date.setHours(0)
date.setMinutes(0)
date.setSeconds(0)
date.setMilliseconds(0)}
return this._daylightSavingAdjust(date)
},
_daylightSavingAdjust: function(date){
if(!date)return null
date.setHours(date.getHours()>12 ? date.getHours()+2 : 0)
return date
},
_setDate: function(inst,date,endDate){
date=(!date ? [] :(isArray(date)? date : [date]))
if(endDate)
date.push(endDate)
var clear=(date.length==0)
var origMonth=inst.cursorDate.getMonth()
var origYear=inst.cursorDate.getFullYear()
inst.dates=[]
inst.dates[0]=this._restrictMinMax(inst,this._determineDate(inst,date[0],new Date()))
inst.cursorDate=new Date(inst.dates[0].getTime())
inst.drawMonth=inst.cursorDate.getMonth()
inst.drawYear=inst.cursorDate.getFullYear()
if(this._get(inst,'rangeSelect'))
inst.dates[1]=(date.length<1 ? inst.dates[0] :
this._restrictMinMax(inst,this._determineDate(inst,date[1],null)))
else if(this._get(inst,'multiSelect'))
for(var i=1;i<date.length;i++)
inst.dates[i]=this._restrictMinMax(inst,this._determineDate(inst,date[i],null))
if(origMonth !=inst.cursorDate.getMonth()|| origYear !=inst.cursorDate.getFullYear())
this._notifyChange(inst)
this._adjustInstDate(inst)
this._showDate(inst)
},
_getDate: function(inst){
var startDate=(inst.input&&inst.input.val()=='' ? null : inst.dates[0])
if(this._get(inst,'rangeSelect'))
return(startDate ? [inst.dates[0],inst.dates[1] || inst.dates[0]] : [null,null])
else if(this._get(inst,'multiSelect'))
return inst.dates.slice(0,inst.dates.length)
else
return startDate
},
_generateHTML: function(inst){
var today=new Date()
today=this._daylightSavingAdjust(
new Date(today.getFullYear(),today.getMonth(),today.getDate()))
var showStatus=this._get(inst,'showStatus')
var initStatus=this._get(inst,'initStatus')|| '&#xa0;'
var isRTL=this._get(inst,'isRTL')
var useTR=this._get(inst,'useThemeRoller')? 1 : 0
var clear=(this._get(inst,'mandatory')? '' :
'<div class="'+this._clearClass[useTR]+'"><a href="javascript:void(0)" '+
'onclick="jQuery.datepick._clearDate(\'#'+inst.id+'\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'clearStatus'),initStatus)+
'>'+this._get(inst,'clearText')+'</a></div>')
var controls='<div class="'+this._controlClass[useTR]+'">'+(isRTL ? '' : clear)+
'<div class="'+this._closeClass[useTR]+'"><a href="javascript:void(0)" '+
'onclick="jQuery.datepick._hideDatepick();"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'closeStatus'),initStatus)+
'>'+this._get(inst,'closeText')+'</a></div>'+(isRTL ? clear : '')+'</div>'
var prompt=this._get(inst,'prompt')
var closeAtTop=this._get(inst,'closeAtTop')
var hideIfNoPrevNext=this._get(inst,'hideIfNoPrevNext')
var navigationAsDateFormat=this._get(inst,'navigationAsDateFormat')
var showBigPrevNext=this._get(inst,'showBigPrevNext')
var numMonths=this._getNumberOfMonths(inst)
var showCurrentAtPos=this._get(inst,'showCurrentAtPos')
var stepMonths=this._get(inst,'stepMonths')
var stepBigMonths=this._get(inst,'stepBigMonths')
var isMultiMonth=(numMonths[0] !=1 || numMonths[1] !=1)
var minDate=this._getMinMaxDate(inst,'min',true)
var maxDate=this._getMinMaxDate(inst,'max')
var drawMonth=inst.drawMonth-showCurrentAtPos
var drawYear=inst.drawYear
if(drawMonth<0){
drawMonth+=12
drawYear--}
if(maxDate){
var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
maxDate.getMonth()-(numMonths[0]*numMonths[1])+1,maxDate.getDate()))
maxDraw=(minDate&&maxDraw<minDate ? minDate : maxDraw)
while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){
drawMonth--
if(drawMonth<0){
drawMonth=11
drawYear--}}}
inst.drawMonth=drawMonth
inst.drawYear=drawYear
var prevText=this._get(inst,'prevText')
prevText=(!navigationAsDateFormat ? prevText : this.formatDate(prevText,
this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),
this._getFormatConfig(inst)))
var prevBigText=(showBigPrevNext ? this._get(inst,'prevBigText'): '')
prevBigText=(!navigationAsDateFormat ? prevBigText : this.formatDate(prevBigText,
this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepBigMonths,1)),
this._getFormatConfig(inst)))
var prev='<div class="'+this._prevClass[useTR]+'">'+
(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?
(showBigPrevNext ? '<a href="javascript:void(0)" onclick="jQuery.datepick._adjustDate(\'#'+
inst.id+'\', -'+stepBigMonths+', \'M\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'prevBigStatus'),initStatus)+
'>'+prevBigText+'</a>' : '')+
'<a href="javascript:void(0)" onclick="jQuery.datepick._adjustDate(\'#'+
inst.id+'\', -'+stepMonths+', \'M\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'prevStatus'),initStatus)+
'>'+prevText+'</a>' :
(hideIfNoPrevNext ? '&#xa0;' :(showBigPrevNext ? '<label>'+prevBigText+'</label>' : '')+
'<label>'+prevText+'</label>'))+'</div>'
var nextText=this._get(inst,'nextText')
nextText=(!navigationAsDateFormat ? nextText : this.formatDate(nextText,
this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),
this._getFormatConfig(inst)))
var nextBigText=(showBigPrevNext ? this._get(inst,'nextBigText'): '')
nextBigText=(!navigationAsDateFormat ? nextBigText : this.formatDate(nextBigText,
this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepBigMonths,1)),
this._getFormatConfig(inst)))
var next='<div class="'+this._nextClass[useTR]+'">'+
(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?
'<a href="javascript:void(0)" onclick="jQuery.datepick._adjustDate(\'#'+
inst.id+'\', +'+stepMonths+', \'M\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'nextStatus'),initStatus)+
'>'+nextText+'</a>'+
(showBigPrevNext ? '<a href="javascript:void(0)" onclick="jQuery.datepick._adjustDate(\'#'+
inst.id+'\', +'+stepBigMonths+', \'M\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'nextBigStatus'),initStatus)+
'>'+nextBigText+'</a>' : ''):
(hideIfNoPrevNext ? '&#xa0;' : '<label>'+nextText+'</label>'+
(showBigPrevNext ? '<label>'+nextBigText+'</label>' : '')))+'</div>'
var currentText=this._get(inst,'currentText')
var gotoDate=(this._get(inst,'gotoCurrent')&&inst.dates[0] ? inst.dates[0] : today)
currentText=(!navigationAsDateFormat ? currentText :
this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)))
var html=(closeAtTop&&!inst.inline ? controls : '')+
'<div class="'+this._linksClass[useTR]+'">'+(isRTL ? next : prev)+
'<div class="'+this._currentClass[useTR]+'">'+(this._isInRange(inst,gotoDate)?
'<a href="javascript:void(0)" onclick="jQuery.datepick._gotoToday(\'#'+inst.id+'\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'currentStatus'),initStatus)+'>'+
currentText+'</a>' :(hideIfNoPrevNext ? '&#xa0;' : '<label>'+currentText+'</label>'))+
'</div>'+(isRTL ? prev : next)+'</div>'+
(prompt ? '<div class="'+this._promptClass[useTR]+'"><span>'+
prompt+'</span></div>' : '')
var firstDay=parseInt(this._get(inst,'firstDay'),10)
firstDay=(isNaN(firstDay)? 0 : firstDay)
var changeFirstDay=this._get(inst,'changeFirstDay')
var dayNames=this._get(inst,'dayNames')
var dayNamesShort=this._get(inst,'dayNamesShort')
var dayNamesMin=this._get(inst,'dayNamesMin')
var monthNames=this._get(inst,'monthNames')
var beforeShowDay=this._get(inst,'beforeShowDay')
var showOtherMonths=this._get(inst,'showOtherMonths')
var selectOtherMonths=this._get(inst,'selectOtherMonths')
var showWeeks=this._get(inst,'showWeeks')
var calculateWeek=this._get(inst,'calculateWeek')|| this.iso8601Week
var weekStatus=this._get(inst,'weekStatus')
var status=(showStatus ? this._get(inst,'dayStatus')|| initStatus : '')
var dateStatus=this._get(inst,'statusForDate')|| this.dateStatus
var defaultDate=this._getDefaultDate(inst)
for(var row=0;row<numMonths[0];row++){
for(var col=0;col<numMonths[1];col++){
var cursorDate=this._daylightSavingAdjust(
new Date(drawYear,drawMonth,inst.cursorDate.getDate()))
html+='<div class="'+this._oneMonthClass[useTR]+
(col==0&&!useTR ? ' '+this._newRowClass[useTR] : '')+'">'+
this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,
cursorDate,row>0 || col>0,useTR,showStatus,initStatus,monthNames)+
'<table class="'+this._tableClass[useTR]+'" cellpadding="0" cellspacing="0"><thead>'+
'<tr class="'+this._tableHeaderClass[useTR]+'">'+(showWeeks ? '<th'+
this._addStatus(useTR,showStatus,inst.id,weekStatus,initStatus)+'>'+
this._get(inst,'weekHeader')+'</th>' : '')
for(var dow=0;dow<7;dow++){
var day=(dow+firstDay)% 7
var dayStatus=(!showStatus || !changeFirstDay ? '' :
status.replace(/DD/,dayNames[day]).replace(/D/,dayNamesShort[day]))
html+='<th'+((dow+firstDay+6)% 7<5 ? '' :
' class="'+this._weekendClass[useTR]+'"')+'>'+
(!changeFirstDay ? '<span'+
this._addStatus(useTR,showStatus,inst.id,dayNames[day],initStatus):
'<a href="javascript:void(0)" onclick="jQuery.datepick._changeFirstDay(\'#'+
inst.id+'\', '+day+');"'+
this._addStatus(useTR,showStatus,inst.id,dayStatus,initStatus))+
' title="'+dayNames[day]+'">'+
dayNamesMin[day]+(changeFirstDay ? '</a>' : '</span>')+'</th>'}
html+='</tr></thead><tbody>'
var daysInMonth=this._getDaysInMonth(drawYear,drawMonth)
if(drawYear==inst.cursorDate.getFullYear()&&drawMonth==inst.cursorDate.getMonth())
inst.cursorDate.setDate(Math.min(inst.cursorDate.getDate(),daysInMonth))
var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)% 7
var numRows=(isMultiMonth ? 6 : Math.ceil((leadDays+daysInMonth)/7))
var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays))
for(var dRow=0;dRow<numRows;dRow++){
html+='<tr class="'+this._weekRowClass[useTR]+'">'+
(showWeeks ? '<td class="'+this._weekColClass[useTR]+'"'+
this._addStatus(useTR,showStatus,inst.id,weekStatus,initStatus)+'>'+
calculateWeek(printDate)+'</td>' : '')
for(var dow=0;dow<7;dow++){
var daySettings=(beforeShowDay ?
beforeShowDay.apply((inst.input ? inst.input[0] : null),[printDate]): [true,''])
var otherMonth=(printDate.getMonth()!=drawMonth)
var unselectable=(otherMonth&&!selectOtherMonths)|| !daySettings[0] ||
(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate)
var selected=(this._get(inst,'rangeSelect')&&inst.dates[0]&&
printDate.getTime()>=inst.dates[0].getTime()&&
printDate.getTime()<=(inst.dates[1] || inst.dates[0]).getTime())
for(var i=0;i<inst.dates.length;i++)
selected=selected ||(inst.dates[i]&&
printDate.getTime()==inst.dates[i].getTime())
var empty=otherMonth&&!showOtherMonths
html+='<td class="'+this._dayClass[useTR]+
((dow+firstDay+6)% 7>=5 ? ' '+this._weekendClass[useTR] : '')+
(otherMonth ? ' '+this._otherMonthClass[useTR] : '')+
((printDate.getTime()==cursorDate.getTime()&&
drawMonth==inst.cursorDate.getMonth()&&inst.keyEvent)||
(defaultDate.getTime()==printDate.getTime()&&
defaultDate.getTime()==cursorDate.getTime())?
' '+$.datepick._dayOverClass[useTR] : '')+
(unselectable ? ' '+this._unselectableClass[useTR] :
' '+this._selectableClass[useTR])+
(empty ? '' : ' '+daySettings[1]+
(selected ? ' '+this._selectedClass[useTR] : '')+
(printDate.getTime()==today.getTime()? ' '+this._todayClass[useTR] : ''))+'"'+
(!empty&&daySettings[2] ? ' title="'+daySettings[2]+'"' : '')+
(unselectable ? '' : ' onmouseover="'+'jQuery.datepick._doMouseOver(this,\''+
inst.id+'\','+printDate.getTime()+')"'+
' onmouseout="jQuery.datepick._doMouseOut(this,\''+inst.id+'\')"'+
' onclick="jQuery.datepick._selectDay(this,\'#'+
inst.id+'\','+printDate.getTime()+')"')+'>'+
(empty ? '&#xa0;' :
(unselectable ? printDate.getDate(): '<a>'+printDate.getDate()+'</a>'))+'</td>'
printDate.setDate(printDate.getDate()+1)
printDate=this._daylightSavingAdjust(printDate)}
html+='</tr>'}
drawMonth++
if(drawMonth>11){
drawMonth=0
drawYear++}
html+='</tbody></table></div>'}
if(useTR)
html+='<div class="'+this._newRowClass[useTR]+'"></div>'}
html+=(showStatus ? '<div style="clear: both;"></div><div id="'+this._statusId[useTR]+
inst.id+'" class="'+this._statusClass[useTR]+'">'+initStatus+'</div>' : '')+
(!closeAtTop&&!inst.inline ? controls : '')+
'<div style="clear: both;"></div>'+
($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline ?
'<iframe src="javascript:false;" class="'+this._coverClass[useTR]+'"></iframe>' : '')
inst.keyEvent=false
return html
},
_generateMonthYearHeader: function(inst,drawMonth,drawYear,minDate,maxDate,
cursorDate,secondary,useTR,showStatus,initStatus,monthNames){
var minDraw=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))
minDate=(minDate<minDraw ? minDate : minDraw)
var changeMonth=this._get(inst,'changeMonth')
var changeYear=this._get(inst,'changeYear')
var showMonthAfterYear=this._get(inst,'showMonthAfterYear')
var html='<div class="'+this._monthYearClass[useTR]+'">'
var monthHtml=''
if(secondary || !changeMonth)
monthHtml+='<span class="'+this._monthClass[useTR]+'">'+
monthNames[drawMonth]+'</span>'
else{
var inMinYear=(minDate&&minDate.getFullYear()==drawYear)
var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear)
monthHtml+='<select class="'+this._monthSelectClass[useTR]+'" '+
'onchange="jQuery.datepick._selectMonthYear(\'#'+inst.id+'\', this, \'M\');" '+
'onclick="jQuery.datepick._clickMonthYear(\'#'+inst.id+'\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'monthStatus'),
initStatus)+'>'
for(var month=0;month<12;month++){
if((!inMinYear || month>=minDate.getMonth())&&
(!inMaxYear || month<=maxDate.getMonth()))
monthHtml+='<option value="'+month+'"'+
(month==drawMonth ? ' selected="selected"' : '')+
'>'+monthNames[month]+'</option>'}
monthHtml+='</select>'}
if(!showMonthAfterYear)
html+=monthHtml+(secondary || !changeMonth || !changeYear ? '&#xa0;' : '')
if(secondary || !changeYear)
html+='<span class="'+this._yearClass[useTR]+'">'+drawYear+'</span>'
else{
var years=this._get(inst,'yearRange').split(':')
var year=0
var endYear=0
if(years.length !=2){
year=drawYear-10
endYear=drawYear+10
}else if(years[0].charAt(0)=='+' || years[0].charAt(0)=='-'){
year=drawYear+parseInt(years[0],10)
endYear=drawYear+parseInt(years[1],10)
}else{
year=parseInt(years[0],10)
endYear=parseInt(years[1],10)}
year=(minDate ? Math.max(year,minDate.getFullYear()): year)
endYear=(maxDate ? Math.min(endYear,maxDate.getFullYear()): endYear)
html+='<select class="'+this._yearSelectClass[useTR]+'" '+
'onchange="jQuery.datepick._selectMonthYear(\'#'+inst.id+'\', this, \'Y\');" '+
'onclick="jQuery.datepick._clickMonthYear(\'#'+inst.id+'\');"'+
this._addStatus(useTR,showStatus,inst.id,this._get(inst,'yearStatus'),
initStatus)+'>'
for(;year<=endYear;year++){
html+='<option value="'+year+'"'+
(year==drawYear ? ' selected="selected"' : '')+
'>'+year+'</option>'}
html+='</select>'}
html+=this._get(inst,'yearSuffix')
if(showMonthAfterYear)
html+=(secondary || !changeMonth || !changeYear ? '&#xa0;' : '')+monthHtml
html+='</div>'
return html
},
_addStatus: function(useTR,showStatus,id,text,initStatus){
return(showStatus ? ' onmouseover="jQuery(\'#'+this._statusId[useTR]+id+
'\').html(\''+(text || initStatus)+'\');" '+
'onmouseout="jQuery(\'#'+this._statusId[useTR]+id+
'\').html(\''+initStatus+'\');"' : '')
},
_adjustInstDate: function(inst,offset,period){
var yearMonth=inst.drawYear+'/'+inst.drawMonth
var year=inst.drawYear+(period=='Y' ? offset : 0)
var month=inst.drawMonth+(period=='M' ? offset : 0)
var day=Math.min(inst.cursorDate.getDate(),this._getDaysInMonth(year,month))+
(period=='D' ? offset : 0)
inst.cursorDate=this._restrictMinMax(inst,
this._daylightSavingAdjust(new Date(year,month,day)))
inst.drawMonth=inst.cursorDate.getMonth()
inst.drawYear=inst.cursorDate.getFullYear()
if(yearMonth !=inst.drawYear+'/'+inst.drawMonth)
this._notifyChange(inst)
},
_restrictMinMax: function(inst,date){
var minDate=this._getMinMaxDate(inst,'min',true)
var maxDate=this._getMinMaxDate(inst,'max')
date=(minDate&&date<minDate ? new Date(minDate.getTime()): date)
date=(maxDate&&date>maxDate ? new Date(maxDate.getTime()): date)
return date
},
_notifyChange: function(inst){
var onChange=this._get(inst,'onChangeMonthYear')
if(onChange)
onChange.apply((inst.input ? inst.input[0] : null),
[inst.cursorDate.getFullYear(),inst.cursorDate.getMonth()+1,
this._daylightSavingAdjust(new Date(
inst.cursorDate.getFullYear(),inst.cursorDate.getMonth(),1)),inst])
},
_getNumberOfMonths: function(inst){
var numMonths=this._get(inst,'numberOfMonths')
return(numMonths==null ? [1,1] :
(typeof numMonths=='number' ? [1,numMonths] : numMonths))
},
_getMinMaxDate: function(inst,minMax,checkRange){
var date=this._determineDate(inst,this._get(inst,minMax+'Date'),null)
var rangeMin=this._getRangeMin(inst)
return(checkRange&&rangeMin&&(!date || rangeMin>date)? rangeMin : date)
},
_getRangeMin: function(inst){
return(this._get(inst,'rangeSelect')&&inst.dates[0]&&
!inst.dates[1] ? inst.dates[0] : null)
},
_getDaysInMonth: function(year,month){
return 32-new Date(year,month,32).getDate()
},
_getFirstDayOfMonth: function(year,month){
return new Date(year,month,1).getDay()
},
_canAdjustMonth: function(inst,offset,curYear,curMonth){
var numMonths=this._getNumberOfMonths(inst)
var date=this._daylightSavingAdjust(new Date(curYear,
curMonth+(offset<0 ? offset : numMonths[0]*numMonths[1]),1))
if(offset<0)
date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))
return this._isInRange(inst,date)
},
_isInRange: function(inst,date){
var minDate=this._getRangeMin(inst)|| this._getMinMaxDate(inst,'min')
var maxDate=this._getMinMaxDate(inst,'max')
return((!minDate || date>=minDate)&&(!maxDate || date<=maxDate))
},
_getFormatConfig: function(inst){
return{shortYearCutoff: this._get(inst,'shortYearCutoff'),
dayNamesShort: this._get(inst,'dayNamesShort'),dayNames: this._get(inst,'dayNames'),
monthNamesShort: this._get(inst,'monthNamesShort'),monthNames: this._get(inst,'monthNames')}
},
_formatDate: function(inst,year,month,day){
if(!year)
inst.dates[0]=new Date(inst.cursorDate.getTime())
var date=(year ?(typeof year=='object' ? year :
this._daylightSavingAdjust(new Date(year,month,day))): inst.dates[0])
return this.formatDate(this._get(inst,'dateFormat'),date,this._getFormatConfig(inst))}
})
function extendRemove(target,props){
$.extend(target,props)
for(var name in props)
if(props[name]==null || props[name]==undefined)
target[name]=props[name]
return target}
function isArray(a){
return(a&&a.constructor==Array)}
$.fn.datepick=function(options){
var otherArgs=Array.prototype.slice.call(arguments,1)
if(typeof options=='string'&&(options=='isDisabled' ||
options=='getDate' || options=='settings'))
return $.datepick['_'+options+'Datepick'].
apply($.datepick,[this[0]].concat(otherArgs))
if(options=='option'&&arguments.length==2&&typeof arguments[1]=='string')
return $.datepick['_'+options+'Datepick'].
apply($.datepick,[this[0]].concat(otherArgs))
return this.each(function(){
typeof options=='string' ?
$.datepick['_'+options+'Datepick'].
apply($.datepick,[this].concat(otherArgs)):
$.datepick._attachDatepick(this,options)
})}
$.datepick=new Datepick()
$(function(){
$(document).mousedown($.datepick._checkExternalClick).
find('body').append($.datepick.dpDiv)
})
})(jQuery)
