UNPKG

simple-jscalendar

Version:
47 lines (45 loc) 20.6 kB
/* * jsCalendar v1.4.5 * MIT License * Copyright (c) 2017-2023 Grammatopoulos Athanasios-Vasileios */ var jsCalendar=function(){function d(){0!==arguments.length&&this._construct(arguments)}d.version="v1.4.5";d.prototype._construct=function(a){a=this._parseArguments(a);this._setTarget(a.target);this._init(a.options);this._initTarget();this._setDate(null!==a.date?a.date:this._target.dataset.hasOwnProperty("date")?this._target.dataset.date:new Date);if(!this._now)throw Error("jsCalendar: Date is outside range.");this.extensionsCall("init",[]);this._create();this._update();this._isFrozen=!1};d.prototype.languages= {en:{months:"January February March April May June July August September October November December".split(" "),days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),_dateStringParser:function(a,b){return d._defaultDateStringParser(a,b,this)},_dayStringParser:function(a,b){return d._defaultDayStringParser(a,b,this)}}};d.extension={};d.prototype.extensionCall=function(a,b,c){a=d.extension[a];return a[b].apply(a,c)};d.prototype.extensionsCall=function(a,b){b=[this].concat(b);for(var c in d.extension)d.extension.hasOwnProperty(c)&& d.extension[c].hasOwnProperty(a)&&this.extensionCall(c,a,b)};d.prototype._init=function(a){this._elements={};this._events={};this._events.date=[];this._events.month=[];this._events.day_render=[];this._events.date_render=[];this._events.month_render=[];this._date=this._now=null;this._selected=[];this.language={};this._parseOptions(a)};d.prototype._parseArguments=function(a){var b={target:null,date:null,options:{}};if(0===a.length)throw Error("jsCalendar: No parameters were given.");if(1===a.length)if(("object"=== typeof HTMLElement?a[0]instanceof HTMLElement:a[0])&&"object"===typeof a[0]&&null!==a[0]&&1===a[0].nodeType&&"string"===typeof a[0].nodeName||"string"===typeof a[0])b.target=a[0];else{b.options=a[0];if("undefined"!==typeof a[0].target)b.target=a[0].target;else throw Error("jsCalendar: Not target was given.");"undefined"!==typeof a[0].date&&(b.date=a[0].date)}else b.target=a[0],2<=a.length&&(b.date=a[1]),3<=a.length&&(b.options=a[2]);return b};d.options={language:"en",zeroFill:!1,monthFormat:"month", dayFormat:"D",firstDayOfTheWeek:1,navigator:!0,navigatorPosition:"both",min:!1,max:!1,onMonthRender:!1,onDayRender:!1,onDateRender:!1};d.prototype._parseOptions=function(a){this._options={};var b={};for(c in d.options)d.options.hasOwnProperty(c)&&(this._options[c]=d.options[c]),a.hasOwnProperty(c)?b[c]=a[c]:this._target.dataset.hasOwnProperty(c)&&(b[c]=this._target.dataset[c]);var c="fdotw";a.hasOwnProperty(c)?b[c]=a[c]:this._target.dataset.hasOwnProperty(c)&&(b[c]=this._target.dataset[c]);"undefined"!== typeof b.zeroFill&&(this._options.zeroFill="false"!==b.zeroFill&&b.zeroFill?!0:!1);"undefined"!==typeof b.monthFormat&&(this._options.monthFormat=b.monthFormat);"undefined"!==typeof b.dayFormat&&(this._options.dayFormat=b.dayFormat);"undefined"!==typeof b.navigator&&(this._options.navigator="false"!==b.navigator&&b.navigator?!0:!1);"undefined"!==typeof b.navigatorPosition&&(this._options.navigatorPosition=b.navigatorPosition);"string"===typeof b.language&&"undefined"!==typeof this.languages[b.language]&& (this._options.language=b.language);this.setLanguage(this._options.language);"undefined"!==typeof b.fdotw&&(b.firstDayOfTheWeek=b.fdotw);if("undefined"!==typeof b.firstDayOfTheWeek&&("number"===typeof b.firstDayOfTheWeek&&1<=b.firstDayOfTheWeek&&7>=b.firstDayOfTheWeek&&(this._options.firstDayOfTheWeek=b.firstDayOfTheWeek),"string"===typeof b.firstDayOfTheWeek))if(b.firstDayOfTheWeek.match(/^[1-7]$/))this._options.firstDayOfTheWeek=parseInt(b.firstDayOfTheWeek,10);else if(this._options.firstDayOfTheWeek= this.language.days.indexOf(b.firstDayOfTheWeek)+1,1>this._options.firstDayOfTheWeek||7<this._options.firstDayOfTheWeek)this._options.firstDayOfTheWeek=1;"undefined"!==typeof b.min&&"false"!==b.min&&!1!==b.min&&(this._options.min=f.parseDate(b.min));"undefined"!==typeof b.max&&"false"!==b.max&&!1!==b.max&&(this._options.max=f.parseDate(b.max));"undefined"!==typeof b.onMonthRender&&("string"===typeof b.onMonthRender&&"function"===typeof window[b.onMonthRender]?this._on("month_render",window[b.onMonthRender]): "function"===typeof b.onMonthRender&&this._on("month_render",b.onMonthRender));"undefined"!==typeof b.onDayRender&&("string"===typeof b.onDayRender&&"function"===typeof window[b.onDayRender]?this._on("day_render",window[b.onDayRender]):"function"===typeof b.onDayRender&&this._on("day_render",b.onDayRender));"undefined"!==typeof b.onDateRender&&("string"===typeof b.onDateRender&&"function"===typeof window[b.onDateRender]?this._on("date_render",window[b.onDateRender]):"function"===typeof b.onDateRender&& this._on("date_render",b.onDateRender))};d.prototype._setTarget=function(a){if(a=f.getElement(a))this._target=a,(a=this._target.id)&&0<a.length&&(h["#"+a]=this);else throw Error("jsCalendar: Target was not found.");};d.prototype._initTarget=function(){0<this._target.className.length&&(this._target.className+=" ");this._target.className+="jsCalendar";this._elements.table=document.createElement("table");this._elements.head=document.createElement("thead");this._elements.table.appendChild(this._elements.head); this._elements.body=document.createElement("tbody");this._elements.table.appendChild(this._elements.body);this._target.appendChild(this._elements.table)};d.prototype._isDateInRange=function(a){if(!1===this._options.min&&!1===this._options.max)return!0;a=f.parseDate(a);return!1!==this._options.min&&this._options.min.getTime()>a.getTime()||!1!==this._options.max&&this._options.max.getTime()<a.getTime()?!1:!0};d.prototype._setDate=function(a){a=f.parseDate(a);this._isDateInRange(a)&&(this._now=a,this._date= new Date(this._now.getFullYear(),this._now.getMonth(),1))};d.prototype._parseToDateString=function(a,b){var c=this.language;return b.replace(/(MONTH|month|MMM|mmm|mm|m|MM|M|DAY|day|DDD|ddd|dd|d|DD|D|YYYY|yyyy)/g,function(e){return c.dateStringParser(e,a)})};d.prototype._getVisibleMonth=function(a){a="undefined"===typeof a?this._date:f.parseDate(a);var b=new Date(a.getTime());b.setDate(1);var c=b.getDay()-(this._options.firstDayOfTheWeek-1);0>c&&(c+=7);var e=this.language,g=this._options.monthFormat.replace(/(MONTH|month|MMM|mmm|##|#|YYYY|yyyy)/g, function(m){return e.dateStringParser(m,b)});a=this._getVisibleDates(a);var k=(new Date(b.getFullYear(),b.getMonth()+1,0)).getDate(),l=-1;b.getFullYear()===this._now.getFullYear()&&b.getMonth()===this._now.getMonth()&&(l=c+this._now.getDate()-1);return{name:g,days:a,start:c+1,current:l,end:c+k}};d.prototype._getVisibleDates=function(a){a="undefined"===typeof a?this._date:f.parseDate(a);var b=[],c=new Date(a.getTime());c.setDate(1);c.setHours(0,0,0,0);var e=c.getDay()-(this._options.firstDayOfTheWeek- 1);0>e&&(e+=7);for(a=new Date(c.getTime());0<e;)a.setDate(a.getDate()-1),a.setHours(0,0,0,0),b.unshift(new Date(a.getTime())),e--;a=new Date(c.getTime());do b.push(new Date(a.getTime())),a.setDate(a.getDate()+1),a.setHours(0,0,0,0);while(1!==a.getDate());for(c=42-b.length;0<c;)b.push(new Date(a.getTime())),a.setDate(a.getDate()+1),a.setHours(0,0,0,0),c--;return b};d.prototype._create=function(){var a,b,c=this;this._elements.created=!0;this._elements.headRows=[];for(a=0;2>a;a++)this._elements.headRows.push(document.createElement("tr")), this._elements.head.appendChild(this._elements.headRows[a]);a=document.createElement("th");a.setAttribute("colspan",7);this._elements.headRows[0].className="jsCalendar-title-row";this._elements.headRows[0].appendChild(a);this._elements.headLeft=document.createElement("div");this._elements.headLeft.className="jsCalendar-title-left";a.appendChild(this._elements.headLeft);this._elements.month=document.createElement("div");this._elements.month.className="jsCalendar-title-name";a.appendChild(this._elements.month); this._elements.headRight=document.createElement("div");this._elements.headRight.className="jsCalendar-title-right";a.appendChild(this._elements.headRight);this._options.navigator&&(this._elements.navLeft=document.createElement("div"),this._elements.navLeft.className="jsCalendar-nav-left",this._elements.navRight=document.createElement("div"),this._elements.navRight.className="jsCalendar-nav-right","left"===this._options.navigatorPosition?(this._elements.headLeft.appendChild(this._elements.navLeft), this._elements.headLeft.appendChild(this._elements.navRight)):("right"===this._options.navigatorPosition?this._elements.headRight.appendChild(this._elements.navLeft):this._elements.headLeft.appendChild(this._elements.navLeft),this._elements.headRight.appendChild(this._elements.navRight)),this._elements.navLeft.addEventListener("click",function(e){c.previous();var g=new Date(c._date.getTime());g.setDate(1);c._eventFire("month",g,e)},!1),this._elements.navRight.addEventListener("click",function(e){c.next(); var g=new Date(c._date.getTime());g.setDate(1);c._eventFire("month",g,e)},!1));this._elements.headRows[1].className="jsCalendar-week-days";a.className="jsCalendar-title";this._elements.days=[];for(a=0;7>a;a++)this._elements.days.push(document.createElement("th")),this._elements.headRows[1].appendChild(this._elements.days[this._elements.days.length-1]);this._elements.bodyRows=[];this._elements.bodyCols=[];for(a=0;6>a;a++)for(this._elements.bodyRows.push(document.createElement("tr")),this._elements.body.appendChild(this._elements.bodyRows[a]), b=0;7>b;b++)this._elements.bodyCols.push(document.createElement("td")),this._elements.bodyRows[a].appendChild(this._elements.bodyCols[7*a+b]),this._elements.bodyCols[7*a+b].addEventListener("click",function(e){return function(g){c._eventFire("date",c._active[e],g)}}(7*a+b),!1);this.extensionsCall("create",[this._elements])};d.prototype._selectDates=function(a){a=a.slice();for(var b=0;b<a.length;b++)a[b]=f.parseDate(a[b]),a[b].setHours(0,0,0,0),a[b]=a[b].getTime();for(b=a.length-1;0<=b;b--)0>this._selected.indexOf(a[b])&& this._selected.push(a[b])};d.prototype._unselectDates=function(a){a=a.slice();for(var b=0;b<a.length;b++)a[b]=f.parseDate(a[b]),a[b].setHours(0,0,0,0),a[b]=a[b].getTime();for(b=a.length-1;0<=b;b--){var c=this._selected.indexOf(a[b]);0<=c&&this._selected.splice(c,1)}};d.prototype._unselectAllDates=function(){for(;this._selected.length;)this._selected.pop()};d.prototype._update=function(){if(!0===this._isFrozen)return this;var a=this._getVisibleMonth(this._date);this._active=a.days.slice();this._elements.month.textContent= a.name;for(var b=this._options.zeroFill?"0":"",c,e=a.days.length-1;0<=e;e--)c=a.days[e].getDate(),this._elements.bodyCols[e].textContent=10>c?b+c:c,0<=this._selected.indexOf(a.days[e].getTime())?this._elements.bodyCols[e].className="jsCalendar-selected":this._elements.bodyCols[e].removeAttribute("class");for(e=0;e<a.start-1;e++)this._elements.bodyCols[e].className="jsCalendar-previous";0<=a.current&&(this._elements.bodyCols[a.current].className=0<this._elements.bodyCols[a.current].className.length? this._elements.bodyCols[a.current].className+" jsCalendar-current":"jsCalendar-current");for(e=a.end;e<a.days.length;e++)this._elements.bodyCols[e].className="jsCalendar-next";for(e=0;e<this._elements.bodyCols.length;++e)this._isDateInRange(this._active[e])||(this._elements.bodyCols[e].className="jsCalendar-unselectable");for(e=0;7>e;e++){var g=this;this._elements.days[e].textContent=this._options.dayFormat.replace(/(DAY|day|DDD|ddd|DD|dd|D)/g,function(k){return g.language.dayStringParser(k,(e+g._options.firstDayOfTheWeek- 1)%7)})}if(0<this._events.month_render.length)for(c=a.days[a.start-1],this._elements.month.removeAttribute("style"),b=0;b<this._events.month_render.length;b++)this._events.month_render[b].call(this,c.getMonth(),this._elements.month,{start:new Date(c.getFullYear(),c.getMonth(),1,0,0,0,0),end:new Date(c.getFullYear(),c.getMonth()+1,0,23,59,59,999),numberOfDays:a.end-a.start+1});if(0<this._events.day_render.length)for(e=0;7>e;e++)for(this._elements.days[e].removeAttribute("style"),b=0;b<this._events.day_render.length;b++)this._events.day_render[b].call(this, (e+this._options.firstDayOfTheWeek-1)%7,this._elements.days[e],{position:e});if(0<this._events.date_render.length)for(e=0;e<a.days.length;e++)for(this._elements.bodyCols[e].removeAttribute("style"),b=0;b<this._events.date_render.length;b++)this._events.date_render[b].call(this,new Date(a.days[e].getTime()),this._elements.bodyCols[e],{isCurrent:a.current==e,isSelected:0<=this._selected.indexOf(a.days[e].getTime()),isPreviousMonth:e+1<a.start,isCurrentMonth:a.start<=e+1&&e+1<=a.end,isNextMonth:a.end< e+1,position:{x:e%7,y:Math.floor(e/7)}});this.extensionsCall("update",[a])};d.prototype._eventFire=function(a,b,c){if(this._events.hasOwnProperty(a))for(var e=0;e<this._events[a].length;e++)(function(g,k){setTimeout(function(){g.call(k,c,new Date(b.getTime()))},0)})(this._events[a][e],this)};d.prototype._on=function(a,b){if("function"===typeof b)this._events[a].push(b);else throw Error("jsCalendar: Invalid callback function.");return this};d.prototype.onDateClick=function(a){return this._on("date", a)};d.prototype.onMonthChange=function(a){return this._on("month",a)};d.prototype.onDayRender=function(a){return this._on("day_render",a)};d.prototype.onDateRender=function(a){return this._on("date_render",a)};d.prototype.onMonthRender=function(a){return this._on("month_render",a)};d.prototype.set=function(a){this._setDate(a);this.refresh();return this};d.prototype.min=function(a){this._options.min=a?f.parseDate(a):!1;this.refresh();return this};d.prototype.max=function(a){this._options.max=a?f.parseDate(a): !1;this.refresh();return this};d.prototype.freeze=function(){this._isFrozen=!0;return this};d.prototype.unfreeze=function(){this._isFrozen=!1;return this};d.prototype.isFrozen=function(){return this._isFrozen};d.prototype.refresh=function(a){"undefined"!==typeof a&&this._isDateInRange(a)&&(this._date=f.parseDate(a));!0===this._elements.created&&this._update();return this};d.prototype.next=function(a){"number"!==typeof a&&(a=1);a=new Date(this._date.getFullYear(),this._date.getMonth()+a,1);if(!this._isDateInRange(a))return this; this._date=a;this.refresh();return this};d.prototype.previous=function(a){"number"!==typeof a&&(a=1);a=new Date(this._date.getFullYear(),this._date.getMonth()-a+1,0);if(!this._isDateInRange(a))return this;this._date=a;this.refresh();return this};d.prototype["goto"]=function(a){this.refresh(a);return this};d.prototype.reset=function(){this.refresh(this._now);return this};d.prototype.select=function(a){if("undefined"===typeof a)return this;a instanceof Array||(a=[a]);this._selectDates(a);this.refresh(); return this};d.prototype.unselect=function(a){if("undefined"===typeof a)return this;a instanceof Array||(a=[a]);this._unselectDates(a);this.refresh();return this};d.prototype.clearselect=function(){this._unselectAllDates();this.refresh();return this};d.prototype.clearSelected=d.prototype.clearselect;d.prototype.getSelected=function(a){"object"!==typeof a&&(a={});var b=this._selected.slice();a.sort&&(!0===a.sort?b.sort():"string"===typeof a.sort&&("asc"===a.sort.toLowerCase()?b.sort():"desc"===a.sort.toLowerCase()&& (b.sort(),b.reverse())));if(a.type&&"string"===typeof a.type){var c;if("date"===a.type.toLowerCase())for(c=b.length-1;0<=c;c--)b[c]=new Date(b[c]);else if("timestamp"!==a.type.toLowerCase())for(c=b.length-1;0<=c;c--)b[c]=this._parseToDateString(new Date(b[c]),a.type)}return b};d.prototype.isSelected=function(a){if("undefined"===typeof a||null===a)return!1;a=f.parseDate(a);a.setHours(0,0,0,0);a=a.getTime();return 0<=this._selected.indexOf(a)?!0:!1};d.prototype.isVisible=function(a){if("undefined"=== typeof a||null===a)return!1;a=f.parseDate(a);a.setHours(0,0,0,0);a=a.getTime();var b=this._getVisibleDates();return b[0].getTime()<=a&&b[b.length-1].getTime()>=a?!0:!1};d.prototype.isInMonth=function(a){if("undefined"===typeof a||null===a)return!1;a=f.parseDate(a);a.setHours(0,0,0,0);a.setDate(1);var b=f.parseDate(this._date);b.setHours(0,0,0,0);b.setDate(1);return a.getTime()===b.getTime()?!0:!1};d.prototype.setLanguage=function(a){if("string"!==typeof a)throw Error("jsCalendar: Invalid language code."); if("undefined"===typeof this.languages[a])throw Error("jsCalendar: Language not found.");this._options.language=a;a=this.languages[a];this.language.months=a.months;this.language.days=a.days;this.language.dateStringParser=a._dateStringParser;this.language.dayStringParser=a._dayStringParser;this.refresh();return this};d.autoFind=function(){for(var a=document.getElementsByClassName("auto-jsCalendar"),b=0;b<a.length;b++)"true"!==a[b].getAttribute("jsCalendar-loaded")&&(a[b].setAttribute("jsCalendar-loaded", "true"),new d({target:a[b]}))};var f=d.tools={};f.parseDate=function(a,b){if("undefined"===typeof a||null===a||"now"===a)a=new Date;else if("string"===typeof a)if(a=a.replace(/-/g,"/").match(/^(\d{1,2})\/(\d{1,2})\/(\d{4,4})$/i),null!==a){var c=parseInt(a[2],10)-1;a=new Date(a[3],c,a[1]);if(!a||a.getMonth()!==c){if(!b)throw Error("jsCalendar: Date does not exist.");return null}}else{if(!b)throw Error("jsCalendar: Failed to parse date.");return null}else if("number"===typeof a)a=new Date(a);else if(!(a instanceof Date)){if(!b)throw Error("jsCalendar: Invalid date.");return null}if(isNaN(a)){if(!b)throw Error("jsCalendar: Invalid date.");return null}return new Date(a.getTime())};f.stringToDate=f.parseDate;f.dateToString=function(a,b,c){var e=d.prototype.languages;c&&e.hasOwnProperty(c)||(c="en");return d.prototype._parseToDateString.apply({language:{months:e[c].months,days:e[c].days,dateStringParser:e[c]._dateStringParser,dayStringParser:e[c]._dayStringParser}},[a,b])};f.getElement=function(a){if(!a)return null; if("string"===typeof a){if("#"===a[0])return document.getElementById(a.substring(1));if("."===a[0])return document.getElementsByClassName(a.substring(1))[0]}else if(a.tagName&&a.nodeName&&a.ownerDocument&&a.removeAttribute)return a;return null};d["new"]=function(){var a=new d;a._construct(arguments);return a};var h={};d.set=function(a,b){if(b instanceof d)return h[a]=b,!0;throw Error("jsCalendar: The second parameter is not a jsCalendar.");};d.get=function(a){return h.hasOwnProperty(a)?h[a]:null}; d.del=function(a){return h.hasOwnProperty(a)?(delete h[a],!0):!1};d.addLanguage=function(a){if("undefined"===typeof a)throw Error("jsCalendar: No language object was given.");if("string"!==typeof a.code)throw Error("jsCalendar: Invalid language code.");if(!(a.months instanceof Array))throw Error("jsCalendar: Invalid language months.");if(12!==a.months.length)throw Error("jsCalendar: Invalid language months length.");if(!(a.days instanceof Array))throw Error("jsCalendar: Invalid language days.");if(7!== a.days.length)throw Error("jsCalendar: Invalid language days length.");d.prototype.languages[a.code]=a;a._dateStringParser=a.hasOwnProperty("dateStringParser")?function(b,c){return a.dateStringParser(b,c)||d._defaultDateStringParser(b,c,a)}:function(b,c){return d._defaultDateStringParser(b,c,a)};a._dayStringParser=a.hasOwnProperty("dayStringParser")?function(b,c){return a.dayStringParser(b,c)||d._defaultDayStringParser(b,c,a)}:function(b,c){return d._defaultDayStringParser(b,c,a)}};d.ext=function(a, b){d.extension[a]=b};d._defaultDateStringParser=function(a,b,c){switch(a){case "MONTH":case "month":return c.months[b.getMonth()];case "MMM":case "mmm":return c.months[b.getMonth()].substring(0,3);case "mm":return c.months[b.getMonth()].substring(0,2);case "m":return c.months[b.getMonth()].substring(0,1);case "MM":return(9>b.getMonth()?"0":"")+(b.getMonth()+1);case "M":return b.getMonth()+1;case "##":return(9>b.getMonth()?"0":"")+(b.getMonth()+1);case "#":return b.getMonth()+1;case "DAY":case "day":return c.days[b.getDay()]; case "DDD":case "ddd":return c.days[b.getDay()].substring(0,3);case "dd":return c.days[b.getDay()].substring(0,2);case "d":return c.days[b.getDay()].substring(0,1);case "DD":return(9>=b.getDate()?"0":"")+b.getDate();case "D":return b.getDate();case "YYYY":case "yyyy":return b.getFullYear()}};d._defaultDayStringParser=function(a,b,c){switch(a){case "DAY":case "day":return c.days[b];case "DDD":case "ddd":return c.days[b].substring(0,3);case "DD":case "dd":return c.days[b].substring(0,2);case "D":return c.days[b].substring(0, 1)}};(function(){if("undefined"!==typeof window.jsCalendar_language2load){for(;window.jsCalendar_language2load.length;)(function(a){return function(){d.addLanguage(a)}})(window.jsCalendar_language2load.pop());delete window.jsCalendar_language2load}})();window.addEventListener("load",function(){d.autoFind()},!1);return d}();