/*! * CibulCalendar v0.2.7 ~ Copyright (c) 2013 Kari Olafsson, http://tech.cibul.net * Released under MIT license, http://opensource.org/licenses/mit-license.php */ (function(a,b){if(typeof exports=='object'){module.exports=b()}else if(typeof define=='function'&&define.amd){define(b)}else{var c=b();a.CibulCalendar=c.CibulCalendar;a.setCibulCalendar=c.setCibulCalendar}}(this,function(){'use strict';var f='ontouchstart'in window&&!(/hp-tablet/gi).test(navigator.appVersion),CibulCalendar=function(a,b){if(!b)b={};if(!isElement(a))return;extend(this,{options:extend({init:new Date(),range:true,lang:'en',enabled:true,firstDayOfWeek:1,selected:false,filter:false,template:'
',classes:extend({calendar:'ccal',locale:extend({en:'en',fr:'fr',it:'it',es:'es',sv:'sv',no:'no',da:'da',ar:'ar',de:'de'}),navDomPrev:'calprevmonth',navDomNext:'calnextmonth',calendarBody:'calbody',selected:'selected',preSelected:'preselected',today:'today',month:'month',prevMonthDate:'calprev',nextMonthDate:'calnext',disabled:'disabled',originCalendar:'origincal',},b.classes?b.classes:{}),navDomContent:{prev:'<',next:'>'},monthNames:extend({en:['January','February','March','April','May','June','July','August','September','October','November','December'],fr:['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],it:['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],es:['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Augosto','Septiembre','Octubre','Noviembre','Diciembre'],sv:['Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December'],no:['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'],da:['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'],ar:['دجمبر','نونبر','أكتوبر','شتمبر','غشت','يوليو','يونيو','ماي','أبريل','مارس','فبراير','يناير'],de:['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']},b.monthNames?b.monthNames:{}),weekDays:extend({en:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],fr:['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],it:['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],es:['Dom','Lun','Mar','Mie','Jue','Vie','Sab'],sv:['Sön','Mån','Tid','Ons','Tor','Fre','Lör'],no:['Søn','Man','Tir','Ons','Tor','Fre','Lør'],da:['Søn','Man','Tir','Ons','Tor','Fre','Lør'],ar:['اﻷحد','السبت','الجمعة','الخميس','اﻷربعاء','الثلاتاء','اﻷتنين'],de:['Son','Mon','Die','Mit','Don','Fre','Sam']},b.weekDays),switchMonthOnHoverDelay:800,},b),displayedCalendarElement:false,preSelection:false,selecting:false,element:a,});this.enabled=this.options.enabled;this.setSelected(this.options.selected);this._renderCalendar()};CibulCalendar.prototype={disable:function(){this.enabled=false;addClass(getElementsByClassName(this.element,this.options.classes.calendar)[0],this.options.classes.disabled)},enable:function(){this.enabled=true;removeClass(getElementsByClassName(this.element,this.options.classes.calendar)[0],this.options.classes.disabled)},showNext:function(){if(!this.enabled)return;this._incDisplayedMonth()},showPrevious:function(){if(!this.enabled)return;this._decDisplayedMonth()},setSelected:function(a,b){if(a){if(typeof a.begin=='undefined')a={begin:a,end:a};if(typeof b=='undefined')b=true;this.selection=(a.begin>a.end)?{begin:a.end,end:a.begin}:a;if(this.selection&&b){this._setDisplayedMonth(new Date(this.selection.begin.getTime()))}else{this._renderSelection(this.selection)}}else{this.selection=false;this._clearSelectionRender()}},_getSelected:function(){if(typeof this.selection=='undefined')this.selection=false;return this.selection},_getSelectedElements:function(){return getElementsByClassName(getElementsByClassName(this.displayedCalendarElement,this.options.classes.calendarBody)[0],this.options.classes.selected)},_applyBehavior:function(){var b=this;addEvent(getElementsByClassName(this.displayedCalendarElement,this.options.classes.navDomPrev)[0],'click',function(a){b.showPrevious()});addEvent(getElementsByClassName(this.displayedCalendarElement,this.options.classes.navDomNext)[0],'click',function(a){b.showNext()});forEach(getElementsByClassName(this.displayedCalendarElement,this.options.classes.calendarBody)[0].getElementsByTagName('li'),function(a){b._applySelectionBehavior(a)});addEvent(getElementsByClassName(this.displayedCalendarElement,this.options.classes.month)[0],'click',function(){b._selectMonth()})},_selectMonth:function(){if(!this.enabled||!this.options.range)return;var a=this._getDisplayedMonth();this.setSelected({begin:new Date(a.getFullYear(),a.getMonth(),1),end:new Date(a.getFullYear(),a.getMonth()+1,0)});this._renderCalendar();if(typeof this.options.onSelect!='undefined')this.options.onSelect(this.selection)},_applySelectionBehavior:function(b){var c=this;addEvent(b,['touchstart','mousedown'],function(a){if(c.selecting||!c.enabled)return;c.selecting=true;c._beginPreselection(b)});addEvent(b,['mouseover','touchmove'],function(a){if(!c.selecting||!c.enabled)return;c._updatePreselection(c._getActualListItem(b,a))});addEvent(b,['mouseup','touchend'],function(a){if(!c.selecting||!c.enabled)return;c.selecting=false;c._completePreselection(b);if(getElementsByClassName(c.element,c.options.classes.originCalendar).length)c.element.removeChild(getElementsByClassName(c.element,c.options.classes.originCalendar)[0])})},_preventDefaultBodyMove:function(a){if(a.preventDefault)a.preventDefault()},_beginPreselection:function(a){if(f)addEvent(document.getElementsByTagName('body')[0],'touchmove',this._preventDefaultBodyMove);this.selection=false;this.currentListItem=a;this.anchorDate=this._getDateFromElement(a);this.preSelection={begin:this.anchorDate,end:this.anchorDate};this._renderSelection(this.preSelection,true)},_updatePreselection:function(a){if(this.currentListItem==a)return;this.currentListItem=a;var b=this._getDateFromElement(a);if(this.options.range){this.preSelection=(b10))incMonth=-1;if((b>=4)&&(dateValue<12))incMonth=1;return new Date(displayedMonth.getFullYear(),displayedMonth.getMonth()+incMonth,dateValue)},_incDisplayedMonth:function(){var a=this._getDisplayedMonth();a.setMonth(a.getMonth()+1);this._setDisplayedMonth(a)},_decDisplayedMonth:function(){var a=this._getDisplayedMonth();a.setMonth(a.getMonth()-1);this._setDisplayedMonth(a)},_setDisplayedMonth:function(a){this.displayedMonth=a;this._renderCalendar()},_getDisplayedMonth:function(){if(typeof this.displayedMonth=='undefined')this.displayedMonth=this.options.init;return this.displayedMonth},_clearSelectionRender:function(){var b=this;if(!this.displayedCalendarElement)return;forEach(getElementsByClassName(getElementsByClassName(this.displayedCalendarElement,this.options.classes.calendarBody)[0],this.options.classes.selected),function(a){removeClass(a,b.options.classes.selected)})},_renderSelection:function(b,c){if(!this.displayedCalendarElement)return;var d=false,i=0,classes,self=this,currentMonth=self._getDisplayedMonth().getMonth();c=(typeof c=='undefined')?false:c;forEach(getElementsByClassName(this.displayedCalendarElement,this.options.classes.calendarBody)[0].getElementsByTagName('li'),function(a){classes=[];if(!d)d=self._getDateFromElement(a);else d.setDate(d.getDate()+1);if(self._isWithinRange(d,b))classes.push(c?self.options.classes.preSelected:self.options.classes.selected);if(self._isToday(d))classes.push(self.options.classes.today);if(d.getMonth()!=currentMonth)classes.push(self.options.classes[i++<7?'prevMonthDate':'nextMonthDate']);if(self.options.filter)classes=self.options.filter(d,classes);a.className=classes.join(' ')})},_generateCalendarHTML:function(a){var i,render=this.options.template,regexp,curDate,varMonth=0,selected=this._getSelected(),monthStack=this._getMonthStack(a.getMonth(),a.getFullYear());for(i=0;i9?'':'0')+i);render=render.replace(regexp,monthStack[i]);var b=parseInt(monthStack[i],10);var c=[];regexp=new RegExp('#cls'+(i>9?'':'0')+i);varMonth=0;if((i<7)&&(b>10)){c.push(this.options.classes.prevMonthDate);varMonth=-1}else{if((i>27)&&(b<13)){c.push(this.options.classes.nextMonthDate);varMonth=1}}curDate=new Date(a.getFullYear(),a.getMonth()+varMonth,b);if(selected)if(this._isWithinRange(curDate,selected))c.push(this.options.classes.selected);if(this._isToday(curDate)){c.push(this.options.classes.today)}if(this.options.filter)this.options.filter(curDate,c);render=render.replace(regexp,c.length?' class="'+c.join(' ')+'"':'')}for(i=0;i<7;i++){regexp=new RegExp('#wd'+i);render=render.replace(regexp,this.options.weekDays[this.options.lang][(i+this.options.firstDayOfWeek)%7])}render=render.replace('#title',this.options.monthNames[this.options.lang][a.getMonth()]+' '+a.getFullYear());render=render.replace('#navprev',this.options.navDomContent.prev).replace('#navnext',this.options.navDomContent.next);return render},_renderCalendar:function(){var a=this._getDisplayedMonth();if(this.selecting){if((a.getMonth()==this.anchorDate.getMonth())&&(a.getFullYear()==this.anchorDate.getFullYear())&&(getElementsByClassName(this.element,this.options.classes.originCalendar).length)){this.element.removeChild(getElementsByClassName(this.element,this.options.classes.calendar)[0]);getElementsByClassName(this.element,this.options.classes.originCalendar)[0].setAttribute('style','display:block;');getElementsByClassName(this.element,this.options.classes.originCalendar)[0].className=this.options.classes.calendar;return}else{if(!getElementsByClassName(this.element,this.options.classes.originCalendar).length){getElementsByClassName(this.element,this.options.classes.calendar)[0].setAttribute('style','display:none;');getElementsByClassName(this.element,this.options.classes.calendar)[0].className=this.options.classes.originCalendar}else{this.element.removeChild(getElementsByClassName(this.element,this.options.classes.calendar)[0])}}}else{if(getElementsByClassName(this.element,this.options.classes.calendar).length)this.element.removeChild(getElementsByClassName(this.element,this.options.classes.calendar)[0])}var b=document.createElement('div');b.className=this.options.classes.calendar+' '+this.options.classes.locale[this.options.lang];b.innerHTML=this._generateCalendarHTML(a);this.element.appendChild(b);this.displayedCalendarElement=getElementsByClassName(this.element,this.options.classes.calendar)[0];makeUnselectable(this.element);this._applyBehavior()},_getMonthStack:function(a,b){var c=[],day=new Date(b,a+1,0),i;i=day.getDate();while(i--)c.unshift((i+1).toString());day=new Date(b,a,1);var d=(day.getDay()-this.options.firstDayOfWeek)%7;d=d<0?d+7:d;while(d--){day.setDate(day.getDate()-1);c.unshift(day.getDate().toString())}day=new Date(b,a+1,0);while(c.length<42){day.setDate(day.getDate()+1);c.push(day.getDate().toString())}return c},_isToday:function(a){if(typeof this.today=='undefined')this.today=new Date().toDateString();return(a.toDateString()==this.today)},_isWithinRange:function(a,b){var c=a.toDateString();var d={begin:b.begin.toDateString(),end:b.end.toDateString()};if((c==d.begin)||(c==d.end))return true;if((a>=b.begin)&&(a<=b.end))return true;return false},_getActualListItem:function(a,b){if(typeof b=='undefined')return a;if(typeof b.touches=='undefined')return a;return elementFromDocumentPoint(b.touches[0].pageX,b.touches[0].pageY).parentNode}};var g=function(b,c){var d=document.getElementById(b),calCanvas,calendar,inFocus=false,_init=function(){c=extend({onSelect:_onSelect,separator:' - ',canvasClass:'calendar-canvas',offset:{top:5,left:0}},c?c:{});addEvent(d,'click',_focus);addEvent(document.getElementsByTagName('body')[0],'click',function(){if(!inFocus)_blur();inFocus=false})},_focus=function(){inFocus=true;if(!calCanvas)_createCalendar();extend(calCanvas.style,{position:'absolute',top:(d.offsetTop+d.offsetHeight+c.offset.top)+'px',left:d.offsetLeft+c.offset.left+'px'});calCanvas.style.display='block';d.blur()},_blur=function(){if(calCanvas)calCanvas.style.display='none'},_createCalendar=function(){calCanvas=document.createElement('div');calCanvas.className=c.canvasClass;if(!d.parentNode.style.position)d.parentNode.style.position='relative';calCanvas.style.position='absolute';addEvent(calCanvas,'click',_focus);d.parentNode.appendChild(calCanvas);new CibulCalendar(calCanvas,c)},_onSelect=function(a){d.value=a.begin?_dateToString(a.begin)+(a.begin!=a.end?c.separator+_dateToString(a.end):''):_dateToString(a);fireEvent(d,'change');setTimeout(_blur,200)},_dateToString=function(a){return _fZ(a.getDate())+'/'+_fZ(a.getMonth()+1)+'/'+a.getFullYear()},_fZ=function(n){return(n>9?'':'0')+n};_init()},extend=function(){for(var i=1;i-1},addClass=function(a,b){if(!hasClass(a,b))a.className=a.className+' '+b},removeClass=function(a,b){if(hasClass(a,b)){var c=new RegExp(b,'g');a.className=a.className.replace(c,'')}},elementFromPointIsUsingViewPortCoordinates=function(){if(window.pageYOffset>0){return(window.document.elementFromPoint(0,window.pageYOffset+window.innerHeight-1)===null)}else if(window.pageXOffset>0){return(window.document.elementFromPoint(window.pageXOffset+window.innerWidth-1,0)===null)}return false},elementFromDocumentPoint=function(x,y){if(elementFromPointIsUsingViewPortCoordinates()){return window.document.elementFromPoint(x-window.pageXOffset,y-window.pageYOffset)}else{return window.document.elementFromPoint(x,y)}};return{CibulCalendar:CibulCalendar,setCibulCalendar:g}}));