forked from imightbeamy/gcal-multical-event-merge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
events.js
102 lines (85 loc) · 3.01 KB
/
events.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
'use strict';
function EventMerger(key_function, clean_up_function) {
this.makeKey = key_function;
this.cleanUp = clean_up_function;
}
EventMerger.prototype = {
getEventSets: function ($events) {
var event_sets = {},
makeKey = this.makeKey;
$events.each(function () {
var $event = $(this),
key = makeKey($event).replace(/\s/g, '');
event_sets[key] = event_sets[key] || [];
event_sets[key].push($event);
});
return event_sets;
},
makeStripes: function (colors) {
var gradient = "repeating-linear-gradient( 45deg,",
pos = 0;
$.each(colors, function (i, c) {
gradient += c + " " + pos + "px,";
pos += 10;
gradient += c + " " + pos + "px,";
});
gradient = gradient.slice(0, -1);
gradient += ")";
return gradient;
},
mergeEvents: function (name, event_set) {
if (event_set.length > 1) {
var colors = $.map(event_set, function (event) {
return $(event).css('background-color');
});
var keep = event_set.shift();
$(event_set).each(function () {
$(this).parent().remove();
});
keep.css('background-image', this.makeStripes(colors));
this.cleanUp && this.cleanUp(keep);
}
},
mergeSets: function ($events) {
var sets = this.getEventSets($events);
$.each(sets, $.proxy(this.mergeEvents, this));
}
};
/*****************************************************************************/
function eventKey($event) {
var event_name = $event.find('dd span').text(),
event_time = $event.find('dt').text(),
col = $event.parents('.tg-col-eventwrapper').attr('id');
return event_name + event_time + col;
}
function cleanUp($event) {
var chip = $event.parents('.chip'),
left = Number(chip.css('left').replace(/[%px]*/g, ''));
chip.css('width', 100 - left + "%");
}
var merger = new EventMerger(eventKey, cleanUp);
$(document).on("DOMNodeInserted", ".tg-mainwrapper", function () {
merger.mergeSets($('dl'));
});
/*****************************************************************************/
// merge day-long events, on top of week mode display
function dayLongEventKey($event) {
var event_name = $event.text(),
$td = $event.parents('td'),
days = $td.attr("colspan") || 1,
col = $td.position().left;
return event_name + col + days;
}
var dayLongMerger = new EventMerger(dayLongEventKey);
$(document).on("DOMNodeInserted", "#topcontainerwk", function () {
dayLongMerger.mergeSets($(".rb-n"));
});
// ...and now, in month-view display
function monthDayEventKey($event) {
var row = $event.parents('.month-row').index();
return dayLongEventKey($event) + row;
}
var monthViewMerger = new EventMerger(monthDayEventKey);
$(document).on("DOMNodeInserted", ".mv-container", function () {
monthViewMerger.mergeSets($(".rb-n"));
});