1"use strict"; 2 3(function ($, root) { 4 5 function Calendar(){ 6 var CALENDAR_URL='https://kalendar.vse.cz/api/date/list'; 7 var targetElement=null; 8 var calendarImportantEventsElement=null; 9 var calendarEventsElement=null; 10 var userIsAdmin=false; 11 var limitMonths=3; 12 var dateFrom=null; 13 var dateTo=null; 14 var limitCount=8; 15 var limitPromoCount=2; 16 var promoNormalEvents=false; 17 var currentYear = (new Date()).getFullYear(); 18 var tags=[]; 19 var web=''; 20 var isRenderedInSideColumn=false; 21 22 /** 23 * Metoda pro inicializaci kaledáÅe ve zvoleném bloku 24 * @param {object} params 25 */ 26 this.init = function(params){ 27 web=params.web; 28 tags=params.tags.split(','); 29 userIsAdmin=params.userIsAdmin; 30 if (typeof params.target === "string"){ 31 targetElement=$((params.target.substr(0,1)==='#'?'':'#')+params.target); 32 }else{ 33 targetElement=params.target; 34 } 35 if (params.hasOwnProperty("months") && params.months!==''){ 36 if (params.months.toLowerCase()==="unlimited"){ 37 limitMonths=false; 38 }else{ 39 limitMonths=parseInt(params.months); 40 if (limitMonths<=0){ 41 limitMonths=3; 42 } 43 } 44 } 45 isRenderedInSideColumn=(targetElement.closest('.content-col-3').length>0); 46 if (params.hasOwnProperty("limitCount") && params.limitCount!==''){ 47 limitCount=parseInt(params.limitCount); 48 } 49 if (limitCount<=0){ 50 limitCount=isRenderedInSideColumn?6:8; 51 } 52 if (params.hasOwnProperty("limitPromoCount") && params.limitPromoCount!==''){ 53 limitPromoCount=parseInt(params.limitPromoCount); 54 }else{ 55 limitPromoCount=isRenderedInSideColumn?0:2; 56 } 57 promoNormalEvents=(params.hasOwnProperty("promoNormalEvents") && params.promoNormalEvents); 58 if (params.hasOwnProperty("dateFrom") && params.dateFrom!==''){ 59 dateFrom=params.dateFrom; 60 } 61 if (params.hasOwnProperty("dateTo") && params.dateTo!==''){ 62 dateTo=params.dateTo; 63 } 64 calendarImportantEventsElement=targetElement.children('.important-events').first(); 65 calendarEventsElement=targetElement.children('.events').first(); 66 67 this.loadItems(); 68 }; 69 70 /** 71 * Metoda pro naÄtenà položek kalendáÅe 72 */ 73 this.loadItems = function(){ 74 if (isRenderedInSideColumn){ 75 targetElement.find('.inline-calendar-btn').removeClass('d-md-inline-block'); 76 } 77 78 79 if (targetElement.attr('data-force-show')!='1'){ 80 targetElement.hide(); 81 } 82 83 //region urÄenà obdobÃ, ze kterého chceme zobrazovat události 84 if (!dateTo){ 85 if (limitMonths===false){ 86 dateTo=false; 87 }else{ 88 var date = new Date(); 89 if (dateFrom){ 90 date=Date.parse(dateFrom); 91 } 92 date.setDate(date.getDate()+Math.ceil(limitMonths*30.5)); 93 dateTo=date.getFullYear()+'-'+('0'+(date.getMonth()+1)).slice(-2)+'-'+('0'+date.getDate()).slice(-2); 94 } 95 } 96 //endregion urÄenà obdobÃ, ze kterého chceme zobrazovat události 97 $.getJSON( 98 CALENDAR_URL, 99 getRequestData(limitCount,limitPromoCount,dateFrom,dateTo,tags,promoNormalEvents) 100 ).done(function(data){ 101 renderEvents(data.hasOwnProperty('promoDates')?data.promoDates:[],data.hasOwnProperty('dates')?data.dates:[]); 102 }) 103 .fail(function(jqxhr, textStatus, error){ 104 console.error(textStatus+', '+error); 105 }); 106 }; 107 108 /** 109 * Metoda renderujÃcà pole s událostmi zÃskané z JSON API 110 * @param {array} importantDates 111 * @param {array} dates 112 */ 113 var renderEvents = function(importantDates, dates){ 114 if ((importantDates.length===0) && (dates.length===0)){return;} 115 calendarImportantEventsElement.html(''); 116 $.each(importantDates,function(key, event){ 117 calendarImportantEventsElement.append(isRenderedInSideColumn ? renderEvent(event) : renderImportantEvent(event)); 118 }); 119 calendarEventsElement.html(''); 120 $.each(dates,function(key, event){ 121 calendarEventsElement.append(renderEvent(event)); 122 }); 123 targetElement.show(); 124 }; 125 126 /**
127 * Funkce pro vygenerovánà Äástà HTML s daty konánà události 128 * @param {object} event 129 * @param {HTMLElement} dateItemsHtml 130 * @param {HTMLElement} timeContentHtml 131 */ 132 var renderEventDates = function(event, dateItemsHtml, timeContentHtml){ 133 var start=event.start.replace(/[\s:]/g,'-').split('-'); 134 var end=event.end.replace(/[\s:]/g,'-').split('-'); 135 136 var startYear=parseInt(start[0]); 137 var startMonth=parseInt(start[1]); 138 var startDate=parseInt(start[2]); 139 var startDateTime=new Date(startYear,startMonth-1,startDate,parseInt(start[3]),parseInt(start[4]),parseInt(start[5])); 140 141 var endYear=parseInt(end[0]); 142 var endMonth=parseInt(end[1]); 143 var endDate=parseInt(end[2]); 144 var endDateTime=new Date(endYear,endMonth-1,endDate,parseInt(start[3]),parseInt(start[4]),parseInt(start[5])); 145 146 if (startDate===endDate && startMonth===endMonth){ 147 //událost má pouze jedno datum 148 dateItemsHtml.append('<div class="date-item">'+startDate+'.<small>'+vse_calendar.DATEITEM_MONTH[startMonth-1]+'</small></div>'); 149 if (startYear!==currentYear){ 150 dateItemsHtml.append('<div class="date-item date-item-secondary"><span class="date-year">'+startYear+'</span></div>'); 151 } 152 timeContentHtml.append(vse_calendar.WEEKDAY[startDateTime.getDay()]); 153 }else{ 154 //událost má 2 rozdÃlná data 155 dateItemsHtml.append('<div class="date-item">'+startDate+'.<small>'+vse_calendar.DATEITEM_MONTH[startMonth-1]+'</small></div>'); 156 if (startYear!==endYear){ 157 dateItemsHtml.append('<div class="date-item date-item-secondary"><span class="date-year">'+startYear+'</span></div>'); 158 } 159 dateItemsHtml.append('<div class="date-item date-separator">'+endDate+'.<small>'+vse_calendar.DATEITEM_MONTH[endMonth-1]+'</small></div>'); 160 if (endYear!==currentYear){ 161 dateItemsHtml.append('<div class="date-item date-item-secondary"><span class="date-year">'+endYear+'</span></div>'); 162 } 163 timeContentHtml.append(vse_calendar.WEEKDAY[startDateTime.getDay()]); 164 timeContentHtml.append('-'); 165 timeContentHtml.append(vse_calendar.WEEKDAY[endDateTime.getDay()]); 166 } 167 168 if ((!event.whole_day)){ 169 timeContentHtml.append(', '); 170 var startTime=startDateTime.getHours()+':'+('0'+startDateTime.getMinutes()).slice(-2); 171 timeContentHtml.append(startTime); 172 var endTime=endDateTime.getHours()+':'+('0'+endDateTime.getMinutes()).slice(-2); 173 if (startTime!==endTime){ 174 timeContentHtml.append('-'+endTime); 175 } 176 } 177 }; 178 179 /** 180 * Funkce pro vygenerovánà detailů jedné události 181 * @param {object} event 182 * @return {*|HTMLElement} 183 */ 184 var renderEvent = function(event){ 185 var result=$('<article class="calendar-list-item col-md-6 col-xl-3"></article>'); 186 var dateItems=$('<div class="date-items"></div>'); 187 var calendarContent=$('<div class="calendar-content"></div>'); 188 var calendarContentTime=$('<time></time>'); 189 calendarContent.append(calendarContentTime); 190 var calendarDate=$('<a class="calendar-date"></a>'); 191 calendarDate.append(dateItems); 192 result.append(calendarDate); 193 result.append(calendarContent); 194 195 //region data události 196 renderEventDates(event, dateItems, calendarContentTime); 197 //endregion data události 198 199 //region informace o události 200 var h3=$('<h3 class="calendar-content-title"></h3>'); 201 var h3Link=$('<a target="_blank"></a>'); 202 var eventUrl=vse_calendar.URLS.EVENT_DETAILS.replace('%dateId%',event.date_id).replace('%web%',web); 203 204 h3Link.attr('href', eventUrl); 205 calendarDate.attr('href', eventUrl); 206 calendarDate.attr('target','_blank'); 207 208 h3Link.text(event.title); 209 h3Link.appendTo(h3); 210 calendarContent.append(h3); 211 if (event.subtitle){ 212 calendarContent.append($('<p></p>').html($('<span class="small"></span>').text(event.subtitle))); 213 } 214 //endregion informace o události 215 return result; 216 }; 217 218 /** 219 * Funkce pro vygenerovánà detailů jedné důležité (promované) události 220 * @param {object} event 221 * @return {*|HTMLElement} 222 */ 223 var renderImportantEvent = function(event){ 224 var eventUrl=vse_calendar.URLS.EVENT_DETAILS.replace('%dateId%',event.date_id).replace('%web%',web); 225 var result=$('<article class="calendar-item col-lg-6 mb-4"></article>'); 226 var resultContentLink=$('<a class="calendar-link"></a>'); 227 resultContentLink.attr('href',eventUrl); 228 result.append(resultContentLink); 229 var calendarDate=$('<div class="calendar-date"></div>'); 230 var dateItems=$('<div class="date-items"></div>'); 231 calendarDate.append(dateItems); 232 resultContentLink.append(calendarDate); 233 var calendarContentTime=$('<time></time>'); 234 235 //region data události 236 renderEventDates(event, dateItems, calendarContentTime); 237 //endregion data události 238 239 //region obrázek a info o události 240 var calendarFigure=$('<figure class="calendar-figure"></figure>'); 241 resultContentLink.append(calendarFigure); 242 var eventImg = $('<img class="img-fluid w-100"/>'); 243 eventImg.attr('src',event.image); 244 eventImg.attr('alt',event.title); 245 calendarFigure.append(eventImg); 246 247 var calendarFigcaption=$('<figcaption class="calendar-figcaption mt-xl--4"></figcaption>'); 248 var h2=$('<h2 class="calendar-title text-white"></h2>'); 249 h2.text(event.title); 250 if (event.subtitle!==''){ 251 h2.append($('<div class="small"></div>').text(event.subtitle)); 252 } 253 calendarFigcaption.append(h2); 254 calendarFigure.append(calendarFigcaption); 255 //endregion obrázek a info o události 256 257 return result; 258 }; 259 260 /** 261 * Metoda sestavujÃcà URL pro zaslánà dotazu 262 * @return {object} 263 */ 264 var getRequestData = function(limit,promoCount,dateFrom,dateTo,tags,promoNormalEvents){ 265 var result={ 266 web:web, 267 promoCount:promoCount 268 }; 269 if (limit){ 270 result.limit=limit; 271 } 272 if (dateTo){ 273 result.dateFrom=dateFrom; 274 } 275 if (dateTo){ 276 result.dateTo=dateTo; 277 } 278 if (tags.length>0){ 279 result.tag=tags; 280 } 281 if (promoNormalEvents){ 282 result.promoNormalEvents=1; 283 } 284 return result; 285 }; 286 } 287 288 $(function(){ 289 $('.inline-calendar').each(function(){ 290 var calendarSection=$(this); 291 292 var calendar=new Calendar; 293 calendar.init({ 294 target: calendarSection, 295 web: calendarSection.attr('data-calendar-web'), 296 tags: calendarSection.attr('data-calendar-tags'), 297 months: calendarSection.attr('data-calendar-months'), 298 limitCount: calendarSection.attr('data-calendar-count'), 299 limitPromoCount: calendarSection.attr('data-calendar-promo-count'), 300 promoNormalEvents: calendarSection.attr('data-calendar-promo-normal-events'), 301 dateFrom: calendarSection.attr('data-calendar-date-from'), 302 dateTo: calendarSection.attr('data-calendar-date-to'), 303 userIsAdmin: (calendarSection.attr('data-calendar-admin')==='1') 304 }); 305 });
306 307 308 309 }); 310})(jQuery, this);
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.