1 | scheduler.ical={
|
---|
2 | parse:function(str){
|
---|
3 | var data = str.match(RegExp(this.c_start+"[^\f]*"+this.c_end,""));
|
---|
4 | if (!data.length) return;
|
---|
5 |
|
---|
6 | //unfolding
|
---|
7 | data[0]=data[0].replace(/[\r\n]+(?=[a-z \t])/g," ");
|
---|
8 | //drop property
|
---|
9 | data[0]=data[0].replace(/\;[^:\r\n]*/g,"");
|
---|
10 |
|
---|
11 |
|
---|
12 | var incoming=[];
|
---|
13 | var match;
|
---|
14 | var event_r = RegExp("(?:"+this.e_start+")([^\f]*?)(?:"+this.e_end+")","g");
|
---|
15 | while (match=event_r.exec(data)){
|
---|
16 | var e={};
|
---|
17 | var param;
|
---|
18 | var param_r = /[^\r\n]+[\r\n]+/g;
|
---|
19 | while (param=param_r.exec(match[1]))
|
---|
20 | this.parse_param(param.toString(),e);
|
---|
21 | if (e.uid && !e.id) e.id = e.uid; //fallback to UID, when ID is not defined
|
---|
22 | incoming.push(e);
|
---|
23 | }
|
---|
24 | return incoming;
|
---|
25 | },
|
---|
26 | parse_param:function(str,obj){
|
---|
27 | var d = str.indexOf(":");
|
---|
28 | if (d==-1) return;
|
---|
29 |
|
---|
30 | var name = str.substr(0,d).toLowerCase();
|
---|
31 | var value = str.substr(d+1).replace(/\\\,/g,",").replace(/[\r\n]+$/,"");
|
---|
32 | if (name=="summary")
|
---|
33 | name="text";
|
---|
34 | else if (name=="dtstart"){
|
---|
35 | name = "start_date";
|
---|
36 | value = this.parse_date(value,0,0);
|
---|
37 | }
|
---|
38 | else if (name=="dtend"){
|
---|
39 | name = "end_date";
|
---|
40 | if (obj.start_date && obj.start_date.getHours()==0)
|
---|
41 | value = this.parse_date(value,24,00);
|
---|
42 | else
|
---|
43 | value = this.parse_date(value,23,59);
|
---|
44 | }
|
---|
45 | obj[name]=value;
|
---|
46 | },
|
---|
47 | parse_date:function(value,dh,dm){
|
---|
48 | var t = value.split("T");
|
---|
49 | if (t[1]){
|
---|
50 | dh=t[1].substr(0,2);
|
---|
51 | dm=t[1].substr(2,2);
|
---|
52 | }
|
---|
53 | var dy = t[0].substr(0,4);
|
---|
54 | var dn = parseInt(t[0].substr(4,2),10)-1;
|
---|
55 | var dd = t[0].substr(6,2);
|
---|
56 | if (scheduler.config.server_utc && !t[1]) { // if no hours/minutes were specified == full day event
|
---|
57 | return new Date(Date.UTC(dy,dn,dd,dh,dm)) ;
|
---|
58 | }
|
---|
59 | return new Date(dy,dn,dd,dh,dm);
|
---|
60 | },
|
---|
61 | c_start:"BEGIN:VCALENDAR",
|
---|
62 | e_start:"BEGIN:VEVENT",
|
---|
63 | e_end:"END:VEVENT",
|
---|
64 | c_end:"END:VCALENDAR"
|
---|
65 | }; |
---|