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
|
(function(module, ns) {
function CalendarData() {
this.struct = {};
}
CalendarData.prototype = {
rootName: 'calendar-data',
compName: 'comp',
propName: 'prop',
/**
* Appends a list of fields
* to a given iCalendar field set.
*
* @param {String} type iCal fieldset (VTODO, VEVENT,...).
*/
select: function(type, list) {
var struct = this.struct;
if (!(type in struct)) {
struct[type] = [];
}
if (list instanceof Array) {
struct[type] = struct[type].concat(list);
} else {
struct[type] = list;
}
return this;
},
/**
* Accepts an object full of arrays
* recuse when encountering another object.
*/
_renderFieldset: function(template, element) {
var tag;
var value;
var i;
var output = '';
var elementOutput = '';
for (tag in element) {
value = element[tag];
for (i = 0; i < value.length; i++) {
if (typeof(value[i]) === 'object') {
elementOutput += this._renderFieldset(
template,
value[i]
);
} else {
elementOutput += template.tag(
['caldav', this.propName],
{ name: value[i] }
);
}
}
output += template.tag(
['caldav', this.compName],
{ name: tag },
elementOutput || null
);
elementOutput = '';
}
return output;
},
/**
* Renders CalendarData with a template.
*
* @param {WebCals.Template} template calendar to render.
* @return {String} <calendardata /> xml output.
*/
render: function(template) {
var struct = this.struct;
var output = template.tag(
['caldav', this.rootName],
template.tag(
['caldav', this.compName],
{ name: 'VCALENDAR' },
this._renderFieldset(template, struct)
)
);
return output;
}
};
module.exports = CalendarData;
}.apply(
this,
(this.Webcals) ?
[Webcals('templates/calendar_data'), Webcals] :
[module, require('../webcals')]
));
|