PageRenderTime 44ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/inceptionsystem.us/themes/Material-News/js/jquery.eventCalendar.js

https://gitlab.com/aliyafathma/9-Agustus-WEBDESIGN-LAPAN
JavaScript | 442 lines | 313 code | 88 blank | 41 comment | 83 complexity | e9e54938e883d1041999813a33c1a3ef MD5 | raw file
  1. /* =
  2. jquery.eventCalendar.js
  3. version: 0.42;
  4. date: 28-05-2012
  5. authors:
  6. Jaime Fernandez (@vissit)
  7. Nerea Navarro (@nereaestonta)
  8. company:
  9. Paradigma Tecnologico (@paradigmate)
  10. */
  11. ;$.fn.eventCalendar = function(options){
  12. var eventsOpts = $.extend({}, $.fn.eventCalendar.defaults, options);
  13. // define global vars for the function
  14. var flags = {
  15. wrap: "",
  16. directionLeftMove: "300",
  17. eventsJson: {}
  18. }
  19. // each eventCalendar will execute this function
  20. this.each(function(){
  21. flags.wrap = $(this);
  22. flags.wrap.addClass('eventCalendar-wrap').append("<div class='eventsCalendar-list-wrap'><p class='eventsCalendar-subtitle'></p><span class='eventsCalendar-loading'>loading...</span><div class='eventsCalendar-list-content'><ul class='eventsCalendar-list'></ul></div></div>");
  23. if (eventsOpts.eventsScrollable) {
  24. flags.wrap.find('.eventsCalendar-list-content').addClass('scrollable');
  25. }
  26. setCalendarWidth();
  27. $(window).resize(function(){
  28. setCalendarWidth();
  29. });
  30. //flags.directionLeftMove = flags.wrap.width();
  31. // show current month
  32. dateSlider("current");
  33. getEvents(eventsOpts.eventsLimit,false,false,false,false);
  34. changeMonth();
  35. flags.wrap.find('.eventsCalendar-day a').live('click',function(e){
  36. e.preventDefault();
  37. var year = flags.wrap.attr('data-current-year'),
  38. month = flags.wrap.attr('data-current-month'),
  39. day = $(this).parent().attr('rel');
  40. getEvents(false, year, month,day, "day");
  41. });
  42. flags.wrap.find('.monthTitle').live('click',function(e){
  43. e.preventDefault();
  44. var year = flags.wrap.attr('data-current-year'),
  45. month = flags.wrap.attr('data-current-month');
  46. getEvents(eventsOpts.eventsLimit, year, month,false, "month");
  47. })
  48. });
  49. // show event description
  50. flags.wrap.find('.eventsCalendar-list .eventTitle').live('click',function(e){
  51. if(!eventsOpts.showDescription) {
  52. e.preventDefault();
  53. var desc = $(this).parent().find('.eventDesc');
  54. if (!desc.find('a').size()) {
  55. var eventUrl = $(this).attr('href');
  56. var eventTarget = $(this).attr('target');
  57. // create a button to go to event url
  58. desc.append('<a href="' + eventUrl + '" target="'+eventTarget+'" class="bt">'+eventsOpts.txt_GoToEventUrl+'</a>')
  59. }
  60. if (desc.is(':visible')) {
  61. desc.slideUp();
  62. } else {
  63. if(eventsOpts.onlyOneDescription) {
  64. flags.wrap.find('.eventDesc').slideUp();
  65. }
  66. desc.slideDown();
  67. }
  68. }
  69. });
  70. function sortJson(a, b){
  71. return a.date.toLowerCase() > b.date.toLowerCase() ? 1 : -1;
  72. };
  73. function dateSlider(show, year, month) {
  74. var $eventsCalendarSlider = $("<div class='eventsCalendar-slider'></div>"),
  75. $eventsCalendarMonthWrap = $("<div class='eventsCalendar-monthWrap'></div>"),
  76. $eventsCalendarTitle = $("<div class='eventsCalendar-currentTitle'><a href='#' class='monthTitle'></a></div>"),
  77. $eventsCalendarArrows = $("<a href='#' class='arrow prev'><span>" + eventsOpts.txt_prev + "</span></a><a href='#' class='arrow next'><span>" + eventsOpts.txt_next + "</span></a>");
  78. $eventsCalendarDaysList = $("<ul class='eventsCalendar-daysList'></ul>"),
  79. date = new Date();
  80. if (!flags.wrap.find('.eventsCalendar-slider').size()) {
  81. flags.wrap.prepend($eventsCalendarSlider);
  82. $eventsCalendarSlider.append($eventsCalendarMonthWrap);
  83. } else {
  84. flags.wrap.find('.eventsCalendar-slider').append($eventsCalendarMonthWrap);
  85. }
  86. flags.wrap.find('.eventsCalendar-monthWrap.currentMonth').removeClass('currentMonth').addClass('oldMonth');
  87. $eventsCalendarMonthWrap.addClass('currentMonth').append($eventsCalendarTitle, $eventsCalendarDaysList);
  88. // if current show current month & day
  89. if (show === "current") {
  90. day = date.getDate();
  91. $eventsCalendarSlider.append($eventsCalendarArrows);
  92. } else {
  93. date = new Date(flags.wrap.attr('data-current-year'),flags.wrap.attr('data-current-month'),1,0,0,0); // current visible month
  94. day = 0; // not show current day in days list
  95. moveOfMonth = 1;
  96. if (show === "prev") {
  97. moveOfMonth = -1;
  98. }
  99. date.setMonth( date.getMonth() + moveOfMonth );
  100. var tmpDate = new Date();
  101. if (date.getMonth() === tmpDate.getMonth()) {
  102. day = tmpDate.getDate();
  103. }
  104. }
  105. // get date portions
  106. var year = date.getFullYear(), // year of the events
  107. currentYear = (new Date).getFullYear(), // current year
  108. month = date.getMonth(), // 0-11
  109. monthToShow = month + 1;
  110. if (show != "current") {
  111. // month change
  112. getEvents(eventsOpts.eventsLimit, year, month,false, show);
  113. }
  114. flags.wrap.attr('data-current-month',month)
  115. .attr('data-current-year',year);
  116. // add current date info
  117. $eventsCalendarTitle.find('.monthTitle').html(eventsOpts.monthNames[month] + " " + year);
  118. // print all month days
  119. var daysOnTheMonth = 32 - new Date(year, month, 32).getDate();
  120. var daysList = [];
  121. if (eventsOpts.showDayAsWeeks) {
  122. $eventsCalendarDaysList.addClass('showAsWeek');
  123. // show day name in top of calendar
  124. if (eventsOpts.showDayNameInCalendar) {
  125. $eventsCalendarDaysList.addClass('showDayNames');
  126. var i = 0;
  127. // if week start on monday
  128. if (eventsOpts.startWeekOnMonday) {
  129. i = 1;
  130. }
  131. for (; i < 7; i++) {
  132. daysList.push('<li class="eventsCalendar-day-header">'+eventsOpts.dayNamesShort[i]+'</li>');
  133. if (i === 6 && eventsOpts.startWeekOnMonday) {
  134. // print sunday header
  135. daysList.push('<li class="eventsCalendar-day-header">'+eventsOpts.dayNamesShort[0]+'</li>');
  136. }
  137. }
  138. }
  139. dt=new Date(year, month, 01);
  140. var weekDay = dt.getDay(); // day of the week where month starts
  141. if (eventsOpts.startWeekOnMonday) {
  142. weekDay = dt.getDay() - 1;
  143. }
  144. if (weekDay < 0) { weekDay = 6; } // if -1 is because day starts on sunday(0) and week starts on monday
  145. for (i = weekDay; i > 0; i--) {
  146. daysList.push('<li class="eventsCalendar-day empty"></li>');
  147. }
  148. }
  149. for (dayCount = 1; dayCount <= daysOnTheMonth; dayCount++) {
  150. var dayClass = "";
  151. if (day > 0 && dayCount === day && year === currentYear) {
  152. dayClass = "current";
  153. }
  154. daysList.push('<li id="dayList_' + dayCount + '" rel="'+dayCount+'" class="eventsCalendar-day '+dayClass+'"><a href="#">' + dayCount + '</a></li>');
  155. }
  156. $eventsCalendarDaysList.append(daysList.join(''));
  157. $eventsCalendarSlider.css('height',$eventsCalendarMonthWrap.height()+'px');
  158. }
  159. function num_abbrev_str(num) {
  160. var len = num.length, last_char = num.charAt(len - 1), abbrev
  161. if (len === 2 && num.charAt(0) === '1') {
  162. abbrev = 'th'
  163. } else {
  164. if (last_char === '1') {
  165. abbrev = 'st'
  166. } else if (last_char === '2') {
  167. abbrev = 'nd'
  168. } else if (last_char === '3') {
  169. abbrev = 'rd'
  170. } else {
  171. abbrev = 'th'
  172. }
  173. }
  174. return num + abbrev
  175. }
  176. function getEvents(limit, year, month, day, direction) {
  177. var limit = limit || 0;
  178. var year = year || '';
  179. var day = day || '';
  180. // to avoid problem with january (month = 0)
  181. if (typeof month != 'undefined') {
  182. var month = month;
  183. } else {
  184. var month = '';
  185. }
  186. //var month = month || '';
  187. flags.wrap.find('.eventsCalendar-loading').fadeIn();
  188. if (eventsOpts.jsonData) {
  189. // user send a json in the plugin params
  190. eventsOpts.cacheJson = true;
  191. flags.eventsJson = eventsOpts.jsonData;
  192. getEventsData(flags.eventsJson, limit, year, month, day, direction);
  193. } else if (!eventsOpts.cacheJson || !direction) {
  194. // first load: load json and save it to future filters
  195. $.getJSON(eventsOpts.eventsjson + "?limit="+limit+"&year="+year+"&month="+month+"&day="+day, function(data) {
  196. flags.eventsJson = data; // save data to future filters
  197. getEventsData(flags.eventsJson, limit, year, month, day, direction);
  198. }).error(function() {
  199. showError("error getting json: ");
  200. });
  201. } else {
  202. // filter previus saved json
  203. getEventsData(flags.eventsJson, limit, year, month, day, direction);
  204. }
  205. }
  206. function getEventsData(data, limit, year, month, day, direction){
  207. directionLeftMove = "-=" + flags.directionLeftMove;
  208. eventContentHeight = "auto";
  209. subtitle = flags.wrap.find('.eventsCalendar-list-wrap .eventsCalendar-subtitle')
  210. if (!direction) {
  211. // first load
  212. subtitle.html(eventsOpts.txt_NextEvents);
  213. eventContentHeight = "auto";
  214. directionLeftMove = "-=0";
  215. } else {
  216. if (day != '') {
  217. subtitle.html(eventsOpts.txt_SpecificEvents_prev + eventsOpts.monthNames[month] + " " + num_abbrev_str(day) + " " + eventsOpts.txt_SpecificEvents_after);
  218. } else {
  219. subtitle.html(eventsOpts.txt_SpecificEvents_prev + eventsOpts.monthNames[month] + " " + eventsOpts.txt_SpecificEvents_after);
  220. }
  221. if (direction === 'prev') {
  222. directionLeftMove = "+=" + flags.directionLeftMove;
  223. } else if (direction === 'day' || direction === 'month') {
  224. directionLeftMove = "+=0";
  225. eventContentHeight = 0;
  226. }
  227. }
  228. flags.wrap.find('.eventsCalendar-list').animate({
  229. opacity: eventsOpts.moveOpacity,
  230. left: directionLeftMove,
  231. height: eventContentHeight
  232. }, eventsOpts.moveSpeed, function() {
  233. flags.wrap.find('.eventsCalendar-list').css({'left':0, 'height': 'auto'}).hide();
  234. //wrap.find('.eventsCalendar-list li').fadeIn();
  235. var events = [];
  236. data = $(data).sort(sortJson); // sort event by dates
  237. // each event
  238. if (data.length) {
  239. // show or hide event description
  240. var eventDescClass = '';
  241. if(!eventsOpts.showDescription) {
  242. eventDescClass = 'hidden';
  243. }
  244. var eventLinkTarget = "_self";
  245. if(eventsOpts.openEventInNewWindow) {
  246. eventLinkTarget = '_target';
  247. }
  248. var i = 0;
  249. $.each(data, function(key, event) {
  250. //console.log(event.title_agenda);
  251. $('.title_agenda').text(event.title_agenda); //tambahan to set ke Title WIdget
  252. var eventDate = new Date(parseInt(event.date)),
  253. eventYear = eventDate.getFullYear(),
  254. eventMonth = eventDate.getMonth(),
  255. eventDay = eventDate.getDate();
  256. if (limit === 0 || limit > i) {
  257. var eventMonthToShow = eventMonth + 1,
  258. eventHour = eventDate.getHours(),
  259. eventMinute = eventDate.getMinutes();
  260. if (eventMinute <= 9) {
  261. eventMinute = "0" + eventMinute;
  262. }
  263. console.log(eventHour);
  264. // if month or day exist then only show matched events
  265. if ((month === false || month == eventMonth)
  266. && (day == '' || day == eventDay)
  267. && (year == '' || year == eventYear) // get only events of current year
  268. ) {
  269. // if initial load then load only future events
  270. if (month === false && eventDate < new Date()) {
  271. } else {
  272. eventStringDate = eventDay + "/" + eventMonthToShow + "/" + eventYear;
  273. events.push('<li id="' + key + '" class="'+event.type+'"><time datetime="'+eventDate+'"><em>' + eventStringDate + '</em></time><a href="'+event.url+'" target="' + eventLinkTarget + '" class="eventTitle">' + event.title + '</a><p class="eventDesc ' + eventDescClass + '">' + event.description + '</p></li>');
  274. i++;
  275. }
  276. }
  277. }
  278. // add mark in the dayList to the days with events
  279. if (eventYear == flags.wrap.attr('data-current-year') && eventMonth == flags.wrap.attr('data-current-month')) {
  280. flags.wrap.find('.currentMonth .eventsCalendar-daysList #dayList_' + eventDay).addClass('dayWithEvents');
  281. }
  282. });
  283. }
  284. // there is no events on this period
  285. if (!events.length) {
  286. events.push('<li class="eventsCalendar-noEvents"><p>' + eventsOpts.txt_noEvents + '</p></li>');
  287. }
  288. flags.wrap.find('.eventsCalendar-loading').hide();
  289. flags.wrap.find('.eventsCalendar-list')
  290. .html(events.join(''));
  291. flags.wrap.find('.eventsCalendar-list').animate({
  292. opacity: 1,
  293. height: "toggle"
  294. }, eventsOpts.moveSpeed);
  295. });
  296. setCalendarWidth();
  297. }
  298. function changeMonth() {
  299. flags.wrap.find('.arrow').click(function(e){
  300. e.preventDefault();
  301. if ($(this).hasClass('next')) {
  302. dateSlider("next");
  303. var lastMonthMove = '-=' + flags.directionLeftMove;
  304. } else {
  305. dateSlider("prev");
  306. var lastMonthMove = '+=' + flags.directionLeftMove;
  307. }
  308. flags.wrap.find('.eventsCalendar-monthWrap.oldMonth').animate({
  309. opacity: eventsOpts.moveOpacity,
  310. left: lastMonthMove
  311. }, eventsOpts.moveSpeed, function() {
  312. flags.wrap.find('.eventsCalendar-monthWrap.oldMonth').remove();
  313. });
  314. });
  315. }
  316. function showError(msg) {
  317. flags.wrap.find('.eventsCalendar-list-wrap').html("<span class='eventsCalendar-loading error'>"+msg+" " +eventsOpts.eventsjson+"</span>");
  318. }
  319. function setCalendarWidth(){
  320. // resize calendar width on window resize
  321. flags.directionLeftMove = flags.wrap.width();
  322. flags.wrap.find('.eventsCalendar-monthWrap').width(flags.wrap.width() + 'px');
  323. flags.wrap.find('.eventsCalendar-list-wrap').width(flags.wrap.width() + 'px');
  324. }
  325. };
  326. // define the parameters with the default values of the function
  327. $.fn.eventCalendar.defaults = {
  328. eventsjson: 'js/events.json',
  329. eventsLimit: 4,
  330. monthNames: [ "January", "February", "March", "April", "May", "June",
  331. "July", "August", "September", "October", "November", "December" ],
  332. dayNames: [ 'Sunday','Monday','Tuesday','Wednesday',
  333. 'Thursday','Friday','Saturday' ],
  334. dayNamesShort: [ 'Sun','Mon','Tue','Wed', 'Thu','Fri','Sat' ],
  335. txt_noEvents: "There are no events in this period",
  336. txt_SpecificEvents_prev: "",
  337. txt_SpecificEvents_after: "events:",
  338. txt_next: "next",
  339. txt_prev: "prev",
  340. txt_NextEvents: "Next events:",
  341. txt_GoToEventUrl: "See the event",
  342. showDayAsWeeks: true,
  343. startWeekOnMonday: true,
  344. showDayNameInCalendar: true,
  345. showDescription: false,
  346. onlyOneDescription: true,
  347. openEventInNewWindow: false,
  348. eventsScrollable: false,
  349. moveSpeed: 500, // speed of month move when you clic on a new date
  350. moveOpacity: 0.15, // month and events fadeOut to this opacity
  351. jsonData: "", // to load and inline json (not ajax calls)
  352. cacheJson: true // if true plugin get a json only first time and after plugin filter events
  353. // if false plugin get a new json on each date change
  354. };