PageSourceSearch

https://iticket.kg/imapjs/js/icalendar.js?v=m1.2.1

js iticket.kg collected 2026-10-01 23:57:50 UTC 7,811 bytes, 310 lines download raw bytes

1function iCalendar(settings) {
2  let fp = null
3  const flatpickr = settings.fpr
4
5  const loadSessionView = (session, hideGetTicketButton) => {
6    let button = ''
7    let config_url = null
8
9    if (session.available_tickets_count == 0) {
10      button = `<div class="sa-col-4">
11                  <button class="toggler" type="button" disabled>
12                    ${scope.settings.locales.sold_out}
13                  </button>
14                </div>`
15    } else {
16      config_url = session.config_url
17
18      if (!hideGetTicketButton) {
19        button = `<div class="sa-col-4">
20                  <button class="toggler" type="button" data-session="${session.id}" data-config_url="${config_url}">
21                    ${scope.settings.locales.get_tickets}
22                  </button>
23                </div>`
24      }
25    }
26
27    const free =
28      session.min_price == session.max_price && session.min_price == 0
29
30    const price_range =
31      session.min_price == session.max_price
32        ? session.min_price
33        : session.min_price + ' - ' + session.max_price
34
35    const accordion_item = cash(`<div class="accordion-item">
36    				<div class="info">
37    					<div class="sa-col-1">
38    						<div class="session-name">${session.name} ${
39      session.session_lang && session.session_lang != '-'
40        ? '(' +
41          scope.settings.locales.language +
42          ': ' +
43          session.session_lang +
44          ')'
45        : ''
46    } ${
47      session.age_limit
48        ? '(' +
49          session.age_limit +
50          ')'
51        : ''
52    }</div>
53    						<div class="accordion-label">${session.venue.name}</div>
54    					</div>
55    					<div class="sa-col-2">
56    						<div class="accordion-label">${scope.settings.locales.date}</div>
57    						<div class="value">
58                ${session.session_dates}
59                </div>
60    					</div>
61    					<div class="sa-col-3">
62    						<div class="accordion-label">${scope.settings.locales.price}</div>
63    						<div class="value">
64                  ${free ? scope.settings.locales.free : price_range} ${
65      free ? '' : scope.settings.currency
66    }
67                </div>
68    					</div>
69    					${button}
70    				</div>
71    				<div class="map"></div>
72    			</div>`)
73
74    scope.accordions.append(accordion_item)
75
76    if (hideGetTicketButton) {
77      if (config_url) {
78        accordion_item.addClass('collapsed')
79
80        initMap({
81          container: accordion_item.find('.map'),
82          config_url,
83        })
84      }
85    }
86  }
87
88  const showSingleSessionView = (id) => {
89    const toggleButton = cash(`.toggler[data-session="${id}"]`);
90
91    if (toggleButton){
92      try {
93        const accordion_item = toggleButton
94        .parents('.accordion-item')
95        .toggleClass('collapsed')
96
97        accordion_item.siblings().removeClass('collapsed')
98
99        if (scope.imap) {
100            scope.imap.destroy()
101        }
102
103        initMap({
104          container: accordion_item.find('.map'),
105          config_url: toggleButton[0].dataset.config_url,
106        })
107      } catch (e){
108        // do nothing
109      }
110    }
111  }
112
113  const loadCalendar = async () => {
114    // await loadExternalFiles([
115    //   {
116    //     type: 'css',
117    //     url: 'http://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css',
118    //   },
119    //   {
120    //     type: 'js',
121    //     url: 'http://cdn.jsdelivr.net/npm/flatpickr',
122    //   },
123    // ])
124
125    loadCalendarView()
126
127    // loadSessions(dates[min_date])
128  }
129
130  const initFlatpicker = () => {
131    if (fp) {
132      try {
133        fp.destroy()
134      } catch {}
135
136      fp = null
137    }
138
139    let showMonths = 1
140
141    if (window.innerWidth >= 1024) {
142      showMonths = 3
143    } else if (window.innerWidth >= 768) {
144      showMonths = 2
145    }
146
147    fp = flatpickr(scope.calendar_input[0], {
148      locale: settings.locale,
149      inline: true,
150      showMonths,
151      dateFormat: 'Y-m-d',
152      // defaultDate: "",
153      minDate: min_date,
154      maxDate: max_date,
155      enable: Object.keys(dates),
156      // defaultDate: min_date,
157      onChange: (selectedDates, selected_date, instance) => {
158        // if (dates[selected_date].length == 1){
159        //   window.location.href = settings.url + dates[selected_date][0].id + window.location.search;
160        // } else {
161         loadSessions(dates[selected_date])
162        // }
163      },
164    })
165
166    if (settings.selected && !scope.imap){
167      const date = new Date(settings.selected.session_starts_at)
168
169      const key =
170        date.getFullYear() +
171        '-' +
172        ('0' + (date.getMonth() + 1)).slice(-2) +
173        '-' +
174        ('0' + date.getDate()).slice(-2)
175
176      fp.setDate(key, true)
177    }
178  }
179
180  const loadCalendarView = () => {
181    initFlatpicker()
182    window.addEventListener('resize', initFlatpicker)
183  }
184
185  const loadSessions = (sessions) => {
186    scope.accordions.empty()
187
188    const hideGetTicketButton = sessions.length == 1
189
190    sessions.forEach(function (session) {
191      loadSessionView(session, hideGetTicketButton)
192    })
193
194    if (settings.selected){
195      showSingleSessionView(settings.selected.id)
196    }
197  }
198
199  const bindEvents = () => {
200    cash(document).off('click', `${scope.settings.container} .toggler`)
201    cash(document).on(
202      'click',
203      `${scope.settings.container} .toggler`,
204      function (e) {
205        window.location.href = settings.url + this.dataset.session + window.location.search;
206
207        // const accordion_item = cash(this)
208        //   .parents('.accordion-item')
209        //   .toggleClass('collapsed')
210        // accordion_item.siblings().removeClass('collapsed')
211
212        // if (scope.imap) {
213        //   scope.imap.destroy()
214        // }
215
216        // initMap({
217        //   container: accordion_item.find('.map'),
218        //   config_url: this.dataset.config_url,
219        // })
220      }
221    )
222  }
223
224  const initMap = (settings) => {
225    scope.imap = new iMap(
226      cash.extend(settings, {
227        headers: scope.settings.headers,
228        locales: scope.settings.locales,
229        client: scope.settings.client,
230        assets_url: scope.settings.assets_url,
231        version: scope.settings.version,
232        embed: scope.settings.embed,
233        currency: scope.settings.currency,
234      }),
235      scope.settings.callbacks
236    )
237  }
238
239  const init = async (sessions) => {
240    await loadExternalFiles([
241      {
242        type: 'css',
243        url:
244          '/imapjs/css/icalendar.css?v=' +
245          scope.settings.version,
246      },
247      {
248        type: 'css',
249        url:
250          '/imapjs/css/imap.css?v=' +
251          scope.settings.version,
252      },
253    ])
254
255    if (!showCalendar) {
256      loadSessions(sessions)
257
258      bindEvents()
259
260      return
261    }
262
263    sessions.forEach((session) => {
264      const date = new Date(session.session_starts_at)
265
266      const key =
267        date.getFullYear() +
268        '-' +
269        ('0' + (date.getMonth() + 1)).slice(-2) +
270        '-' +
271        ('0' + date.getDate()).slice(-2)
272
273      if (!min_date) {
274        min_date = key
275      }
276      max_date = key
277      ;(dates[key] = dates[key] || []).push(session)
278    })
279
280    if (Object.keys(dates).length > 1) {
281      loadCalendar()
282    } else {
283      loadSessions(dates[Object.keys(dates)[0]])
284    }
285
286    bindEvents()
287  }
288
289  const dates = {}
290  let min_date = null
291  let max_date = null
292  const showCalendar = settings.sessions.length > 15 || settings.show_calendar
293
294  const scope = this
295
296  scope.settings = cash.extend({ container: 'body', sessions: [] }, settings)
297  scope.container = cash(scope.settings.container)
298  scope.accordions = cash('<div class="accordions" />').appendTo(
299    scope.container
300  )
301
302  if (showCalendar) {
303    scope.calendar = cash('<div class="calendar" />').prependTo(scope.container)
304    scope.calendar_input = cash('<input />').appendTo(scope.calendar)
305  }
306
307  init(scope.settings.sessions)
308
309  return scope
310}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.