1
0
Fork 0
This repository has been archived on 2024-06-28. You can view files and clone it, but cannot push or open issues or pull requests.
Umweltdatenmessung/Webinterface/Fremddateien/CibulCalendar.min.js
2014-09-28 10:41:03 +02:00

6 lines
No EOL
18 KiB
JavaScript

/*!
* 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:'<div class="calhead"><ul class="calmonthnav"><li class="calprevmonth"><span>#navprev</span></li><li class="calmonth"><span class="month">#title</span></li><li class="calnextmonth"><span>#navnext</span></li></ul><ul class="calweekdays"><li><span>#wd0</span></li><li><span>#wd1</span></li><li><span>#wd2</span></li><li><span>#wd3</span></li><li><span>#wd4</span></li><li><span>#wd5</span></li><li><span>#wd6</span></li></ul></div><div class="calbody"><ul><li#cls00><span>#d00</span></li><li#cls01><span>#d01</span></li><li#cls02><span>#d02</span></li><li#cls03><span>#d03</span></li><li#cls04><span>#d04</span></li><li#cls05><span>#d05</span></li><li#cls06><span>#d06</span></li></ul><ul><li#cls07><span>#d07</span></li><li#cls08><span>#d08</span></li><li#cls09><span>#d09</span></li><li#cls10><span>#d10</span></li><li#cls11><span>#d11</span></li><li#cls12><span>#d12</span></li><li#cls13><span>#d13</span></li></ul><ul><li#cls14><span>#d14</span></li><li#cls15><span>#d15</span></li><li#cls16><span>#d16</span></li><li#cls17><span>#d17</span></li><li#cls18><span>#d18</span></li><li#cls19><span>#d19</span></li><li#cls20><span>#d20</span></li></ul><ul><li#cls21><span>#d21</span></li><li#cls22><span>#d22</span></li><li#cls23><span>#d23</span></li><li#cls24><span>#d24</span></li><li#cls25><span>#d25</span></li><li#cls26><span>#d26</span></li><li#cls27><span>#d27</span></li></ul><ul><li#cls28><span>#d28</span></li><li#cls29><span>#d29</span></li><li#cls30><span>#d30</span></li><li#cls31><span>#d31</span></li><li#cls32><span>#d32</span></li><li#cls33><span>#d33</span></li><li#cls34><span>#d34</span></li></ul><ul><li#cls35><span>#d35</span></li><li#cls36><span>#d36</span></li><li#cls37><span>#d37</span></li><li#cls38><span>#d38</span></li><li#cls39><span>#d39</span></li><li#cls40><span>#d40</span></li><li#cls41><span>#d41</span></li></ul></div>',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=(b<this.anchorDate)?{begin:b,end:this.anchorDate}:{begin:this.anchorDate,end:b}}else{this.preSelection={begin:b,end:b}}this._switchMonthOnTimer(a,b);this._renderSelection(this.preSelection,true)},_completePreselection:function(a){if(f)document.getElementsByTagName('body')[0].removeEventListener('touchmove',this._preventDefaultBodyMove,false);this.currentListItem=false;this.setSelected(this.preSelection,false);this._renderSelection(this.selection);this.preSelection=false;if(typeof this.options.onSelect!='undefined')this.options.onSelect(this.options.range?this.selection:this.selection.begin);this._clearHoverTimer()},_switchMonthOnTimer:function(a,b){var c=false,self=this,sameMonth=(self._getDisplayedMonth().getMonth()==b.getMonth());switch(getChildIndex(a.parentNode)){case 0:if((getChildIndex(a)===0)||!sameMonth)c='prev';break;case 4:if(!sameMonth)c='next';break;case 5:if((getChildIndex(a)==6)||!sameMonth)c='next';break}if(c){if(typeof this.hoverTimer=='undefined')this.hoverTimer=setTimeout(function(){if(c=='next'){self.showNext()}else if(c=='prev'){self.showPrevious()}self._clearHoverTimer()},this.options.switchMonthOnHoverDelay)}else{this._clearHoverTimer()}},_clearHoverTimer:function(){if(this.hoverTimer)clearTimeout(this.hoverTimer);this.hoverTimer=undefined},_getDateFromElement:function(a){var b=getChildIndex(a.parentNode),incMonth=0,dateValue=parseInt(a.getElementsByTagName('span')[0].innerHTML,10),displayedMonth=this._getDisplayedMonth();if((b===0)&&(dateValue>10))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;i<monthStack.length;i++){regexp=new RegExp('#d'+(i>9?'':'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<arguments.length;i++)for(var a in arguments[i])if(arguments[i].hasOwnProperty(a))arguments[0][a]=arguments[i][a];return arguments[0]},getElementsByClassName=function(b,c){var a=[];var d=new RegExp('(^| )'+c+'( |$)');var e=b.getElementsByTagName("*");for(var i=0,j=e.length;i<j;i++)if(d.test(e[i].className))a.push(e[i]);return a},isElement=function(o){return(typeof HTMLElement==="object"?o instanceof HTMLElement:o&&typeof o==="object"&&o.nodeType===1&&typeof o.nodeName==="string")},forEach=function(a,b){for(var i=0;i<a.length;i++)b(a[i])},addEvent=function(b,c,d){if(b===null||b===undefined)return;if(typeof c=='string')c=[c];forEach(c,function(a){if(b.addEventListener){b.addEventListener(a,d,false)}else if(b.attachEvent){b.attachEvent("on"+a,d)}else{b["on"+a]=d}})},fireEvent=function(c,d){if(c===null||c===undefined)return;if(typeof d=='string')d=[d];forEach(d,function(a){if("fireEvent"in c){c.fireEvent(a)}else{var b=document.createEvent("HTMLEvents");b.initEvent(a,false,true);c.dispatchEvent(b)}})},makeUnselectable=function(a){if(a.nodeType==1)a.setAttribute("unselectable","on");var b=a.firstChild;while(b){makeUnselectable(b);b=b.nextSibling}},previousObject=function(a){a=a.previousSibling;while(a&&a.nodeType!=1)a=a.previousSibling;return a},getChildIndex=function(a){var i=0;while((a=previousObject(a))!==null)i++;return i},hasClass=function(a,b){return(' '+a.className+' ').indexOf(' '+b+' ')>-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}}));