/
jquery.dateentry.min.js
6 lines (6 loc) · 14.6 KB
/
jquery.dateentry.min.js
1
2
3
4
5
6
/* http://keith-wood.name/dateEntry.html
Date entry for jQuery v2.0.1.
Written by Keith Wood (kbwood{at}iinet.com.au) March 2009.
Licensed under the MIT (https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt) license.
Please attribute the author if you use it. */
(function($){var l='dateEntry';$.JQPlugin.createPlugin({name:l,defaultOptions:{appendText:'',initialField:null,tabToExit:false,useMouseWheel:true,defaultDate:null,minDate:null,maxDate:null,spinnerImage:'spinnerDefault.png',spinnerSize:[20,20,8],spinnerBigImage:'',spinnerBigSize:[40,40,16],spinnerIncDecOnly:false,spinnerRepeat:[500,250],beforeShow:null,altField:null,altFormat:null},regionalOptions:{'':{dateFormat:'mdy/',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'],dayNames:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],dayNamesShort:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],spinnerTexts:['Today','Previous field','Next field','Increment','Decrement']}},_getters:['getDate','isDisabled'],_appendClass:l+'-append',_controlClass:l+'-control',_expandClass:l+'-expand',_disabledInputs:[],_instSettings:function(a,b){return{_field:0,_selectedYear:0,_selectedMonth:0,_selectedDay:0}},_postAttach:function(b,c){b.on('focus.'+c.name,this._doFocus).on('blur.'+c.name,this._doBlur).on('click.'+c.name,this._doClick).on('keydown.'+c.name,this._doKeyDown).on('keypress.'+c.name,this._doKeyPress).on('paste.'+c.name,function(a){setTimeout(function(){m._parseDate(c)},1)})},_optionsChanged:function(a,b,c){var d=this._extractDate(a.val(),b);$.extend(b.options,c);b._field=0;b._lastField=(b.options.dateFormat[2]===' '?1:2);if(d){this._setDate(b,d)}a.next('span.'+this._appendClass).remove();a.parent().find('span.'+this._controlClass).remove();if($.fn.mousewheel){a.unmousewheel()}var e=(!b.options.spinnerImage?null:$('<span class="'+this._controlClass+'" style="display: inline-block; '+'background: url(\''+b.options.spinnerImage+'\') 0 0 no-repeat; width: '+b.options.spinnerSize[0]+'px; height: '+b.options.spinnerSize[1]+'px;"></span>'));a.after(b.options.appendText?'<span class="'+this._appendClass+'">'+b.options.appendText+'</span>':'').after(e||'');if(b.options.useMouseWheel&&$.fn.mousewheel){a.mousewheel(this._doMouseWheel)}if(e){e.mousedown(this._handleSpinner).mouseup(this._endSpinner).mouseover(this._expandSpinner).mouseout(this._endSpinner).mousemove(this._describeSpinner)}},enable:function(a){this._enableDisable(a,false)},disable:function(a){this._enableDisable(a,true)},_enableDisable:function(b,c){var d=this._getInst(b);if(!d){return}b.disabled=c;if(b.nextSibling&&b.nextSibling.nodeName.toLowerCase()==='span'){this._changeSpinner(d,b.nextSibling,(c?5:-1))}this._disabledInputs=$.map(this._disabledInputs,function(a){return(a===b?null:a)});if(c){this._disabledInputs.push(b)}},isDisabled:function(a){return $.inArray(a,this._disabledInputs)>-1},_preDestroy:function(b,c){b=$(b).off('.'+l);if($.fn.mousewheel){b.unmousewheel()}this._disabledInputs=$.map(this._disabledInputs,function(a){return(a===b[0]?null:a)});b.siblings('.'+this._appendClass+',.'+this._controlClass).remove()},setDate:function(a,b){var c=this._getInst(a);if(c){if(b===null||b===''){$(a).val('')}else{this._setDate(c,b?(typeof b==='object'?new Date(b.getTime()):b):null)}}},getDate:function(a){var b=this._getInst(a);return(b?this._extractDate(b.elem.val(),b):null)},_doFocus:function(a){var b=(a.nodeName&&a.nodeName.toLowerCase()==='input'?a:this);if(m._lastInput===b||m.isDisabled(b)){return}var c=m._getInst(b);c._field=0;m._lastInput=b;m._blurredInput=null;$.extend(c.options,($.isFunction(c.options.beforeShow)?c.options.beforeShow.apply(b,[b]):{}));m._parseDate(c,a.nodeName?null:a);setTimeout(function(){m._showField(c)},10)},_doBlur:function(a){m._blurredInput=m._lastInput;m._lastInput=null},_doClick:function(a){var b=a.target;var c=m._getInst(b);var d=c._field;c._field=m._getSelection(c,b,a);if(d!==c._field){c._lastChr=''}m._showField(c)},_getSelection:function(b,c,d){var e=0;if(typeof c.selectionStart!=='undefined'){var f=0;for(var g=0;g<=b._lastField;g++){f+=m._fieldLength(b,g,b.options.dateFormat)+1;e=g;if(c.selectionStart<f){break}}}else if(c.createTextRange&&d!=null&&$(c).val()){var h=$(d.target||d.srcElement);var i=c.createTextRange();var j=function(a){return{thin:2,medium:4,thick:6}[a]||a};var k=(d.clientX||0)+document.documentElement.scrollLeft-(h.offset().left+parseInt(j(h.css('border-left-width')),10))-i.offsetLeft;var f=0;for(var g=0;g<=b._lastField;g++){f+=m._fieldLength(b,g,b.options.dateFormat)+1;i.collapse();i.moveEnd('character',f);e=g;if(k<i.boundingWidth){break}}}return e},_doKeyDown:function(a){if(a.keyCode>=48){return true}var b=m._getInst(a.target);switch(a.keyCode){case 9:return(b.options.tabToExit?true:(a.shiftKey?m._changeField(b,-1,true):m._changeField(b,+1,true)));case 35:if(a.ctrlKey){m._setValue(b,'')}else{b._field=b._lastField;m._adjustField(b,0)}break;case 36:if(a.ctrlKey){m._setDate(b)}else{b._field=0;m._adjustField(b,0)}break;case 37:m._changeField(b,-1,false);break;case 38:m._adjustField(b,+1);break;case 39:m._changeField(b,+1,false);break;case 40:m._adjustField(b,-1);break;case 46:m._setValue(b,'');break;default:return true}return false},_doKeyPress:function(a){var b=String.fromCharCode(a.charCode===undefined?a.keyCode:a.charCode);if(b<' '){return true}var c=m._getInst(a.target);m._handleKeyPress(c,b);return false},_handleKeyPress:function(a,b){if(a.options.dateFormat.substring(3).indexOf(b)>-1){this._changeField(a,+1,false)}else if(b>='0'&&b<='9'){var c=a.options.dateFormat.charAt(a._field);var d=parseInt(b,10);var e=parseInt((a._lastChr||'')+b,10);var f=(!c.match(/y/i)?a._selectedYear:e);var g=(!c.match(/m|n/i)?a._selectedMonth+1:(e>=1&&e<=12?e:(d>0?d:a._selectedMonth+1)));var h=(!c.match(/d|w/i)?a._selectedDay:(e>=1&&e<=this._getDaysInMonth(f,g-1)?e:(d>0?d:a._selectedDay)));this._setDate(a,new Date(f,g-1,h,12));a._lastChr=(c!=='y'?'':a._lastChr.substr(Math.max(0,a._lastChr.length-2)))+b}else{var c=a.options.dateFormat.charAt(a._field);if(c.match(/n/i)){a._lastChr+=b.toLowerCase();var j=a.options[c==='n'?'monthNamesShort':'monthNames'];var k=function(){for(var i=0;i<j.length;i++){if(j[i].toLowerCase().substring(0,a._lastChr.length)===a._lastChr){return i;break}}return-1};var g=k();if(g===-1){a._lastChr=b.toLowerCase();g=k()}if(g===-1){a._lastChr=''}else{var f=a._selectedYear;var h=Math.min(a._selectedDay,this._getDaysInMonth(f,g));this._setDate(a,new Date(f,g,h,12))}}}},_doMouseWheel:function(a,b){if(m.isDisabled(a.target)){return}var c=m._getInst(a.target);c.elem.focus();if(!c.elem.val()){m._parseDate(c)}m._adjustField(c,b);a.preventDefault()},_expandSpinner:function(b){var c=m._getSpinnerTarget(b);var d=m._getInst(m._getInput(c));if(m.isDisabled(d.elem[0])){return}if(d.options.spinnerBigImage){d._expanded=true;var e=$(c).offset();var f=null;$(c).parents().each(function(){var a=$(this);if(a.css('position')==='relative'||a.css('position')==='absolute'){f=a.offset()}return!f});$('<div class="'+m._expandClass+'" style="position: absolute; left: '+(e.left-(d.options.spinnerBigSize[0]-d.options.spinnerSize[0])/2-(f?f.left:0))+'px; top: '+(e.top-(d.options.spinnerBigSize[1]-d.options.spinnerSize[1])/2-(f?f.top:0))+'px; width: '+d.options.spinnerBigSize[0]+'px; height: '+d.options.spinnerBigSize[1]+'px; background: transparent url('+d.options.spinnerBigImage+') no-repeat 0px 0px; z-index: 10;"></div>').mousedown(m._handleSpinner).mouseup(m._endSpinner).mouseout(m._endExpand).mousemove(m._describeSpinner).insertAfter(c)}},_getInput:function(a){return $(a).siblings('.'+this._getMarker())[0]},_describeSpinner:function(a){var b=m._getSpinnerTarget(a);var c=m._getInst(m._getInput(b));b.title=c.options.spinnerTexts[m._getSpinnerRegion(c,a)]},_handleSpinner:function(a){var b=m._getSpinnerTarget(a);var c=m._getInput(b);if(m.isDisabled(c)){return}if(c===m._blurredInput){m._lastInput=c;m._blurredInput=null}var d=m._getInst(c);m._doFocus(c);var e=m._getSpinnerRegion(d,a);m._changeSpinner(d,b,e);m._actionSpinner(d,e);m._timer=null;m._handlingSpinner=true;if(e>=3&&d.options.spinnerRepeat[0]){m._timer=setTimeout(function(){m._repeatSpinner(d,e)},d.options.spinnerRepeat[0]);$(b).one('mouseout',m._releaseSpinner).one('mouseup',m._releaseSpinner)}},_actionSpinner:function(a,b){if(!a.elem.val()){m._parseDate(a)}switch(b){case 0:this._setDate(a);break;case 1:this._changeField(a,-1,false);break;case 2:this._changeField(a,+1,false);break;case 3:this._adjustField(a,+1);break;case 4:this._adjustField(a,-1);break}},_repeatSpinner:function(a,b){if(!m._timer){return}m._lastInput=m._blurredInput;this._actionSpinner(a,b);this._timer=setTimeout(function(){m._repeatSpinner(a,b)},a.options.spinnerRepeat[1])},_releaseSpinner:function(a){clearTimeout(m._timer);m._timer=null},_endExpand:function(a){m._timer=null;var b=m._getSpinnerTarget(a);var c=m._getInput(b);var d=m._getInst(c);$(b).remove();d._expanded=false},_endSpinner:function(a){m._timer=null;var b=m._getSpinnerTarget(a);var c=m._getInput(b);var d=m._getInst(c);if(!m.isDisabled(c)){m._changeSpinner(d,b,-1)}if(m._handlingSpinner){m._lastInput=m._blurredInput}if(m._lastInput&&m._handlingSpinner){m._showField(d)}m._handlingSpinner=false},_getSpinnerTarget:function(a){return a.target||a.srcElement},_getSpinnerRegion:function(a,b){var c=this._getSpinnerTarget(b);var d=$(c).offset();var e=[document.documentElement.scrollLeft||document.body.scrollLeft,document.documentElement.scrollTop||document.body.scrollTop];var f=(a.options.spinnerIncDecOnly?99:b.clientX+e[0]-d.left);var g=b.clientY+e[1]-d.top;var h=a.options[a._expanded?'spinnerBigSize':'spinnerSize'];var i=(a.options.spinnerIncDecOnly?99:h[0]-1-f);var j=h[1]-1-g;if(h[2]>0&&Math.abs(f-i)<=h[2]&&Math.abs(g-j)<=h[2]){return 0}var k=Math.min(f,g,i,j);return(k===f?1:(k===i?2:(k===g?3:4)))},_changeSpinner:function(a,b,c){$(b).css('background-position','-'+((c+1)*a.options[a._expanded?'spinnerBigSize':'spinnerSize'][0])+'px 0px')},_parseDate:function(a,b){var c=this._extractDate(a.elem.val(),a)||this._normaliseDate(this._determineDate(a.options.defaultDate,a)||new Date());a._selectedYear=c.getFullYear();a._selectedMonth=c.getMonth();a._selectedDay=c.getDate();a._lastChr='';var d=function(){if(a.elem.val()!==''){m._showDate(a)}};if(typeof a.options.initialField==='number'){a._field=Math.max(0,Math.min(a._lastField,a.options.initialField));d()}else{setTimeout(function(){a._field=m._getSelection(a,a.elem[0],b);d()},0)}},_extractDate:function(a,b){if(!a){return null}var c=a.split(new RegExp('[\\'+b.options.dateFormat.substring(3).split('').join('\\')+']'));var d=0;var e=0;var f=0;var g=[false,false,false];for(var i=0;i<=b._lastField;i++){var h=parseInt(c[i],10);h=(isNaN(h)?0:h);var j=b.options.dateFormat.charAt(i);switch(j){case'y':d=h;g[0]=true;break;case'Y':d=(h%100)+(new Date().getFullYear()-new Date().getFullYear()%100);g[0]=true;break;case'm':case'M':e=h;g[1]=true;break;case'n':case'N':e=$.inArray(c[i],b.options[j==='N'?'monthNames':'monthNamesShort'])+1;g[1]=true;break;case'w':case'W':if(b.options.dateFormat.charAt(3)===' '){c.splice(i,1);h=parseInt(c[i],10)}else{h=parseInt(c[i].replace(/^.* /,''),10)}h=(isNaN(h)?0:h);case'd':case'D':f=h;g[2]=true;break}}d=g[0]?d:2000;e=g[1]?e:1;f=g[2]?f:1;return(d&&e&&f?new Date(d,e-1,f,12):null)},_showDate:function(a){this._setValue(a,this._formatDate(a,a.options.dateFormat));this._showField(a)},_formatDate:function(a,b){var c='';for(var i=0;i<=a._lastField;i++){c+=(i===0?'':b.charAt(3));var d=b.charAt(i);switch(d){case'y':c+=this._formatNumber(a._selectedYear);break;case'Y':c+=this._formatNumber(a._selectedYear%100);break;case'm':c+=this._formatNumber(a._selectedMonth+1);break;case'M':c+=(a._selectedMonth+1);break;case'n':case'N':c+=a.options[d==='N'?'monthNames':'monthNamesShort'][a._selectedMonth];break;case'd':c+=this._formatNumber(a._selectedDay);break;case'D':c+=a._selectedDay;break;case'w':case'W':c+=a.options[d==='W'?'dayNames':'dayNamesShort'][new Date(a._selectedYear,a._selectedMonth,a._selectedDay,12).getDay()]+' '+this._formatNumber(a._selectedDay);break}}return c},_showField:function(a){var b=a.elem[0];if(a.elem.is(':hidden')||m._lastInput!==b){return}var c=0;for(var i=0;i<a._field;i++){c+=this._fieldLength(a,i,a.options.dateFormat)+1}var d=c+this._fieldLength(a,i,a.options.dateFormat);if(b.setSelectionRange){b.setSelectionRange(c,d)}else if(b.createTextRange){var e=b.createTextRange();e.moveStart('character',c);e.moveEnd('character',d-a.elem.val().length);e.select()}if(!b.disabled){b.focus()}},_fieldLength:function(a,b,c){b=c.charAt(b);switch(b){case'y':return 4;case'M':return(a._selectedMonth<9?1:2);case'n':case'N':return a.options[b==='N'?'monthNames':'monthNamesShort'][a._selectedMonth].length;case'w':case'W':return a.options[b==='W'?'dayNames':'dayNamesShort'][new Date(a._selectedYear,a._selectedMonth,a._selectedDay,12).getDay()].length+3;case'D':return(a._selectedDay<10?1:2);default:return 2}},_formatNumber:function(a){return(a<10?'0':'')+a},_setValue:function(a,b){if(b!==a.elem.val()){if(a.options.altField){$(a.options.altField).val(!b?'':this._formatDate(a,a.options.altFormat||a.options.dateFormat))}a.elem.val(b).trigger('change')}},_changeField:function(a,b,c){var d=(a.elem.val()===''||a._field===(b===-1?0:a._lastField));if(!d){a._field+=b}this._showField(a);a._lastChr='';return(d&&c)},_adjustField:function(a,b){if(a.elem.val()===''){b=0}var c=a.options.dateFormat.charAt(a._field);var d=a._selectedYear+(c.match(/y/i)?b:0);var e=a._selectedMonth+(c.match(/m|n/i)?b:0);var f=(c.match(/d|w/i)?a._selectedDay+b:Math.min(a._selectedDay,this._getDaysInMonth(d,e)));this._setDate(a,new Date(d,e,f,12))},_getDaysInMonth:function(a,b){return new Date(a,b+1,0,12).getDate()},_setDate:function(a,b){b=this._normaliseDate(this._determineDate(b||a.options.defaultDate,a)||new Date());var c=this._normaliseDate(this._determineDate(a.options.minDate,a));var d=this._normaliseDate(this._determineDate(a.options.maxDate,a));b=(c&&b<c?c:(d&&b>d?d:b));a._selectedYear=b.getFullYear();a._selectedMonth=b.getMonth();a._selectedDay=b.getDate();this._showDate(a)},_determineDate:function(h,i){var j=function(a){var b=m._normaliseDate(new Date());b.setDate(b.getDate()+a);return b};var k=function(a){var b=m._extractDate(a,i);if(b){return b}a=a.toLowerCase();b=m._normaliseDate(new Date());var c=b.getFullYear();var d=b.getMonth();var e=b.getDate();var f=/([+-]?[0-9]+)\s*(d|w|m|y)?/g;var g=f.exec(a);while(g){switch(g[2]||'d'){case'd':e+=parseInt(g[1],10);break;case'w':e+=parseInt(g[1],10)*7;break;case'm':d+=parseInt(g[1],10);break;case'y':c+=parseInt(g[1],10);break}g=f.exec(a)}return new Date(c,d,e,12)};return(h?(typeof h==='string'?k(h):(typeof h==='number'?j(h):h)):null)},_normaliseDate:function(a){if(a){a.setHours(12,0,0,0)}return a}});var m=$.dateEntry})(jQuery);