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