/*! * LiteRyzJS/Timeline v0.2.0.121 * Copyright 2023-2024 Ray Lam (https://www.hiimray.co.uk) * */ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.LiteRyzJS=t():e.LiteRyzJS=t()}(this,(()=>(()=>{"use strict";var e={d:(t,n)=>{for(var a in n)e.o(n,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:n[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{Timeline:()=>s});const n=class{constructor(e,t){const n=this;n.Parent=e,n.Container=t,n.CTX=n.Container.getContext("2d"),n.initialiseOptions(),n.initialiseComponents()}initialiseOptions(){}initialiseComponents(){const e=this;e.Container.style.width=e.Parent.Size.W+"px",e.Container.style.height=e.Parent.Size.H+"px",e.Container.style.position="absolute",e.Container.style.border="none",e.CTX.canvas.width=e.Parent.Size.W,e.CTX.canvas.height=e.Parent.Size.H,e.Clear()}get ClientRectangle(){const e=this;return{X:e.Parent.Padding.Left,Y:e.Parent.Padding.Top,W:e.Parent.Size.W-(e.Parent.Padding.Left+e.Parent.Padding.Right),H:e.Parent.Size.H-(e.Parent.Padding.Top+e.Parent.Padding.Bottom)}}Clear(){const e=this;e.CTX.clearRect(0,0,e.CTX.canvas.width,e.CTX.canvas.height)}Invalidate(){}drawCircle(e,t,n,a,i,r){const o=this,s=2*a,l=n-s,c=o.half(n);return o.CTX.beginPath(),o.CTX.arc(e,t,l,0,2*Math.PI,!1),o.CTX.fillStyle=r,o.CTX.fill(),o.CTX.lineWidth=a,o.CTX.strokeStyle=i,o.CTX.stroke(),{X:e-(c+a),Y:t-(c+a),W:n+s,H:n+s}}drawRectangle(e,t){const n=this;return n.CTX.beginPath(),n.CTX.rect(e.X,e.Y,e.W,e.H),n.CTX.lineWidth=1,n.CTX.strokeStyle=t,n.CTX.stroke(),e}drawText(e,t,n,a,i,r){const o=this;o.CTX.font=a,o.CTX.fillStyle=i;let s=o.measureText(a,n);switch(s.Y=t,r){case"center":s.X=e-s.X;break;case"right":s.X=e-s.W;break;default:s.X=e}return o.CTX.fillText(n,s.X,s.Y+s.H),s}drawVerticalLine(e,t,n,a,i){const r=this;return r.CTX.beginPath(),r.CTX.moveTo(e,t),r.CTX.lineTo(e,n-a),r.CTX.lineWidth=a,r.CTX.strokeStyle=i,r.CTX.stroke(),{X:e,Y:t,W:a,H:n-t}}half(e){return e/2}measureText(e,t){const n=this;n.CTX.font=e;const a=n.CTX.measureText(t);return{W:a.width,H:a.fontBoundingBoxAscent,X:n.half(a.width),Y:n.half(a.fontBoundingBoxAscent)}}isPointInRectangle(e,t){const n=e.X+e.W,a=e.Y+e.H;return t.X>=e.X&&t.X<=n&&t.Y>=e.Y&&t.Y<=a}combineRectangle(e,t){const n=Math.max(e.X+e.W,t.X+t.W),a=Math.max(e.Y+e.H,t.Y+t.H),i={X:Math.min(e.X,t.X),Y:Math.min(e.Y,t.Y),W:0,H:0};return i.W=n-i.X,i.H=a-i.Y,i}},i=class extends n{constructor(e,t){super(e,t)}initialiseOptions(){super.initialiseOptions(),this.Options={Axis:{LineColour1:"#000000",LineWidth:1,Font:"8pt Arial",LabelColour:"#000000",LabelSpacing:6},XAxis:{NoPartPerDay:4,HourLineSpace:6,HourLineHeight:10,HourLineColour:"#EAEAEA",DayLineHeight:20,DayLineColour:"#9E9E9E",Position:"bottom"}}}initialiseComponents(){super.initialiseComponents(),this.Invalidate()}get GraphRectangle(){const e=this;return"top"==e.Options.XAxis.Position?{X:e.ClientRectangle.X,Y:e.ClientRectangle.Y+e.XAxisHeight,W:e.ClientRectangle.W,H:e.ClientRectangle.H-e.XAxisHeight}:{X:e.ClientRectangle.X,Y:e.ClientRectangle.Y,W:e.ClientRectangle.W,H:e.ClientRectangle.H-e.XAxisHeight}}get XAxisHeight(){const e=this;return e.measureText(e.Options.Axis.Font,"0").H+e.Options.Axis.LabelSpacing+2*e.Options.XAxis.DayLineHeight}get XAxisPositions(){const e=this,t=e.GraphRectangle.X+e.GraphRectangle.W;let n=[],a=e.GraphRectangle.X,i=e.Parent.ConvertToDate(e.Parent.ShowDate);for(i.setDate(i.getDate()-1);!(a>=t);)n.push({Date:e.Parent.DateToInternalString(i),X:a}),a+=e.Options.XAxis.HourLineSpace*e.Options.XAxis.NoPartPerDay,i.setDate(i.getDate()+1);return n}Invalidate(){const e=this;e.Clear(),e.drawAxis(),e.drawXAxisTicks(),e.drawXAxisLabels(),e.Parent.Debug&&e.drawRectangle(e.ClientRectangle,"red"),e.Parent.Debug&&e.drawRectangle(e.GraphRectangle,"red")}drawAxis(){const e=this;e.CTX.beginPath(),"top"==e.Options.XAxis.Position?(e.CTX.moveTo(e.GraphRectangle.X,e.GraphRectangle.Y+e.GraphRectangle.H),e.CTX.lineTo(e.GraphRectangle.X,e.GraphRectangle.Y),e.CTX.lineTo(e.GraphRectangle.X+e.GraphRectangle.W,e.GraphRectangle.Y)):(e.CTX.moveTo(e.GraphRectangle.X,e.GraphRectangle.Y),e.CTX.lineTo(e.GraphRectangle.X,e.GraphRectangle.Y+e.GraphRectangle.H),e.CTX.lineTo(e.GraphRectangle.X+e.GraphRectangle.W,e.GraphRectangle.Y+e.GraphRectangle.H)),e.CTX.lineWidth=e.Options.Axis.LineWidth,e.CTX.strokeStyle=e.Options.Axis.LineColour1,e.CTX.stroke()}drawXAxisLabels(){const e=this,t=e.measureText(e.Options.Axis.Font,"0");let n=0,a=0,i=0;"top"==e.Options.XAxis.Position?(n=e.GraphRectangle.Y-e.Options.Axis.LineWidth-2,a=n-(t.H+e.Options.XAxis.DayLineHeight),i=a-(t.H+e.Options.Axis.LabelSpacing)):(n=e.GraphRectangle.Y+e.GraphRectangle.H+e.Options.Axis.LineWidth,a=n+e.Options.XAxis.DayLineHeight,i=a+t.H+e.Options.Axis.LabelSpacing),e.XAxisPositions.forEach((function(t,n){const r=e.Parent.ConvertToDate(t.Date);let o=!1;0==n?r.getDate()<25&&(o=!0):1==r.getDate()&&(o=!0),e.drawText(t.X,a,e.Parent.DateToString(r,"dd"),e.Options.Axis.Font,e.Options.Axis.LabelColour,"center"),o&&e.drawText(t.X,i,e.Parent.DateToString(r,"MMMM yyyy"),e.Options.Axis.Font,e.Options.Axis.LabelColour,"left")}))}drawXAxisTicks(){const e=this;let t=e.GraphRectangle.X;const n=e.GraphRectangle.X+e.GraphRectangle.W;let a=0,i=0,r=0;"top"==e.Options.XAxis.Position?(a=e.GraphRectangle.Y-e.Options.Axis.LineWidth,i=a-e.Options.XAxis.DayLineHeight,r=a-e.Options.XAxis.HourLineHeight):(a=e.GraphRectangle.Y+e.GraphRectangle.H+e.Options.Axis.LineWidth,i=a+e.Options.XAxis.DayLineHeight,r=a+e.Options.XAxis.HourLineHeight);let o=0;for(;!(t>=n);)e.CTX.beginPath(),e.CTX.moveTo(t,a),o%e.Options.XAxis.NoPartPerDay==0?(e.CTX.lineTo(t,i),e.CTX.strokeStyle=e.Options.XAxis.DayLineColour):(e.CTX.lineTo(t,r),e.CTX.strokeStyle=e.Options.XAxis.HourLineColour),e.CTX.lineWidth=e.Options.Axis.LineWidth,e.CTX.stroke(),t+=e.Options.XAxis.HourLineSpace,o++}},r=class extends n{constructor(e,t){super(e,t)}initialiseOptions(){super.initialiseOptions(),this.XPos=-1}Invalidate(){const e=this;if(e.Clear(),e.XPos<0)e.Clear();else{let t=0;t="top"==e.Parent.XAxis.Position?e.Parent.Layer.Background.GraphRectangle.Y:e.Parent.Layer.Background.GraphRectangle.Y+e.Parent.Layer.Background.GraphRectangle.H,e.drawCircle(e.XPos,t,e.Parent.HotTrack.Width,0,e.Parent.HotTrack.Colour,e.Parent.HotTrack.Colour)}}},o=class extends n{constructor(e,t){super(e,t)}initialiseOptions(){super.initialiseOptions(),this.Options={Marker:{BorderColour:"#3A5D9C",BorderWidth:2,BackColour:"#D4DEEF",Width:10},Label:{Colour:"#3A5D9C",Font:"9pt Arial",Margin:{X:2,Y:10},Line:{Colour:"#A6A6A6",Width:1}}}}initialiseComponents(){super.initialiseComponents();const e=this;e.CTX.canvas.addEventListener("mousedown",(function(t){if(e.Parent.Enabled){var n=e.Parent.FindEventsByCoords(t.offsetX,t.offsetY,!1);null!=n&&(e.Parent.Debug&&console.log(n),e.Parent.OnMouseDown(this,t,n))}})),e.CTX.canvas.addEventListener("click",(function(t){if(e.Parent.Enabled){var n=e.Parent.FindEventsByCoords(t.offsetX,t.offsetY,!1);null!=n&&(e.Parent.Debug&&console.log(n),e.Parent.OnClick(this,t,n))}})),e.CTX.canvas.addEventListener("dblclick",(function(t){if(e.Parent.Enabled){var n=e.Parent.FindEventsByCoords(t.offsetX,t.offsetY,!1);null!=n&&(e.Parent.Debug&&console.log(n),e.Parent.OnDblClick(this,t,n))}})),e.Parent.EnableHotTracking&&e.CTX.canvas.addEventListener("mousemove",(function(t){if(e.Parent.Enabled){var n=e.Parent.FindEventsByCoords(t.offsetX,t.offsetY,!1);if(e.Container.style.cursor=null!=n?"pointer":"default",e.Parent.EnableHotTracking){const a={X:t.offsetX,Y:t.offsetY};e.isPointInRectangle(e.Parent.Layer.Background.GraphRectangle,a)?(e.Parent.Debug&&console.log(a),e.Parent.Layer.Flourish.XPos=a.X,e.Parent.OnMouseMove(this,t,n)):e.Parent.Layer.Flourish.XPos=-1,e.Parent.Layer.Flourish.Invalidate()}}})),e.Invalidate()}Invalidate(){const e=this,t=e.Parent.Layer.Background.GraphRectangle;e.Clear();let n=0;const a=e.Parent.VisibleEvents;n="top"==e.Parent.XAxis.Position?t.Y+e.Options.Marker.Width+20:t.Y+e.Options.Marker.Width,a.forEach((function(e,t){e.HitBox={X:0,Y:0,W:0,H:0}})),a.forEach((function(t,a){let i=e.calcMarkerPosition(t.Position.X,n),r=0;r="top"==e.Parent.XAxis.Position?e.Parent.Layer.Background.GraphRectangle.Y:e.Parent.Layer.Background.GraphRectangle.Y+e.Parent.Layer.Background.GraphRectangle.H,e.Options.Label.Line.Width>0&&e.drawVerticalLine(t.Position.X,i,r,e.Options.Label.Line.Width,e.Options.Label.Line.Colour);const o=e.drawCircle(t.Position.X,i,e.Options.Marker.Width,e.Options.Marker.BorderWidth,t.BorderColour,t.BackColour);if(t.Position={X:t.Position.X,Y:i},e.Parent.ShowMarkerLabel){const n=e.drawText(o.X+o.W+e.Options.Label.Margin.X,o.Y,t.Label,e.Options.Label.Font,e.Options.Label.Colour,"left");t.HitBox=e.combineRectangle(o,n)}else t.HitBox=o;e.Parent.Debug&&e.drawRectangle(t.HitBox,"red"),e.Parent.Debug&&console.log(t)}))}OnMouseDown(e){if(a.Parent.Enabled){var t=a.Parent.FindEventsByCoords(e.offsetX,e.offsetY,!1);null!=t&&(a.Parent.Debug&&console.log(t),a.Parent.OnMouseDown(this,e,t))}}calcMarkerPosition(e,t){const n=this,a=n.Parent.Layer.Background.GraphRectangle;let i=!1,r=t;for(let t=a.Y;t";const t=e.Container.getElementsByTagName("canvas");e.Layer.Background=new i(e,t[0]),e.Layer.Flourish=new r(e,t[1]),e.Layer.Markers=new o(e,t[2])}get CTX(){return a.Layer.Markers.CTX}get NewEvent(){return{Date:"",Label:"",Position:{X:0,Y:0},Events:[],HitBox:null,BorderColour:this.Layer.Markers.Options.Marker.BorderColour,BackColour:this.Layer.Markers.Options.Marker.BackColour}}get NewEventItem(){return{Title:"",Description:"",Link:"",Tag:null}}get VisibleDays(){const e=this,t=e.Size.W-(e.Padding.Left+e.Padding.Right);return Math.floor(t/(e.XAxis.NoPartPerDay*e.XAxis.HourLineSpace))}get VisibleStartDate(){return this.ConvertToDate(this.ShowDate)}get VisibleEndDate(){const e=this;let t=e.ConvertToDate(e.ShowDate);return t.setDate(t.getDate()+e.VisibleDays),t.setDate(t.getDate()-1),e.DateToString(t,e.DateParsePattern)}get VisibleEvents(){const e=this;let t=[];return e.Layer.Background.XAxisPositions.forEach((function(n){const a=e.FindEvent(n.Date);null!=a&&(a.Position.X=n.X,t.push(a))})),t}get XAxis(){return this.Layer.Background.Options.XAxis}AddEvent(e,t,n){const a=this,i=Object.assign(a.NewEventItem,n);let r=a.FindEvent(e);if(null==r){let t=a.NewEvent;t.Date=e,a.Events.push(t),r=a.FindEvent(e)}null!=t&&(r.Label=t),r.Events.push(i)}Clear(){const e=this;e.Layer.Background.Clear(),e.Layer.Flourish.Clear(),e.Layer.Markers.Clear(),e.StartDate=e.DateToInternalString(new Date),e.ShowDate=e.StartDate,e.Enabled=!1,e.Events=[]}DeleteMarker(e){const t=this;for(let n=0;n=r.X&&e<=o&&t>=r.Y&&t<=s)return a.Events[i]}return null}Load(e){this.StartDate=e,this.Show(e)}Show(e){const t=this;t.ConvertToDate(e)12?e.getHours()-12:e.getHours()).toString().padStart(2,"0")),n=n.replace("mm",e.getMinutes().toString().padStart(2,"0")),n=n.replace("ss",e.getSeconds().toString().padStart(2,"0")),n=n.replace("ff",e.getMilliseconds().toString().padStart(2,"0")),n=n.replace("tt","{5}"),n=n.replace("zz",""),n=n.replace("y",e.getFullYear().toString()),n=n.replace("M",(e.getMonth()+1).toString()),n=n.replace("d",e.getDate().toString()),n=n.replace("H",e.getHours().toString()),n=n.replace("h",(e.getHours()>12?e.getHours()-12:e.getHours()).toString()),n=n.replace("m",e.getMinutes().toString()),n=n.replace("s",e.getSeconds().toString()),n=n.replace("z",""),n=n.replace("t","{6}"),n=n.replace("Z",""),n=n.replace("{1}",e.toLocaleString("default",{month:"long"})),n=n.replace("{2}",e.toLocaleString("default",{weekday:"long"})),n=n.replace("{3}",e.toLocaleString("default",{month:"short"})),n=n.replace("{4}",e.toLocaleString("default",{weekday:"short"})),n=n.replace("{5}",e.getHours()>=12?"PM":"AM"),n=n.replace("{6}",e.getHours()>=12?"P":"A"),n}DateToInternalString(e){return this.DateToString(e,this.DateParsePattern)}ConvertToDate(e){return new Date(Date.parse(e))}OnMouseDown(e,t,n){}OnMouseMove(e,t,n){}OnClick(e,t,n){}OnDblClick(e,t,n){}};return t})()));