(function(){ try {const reservationMenu = {};reservationMenu.style=`data:text/css;base64,QG1lZGlhKG1pbi13aWR0aDo2NDFweCl7I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudXt3aWR0aDo2MDBweDtib3gtc2l6aW5nOmJvcmRlci1ib3h9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bntib3JkZXI6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7d2lkdGg6NTAlO2Zsb2F0OmxlZnQ7bWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZToxZW07cGFkZGluZzowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjdXJzb3I6cG9pbnRlcn0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLWljb257cG9zaXRpb246YWJzb2x1dGV9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMyMzUyN2N9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bjpob3ZlciAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bi10ZXh0e2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6MCAxcHggMCAjMjY0MzdhfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4gLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4tdGV4dHtjb2xvcjojMjY0MzdhO2ZvbnQtc2l6ZToxLjE0M2VtO2ZvbnQtZmFtaWx5OnJvYm90b1NsYWI7Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmctdG9wOjIwcHg7cGFkZGluZy1ib3R0b206MjBweDtjb2xvcjojMjY0MzdhO3RleHQtc2hhZG93OjAgMXB4IDAgI2ZmZjt0cmFuc2l0aW9uOmNvbG9yIC4zcyBlYXNlIDBzO2xpbmUtaGVpZ2h0OjFlbX0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLW9mZmxpbmV7ZGlzcGxheTpub25lO2ZvbnQtZmFtaWx5OiJSb2JvdG8iLHNhbnMtc2VyaWY7Zm9udC1zaXplOi44OGVtfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG5bZGlzYWJsZWQ9IiJde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsMjQ0LDI0NCwuNSk7Y3Vyc29yOm5vdC1hbGxvd2VkfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG5bZGlzYWJsZWQ9IiJdIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLXRleHR7cGFkZGluZy1ib3R0b206NXB4O29wYWNpdHk6LjU7dGV4dC1zaGFkb3c6bm9uZX0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuW2Rpc2FibGVkPSIiXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDI0NCwyNDQsLjUpfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG5bZGlzYWJsZWQ9IiJdOmhvdmVyIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLXRleHR7Y29sb3I6IzI2NDM3YTt0ZXh0LXNoYWRvdzpub25lfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG5bZGlzYWJsZWQ9IiJdIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLW9mZmxpbmV7ZGlzcGxheTpibG9jaztwYWRkaW5nLWJvdHRvbToyMHB4O2NvbG9yOiM1NzU3NTc7b3BhY2l0eTouNn0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51ICNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUtZXJyb3J7d2lkdGg6NjAwcHg7YmFja2dyb3VuZC1jb2xvcjojYzg2OTY5O2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4O3BhZGRpbmctbGVmdDoyMHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjRzIGVhc2UtaW4tb3V0Oy1tb3otdHJhbnNpdGlvbjpvcGFjaXR5IC40cyBlYXNlLWluLW91dDstbXMtdHJhbnNpdGlvbjpvcGFjaXR5IC40cyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOm9wYWNpdHkgLjRzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246b3BhY2l0eSAuNHMgZWFzZS1pbi1vdXQ7Zm9udC1mYW1pbHk6UnViaWs7dmlzaWJpbGl0eTpoaWRkZW59I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1tZW51LXZpc2libGUtZXJyb3J7dmlzaWJpbGl0eTp2aXNpYmxlICFpbXBvcnRhbnQ7b3BhY2l0eToxICFpbXBvcnRhbnR9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAjaXgtbWVudS12aWRlb3ttYXJnaW46MzBweCBhdXRvO3dpZHRoOjYwMHB4O21hcmdpbi1sZWZ0OjB9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtbWVudS1vZmZsaW5lLWxpbmV7Zm9udC1zaXplOi45OGVtO3RvcDo5MHB4O2xlZnQ6NTAlO21hcmdpbi10b3A6NXB4O2Rpc3BsYXk6bm9uZX0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51ICNpeC1leHQtbWVudS1idG4tY29udGFpbmVyIC5peC1tZW51LWJ0bnt3aWR0aDoxMDAlO2JhY2tncm91bmQ6I2VmZWZlZiAhaW1wb3J0YW50O2JvcmRlcjpub25lO21hcmdpbi10b3A6MTBweDtib3JkZXI6MnB4IHNvbGlkICMyNjQzN2E7Y29sb3I6IzI2NDM3YSAhaW1wb3J0YW50O2ZvbnQtc2l6ZToxLjE0M2VtO2hlaWdodDoxMjBweDtmbG9hdDpsZWZ0O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveH0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51ICNpeC1leHQtbWVudS1idG4tY29udGFpbmVyIC5peC1tZW51LWJ0bjpudGgtY2hpbGQoMm4pe21hcmdpbi1sZWZ0OjB9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAjaXgtZXh0LW1lbnUtYnRuLWNvbnRhaW5lciAuaXgtbWVudS1idG5bZGlzYWJsZWRde2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5Oi40fSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgI2l4LWV4dC1tZW51LWJ0bi1jb250YWluZXIgLml4LW1lbnUtYnRuW2Rpc2FibGVkXSAuaXgtbWVudS1vZmZsaW5lLWxpbmV7ZGlzcGxheTpibG9ja30jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IGgze3BhZGRpbmctdG9wOjIwcHg7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlfX1AbWVkaWEobWF4LXdpZHRoOjY0MHB4KXsjaXgtYm9va2luZy1leHRlcm5hbC1tZW51e3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94fSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG57Ym9yZGVyOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O3dpZHRoOjEwMCU7ZmxvYXQ6bGVmdDttYXJnaW4tdG9wOjEwcHg7Zm9udC1zaXplOjFlbTtwYWRkaW5nOjA7Ym94LXNpemluZzpib3JkZXItYm94O2N1cnNvcjpwb2ludGVyfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4gLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4taWNvbntwb3NpdGlvbjphYnNvbHV0ZX0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzIzNTI3Y30jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuOmhvdmVyIC5peC1ib29raW5nLWV4dGVybmFsLW1lbnUtYnRuLXRleHR7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIDFweCAwICMyNjQzN2F9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0biAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bi10ZXh0e2NvbG9yOiMyNjQzN2E7Zm9udC1zaXplOjEuMTQzZW07Zm9udC1mYW1pbHk6cm9ib3RvU2xhYjtmb250LXdlaWdodDo1MDA7cGFkZGluZy10b3A6MjBweDtwYWRkaW5nLWJvdHRvbToyMHB4O2NvbG9yOiMyNjQzN2E7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO3RyYW5zaXRpb246Y29sb3IgLjNzIGVhc2UgMHM7bGluZS1oZWlnaHQ6MWVtfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4gLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4tb2ZmbGluZXtkaXNwbGF5Om5vbmU7Zm9udC1mYW1pbHk6IlJvYm90byIsc2Fucy1zZXJpZjtmb250LXNpemU6Ljg4ZW19I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bltkaXNhYmxlZD0iIl17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCwyNDQsMjQ0LC41KTtjdXJzb3I6bm90LWFsbG93ZWR9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bltkaXNhYmxlZD0iIl0gLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4tdGV4dHtwYWRkaW5nLWJvdHRvbTo1cHg7b3BhY2l0eTouNTt0ZXh0LXNoYWRvdzpub25lfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG5bZGlzYWJsZWQ9IiJdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsMjQ0LDI0NCwuNSl9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bltkaXNhYmxlZD0iIl06aG92ZXIgLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4tdGV4dHtjb2xvcjojMjY0MzdhO3RleHQtc2hhZG93Om5vbmV9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAuaXgtYm9va2luZy1leHRlcm5hbC1tZW51LWJ0bltkaXNhYmxlZD0iIl0gLml4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1idG4tb2ZmbGluZXtkaXNwbGF5OmJsb2NrO3BhZGRpbmctYm90dG9tOjIwcHg7Y29sb3I6IzU3NTc1NztvcGFjaXR5Oi42fSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgI2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudS1lcnJvcnt3aWR0aDo2MDBweDtiYWNrZ3JvdW5kLWNvbG9yOiNjODY5Njk7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7cGFkZGluZy1sZWZ0OjIwcHg7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6MDstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNHMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgLjRzIGVhc2UtaW4tb3V0Oy1tcy10cmFuc2l0aW9uOm9wYWNpdHkgLjRzIGVhc2UtaW4tb3V0Oy1vLXRyYW5zaXRpb246b3BhY2l0eSAuNHMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpvcGFjaXR5IC40cyBlYXNlLWluLW91dDtmb250LWZhbWlseTpSdWJpazt2aXNpYmlsaXR5OmhpZGRlbn0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1ib29raW5nLW1lbnUtdmlzaWJsZS1lcnJvcnt2aXNpYmlsaXR5OnZpc2libGUgIWltcG9ydGFudDtvcGFjaXR5OjEgIWltcG9ydGFudH0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51ICNpeC1tZW51LXZpZGVve21hcmdpbjozMHB4IGF1dG87d2lkdGg6NjAwcHg7bWFyZ2luLWxlZnQ6MH0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51IC5peC1tZW51LW9mZmxpbmUtbGluZXtmb250LXNpemU6Ljk4ZW07dG9wOjkwcHg7bGVmdDo1MCU7bWFyZ2luLXRvcDo1cHg7ZGlzcGxheTpub25lfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgI2l4LWV4dC1tZW51LWJ0bi1jb250YWluZXIgLml4LW1lbnUtYnRue3dpZHRoOjEwMCU7YmFja2dyb3VuZDojZWZlZmVmICFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7bWFyZ2luLXRvcDoxMHB4O2JvcmRlcjoycHggc29saWQgIzI2NDM3YTtjb2xvcjojMjY0MzdhICFpbXBvcnRhbnQ7Zm9udC1zaXplOjEuMTQzZW07aGVpZ2h0OjEyMHB4O2Zsb2F0OmxlZnQ7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94fSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgI2l4LWV4dC1tZW51LWJ0bi1jb250YWluZXIgLml4LW1lbnUtYnRuOm50aC1jaGlsZCgybil7bWFyZ2luLWxlZnQ6MH0jaXgtYm9va2luZy1leHRlcm5hbC1tZW51ICNpeC1leHQtbWVudS1idG4tY29udGFpbmVyIC5peC1tZW51LWJ0bltkaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjR9I2l4LWJvb2tpbmctZXh0ZXJuYWwtbWVudSAjaXgtZXh0LW1lbnUtYnRuLWNvbnRhaW5lciAuaXgtbWVudS1idG5bZGlzYWJsZWRdIC5peC1tZW51LW9mZmxpbmUtbGluZXtkaXNwbGF5OmJsb2NrfSNpeC1ib29raW5nLWV4dGVybmFsLW1lbnUgaDN7cGFkZGluZy10b3A6MjBweDtmbG9hdDpsZWZ0O3dpZHRoOjEwMCV9fQ==`;reservationMenu.settings=JSON.parse(`{"videoUrl":"https://www.youtube.com/embed/2BMAz8AshUk","buttons":[{"line1":"WIZYTA W CZYTELNI AKT","line2":" ","form":1,"active":true,"offlineMessage":"Formularz chwilowo nie czynny"}]}`);
class ClientCalendar {
constructor(passedGuid) {
this.prepareHtml()
; (async () => {
const DaysOfWeek = Object.freeze({
0: 'Niedziela',
1: 'Poniedziałek',
2: 'Wtorek',
3: 'Środa',
4: 'Czwartek',
5: 'Piątek',
6: 'Sobota',
Sunday: 0,
Monday: 1,
Tuesday: 2,
Wednesday: 3,
Thursday: 4,
Friday: 5,
Saturday: 6
})
const RoomType = Object.freeze({
0: 'IncorrectType',
1: 'PaperSignature',
2: 'ElectronicSignature',
IncorrectType: 0,
PaperSignature: 1,
ElectronicSignature: 2
})
class TimeManager {
static toDate(date) {
// date ma format 2023-06-27T00:00:00
const [datePart, timePart] = date.split('T')
const [year, month, day] = datePart.split('-')
return new Date(year, parseInt(month) - 1, day)
//return new Date(parseInt(apiDate.replace('/Date(', '').split('+')[0]))
}
static toTimeString(timespan) {
const [hours, minutes, seconds] = timespan.split(':');
return `${hours}:${minutes}`
/*
const normalize = apiTime.replace('PT', '').split('H')
let hours = parseInt(normalize[0])
let minutes = parseInt(normalize[1]) || 0
if (hours < 10)
hours = `0${hours}`
if (minutes < 10)
minutes = `0${minutes}`
return `${hours}:${minutes}`*/
}
static nextDays(date, days) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days)
}
static shortDateString(date) {
let day = date.getDate()
let month = date.getMonth()
day = (day < 10) ? `0${day}` : day
month = monthsOfYear[month]
return `${day} ${month}`
}
static toApiDate(date) {
//return `/Date(${date.getTime()}+200)/`
let year = date.getFullYear()
let months = parseInt(date.getMonth()) + 1
let day = date.getDate()
if (parseInt(months) < 10)
months = `0${parseInt(months)}`
if (parseInt(day) < 10)
day = `0${parseInt(day)}`
return `${year}-${months}-${day}T00:00:00`
}
}
class DateRangeHistory {
static get maxIndex() { return 5 }
constructor() {
this.history = []
this.index = -1
}
get triple() {
return this.history[this.index]
}
set triple(triple) {
this.history[this.index] = triple
}
init(triple) {
this.history = [triple]
this.index = 0
}
next() {
this.index++
}
previous() {
this.index--
}
isCurrentFirst() {
return this.index === 0
}
isCurrentLast() {
return this.index == DateRangeHistory.maxIndex
}
}
const
baseUrl = `${ixMenu.homeURL}/`,
url = `${ixMenu.homeURL}/ChangeReservationTerm`,
infoUrl = `${ixMenu.homeURL}/GetReservationBasicInfo`,
pureGuid = passedGuid,
guid = `guid=${pureGuid}`,
calendarHistory = new DateRangeHistory(),
monthsOfYear = ['Stycznia', 'Lutego', 'Marca', 'Kwietnia', 'Maja', 'Czerwca', 'Lipca', 'Sierpnia', 'Września', 'Października', 'Listopada', 'Grudnia'],
daysOfWeek = ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota']
, $ix = 'ix-booking',
// dom create helper objects
$div = 'div', $input = 'input', $label = 'label', $form = 'form', $span = 'span',
$select = 'select', $option = 'option', $button = 'button', $img = 'img',
// dom request helper object
$id = 'id', $cls = 'class', $query = 'query'
;
let
// main dom container
container,
/** form id */
formId,
// dom object for form styles
style,
// added signatures
selectedSignatures = [],
// incremented id for selected signatures
signaturesIID = 0,
// max items u can add to signature table
maxSignaturesCount,
// references
subformCtx,
// TODO: add comennt to this variable
apiUrl,
// current slot set loaded for calendar
slotSet,
//
currentWeek,
//
selectedRoomType = 1,
// uzywany do historii przewijania jako punkt startowy
firstWeek,
// ilość przewininięć kalendarza
calendarPage = 0,
// selected slot
currentSlot,
//
calendarPreloadDelay = 620,
basicInfo
;
const hide = (...nodes) => nodes.forEach(node => node.style.display = 'none')
const show = (...nodes) => nodes.forEach(node => node.style.display = 'block')
const spawn = namespace => dom => options => {
let { id, cls, txt, val, on, src } = options || {}
const element = document.createElement(dom)
element.id = id ? (namespace ? `${namespace}-${id}` : id) : ''
cls = cls ? (namespace ? `${namespace}-${cls}` : cls) : ''
if (cls)
element.classList.add(cls)
element.innerText = txt || ''
if ((val != undefined) && (val != null))
element.value = val
if ((on != undefined) && (on != null))
element.disabled = !on
if (src)
element.src = src
return element
}
const get = namespace => method => query => {
switch (method) {
case 'id':
return document.getElementById(namespace ? `${namespace}-${query}` : query)
break
case 'class':
return Array.from(document.getElementsByClassName(namespace ? `${namespace}-${query}` : query))
break
case 'query':
return Array.from(document.querySelectorAll(query))
break
}
}
const getBasicInfo = async () => {
console.log('getBasicInfo', infoUrl + '?' + guid)
const res = await fetch(infoUrl + '?' + guid, {
headers: { 'Content-Type': 'application/json' }
})
return res.json()
}
const showMessage = msg => {
document.getElementById('details').innerText = msg
document.getElementById('details').style.display = 'block'
document.getElementById('result-box').classList.remove('box-error')
document.getElementById('result-box').classList.add('box-message')
document.getElementById('result-box').innerText = 'Sukces'
}
const showError = err => {
document.getElementById('details').innerText = err
document.getElementById('details').style.display = 'block'
document.getElementById('result-box').classList.add('box-error')
document.getElementById('result-box').classList.remove('box-message')
document.getElementById('result-box').innerText = 'Niepowodzenie'
}
const getFirstSlot = async (selectedRoomType, divisionId) => {
let req = { RoomType: (selectedRoomType == RoomType.PaperSignature) ? null : selectedRoomType, DivisionId: divisionId }
const res = await fetch(`${baseUrl}GetFirstFreeTimeWindow`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(req)
})
return res.json()
}
const getSlots = async (start, end, roomType, devisionId) => {
let req = {
//DateFrom: `/Date(${start.getTime()}+200)/`,
DateFrom: TimeManager.toApiDate(start),
//DateTo: `/Date(${end.getTime()}+0200)/`,
DateTo: TimeManager.toApiDate(end),
RoomType: roomType === RoomType.PaperSignature ? null : roomType,
DivisionId: devisionId
}
const res = await fetch(`${baseUrl}GetAvailableTimeWindows`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(req)
})
return res.json()
}
const onFirstFreeSlot = (res, ok, nope) => {
const date1 = TimeManager.toDate(res.dateValue)
let date2 = TimeManager.nextDays(date1, 1)
let date3
if (date2.getDay() === DaysOfWeek.Sunday) {
date2 = TimeManager.nextDays(date1, 2)
return ok([date1, date2, TimeManager.nextDays(date2, 1)])
} else if (date2.getDay() === DaysOfWeek.Saturday) {
getSlots(date2, date2).then(data => {
if (data.length == 0) {
date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 2)
return ok([date1, date2, new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 1)])
} else {
date3 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 2)
return ok([date1, date2, date3])
}
}).catch(error => {
nope(error)
})
}
date3 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 1)
if (date3.getDay() == 0) {
// niedziela
return ok([date1, date2, new Date(date3.getFullYear(), date3.getMonth(), date3.getDate() + 1)])
} else if (date3.getDay() == 6) {
// sobota
getSlots(date3, date3).then(data => {
if (data.length == 0) {
// pusta sobota
return ok([date1, date2, new Date(date3.getFullYear(), date3.getMonth(), date3.getDate() + 2)])
} else {
// "pełna sobota"
return ok([date1, date2, date3])
}
}).catch(error => {
nope(error)
})
}
return ok([date1, date2, date3])
}
const assignSlotSet = set => {
set.forEach(e => {
e.DateValue = TimeManager.toDate(e.dateValue)
e.EndTime = TimeManager.toTimeString(e.endTime)
e.StartTime = TimeManager.toTimeString(e.startTime)
})
slotSet = set
}
const existAsPaperSlot = reqSlot => slotSet.find(slot => {
if (slot.RoomType === RoomType.ElectronicSignature)
return false
if (slot.DateValue.getTime() != reqSlot.DateValue.getTime())
return false
if (slot.StartTime != reqSlot.StartTime)
return false
if (slot.EndTime != reqSlot.EndTime)
return false
return true
})
const setSelectedSlot = slot => {
get()($id)('ix-rmemct-btn-new-date').classList.remove('calendar-btn-disabled')
const nodeSelectedLabel = get()($id)('ix-rmemct-new-date')
currentSlot = slot
const date = slot.DateValue
nodeSelectedLabel.innerText = `Wybrano: ${DaysOfWeek[date.getDay()]}, ${date.getDate()} ${monthsOfYear[date.getMonth()]} ${date.getFullYear()}, ${slot.StartTime} - ${slot.EndTime}`
}
const getSelectedSlot = () => currentSlot
const renderCalendar = (selectedRoomType) => {
let properSlotSet = []
if (selectedRoomType == RoomType.PaperSignature) {
slotSet.forEach(slot => {
switch (slot.roomType) {
case RoomType.ElectronicSignature:
if (!existAsPaperSlot(slot)) {
properSlotSet.push(slot)
}
break
case RoomType.PaperSignature:
properSlotSet.push(slot)
break
}
})
} else {
properSlotSet = slotSet
}
let today = new Date()
today = new Date(today.getFullYear(), today.getMonth(), today.getDate())
//console.log(properSlotSet)
//window.s = properSlotSet
let [hours, minutes] = (new Date()).toLocaleTimeString('pl-PL').split(':')
let time = `${hours}:${minutes}`
properSlotSet = properSlotSet.filter(slot => (slot.DateValue.getTime() != today.getTime()) || (time < slot.StartTime))
let longColumnExist = false
const triple = calendarHistory.triple
const nodeColumnsBox = get()($id)('ix-rmemct-columns')
const columns = [nodeColumnsBox.children[0], nodeColumnsBox.children[1], nodeColumnsBox.children[2]]
for (let i = 0; i < 3; i++) {
columns[i].children[0].innerText = DaysOfWeek[triple[i].getDay()]
columns[i].children[1].innerText = TimeManager.shortDateString(triple[i])
const slotsForDay = []
properSlotSet.forEach(slot => {
if (slot.DateValue.getTime() == triple[i].getTime())
slotsForDay.push(slot)
})
columns[i].children[2].innerHTML = ''
for (const slot of properSlotSet) {
if (slot.DateValue.getTime() == triple[i].getTime()) {
const currentSlot = slot
const nodeSlot = spawn()($div)({ cls: 'ix-rmemct-slot', txt: `${slot.StartTime} - ${slot.EndTime}` })
columns[i].children[2].append(nodeSlot)
nodeSlot.addEventListener('click', event => {
if (event.target.disabled)
return
get()($cls)('datetime-box-active').forEach(node => node.classList.remove('datetime-box-active'))
event.target.classList.add('datetime-box-active')
setSelectedSlot(currentSlot)
get()($id)('ix-rmemct-btn-new-date').scrollIntoView({ behavior: "smooth" });
})
// zanacznie
const selectedSlot = getSelectedSlot()
if (
selectedSlot &&
(selectedSlot.DateValue.getTime() === currentSlot.DateValue.getTime()) &&
(selectedSlot.WindowNumber === currentSlot.WindowNumber)
) {
nodeSlot.classList.add('datetime-box-active')
}
}
}
}
const nodeBtnBack = get()($id)('ix-rmemct-btn-back')
const nodeBtnNext = get()($id)('ix-rmemct-btn-next')
if (calendarHistory.isCurrentFirst()) {
nodeBtnBack.disabled = true
nodeBtnBack.classList.add('calendar-btn-disabled')
nodeBtnNext.disabled = false
nodeBtnNext.classList.remove('calendar-btn-disabled')
} else if (calendarHistory.isCurrentLast()) {
nodeBtnBack.disabled = false
nodeBtnBack.classList.remove('calendar-btn-disabled')
nodeBtnNext.disabled = true
nodeBtnNext.classList.add('calendar-btn-disabled')
} else {
nodeBtnBack.disabled = false
nodeBtnBack.classList.remove('calendar-btn-disabled')
nodeBtnNext.disabled = false
nodeBtnNext.classList.remove('calendar-btn-disabled')
}
setTimeout(() => {
hide(get()($id)('ix-rmemct-pre-loader'))
show(get()($id)('ix-rmemct-columns'))
}, calendarPreloadDelay)
}
const iHaveNewTripple = (triple, callback) => {
return callback(triple)
}
const onNewFreeSlot = (current, ok, nope) => {
let date1 = new Date(current[2].getFullYear(), current[2].getMonth(), current[2].getDate() + 1)
if (date1.getDay == 0) {
date1 = new Date(current[2].getFullYear(), current[2].getMonth(), current[2].getDate() + 2)
return iHaveNewTripple([
date1,
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 1),
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 2)
], ok)
} else if (date1.getDay() == 6) {
getSlots(date1, date1, basicInfo.FirstChoice, basicInfo.DivisionId).then(data => {
if (data.length == 0) {
// pusta sobota
date1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 2)
return iHaveNewTripple([
date1,
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 1),
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 2)
], ok)
} else {
// "pełna" sobota
return iHaveNewTripple([
date1,
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 2),
new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 3)
], ok)
}
}).catch(error => {
return nope(error)
})
}
let date2 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 1)
let date3
if (date2.getDay() == 0) {
// niedziela naley siłowo dodać jeden dzień
date2 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 2)
return iHaveNewTripple([date1, date2, new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 1)], ok)
} else if (date2.getDay() == 6) {
// sobota
getSlots(date2, date2, basicInfo.FirstChoice, basicInfo.DivisionId).then(data => {
if (data.length == 0) {
// pusta sobota
date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 2)
return iHaveNewTripple([date1, date2, new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 1)], ok)
} else {
// "pełna" sobota
date3 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 2)
return iHaveNewTripple([date1, date2, date3], ok)
}
}).catch(error => {
return nope(error)
})
}
date3 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() + 1)
if (date3.getDay() == 0) {
// niedziela
return iHaveNewTripple([date1, date2, new Date(date3.getFullYear(), date3.getMonth(), date3.getDate() + 1)], ok)
} else if (date3.getDay() == 6) {
// sobota
getSlots(date3, date3, basicInfo.FirstChoice, basicInfo.DivisionId).then(data => {
if (data.length == 0) {
// pusta sobota
return iHaveNewTripple([date1, date2, new Date(date3.getFullYear(), date3.getMonth(), date3.getDate() + 2)], ok)
} else {
// "pełna sobota"
return iHaveNewTripple([date1, date2, date3])
}
}).catch(error => {
return nope(error)
})
}
return iHaveNewTripple([date1, date2, date3], ok)
}
const nodeBtnBack = get()($id)('ix-rmemct-btn-back')
const nodeBtnNext = get()($id)('ix-rmemct-btn-next')
const nodeColumnsBox = get()($id)('ix-rmemct-columns')
const nodePageLoader = get()($id)('ix-rmemct-pre-loader')
nodeBtnBack.addEventListener('click', event => {
if (event.target.disabled)
return
nodeBtnBack.disabled = true
nodeBtnNext.disabled = true
nodeBtnBack.classList.add('calendar-btn-disabled')
nodeBtnNext.classList.add('calendar-btn-disabled')
hide(nodeColumnsBox)
show(nodePageLoader)
calendarHistory.previous()
getSlots(calendarHistory.triple[0], calendarHistory.triple[2], basicInfo.firstChoice, basicInfo.divisionId).then(slots => {
assignSlotSet(slots)
renderCalendar(basicInfo.firstChoice)
})
})
nodeBtnNext.addEventListener('click', event => {
if (event.target.disabled)
return
nodeBtnBack.disabled = true
nodeBtnNext.disabled = true
nodeBtnBack.classList.add('calendar-btn-disabled')
nodeBtnNext.classList.add('calendar-btn-disabled')
hide(nodeColumnsBox)
show(nodePageLoader)
const oldTriple = calendarHistory.triple
calendarHistory.next()
const load = () => {
getSlots(calendarHistory.triple[0], calendarHistory.triple[2], basicInfo.firstChoice, basicInfo.divisionId).then(slots => {
assignSlotSet(slots)
renderCalendar(basicInfo.firstChoice)
})
}
if (calendarHistory.triple == undefined) {
onNewFreeSlot(oldTriple, triple => {
calendarHistory.triple = triple
load()
})
} else {
load()
}
})
const nodeBtnAction = get()($id)('ix-rmemct-btn-new-date')
const action = async (date, window) => {
const req = {
OperationGuid: pureGuid,
NewTerm: TimeManager.toApiDate(date),
TimeWindow: window
};
const res = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(req)
});
return res.json();
}
nodeBtnAction.addEventListener('click', event => {
action(getSelectedSlot().DateValue, getSelectedSlot().windowNumber).then(res => {
const { success: Success, message: Message } = res
hide(get()($id)('view-new-date'))
ixMenu.showConfirmEmailResponse(Success, Message)
}).catch(error => {
console.error(error)
hide(get()($id)('view-new-date'))
ixMenu.showConfirmEmailResponse(false, 'Błąd systemu. Spróbuj ponownie później')
})
})
const preLoader = get()($id)('ix-rmemct-pre-loader')
//show(preLoader)
const displayBasicInfo = () => {
const infoDiv = get()($id)('ix-rmemct-old-date')
const date = TimeManager.toDate(basicInfo.startDate)
let str = `${daysOfWeek[date.getDay()]}, ${date.getDate()} ${monthsOfYear[date.getMonth()]} ${date.getFullYear()} - ${TimeManager.toTimeString(basicInfo.startTime)}`
infoDiv.innerText = str
//console.log('Koniec wyświetlania basicInfo')
}
//
//console.log("Start: getBasicInfo")
getBasicInfo().then(res => {
basicInfo = res
displayBasicInfo()
//console.log("Run: getFirstSlot(", res.FirstChoice, res.DivisionId, ")")
getFirstSlot(res.firstChoice, res.divisionId).then(firstSlot => {
onFirstFreeSlot(firstSlot, triple => {
getSlots(triple[0], triple[2], res.firstChoice, res.divisionId).then(slots => {
assignSlotSet(slots)
calendarHistory.init(triple)
//hide(preLoader)
renderCalendar(res.firstChoice)
show(get()($id)('view-new-date'))
}).catch(error => {
console.error(error)
showError('Nie udało się znaleść wolnych terminów. Spróbuj ponownie później')
})
}, error => { console.error(error); showError('Nie udało się znaleść wolnych terminów. Spróbuj ponownie później') })
}).catch(error => { console.error(error); showError('Nie udało się znaleść wolnych terminów. Spróbuj ponownie później') })
}).catch(error => { console.error(error); showError('Coś poszło nie tak. Spróbuj ponownie później') })
})()
}
prepareHtml() {
ixMenu.DOM._container.innerHTML = `
1. Naciśnij przycisk wyboru miejsca rezerwacji wizyty.
2. Wpisz swoje dane osobowe w wolnych polach.
2.1. Jeżeli wybrałeś opcję Czytelnia Akt, będziesz musiał wypełnić dodatkowe pola dotyczące interesujących Cię dokumentów.
3.
Wybierz odpowiadający Ci termin wizyty w wyświetlonym kalendarzu.
UWAGA: Kalendarz pokazuje tylko dostępne terminy.
Po zakończeniu rezerwacji na podany przez Ciebie adres email zostanie wysłana wiadomość automatyczna.Potwierdź swoje dane, poprzez wybranie przycisku
“Potwierdź email”.
Masz na to 60 minut, jeżeli tego nie zrobisz rezerwacja zostanie anulowana.
Twoja rezerwacja zostaje przekazana do potwierdzenia przez pracownika sądu.
Jeżeli wybrany przez Ciebie termin zostanie ostatecznie zaakceptowany, na Twój adres email zostanie wysłana wiadomość potwierdzająca wraz ze specjalnym kodem QR.
Przyjdź w umówionym terminie do siedziby sądu, potwierdź swoją obecność, skanując kod QR lub wpisując numer rezerwacji - zrób to na urządzeniu - biletomacie.
By dowiedzieć się więcej o szczegółach rezerwacji, możesz obejrzeć ten film instruktażowy:
` } static get videoTags() { return [ `` ] } static insertAfter (target, node) { target.parentNode.insertBefore(node,target.nextSibling) } static insertBefore (target, node) { target.parentNode.insertBefore(node,target) } static showPeriod (_node, time) { _node.classList.add('ix-booking-menu-visible-error') setTimeout(() => { setTimeout(() => _node.classList.remove('ix-booking-menu-visible-error'), time) }, 10) } static initStyle (_container, href) { const _style = document.createElement('link') _style.rel = 'stylesheet' _style.href = href this.insertBefore(_container, _style) } static run(_container, homeURL) { const { actions, route: { action, content } } = IRRouter ixMenu = new Menu(_container, reservationMenu.style, reservationMenu.settings, homeURL) switch (action) { case actions.form: ixMenu.loadFormScript(content, _engine => ixBookingLauncher(_container, homeURL, content), () => { }) break case actions.confirmEmail: ixMenu.loadConfirmEmail(content) break case actions.qr: ixMenu.loadQr(content) break case actions.cancelReservation: ixMenu.loadCancel(content) break case actions.acceptTerm: ixMenu.loadAcceptTerm(content) break case actions.changeTerm: ixMenu.loadChangeTerm(content) break default: ixMenu.render() } } constructor(_container, style, settings, homeURL) { this.constructor.initStyle(_container, style) this.DOM = { _container } this.settings = settings this.homeURL = homeURL } loadFormScript(id, callbackReady, callbackError) { const { homeURL } = this const { _container } = this.DOM const scriptUrl = `${homeURL}/GetRestFormScript?formId=${id}&courtUnitId=${this.settings.courtUnit}&nocache=${parseInt(Math.random() * 1000000)}` const _engine = document.createElement('script') _engine.src = scriptUrl _engine.onload = () => callbackReady(_engine) _engine.onabort = _engine.oncancel = _engine.onerror = () => callbackError(_engine) this.constructor.insertAfter(_container, _engine) } static domFromString(htmlString) { const div = document.createElement('div') div.innerHTML = htmlString.trim() return div.firstChild } async confirmEmail(token) { const { homeURL } = this const res = await fetch(`${homeURL}/ConfirmReservationEmail?guid=${token}`, { headers: { 'Content-Type': 'application/json' } }) return await res.json() } showConfirmEmailResponse(Success, Message) { const { _container } = this.DOM const _status = document.createElement('div') _status.id = 'ix-ixra-confirm-e-status' _status.classList.add(Success ? 'ix-ixra-e-status-success' : 'ix-ixra-e-status-error') const _info = document.createElement('div') _info.id = 'ix-ixra-confirm-e-info' _info.innerText = Success ? 'Sukces' : 'Niepowodzenie' const _msg = document.createElement('div') _msg.id = 'ix-ixra-confirm-e-msg' _msg.innerText = Message _status.append(_info, _msg) _container.append(_status) } async loadConfirmEmail(token) { let Success, Message try { ({ success: Success, message: Message } = await this.confirmEmail(token)) } catch (ex) { log.e('loadConfirmEmail')(ex) Success = false Message = 'Nie dało się wykonać akcji' } this.showConfirmEmailResponse(Success, Message) } async loadQr(num) { const { homeURL } = this const { _container } = this.DOM const _qr = document.createElement('img') _qr.classList.add('ix-ixra-qr') _qr.src = `${homeURL}/GetQrCode?reservationNumber=${num}` _container.append(_qr) } async cancelReservation(token) { const { homeURL } = this const res = await fetch(`${homeURL}/CancelReservation?guid=${token}`, { headers: { 'Content-Type': 'application/json' } }) return await res.json() } async loadCancel(token) { const { _container } = this.DOM const _status = document.createElement('div') _status.id = 'ix-ixra-cancel-status' const _info = document.createElement('div') _info.id = 'ix-ixra-cancel-info' _info.innerText = 'ANULOWANIE REZERWACJI' const _msg = document.createElement('div') _msg.id = 'ix-ixra-cancel-msg' _msg.innerText = 'Proszę wcisnąć przycisk aby anulować rezerwację' const _btn = document.createElement('div') _btn.id = 'ix-ixra-cancel-btn' _btn.innerText = 'Anuluj rezerwację' _status.append(_info, _msg, _btn) _container.append(_status) _btn.onclick = async () => { let Success, Message try { ({ success: Success, message: Message } = await this.cancelReservation(token)) } catch (ex) { log.e('loadConfirmEmail')(ex) Success = false Message = 'Nie dało się wykonać akcji' } _status.remove() this.showConfirmEmailResponse(Success, Message) } } async acceptTerm(token) { const { homeURL } = this const res = await fetch(`${homeURL}/ConfirmReservationTerm?guid=${token}`, { headers: { 'Content-Type': 'application/json' } }) return await res.json() } async loadAcceptTerm(token) { const { _container } = this.DOM const _status = document.createElement('div') _status.id = 'ix-ixra-cancel-status' const _info = document.createElement('div') _info.id = 'ix-ixra-cancel-info' _info.innerText = 'POTWIERDZENIE TERMINU' const _msg = document.createElement('div') _msg.id = 'ix-ixra-cancel-msg' _msg.innerText = 'Czy na pewno chcesz potwierdzić termin ?' const _btn = document.createElement('div') _btn.id = 'ix-ixra-cancel-btn' _btn.innerText = 'Potwierdzam' _status.append(_info, _msg, _btn) _container.append(_status) _btn.onclick = async () => { let Success, Message try { ({ success: Success, message: Message } = await this.acceptTerm(token)) } catch (ex) { log.e('loadConfirmEmail')(ex) Success = false Message = 'Nie dało się wykonać akcji' } _status.remove() this.showConfirmEmailResponse(Success, Message) } } async loadChangeTerm(content) { setTimeout(() => new ClientCalendar(content), 100) } render() { const { settings, homeURL } = this const { _container } = this.DOM const _menu = document.createElement('div') _menu.id = 'ix-booking-external-menu' _menu.classList.add('main-text') const _errorMsg = document.createElement('div') _errorMsg.id = 'ix-booking-external-menu-error' _menu.append(_errorMsg) this.constructor.insertBefore(_container, _menu) const _buttonsContainerSupport = document.createElement('div') _buttonsContainerSupport.id = 'ix-ext-menu-support' const _buttonsContainer = document.createElement('div') _buttonsContainer.id = 'ix-ext-menu-btn-container' _buttonsContainerSupport.append(_buttonsContainer) settings.buttons.forEach(btn => { const button = new MenuButton(btn) button.render(_buttonsContainer, _container, homeURL) }) _menu.append(_buttonsContainerSupport) _menu.insertAdjacentHTML('beforeend', this.constructor.ThisStaticFieldIsResultOfNotHavingEnoughTimeToDoneBetterJobOnRenderThisInterfaceSorryForEnyoneWhoWantOrWhatIsWarsedMustEditThisCode) const [partOne, partTwo] = this.constructor.videoTags if (settings?.videoUrl) { _menu.insertAdjacentHTML('beforeend', `${partOne}${settings?.videoUrl}${partTwo}`) } else { document.getElementById('ix-video-label').style.display = 'none' } this.DOM.constructor.assign(this.DOM, { _menu, _errorMsg }) } } window.ixMenuLauncher = (...args) => Menu.run(...args); } catch(e){ console.error(e); }})()