PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/backend/WebPro/plugins/kalendar/kalendar.js

https://gitlab.com/kaouech/theme
JavaScript | 360 lines | 348 code | 12 blank | 0 comment | 59 complexity | 7594a35bd74b0c661f7cdb3c88cbba1d MD5 | raw file
  1. ;(function($, window, document, undefined) {
  2. var defaults = {
  3. startMonth: new Date().getMonth(),
  4. startYear: new Date().getFullYear(),
  5. firstDayOfWeek: "Monday",
  6. events: [],
  7. color: "red",
  8. showdays: true,
  9. tracking: true,
  10. template: '<div class="c-month-view">'+
  11. '<div class="c-month-arrow-left"><i class="fa fa-angle-left"></i> </div>'+
  12. '<p></p>'+
  13. '<div class="c-month-arrow-right"><i class="fa fa-angle-right"></i> </div>'+
  14. '</div>'+
  15. '<div class="c-holder">'+
  16. '<div class="c-grid"></div>'+
  17. '<div class="c-specific">'+
  18. '<div class="specific-day">'+
  19. '<div class="specific-day-info" i="date"></div>'+
  20. '<div class="specific-day-info" i="day"></div>'+
  21. '</div>'+
  22. '<div class="s-scheme"></div>'+
  23. '</div>'+
  24. '</div>',
  25. calendar_elements: {
  26. monthShow: '.c-month-view p',
  27. prevMonth: '.c-month-arrow-left',
  28. nextMonth: '.c-month-arrow-right',
  29. grid: '.c-grid',
  30. specday_trigger: ".specific-day",
  31. specday_day: ".specific-day-info[i=day]",
  32. specday_date: ".specific-day-info[i=date]",
  33. specday_scheme: ".s-scheme"
  34. },
  35. monthHuman: [["JAN","January"],["FEB","February"],["MAR","March"],["APR","April"],["MAY","May"],["JUN","June"],["JUL","July"],["AUG","August"],["SEP","September"],["OCT","October"],["NOV","November"],["DEC","December"]],
  36. dayHuman: [["S","Sunday"],["M","Monday"],["T","Thursday"],["W","Wednesday"],["T","Thursday"],["F","Friday"],["S","Saturday"]],
  37. dayMachine: function(s) {
  38. var a = [];a["Sunday"] = 0;a["Monday"] = 1;a["Tuesday"] = 2;a["Wednesday"] = 3;a["Thursday"] = 4;a["Friday"] = 5;a["Saturday"] = 6;
  39. return a[s];
  40. },
  41. urlText: "View on Web",
  42. onInitiated: function() { console.log("initiated")},
  43. onGoogleParsed: function() { console.log("googleparsed")},
  44. onMonthChanged: function() {console.log('monthshow')},
  45. onDayShow: function() { console.log('dayshow')},
  46. onGridShow: function() { console.log("gridshow")},
  47. onDayClick: function(e) { console.log(e.data.info)}
  48. }
  49. function kalendar(element, options) {
  50. this.options = $.extend(true, {}, defaults, options);
  51. this.element = element;
  52. this.currentMonth = this.options.startMonth;
  53. this.currentYear = this.options.startYear;
  54. this.currentTimeSet = new Date(this.options.startYear, this.options.startMonth);
  55. this.firstDayOfWeek = [this.options.dayMachine(this.options.firstDayOfWeek), this.options.firstDayOfWeek];
  56. this.currentTime = new Date();
  57. this.currentTime.setHours(0,0,0,0);
  58. if(this.options.tracking) {
  59. this.tracking();
  60. }
  61. this.googleCal();
  62. }
  63. kalendar.prototype.tracking = function() {
  64. $trackimg = $('<img src="">');
  65. this.trackimg = $trackimg;
  66. this.element.append(this.trackimg);
  67. var trackobj = {
  68. url: window.location.href,
  69. color: this.options.color,
  70. showdays: this.options.showdays,
  71. firstdayofweek: this.options.firstDayOfWeek
  72. };
  73. var src = 'http://www.ericwenn.se/php/trackingkalendar.php';
  74. var i = 0;
  75. $.each(trackobj, function(k,v) {
  76. src += (i==0?'?':'&')+k+'='+encodeURIComponent(v);
  77. i++;
  78. });
  79. this.trackimg.attr('src',src);
  80. }
  81. kalendar.prototype.googleCal = function() {
  82. var f = function(c,k) {
  83. $.getJSON("https://www.googleapis.com/calendar/v3/calendars/"+c+"/events?key="+k, function(data) {
  84. for(var i=0;i<data.items.length;i++) {
  85. var it = data.items[i],
  86. tstart = new Date(it.start.dateTime),
  87. tend = new Date(it.end.dateTime),
  88. t = {
  89. title:it.summary,
  90. location: it.location,
  91. start: {
  92. date: dToFormat(tstart, "YYYYMMDD"),
  93. time: dToFormat(tstart, "HH.MM"),
  94. d: new Date(it.start.dateTime)
  95. },
  96. end : {
  97. date: dToFormat(tend, "YYYYMMDD"),
  98. time: dToFormat(tend, "HH.MM"),
  99. d: new Date(it.end.dateTime)
  100. }
  101. }
  102. tempEvents = pushToParsed(tempEvents, t);
  103. }
  104. });
  105. }
  106. var tempEvents = this.options.eventsParsed;
  107. if(!!this.options.googleCal) {
  108. if(this.options.googleCal instanceof Array) {
  109. for(var a=0;a<this.options.googleCal.length;a++) {
  110. f(this.options.googleCal[a].calendar, this.options.googleCal[a].apikey);
  111. }
  112. } else {
  113. f(this.options.googleCal.calendar, this.options.googleCal.apikey);
  114. }
  115. }
  116. this.options.eventsParsed = tempEvents;
  117. this.init();
  118. !!this.options.googleCal ? this.options.onGoogleParsed() : null;
  119. }
  120. kalendar.prototype.init = function() {
  121. this.element.html(this.options.template);
  122. this.element.attr('ewcalendar','');
  123. this.element.attr('color', this.options.color);
  124. this.elements = {};
  125. for(var ele in this.options.calendar_elements) {
  126. this.elements[ele] = this.element.find(this.options.calendar_elements[ele]);
  127. }
  128. this.setMonth();
  129. this.elements.prevMonth.on('click', {"self": this, "dir": "prev"}, this.changeMonth);
  130. this.elements.nextMonth.on('click', {"self": this, "dir": "next"}, this.changeMonth);
  131. this.options.onInitiated();
  132. }
  133. kalendar.prototype.changeMonth = function(e) {
  134. var self = e.data.self;
  135. var dir = e.data.dir;
  136. self.currentMonth += dir == 'prev' ? -1 : 1;
  137. self.currentTimeSet = new Date(self.currentYear, self.currentMonth);
  138. self.currentMonth = self.currentTimeSet.getMonth();
  139. self.currentYear = self.currentTimeSet.getFullYear();
  140. self.setMonth();
  141. }
  142. kalendar.prototype.setMonth = function() {
  143. var $grid = this.elements.grid;
  144. $grid.html('');
  145. this.elements.monthShow.html(this.options.monthHuman[this.currentTimeSet.getMonth()][1]+' '+this.currentTimeSet.getFullYear());
  146. if(this.options.showdays) {
  147. $dayView = $('<div class="c-row"></div>');
  148. for(var i=0;i<7;i++) {
  149. var id = this.firstDayOfWeek[0] + i;
  150. id -= id > 6 ? 7 : 0;
  151. $dayView.append('<div class="c-day c-l"><div class="date-holder">'+this.options.dayHuman[id][0]+'</div></div>');
  152. }
  153. $grid.append($dayView);
  154. }
  155. var tempDate = new Date(this.currentTimeSet),
  156. diffdays = tempDate.getDay() - this.firstDayOfWeek[0];
  157. diffdays += diffdays < 1 ? 7 : 0;
  158. tempDate.setDate(tempDate.getDate() - diffdays);
  159. for(var i=0;i<42;i++) {
  160. if(i==0 || i%7==0) {
  161. $row = $('<div class="c-row"></div>');
  162. $grid.append($row);
  163. }
  164. $day = $('<div class="c-day"><div class="date-holder">'+tempDate.getDate()+'</div></div>');
  165. if(tempDate.getMonth() !== this.currentTimeSet.getMonth()) {
  166. $day.addClass('other-month');
  167. $day.on('click', { "info": "other-month"}, this.options.onDayClick);
  168. } else if(tempDate.getTime() == this.currentTime.getTime()) {
  169. $day.addClass('this-day');
  170. $day.on('click', { "info": "this-day"}, this.options.onDayClick);
  171. } else {
  172. $day.on('click', { "info": "this-month"}, this.options.onDayClick);
  173. }
  174. var strtime = dToFormat(tempDate, "YYYYMMDD");
  175. if(this.options.eventsParsed[strtime] !== undefined) {
  176. $day.addClass('have-events');
  177. $eventholder = $('<div class="event-n-holder"></div>');
  178. for(var u=0;u<3 && u<this.options.eventsParsed[strtime].length;u++) {
  179. $eventholder.append('<div class="event-n"></div>')
  180. }
  181. $day.on('click', { "day": this.options.eventsParsed[strtime], "self": this, "date": tempDate.getTime(), "strtime": strtime}, this.showDay);
  182. $day.append($eventholder);
  183. }
  184. $row.append($day);
  185. tempDate.setDate(tempDate.getDate() + 1);
  186. }
  187. this.options.onMonthChanged();
  188. }
  189. kalendar.prototype.showDay = function(e) {
  190. var events = e.data.day,
  191. self = e.data.self,
  192. date = new Date(e.data.date),
  193. strtime = e.data.strtime;
  194. self.element.addClass('spec-day');
  195. self.elements.specday_day.html(self.options.dayHuman[date.getDay()][1]);
  196. self.elements.specday_date.html(date.getDate());
  197. self.elements.specday_trigger.on('click', {"self": self}, self.hideDay);
  198. for(var i=0;i<events.length;i++) {
  199. ev = events[i];
  200. var ev_h = "",
  201. ev_p = "",
  202. ev_a = "",
  203. ev_b = "";
  204. if(!!ev.color) {
  205. var c = self.options.eventcolors[ev.color];
  206. if(!!c) {
  207. ev_h = !!c.text ? 'style="color:'+c.text+'"' : "";
  208. ev_p = !!c.text ? 'style="color:'+c.text+';opacity:0.5"' : "";
  209. ev_a = !!c.link ? 'style="color:'+c.link+'"' : "";
  210. ev_b = !!c.background ? 'style="background-color:'+c.background+'"' : "";
  211. }
  212. }
  213. $event = $('<div class="s-event" '+ev_b+'></div>');
  214. $event.append('<h5 '+ev_h+'>'+events[i].title+'</h5>');
  215. var start = {
  216. date: ev.start.date == strtime ? "": ev.start.d.getDate(),
  217. month: ev.start.date == strtime ? "": self.options.monthHuman[ev.start.d.getMonth()][1],
  218. year: ev.start.d.getFullYear() == self.currentYear ? "": ev.start.d.getFullYear()
  219. },
  220. end = {
  221. date: ev.end.date == strtime ? "": ev.end.d.getDate(),
  222. month: ev.end.date == strtime ? "": self.options.monthHuman[ev.end.d.getMonth()][1],
  223. year: ev.end.d.getFullYear() == self.currentYear ? "": ev.end.d.getFullYear()
  224. };
  225. var start = start.date +" "+start.month+" "+start.year+" "+ev.start.time,
  226. end = end.date +" "+end.month+" "+end.year+" "+ev.end.time;
  227. $event.append('<p '+ev_p+'>'+start+' - '+end+'</p>');
  228. !!events[i].location ? $event.append('<p '+ev_p+'>'+events[i].location+'</p>') : null;
  229. !!events[i].url ? $event.append('<p><a '+ev_a+' href="'+events[i].url+'">'+self.options.urlText+'</a></p>') : null;
  230. self.elements.specday_scheme.append($event);
  231. }
  232. self.options.onDayShow();
  233. }
  234. kalendar.prototype.hideDay = function(e) {
  235. var self = e.data.self;
  236. self.element.removeClass('spec-day');
  237. self.elements.specday_scheme.html('');
  238. self.options.onGridShow();
  239. }
  240. $.fn.kalendar = function(options) {
  241. return this.each(function() {
  242. if(options.events !== undefined) {
  243. options.eventsParsed = [];
  244. for(var i=0;i<options.events.length;i++) {
  245. var thisevent = options.events[i];
  246. thisevent.end.date = thisevent.end.date == undefined ? thisevent.start.date : thisevent.end.date;
  247. thisevent.start.d = formatToD([thisevent.start.date, thisevent.start.time], "YYYYMMDDHHMM");
  248. thisevent.end.d = formatToD([thisevent.end.date, thisevent.end.time], "YYYYMMDDHHMM");
  249. options.eventsParsed = pushToParsed(options.eventsParsed, thisevent);
  250. }
  251. }
  252. options.source = "JS";
  253. var kalendar_instance = new kalendar($(this), options);
  254. $(this).data('kalendar-instance', kalendar_instance);
  255. });
  256. }
  257. function pushToParsed(o, e) {
  258. var pusher = function(o,e,d) {
  259. var d = !!d ? d: e.start.date;
  260. var t = {
  261. title: e.title,
  262. url: e.url,
  263. start: {
  264. date: e.start.date,
  265. time: e.start.time,
  266. d: e.start.d
  267. },
  268. end: {
  269. date:e.end.date,
  270. time: e.end.time,
  271. d: e.end.d
  272. },
  273. location: e.location,
  274. allDay: e.allDay,
  275. color: e.color
  276. };
  277. if(!o[d]) {
  278. o[d] = [];
  279. }
  280. o[d].push(t);
  281. }
  282. e.start.date = parseInt(e.start.date);
  283. e.end.date = parseInt(e.end.date);
  284. if(e.start.date > e.end.date) {
  285. console.warn("The party was over before it started. That’s just an expression.",e);
  286. } else if(typeof e.start.date !== "number" || typeof e.end.date !== "number" || isNaN(e.end.date) || isNaN(e.start.date)) {
  287. console.warn("There is something wrong with this event, so it was skipped. Take a look at it", e);
  288. } else {
  289. if(e.start.date == e.end.date) {
  290. pusher(o,e);
  291. } else {
  292. var dstart = formatToD(e.start.date, "YYYYMMDD"),
  293. dend = formatToD(e.end.date, "YYYYMMDD"),
  294. diff = (dend.getTime() - dstart.getTime())/86400000;
  295. for(var i=0;i<=diff;i++) {
  296. var tempEvent = $.extend(true,{}, e),
  297. tempDate = new Date(dstart.getTime() + 86400000*i),
  298. date = dToFormat(tempDate,"YYYYMMDD");
  299. if(i==0) {
  300. pusher(o, tempEvent, date);
  301. } else if(i==diff) {
  302. pusher(o, tempEvent, date);
  303. } else {
  304. tempEvent.allDay = true;
  305. pusher(o, tempEvent, date);
  306. }
  307. }
  308. }
  309. }
  310. return o;
  311. }
  312. function dToFormat(d,f) {
  313. var ff = function(d) {
  314. return d<10?0+''+d:d;
  315. }
  316. if(f == "YYYYMMDD") {
  317. var year = d.getFullYear(),
  318. month = ff(d.getMonth()+1),
  319. date = ff(d.getDate());
  320. return year+''+month+''+date;
  321. } else if(f == "HH.MM") {
  322. var hr = ff(d.getHours()+1),
  323. min = ff(d.getMinutes()+1)
  324. return hr+'.'+min;
  325. }
  326. }
  327. function formatToD(s,f) {
  328. if(f == "YYYYMMDD") {
  329. s = s.toString();
  330. d = new Date();
  331. d.setYear(s.substring(0,4));
  332. d.setMonth(s.substring(4,6)-1);
  333. d.setDate(s.substring(6,8));
  334. } else if(f == "YYYYMMDDHHMM") {
  335. d = new Date();
  336. st = s[0].toString();
  337. d.setYear(st.substring(0,4));
  338. d.setMonth(st.substring(4,6)-1);
  339. d.setDate(st.substring(6,8));
  340. st = s[1].toString();
  341. st = st.split(".")[0].length < 2 ? "0"+st : st;
  342. d.setHours(st.substring(0,2));
  343. d.setMinutes(st.substring(3,5));
  344. d.setSeconds(00);
  345. }
  346. return d;
  347. }
  348. })(jQuery, window, document);