1/* = 2 jquery.eventCalendar.js 3 version: 0.7 4 date: 13-08-2015 5 author: 6 Jaime Fernandez (@vissit) 7 company: 8 Paradigma Tecnologico (@paradigmate) 9 url: 10 http://www.vissit.com/projects/eventCalendar/ 11 */ 12; 13(function ($) { 14 $.fn.eventCalendar = function (options) { 15 var calendar = this; 16 17 if (options.locales && typeof (options.locales) == 'string') { 18 $.getJSON(options.locales, function (data) { 19 options.locales = $.extend({}, $.fn.eventCalendar.defaults.locales, data); 20 moment.locale(data.locale, options.locales.moment); 21 moment.locale(data.locale); 22 23 initEventCalendar(calendar, options); 24 }).error(function () { 25 showError("error getting locale json", $(this)); 26 }); 27 } else { 28 if (options.locales && options.locales.locale) { 29 options.locales = $.extend({}, $.fn.eventCalendar.defaults.locales, options.locales); 30 moment.locale(options.locales.locale, options.locales.moment); 31 moment.locale(options.locales.locale); 32 } 33 initEventCalendar(calendar, options); 34 } 35 36 37 }; 38 39 40 // define the parameters with the default values of the function 41 $.fn.eventCalendar.defaults = { 42 eventsjson: 'js/events.json', 43 eventsLimit: 4, 44 locales: { 45 locale: "en", 46 txt_noEvents: "There are no events in this period", 47 txt_SpecificEvents_prev: "", 48 txt_SpecificEvents_after: "events:", 49 txt_next: "next", 50 txt_prev: "prev", 51 txt_NextEvents: "Next events:", 52 txt_GoToEventUrl: "See the event", 53 txt_loading: "loading..." 54 }, 55 showDayAsWeeks: true, 56 startWeekOnMonday: true, 57 showDayNameInCalendar: true, 58 showDescription: false, 59 onlyOneDescription: true, 60 openEventInNewWindow: false, 61 eventsScrollable: false, 62 dateFormat: "D/MM/YYYY", 63 jsonDateFormat: 'timestamp', // you can use also "human" 'YYYY-MM-DD HH:MM:SS' 64 moveSpeed: 500, // speed of month move when you clic on a new date 65 moveOpacity: 0.15, // month and events fadeOut to this opacity 66 jsonData: "", // to load and inline json (not ajax calls) 67 cacheJson: true // if true plugin get a json only first time and after plugin filter events 68 // if false plugin get a new json on each date change 69 }; 70 71 function initEventCalendar(that, options) { 72 var eventsOpts = $.extend({}, $.fn.eventCalendar.defaults, options); 73 74 // define global vars for the function 75 var flags = { 76 wrap: "", 77 directionLeftMove: "300", 78 eventsJson: {} 79 }; 80 81 // each eventCalendar will execute this function 82 that.each(function () { 83 84 flags.wrap = $(this); 85 flags.wrap.addClass('eventCalendar-wrap').append("<div class='eventCalendar-list-wrap'><a href=\"#close\" id='close_event_list'>x</a><p class='eventCalendar-subtitle'></p><span class='eventCalendar-loading'>" + eventsOpts.locales.txt_loading + "</span><div class='eventCalendar-list-content'><ul class='eventCalendar-list'></ul></div></div>"); 86 87 $("#close_event_list").click(function(event) { 88 event.preventDefault(); 89 90 $(".eventCalendar-list-wrap").removeClass('active'); 91 }); 92 93 if (eventsOpts.eventsScrollable) { 94 flags.wrap.find('.eventCalendar-list-content').addClass('scrollable'); 95 } 96 97 setCalendarWidth(flags); 98 $(window).resize(function () { 99 setCalendarWidth(flags); 100 }); 101 //flags.directionLeftMove = flags.wrap.width(); 102 103 // show current month 104 dateSlider("current", flags, eventsOpts); 105 106 getEvents(flags, eventsOpts, eventsOpts.eventsLimit, false, false, false, false); 107 108 changeMonth(flags, eventsOpts); 109 110 flags.wrap.on('click', '.eventCalendar-day a', function (e) { 111 //flags.wrap.find('.eventCalendar-day a').live('click',function(e){ 112 e.preventDefault(); 113 var year = flags.wrap.attr('data-current-year'),
114 month = flags.wrap.attr('data-current-month'), 115 day = $(this).parent().attr('rel'); 116 117 getEvents(flags, eventsOpts, false, year, month, day, "day"); 118 $('.eventCalendar-list-wrap').addClass('active'); 119 }); 120 flags.wrap.on('click', '.eventCalendar-monthTitle', function (e) { 121 //flags.wrap.find('.eventCalendar-monthTitle').live('click',function(e){ 122 e.preventDefault(); 123 var year = flags.wrap.attr('data-current-year'), 124 month = flags.wrap.attr('data-current-month'); 125 126 getEvents(flags, eventsOpts, eventsOpts.eventsLimit, year, month, false, "month"); 127 }); 128 }); 129 130 // show event description 131 flags.wrap.find('.eventCalendar-list').on('click', '.eventCalendar-eventTitle', function (e) { 132 //flags.wrap.find('.eventCalendar-list .eventCalendar-eventTitle').live('click',function(e){ 133 if (false) { 134 e.preventDefault(); 135 var desc = $(this).parent().find('.eventCalendar-eventDesc'); 136 137 if (!desc.find('a').size()) { 138 var eventUrl = $(this).attr('href'); 139 var eventTarget = $(this).attr('target'); 140 141 // create a button to go to event url 142 desc.append('<a href="' + eventUrl + '" target="' + eventTarget + '" class="bt">' + eventsOpts.locales.txt_GoToEventUrl + '</a>'); 143 } 144 145 if (desc.is(':visible')) { 146 desc.slideUp(); 147 } else { 148 if (eventsOpts.onlyOneDescription) { 149 flags.wrap.find('.eventCalendar-eventDesc').slideUp(); 150 } 151 desc.slideDown(); 152 } 153 154 } 155 }); 156 } 157 158 function sortJson(a, b) { 159 if (typeof a.date === 'string') { 160 return a.date.toLowerCase() > b.date.toLowerCase() ? 1 : -1; 161 } 162 return a.date > b.date ? 1 : -1; 163 } 164 165 function dateSlider(show, flags, eventsOpts) { 166 var $eventsCalendarSlider = $("<div class='eventCalendar-slider'></div>"), 167 $eventsCalendarMonthWrap = $("<div class='eventCalendar-monthWrap'></div>"), 168 $eventsCalendarTitle = $("<div class='eventCalendar-currentTitle'><a href='#' class='eventCalendar-monthTitle'></a></div>"), 169 $eventsCalendarArrows = $("<a href='#' class='eventCalendar-arrow eventCalendar-prev'><span>" + eventsOpts.locales.txt_prev + "</span></a><a href='#' class='eventCalendar-arrow eventCalendar-next'><span>" + eventsOpts.locales.txt_next + "</span></a>"); 170 $eventsCalendarDaysList = $("<ul class='eventCalendar-daysList'></ul>"), 171 date = new Date(); 172 173 if (!flags.wrap.find('.eventCalendar-slider').length) { 174 flags.wrap.prepend($eventsCalendarSlider); 175 $eventsCalendarSlider.append($eventsCalendarMonthWrap); 176 } else { 177 flags.wrap.find('.eventCalendar-slider').append($eventsCalendarMonthWrap); 178 } 179 180 flags.wrap.find('.eventCalendar-monthWrap.eventCalendar-currentMonth').removeClass('eventCalendar-currentMonth').addClass('eventCalendar-oldMonth'); 181 $eventsCalendarMonthWrap.addClass('eventCalendar-currentMonth').append($eventsCalendarTitle, $eventsCalendarDaysList); 182 183 184 185 // if current show current month & day 186 if (show === "current") { 187 day = date.getDate(); 188 $eventsCalendarSlider.append($eventsCalendarArrows); 189 190 } else { 191 date = new Date(flags.wrap.attr('data-current-year'), flags.wrap.attr('data-current-month'), 1, 0, 0, 0); // current visible month 192 day = 0; // not show current day in days list 193 194 moveOfMonth = 1; 195 if (show === "prev") { 196 moveOfMonth = -1; 197 } 198 date.setMonth(date.getMonth() + moveOfMonth); 199 200 var tmpDate = new Date(); 201 if (date.getMonth() === tmpDate.getMonth()) { 202 day = tmpDate.getDate(); 203 } 204 205 } 206 207 // get date portions 208 var year = date.getFullYear(), // year of the events 209 currentYear = new Date().getFullYear(), // current year
210 month = date.getMonth(), // 0-11 211 monthToShow = month + 1; 212 213 if (show != "current") { 214 // month change 215 getEvents(flags, eventsOpts, eventsOpts.eventsLimit, year, month, false, show); 216 } 217 218 flags.wrap.attr('data-current-month', month) 219 .attr('data-current-year', year); 220 221 // add current date info 222 moment.locale(eventsOpts.locales.locale); 223 224 var formatedDate = moment(year + " " + monthToShow, "YYYY MM").format("MMMM YYYY"); 225 $eventsCalendarTitle.find('.eventCalendar-monthTitle').html(formatedDate); 226 227 // print all month days 228 var daysOnTheMonth = 32 - new Date(year, month, 32).getDate(); 229 var daysList = [], 230 i; 231 if (eventsOpts.showDayAsWeeks) { 232 $eventsCalendarDaysList.addClass('eventCalendar-showAsWeek'); 233 234 // show day name in top of calendar 235 if (eventsOpts.showDayNameInCalendar) { 236 $eventsCalendarDaysList.addClass('eventCalendar-showDayNames'); 237 238 i = 0; 239 // if week start on monday 240 if (eventsOpts.startWeekOnMonday) { 241 i = 1; 242 } 243 244 for (; i < 7; i++) { 245 daysList.push('<li class="eventCalendar-day-header">' + moment()._locale._weekdaysShort[i] + '</li>'); 246 247 if (i === 6 && eventsOpts.startWeekOnMonday) { 248 // print sunday header 249 daysList.push('<li class="eventCalendar-day-header">' + moment()._locale._weekdaysShort[0] + '</li>'); 250 } 251 252 } 253 } 254 255 dt = new Date(year, month, 01); 256 var weekDay = dt.getDay(); // day of the week where month starts 257 258 if (eventsOpts.startWeekOnMonday) { 259 weekDay = dt.getDay() - 1; 260 } 261 if (weekDay < 0) { 262 weekDay = 6; 263 } // if -1 is because day starts on sunday(0) and week starts on monday 264 265 for (i = weekDay; i > 0; i--) { 266 daysList.push('<li class="eventCalendar-day eventCalendar-empty"></li>'); 267 } 268 } 269 for (dayCount = 1; dayCount <= daysOnTheMonth; dayCount++) { 270 var dayClass = ""; 271 272 if (day > 0 && dayCount === day && year === currentYear) { 273 dayClass = "today"; 274 } 275 daysList.push('<li id="dayList_' + dayCount + '" rel="' + dayCount + '" class="eventCalendar-day ' + dayClass + '"><a href="#">' + dayCount + '</a></li>'); 276 } 277 $eventsCalendarDaysList.append(daysList.join('')); 278 279 $eventsCalendarSlider.css('height', $eventsCalendarMonthWrap.height() + 'px'); 280 } 281 282 function getEvents(flags, eventsOpts, limit, year, month, day, direction) { 283 limit = limit || 0; 284 year = year || ''; 285 day = day || ''; 286 287 // to avoid problem with january (month = 0) 288 289 if (typeof month != 'undefined') { 290 month = month; 291 } else { 292 month = ''; 293 } 294 295 //var month = month || ''; 296 flags.wrap.find('.eventCalendar-loading').fadeIn(); 297 298 if (eventsOpts.jsonData) { 299 // user send a json in the plugin params 300 eventsOpts.cacheJson = true; 301 302 flags.eventsJson = eventsOpts.jsonData; 303 getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction); 304 305 } else if (!eventsOpts.cacheJson || !direction) { 306 // first load: load json and save it to future filters 307 $.getJSON(eventsOpts.eventsjson + "?limit=" + limit + "&year=" + year + "&month=" + month + "&day=" + day, function (data) { 308 flags.eventsJson = data; // save data to future filters 309 getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction); 310 }).error(function () { 311 showError("error getting json: ", flags.wrap); 312 }); 313 } else { 314 // filter previus saved json 315 getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction); 316 } 317 318 if (day > '') { 319 flags.wrap.find('.eventCalendar-current').removeClass('eventCalendar-current'); 320 flags.wrap.find('#dayList_' + day).addClass('eventCalendar-current'); 321 } 322 } 323 324 function getEventsData(flags, eventsOpts, data, limit, year, month, day, direction) { 325 directionLeftMove = "-=" + flags.directionLeftMove; 326 eventContentHeight = "auto"; 327 328 subtitle = flags.wrap.find('.eventCalendar-list-wrap .eventCalendar-subtitle'); 329 330 if (!direction) { 331 // first load 332 subtitle.html(eventsOpts.locales.txt_NextEvents); 333 eventContentHeight = "auto"; 334 directionLeftMove = "-=0"; 335 } else { 336 var jsMonth = parseInt(month) + 1, 337 formatedDate; 338 moment.locale(eventsOpts.locales.locale); 339 340 if (day !== '') { 341 formatedDate = moment(year + " " + jsMonth + " " + day, "YYYY MM DD").format("LL"); 342 subtitle.html(eventsOpts.locales.txt_SpecificEvents_prev + formatedDate + " " + eventsOpts.locales.txt_SpecificEvents_after); 343 //eventStringDate = moment(eventDate).format(eventsOpts.dateFormat); 344 } else { 345 formatedDate = moment(year + " " + jsMonth, "YYYY MM").format("MMMM"); 346 subtitle.html(eventsOpts.locales.txt_SpecificEvents_prev + formatedDate + " " + eventsOpts.locales.txt_SpecificEvents_after); 347 } 348 349 if (direction === 'eventCalendar-prev') { 350 directionLeftMove = "+=" + flags.directionLeftMove; 351 } else if (direction === 'day' || direction === 'month') { 352 directionLeftMove = "+=0"; 353 eventContentHeight = 0; 354 } 355 } 356 357 flags.wrap.find('.eventCalendar-list').animate({ 358 opacity: eventsOpts.moveOpacity, 359 left: directionLeftMove, 360 height: eventContentHeight 361 }, eventsOpts.moveSpeed, function () { 362 flags.wrap.find('.eventCalendar-list').css({'left': 0, 'height': 'auto'}).hide(); 363 //wrap.find('.eventCalendar-list li').fadeIn(); 364 365 var events = []; 366 367 data = $(data).sort(sortJson); // sort event by dates 368 // each event 369 if (data.length) { 370 371 // show or hide event description 372 var eventDescClass = ''; 373 if (!eventsOpts.showDescription) { 374 eventDescClass = 'eventCalendar-hidden'; 375 } 376 var eventLinkTarget = "_self"; 377 if (eventsOpts.openEventInNewWindow) { 378 eventLinkTarget = '_blank'; 379 } 380 381 var i = 0; 382 $.each(data, function (key, event) { 383 var eventDateTime, eventDate, eventTime, eventYear, eventMonth, eventDay, 384 eventMonthToShow, eventHour, eventMinute, eventSeconds; 385 if (eventsOpts.jsonDateFormat == 'human') { 386 eventDateTime = event.date.split(" "); 387 eventDate = eventDateTime[0].split("-"); 388 eventTime = eventDateTime[1].split(":"); 389 eventYear = eventDate[0]; 390 eventMonth = parseInt(eventDate[1]) - 1; 391 eventDay = parseInt(eventDate[2]); 392 //eventMonthToShow = eventMonth; 393 eventMonthToShow = parseInt(eventMonth) + 1; 394 eventHour = eventTime[0]; 395 eventMinute = eventTime[1]; 396 eventSeconds = eventTime[2]; 397 eventDate = new Date(eventYear, eventMonth, eventDay, eventHour, eventMinute, eventSeconds); 398 } else { 399 eventDate = new Date(parseInt(event.date)); 400 eventYear = eventDate.getFullYear(); 401 eventMonth = eventDate.getMonth(); 402 eventDay = eventDate.getDate(); 403 eventMonthToShow = eventMonth + 1; 404 eventHour = eventDate.getHours(); 405 eventMinute = eventDate.getMinutes(); 406 407 } 408 409 if (parseInt(eventMinute) <= 9) { 410 eventMinute = "0" + parseInt(eventMinute); 411 } 412 413 414 if (limit === 0 || limit > i) { 415 // if month or day exist then only show matched events 416
417 if ((month === false || month == eventMonth) && (day === '' || day == eventDay) && (year === '' || year == eventYear)) { 418 // if initial load then load only future events 419 if (month === false && eventDate < new Date()) { 420 } else { 421 moment.locale(eventsOpts.locales.locale); 422 //eventStringDate = eventDay + "/" + eventMonthToShow + "/" + eventYear; 423 eventStringDate = moment(eventDate).format(eventsOpts.dateFormat); 424 var eventTitle; 425 426 if (event.url) { 427 eventTitle = '<a href="' + event.url + '" target="' + eventLinkTarget + '" class="eventCalendar-eventTitle">' + event.title + '</a>'; 428 } else { 429 eventTitle = '<span class="eventCalendar-eventTitle">' + event.title + '</span>'; 430 } 431 432 if(event.thumb != '') { 433 var event_thumb_str = '<div class="thumb">' + event.thumb + '</div><div class="content">'; 434 } 435 else { 436 var event_thumb_str = '<div class="content_full">'; 437 } 438 439 events.push('<li id="' + key + '" class="' + event.type + '">' + event_thumb_str + '<div class="time"><i class="fa fa-calendar"></i> <time datetime="' + eventDate + '"><em>' + eventStringDate + '</em></time></div>' + eventTitle + '<p class="eventCalendar-eventDesc ' + eventDescClass + '">' + event.description + '</p></div><div class="clearfix"></div></li>'); 440 i++; 441 } 442 } 443 } 444 445 // add mark in the dayList to the days with events 446 if (eventYear == flags.wrap.attr('data-current-year') && eventMonth == flags.wrap.attr('data-current-month')) { 447 flags.wrap.find('.eventCalendar-currentMonth .eventCalendar-daysList #dayList_' + parseInt(eventDay)).addClass('eventCalendar-dayWithEvents'); 448 } 449 450 }); 451 } 452 453 // there is no events on this period 454 if (!events.length) { 455 events.push('<li class="eventCalendar-noEvents"><p>' + eventsOpts.locales.txt_noEvents + '</p></li>'); 456 } 457 flags.wrap.find('.eventCalendar-loading').hide(); 458 459 flags.wrap.find('.eventCalendar-list') 460 .html(events.join('')); 461 462 flags.wrap.find('.eventCalendar-list').animate({ 463 opacity: 1, 464 height: "toggle" 465 }, eventsOpts.moveSpeed); 466 467 468 }); 469 setCalendarWidth(flags); 470 } 471 472 function changeMonth(flags, eventsOpts) { 473 flags.wrap.find('.eventCalendar-arrow').click(function (e) { 474 e.preventDefault(); 475 var lastMonthMove; 476 477 if ($(this).hasClass('eventCalendar-next')) { 478 dateSlider("next", flags, eventsOpts); 479 lastMonthMove = '-=' + flags.directionLeftMove; 480 481 } else { 482 dateSlider("prev", flags, eventsOpts); 483 lastMonthMove = '+=' + flags.directionLeftMove; 484 } 485 486 flags.wrap.find('.eventCalendar-monthWrap.eventCalendar-oldMonth').animate({ 487 opacity: eventsOpts.moveOpacity, 488 left: lastMonthMove 489 }, eventsOpts.moveSpeed, function () { 490 flags.wrap.find('.eventCalendar-monthWrap.eventCalendar-oldMonth').remove(); 491 }); 492 }); 493 } 494 495 function showError(msg, wrap) { 496 wrap.find('.eventCalendar-list-wrap').html("<span class='eventCalendar-loading eventCalendar-error'>" + msg + "</span>"); 497 } 498 499 function setCalendarWidth(flags) { 500 // resize calendar width on window resize 501 flags.directionLeftMove = flags.wrap.width(); 502 flags.wrap.find('.eventCalendar-monthWrap').width(flags.wrap.width() + 'px'); 503 504 flags.wrap.find('.eventCalendar-list-wrap').width(flags.wrap.width() + 'px'); 505 506 } 507 508 509})(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.