1/** 2 * Plugin jQuery pour l'extension agenda 3 */ 4(function ($) { 5 $.AgendaList = function (el, options) { 6 var base = this; 7 var $ajaxLoader = $('.tx-culturoscope').find('#ajax-loader'); 8 9 // Version jQuery de l'élément 10 var $el = $(el); 11 var $calendarToggle = $('.calendar-toggle'); 12 13 // Ajoute une référence inverse sur le plugin dans le DOM 14 $el.data("AgendaList", base); 15 16 /** 17 * Point d'entrée, appelé lors de l'instanciation du plugin 18 */ 19 var init = function () { 20 // vérification et assignation des événements de désactivation du calendrier 21 checkCalendar(); 22 23 // define locales 24 moment.locale('fr-ch'); 25 var weekdays = moment.weekdaysShort() 26 weekdays.push(weekdays.shift()); 27 28 // load calendar 29 // if($('#get-calendar-events-url').val()) { 30 // // filter calendar 31 // $.ajax({ 32 // url: $('#get-calendar-events-url').val(), 33 // type: 'post', 34 // data: { 35 // 'tx_culturoscope_list[timestamp]': Date.now() / 1000 36 // }, 37 // success: function(data){ 38 // $ajaxLoader.hide(); 39 // var events = $.parseJSON(data); 40 // 41 // // initiate calendar with clndr.js 42 // var calendar = $('#calendar').clndr({ 43 // template: $('#calendar-template').html(), 44 // moment: moment, 45 // daysOfTheWeek: weekdays, 46 // startWithMonth: moment(), 47 // events: events, 48 // multiDayEvents: { 49 // startDate: 'start', 50 // endDate: 'end', 51 // singleDay: 'date' 52 // }, 53 // clickEvents: { 54 // onMonthChange: function(month){ 55 // $ajaxLoader.show(); 56 // $.ajax({ 57 // url: $('#get-calendar-events-url').val(), 58 // type: 'post', 59 // data: { 60 // 'tx_culturoscope_list[timestamp]': month.format('X') 61 // }, 62 // success: function(data){ 63 // $ajaxLoader.hide(); 64 // calendar.setEvents($.parseJSON(data)); 65 // updateSelectedDays(); 66 // } 67 // }); 68 // }, 69 // click: function(target){ 70 // if($(target.element).hasClass('event') && !$(target.element).hasClass('past')){ 71 // if($(target.element).hasClass('selected')){ 72 // removeSelectedDay(target); 73 // } else { 74 // addSelectedDay(target); 75 // } 76 // checkWhenFilter(); 77 // updateMobileButton(); 78 // } 79 // } 80 // } 81 // }); 82 // 83 // if($('#selected-days').val()){ 84 // updateSelectedDays(); 85 // updateMobileButton(); 86 // } 87 // checkWhenFilter(); 88 // } 89 // }); 90 // } else { 91 // // schedule calendar 92 // $ajaxLoader.hide(); 93 // 94 // // get schedule 95 // var schedule = getEventSchedule(); 96 // 97 // if($.isArray(schedule)) { 98 // var calendar = $('#calendar').clndr({ 99 // template: $('#calendar-template').html(), 100 // moment: moment, 101 // daysOfTheWeek: weekdays, 102 // events: schedule, 103 // startWithMonth: moment(), 104 // multiDayEvents: { 105 // startDate: 'start', 106 // endDate: 'end', 107 // singleDay: 'date' 108 // }, 109 // clickEvents: { 110 // onMonthChange: function() { 111 // addTooltipInformation(schedule); 112 // } 113 // }, 114 // ready: function() { 115 // addTooltipInformation(schedule); 116 // } 117 // }); 118 // 119 // $('.schedule').show(); 120 // } else { 121 // $('#schedule-value').html(schedule); 122 // $('.schedule-info').show(); 123 // } 124 // } 125 126 // load more events button 127 if($('#load-more-events').length > 0) { 128 $('#load-more-events').on('click', function(){ 129 var $urlInput = $('#load-more-url'); 130 var url = $urlInput.val(); 131 var data = {}; 132 var $resultsContainer = ''; 133 134 if($urlInput.data('search')) { 135 $resultsContainer = $('.results'); 136 data = $('#filters-form').serialize(); 137 data += '&tx_culturoscope_list[offset]=' + $('.results').children('.event').length; 138 } else { 139 $resultsContainer = $('.current-events'); 140 var visibleEvents = ''; 141 $('.event').each(function(){ 142 visibleEvents += $(this).find('.period-uid').val() + ','; 143 }); 144 visibleEvents = visibleEvents.slice(0, -1); 145 data = { 146 'tx_culturoscope_list[fromTimestamp]': $('.event:last-child').find('.period-timestamp').val(), 147 'tx_culturoscope_list[limit]': $('#nb-events-to-show').val(),
148 'tx_culturoscope_list[visiblePeriods]': visibleEvents 149 }; 150 } 151 152 $.ajax({ 153 url: url, 154 type: 'post', 155 data: data, 156 success: function(data){ 157 $resultsContainer.append(data); 158 $resultsContainer.find('.event').slideDown('slow'); 159 $('.event-hidden').removeClass('event-hidden'); 160 if(!$('#show-load-more-button').val()){ 161 $('#load-more-events').hide('slow'); 162 } 163 $('#show-load-more-button').remove(); 164 } 165 }); 166 }); 167 } 168 169 // load more permanent events button 170 if($('#load-more-permanent-events').length > 0) { 171 $('#load-more-permanent-events').on('click', function(){ 172 var $urlInput = $('#load-more-permanent-event-url'); 173 var url = $urlInput.val(); 174 var data = {}; 175 var $resultsContainer = ''; 176 177 if($urlInput.data('search')) { 178 $resultsContainer = $('.results'); 179 data = $('#filters-form').serialize(); 180 data += '&tx_culturoscope_permanent[offset]=' + $('.results').children('.permanent-event').length; 181 } else { 182 $resultsContainer = $('.current-events'); 183 var visibleEvents = ''; 184 $('.permanent-event').each(function(){ 185 visibleEvents += $(this).find('.event-uid').val() + ','; 186 }); 187 visibleEvents = visibleEvents.slice(0, -1); 188 data = { 189 'tx_culturoscope_permanent[fromTimestamp]': $('.permanent-event:last-child').find('.event-timestamp').val(), 190 'tx_culturoscope_permanent[limit]': $('#nb-permanent-events-to-show').val(), 191 'tx_culturoscope_permanent[visibleEvents]': visibleEvents 192 }; 193 } 194 195 $.ajax({ 196 url: url, 197 type: 'post', 198 data: data, 199 success: function(data){ 200 $resultsContainer.append(data); 201 $resultsContainer.find('.permanent-event').slideDown('slow'); 202 $('.event-hidden').removeClass('event-hidden'); 203 if(!$('#show-load-more-button').val()){ 204 $('#load-more-events').hide('slow'); 205 } 206 $('#show-load-more-button').remove(); 207 } 208 }); 209 }); 210 } 211 212 // Button to toggle the calendar on mobile 213 $calendarToggle.on('click', function() { 214 if(!$(this).hasClass('disable')) { 215 $('.calendar-content').toggleClass('active'); 216 } 217 }); 218 }; 219 220 /** 221 * Fetch event's periods and return an array of schedule 222 * 223 * @return array 224 */ 225 var getEventSchedule = function() { 226 var schedule = []; 227 if($('.periods').length > 0 && $('.periods').children('div').length > 0) { 228 $('.periods').children('div').each(function(){ 229 var periodStart = moment($(this).data('periodStart')); 230 var periodEnd = moment($(this).data('periodEnd')); 231 232 if(periodEnd.format('X') - periodStart.format('X') <= 86400 && $('.periods').children('div').length === 1) { 233 schedule = periodStart.format('H:mm') + '-' + periodEnd.format('H:mm'); 234 } else { 235 var days = $(this).data('periodDays'); 236 var scheduleTime = periodStart.format('H:mm') + '-' + periodEnd.format('H:mm'); 237 var end = periodEnd.add(1, 'days'); 238 239 for(var day = periodStart; day.format('DD MM YYYY') !== end.format('DD MM YYYY'); day.add(1, 'days')) { 240 var dayStr = day.format('dd').toLowerCase(); 241 if(days.indexOf(dayStr) !== -1) { 242 schedule.push({ 243 date: day.format('YYYY-MM-DD'), 244 schedule: scheduleTime
245 }); 246 } 247 } 248 } 249 }); 250 } 251 252 return schedule; 253 } 254 255 /** 256 * Add tooltip information 257 * 258 * @param array 259 * @return void 260 */ 261 var addTooltipInformation = function(schedule) { 262 for(var i = 0; i < schedule.length; i++) { 263 $('.calendar-day-' + schedule[i]['date']) 264 .attr('data-toggle', 'tooltip') 265 .attr('data-placement', 'top') 266 .attr('title', schedule[i]['schedule']) 267 .attr('data-schedule', schedule[i]['schedule']); 268 } 269 $('[data-toggle="tooltip"]').tooltip(); 270 } 271 272 var checkCalendar = function(){ 273 disableCalendar($('#when').val()); 274 $('#when').on('change', function(){ 275 disableCalendar($(this).val()); 276 }); 277 } 278 279 var disableCalendar = function($value){ 280 var $disableCalendar = $('#disable-calendar'); 281 // Uniquement mobile 282 var $elementsToDisable = $('.calendar-toggle, .calendar-content'); 283 if($value){ 284 $disableCalendar.show(); 285 $elementsToDisable.addClass('disable'); 286 } else { 287 $disableCalendar.hide(); 288 $elementsToDisable.removeClass('disable'); 289 } 290 } 291 292 var checkWhenFilter = function(){ 293 if($('#calendar').find('.selected').length > 0) { 294 $('#when').attr('disabled', 'disabled'); 295 } else { 296 $('#when').removeAttr('disabled'); 297 } 298 } 299 300 /** 301 * Add selected day to calendar 302 * @param target Target day object from clndr.js 303 */ 304 var addSelectedDay = function(target){ 305 var $element = $(target.element); 306 $element.addClass('selected'); 307 308 var selectedDays = []; 309 if($('#selected-days').val()){ 310 selectedDays = $.parseJSON($('#selected-days').val()); 311 selectedDays.push(target.date.format('X')); 312 } else { 313 selectedDays = []; 314 selectedDays.push(target.date.format('X')); 315 } 316 317 $('#selected-days').val(JSON.stringify(selectedDays)); 318 }; 319 320 /** 321 * Remove selected day to calendar 322 * @param target Target day object from clndr.js 323 */ 324 var removeSelectedDay = function(target){ 325 var $element = $(target.element); 326 $element.removeClass('selected'); 327 328 var selectedDays = $.parseJSON($('#selected-days').val()); 329 selectedDays.splice(selectedDays.indexOf(target.date.format('X')), 1); 330 331 $('#selected-days').val(JSON.stringify(selectedDays)); 332 }; 333 334 /** 335 * Update selected days after month change 336 */ 337 var updateSelectedDays = function(){ 338 var selectedDays = $.parseJSON($('#selected-days').val()); 339 var date = ''; 340 var $dayElement = ''; 341 for (var i = 0; i < selectedDays.length; i++){ 342 date = moment.unix(selectedDays[i]); 343 $dayElement = $('.calendar-day-' + date.format('YYYY-MM-DD')); 344 if($dayElement.hasClass('event')){ 345 $('.calendar-day-' + date.format('YYYY-MM-DD')).addClass('selected'); 346 } 347 } 348 } 349 350 /** 351 * Update label of the mobile button 352 */ 353 var updateMobileButton = function() { 354 var stringSelectedDates = $('#selected-days').val(); 355 var selectedDates = JSON.parse(stringSelectedDates); 356 357 // Tableau associatif pour avoir les noms des mois unique 358 var selectedMonths = []; 359 var selectedYears = []; 360 for(var i = 0; i < selectedDates.length; i++) { 361 var date = moment.unix(selectedDates[i]); 362 var month = date.format('MMMM'); 363 var year = date.format('YYYY'); 364 selectedMonths[month] = ''; 365 selectedYears[year] = ''; 366 } 367 368 var calendarToggleText = ''; 369 370 var tempSelectedMonth = []; 371 for (var key in selectedMonths) { 372 tempSelectedMonth.push(key); 373 } 374 var tempSelectedYears = []; 375 for (var key in selectedYears) { 376 tempSelectedYears.push(key); 377 } 378 379 calendarToggleText = tempSelectedMonth.join(', '); 380 calendarToggleText += ' ' + tempSelectedYears.join(', '); 381 382 $calendarToggle.find('.text').text(calendarToggleText); 383 384 if($.trim($calendarToggle.find('.text').text()).length == 0) { 385 $calendarToggle.find('.text').addClass('empty'); 386 } else { 387 $calendarToggle.find('.text').removeClass('empty'); 388 } 389 } 390 391 // Initialisation du plugin 392 init(); 393 }; 394 395 $.fn.AgendaList = function (options) { 396 return this.each(function () { 397 (new $.AgendaList(this, options)); 398 }); 399 }; 400 401})(jQuery);
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.