/* CalDavZAP - the open source CalDAV Web Client Copyright (C) 2011-2015 Jan Mate <jan.mate@inf-it.com> Andrej Lezo <andrej.lezo@inf-it.com> Matej Mihalik <matej.mihalik@inf-it.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ String.prototype.parseComnpactISO8601=function(uid) { if(this.length>=15) var formattedString=this.substring(0, 4)+'/'+this.substring(4, 6)+'/'+this.substring(6, 8)+' '+this.substring(9, 11)+':'+this.substring(11, 13)+':'+this.substring(13, 15); else var formattedString=this.substring(0, 4)+'/'+this.substring(4, 6)+'/'+this.substring(6, 8)+' '+'00:00:00'; var value=Date.parse(formattedString); if(isNaN(value)) return false else return new Date(value); } function repeatStartCompare(objA,objB) { var startA='',startB=''; if(objA.rec_id!='') startA=objA.rec_id.parseComnpactISO8601(); else if(objA.start) startA=new Date(objA.start.getTime()); else if(objA.end) startA=new Date(objA.end.getTime()); else startA=Infinity; if(objB.rec_id!='') startB=objB.rec_id.parseComnpactISO8601(); else if(objB.start) startB=new Date(objB.start.getTime()); else if(objB.end) startB=new Date(objB.end.getTime()); else startB=Infinity; if(startA<startB) return -1; if(startA>startB) return 1; return 0; } function findWeek(weekNo,inDate,day) { var distance = (day + 7 - inDate.getDay()) % 7; var date = new Date(inDate.getTime()); date.setDate(date.getDate() + distance); if(date.getWeekNo() <= weekNo) date.setDate(date.getDate() + 7*(weekNo-date.getWeekNo())); else { var actualYearWeeks = new Date(date.getFullYear(),11,31,1,1,1).getWeekNo(); date.setDate(date.getDate() + 7*(actualYearWeeks-date.getWeekNo())); } } String.prototype.getSecondsFromOffset=function() { if(this.length>=5) { var hours=this.substring(1,3); var minutes=this.substring(3,5); var seconds='00'; if(this.length>=7) seconds=this.substring(5,7); var value=parseInt(hours,10)*60*60+parseInt(minutes,10)*60+parseInt(seconds,10); if(this.charAt(0)=='-') value=value*-1; if(!isNaN(value)) return value else return 0; } else return 0; } Array.prototype.indexElementOf=function(value) { for(var i=0;i<this.length;i++) if(this[i].indexOf(value)!=-1) return i; return -1; } function setAlertTimeouts(isTodo, alertTime, dateStart, dateEnd, params, firstInstance, uid) { var alertTimeOut=new Array(); if(isTodo && dateEnd!='') { if(typeof dateEnd=='string') dateStart = dateEnd; else dateStart=new Date(dateEnd.getTime()); } else if(isTodo && dateStart!='') { if(typeof dateStart=='string') dateEnd=dateStart; else dateEnd=new Date(dateStart.getTime()); } if(alertTime.length>0) { for(var v=0;v<alertTime.length;v++) { if((alertTime[v].charAt(0)=='-') || (alertTime[v].charAt(0)=='+') || firstInstance) { var startTime; var aTime=''; if((dateStart!='' || dateEnd!='') && alertTime[v].charAt(0)=='-') { if(typeof dateStart=='string') startTime = $.fullCalendar.parseDate(dateStart); else startTime=new Date(dateStart.getTime()); aTime=startTime.getTime() - parseInt(alertTime[v].substring(1, alertTime[v].length-1)); } else if((dateStart!='' || dateEnd!='') && alertTime[v].charAt(0)=='+') { if(typeof dateEnd=='string') startTime = $.fullCalendar.parseDate(dateEnd); else startTime=new Date(dateEnd.getTime()); aTime=startTime.getTime() + parseInt(alertTime[v].substring(1, alertTime[v].length-1)); } else if(firstInstance) { aTime=$.fullCalendar.parseDate(alertTime[v]); if(isTodo) var displayDate=(dateEnd=='' ? dateStart : dateEnd); else var displayDate=dateStart; if(displayDate!='') startTime = new Date(displayDate.getTime()); else startTime=''; } var now=new Date(); if(aTime!==''&&aTime>now) { var delay=aTime-now; if(maxAlarmValue<delay) delay=maxAlarmValue; if(isTodo) alertTimeOut[alertTimeOut.length]=setTimeout(function(startTime){ showAlertTODO(uid, (aTime-now), {start:(startTime!='' ? new Date(startTime.getTime()) : ''), status:params.status, title:params.title}); }, delay,startTime); else alertTimeOut[alertTimeOut.length]=setTimeout(function(startTime){ showAlertEvents(uid, (aTime-now), {start:new Date(startTime.getTime()), allDay:params.allDay, title:params.title}); }, delay,startTime); } } } } return alertTimeOut; } function isInRecurrenceArray(varDate,stringUID,recurrence_id_array, tzName) { var checkRec=false; var checkDate=''; if(typeof varDate=='string') checkDate=$.fullCalendar.parseDate(varDate); else checkDate=new Date(varDate.getTime()); if(recurrence_id_array.length>0) { for(var ir=0;ir<recurrence_id_array.length;ir++) { var recString = recurrence_id_array[ir].split(';')[0]; if(recString.charAt(recString.length-1)=='Z') { if(globalSettings.timezonesupport.value && tzName in timezones) { var recValOffsetFrom=getOffsetByTZ(tzName, varDate); var recTime = new Date(recString.parseComnpactISO8601().getTime()); if(recValOffsetFrom) { var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000; recTime.setTime(recTime.getTime()+rintOffset); } if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID) checkRec=true; } } else { if(recString.parseComnpactISO8601().toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID) checkRec=true; } } } return checkRec; } function applyTimezone(previousTimezone,isEventLocal) { updateMainLoaderTextTimezone(); $('#MainLoader').show(); var eventsDone=false; var todosDone=false; var collections=globalResourceCalDAVList.collections; var todoCollections=globalResourceCalDAVList.TodoCollections; var calendarCount=0, calendarCounter=0; var todoCount=0, todoCounter=0; for(var i=0;i<collections.length;i++) if(collections[i].uid!=undefined) calendarCount++; for(var i=0;i<todoCollections.length;i++) if(todoCollections[i].uid!=undefined) todoCount++; var eventsArray=globalEventList.displayEventsArray; var todosArray=globalEventList.displayTodosArray; for(var i=0;i<collections.length;i++) if(collections[i].uid!=undefined) { setTimeout(function(i){ for(var j=0;j<eventsArray[collections[i].uid].length;j++) { if(eventsArray[collections[i].uid][j].timeZone=='local' || eventsArray[collections[i].uid][j].allDay) continue; var dateStart=eventsArray[collections[i].uid][j].start; var previousOffset=getOffsetByTZ(previousTimezone, dateStart).getSecondsFromOffset(); var actualOffset=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') actualOffset=getOffsetByTZ(globalSessionTimeZone, dateStart).getSecondsFromOffset(); else actualOffset=dateStart.getTimezoneOffset()*60*-1; //if timezonesupport is turned off go to local if(typeof isEventLocal!='undefined') actualOffset=getOffsetByTZ(eventsArray[collections[i].uid][j].timeZone, dateStart).getSecondsFromOffset(); if(typeof isEventLocal!='undefined' && !isEventLocal) var intOffset=(previousOffset-actualOffset)*1000; else var intOffset=(actualOffset-previousOffset)*1000; eventsArray[collections[i].uid][j].start.setTime(eventsArray[collections[i].uid][j].start.getTime()+intOffset); if(eventsArray[collections[i].uid][j].end) eventsArray[collections[i].uid][j].end.setTime(eventsArray[collections[i].uid][j].end.getTime()+intOffset); var calEvent=eventsArray[collections[i].uid][j]; if(j==0 || j>0 && eventsArray[collections[i].uid][j].id!=eventsArray[collections[i].uid][j-1].id) if(calEvent.alertTime.length>0) { for(var k=0; k<calEvent.alertTimeOut.length; k++) clearTimeout(calEvent.alertTimeOut[k]); var aTime='', now=new Date(); for(var alarmIterator=0;alarmIterator<calEvent.alertTime.length;alarmIterator++) { if(eventsArray[collections[i].uid][j].start!=null && calEvent.alertTime[alarmIterator].charAt(0)=='-') aTime=eventsArray[collections[i].uid][j].start.getTime() - parseInt(calEvent.alertTime[alarmIterator].substring(1, calEvent.alertTime[alarmIterator].length-1)); else if(eventsArray[collections[i].uid][j].end!=null && calEvent.alertTime[alarmIterator].charAt(0)=='+') aTime=eventsArray[collections[i].uid][j].end.getTime() + parseInt(calEvent.alertTime[alarmIterator].substring(1, calEvent.alertTime[alarmIterator].length-1)); else { var previousOffset=getOffsetByTZ(previousTimezone, $.fullCalendar.parseDate(calEvent.alertTime[alarmIterator])).getSecondsFromOffset(); var actualOffset=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') actualOffset=getOffsetByTZ(globalSessionTimeZone, $.fullCalendar.parseDate(calEvent.alertTime[alarmIterator])).getSecondsFromOffset(); else actualOffset=$.fullCalendar.parseDate(calEvent.alertTime[alarmIterator]).getTimezoneOffset()*60*-1; if(typeof isEventLocal!='undefined') actualOffset=getOffsetByTZ(eventsArray[collections[i].uid][j].timeZone, $.fullCalendar.parseDate(calEvent.alertTime[alarmIterator])).getSecondsFromOffset(); if(typeof isEventLocal!='undefined' && !isEventLocal) var intOffset=(previousOffset-actualOffset)*1000; else var intOffset=(actualOffset-previousOffset)*1000; aTime=new Date($.fullCalendar.parseDate(calEvent.alertTime[alarmIterator]).getTime()+intOffset); eventsArray[collections[i].uid][j].alertTime[alarmIterator]=$.fullCalendar.formatDate(aTime, "yyyy-MM-dd HH:mm:ss"); } if(aTime>now) { var delay=aTime-now; if(maxAlarmValue<delay) delay=maxAlarmValue; eventsArray[collections[i].uid][j].alertTimeOut[alarmIterator]=setTimeout(function(){ showAlertEvents(calEvent.id, (aTime-now), {start:calEvent.start, allDay:calEvent.allDay, title:calEvent.title}); }, delay); } } } } calendarCounter++; if(calendarCounter==calendarCount) { refetchCalendarEvents(); eventsDone=true; if(todosDone) $('#MainLoader').hide(); } },10,i); } for(var i=0;i<todoCollections.length;i++) if(todoCollections[i].uid!=undefined) { setTimeout(function(i){ for(var j=0;j<todosArray[todoCollections[i].uid].length;j++) { if(todosArray[todoCollections[i].uid][j].start) { if(typeof todosArray[todoCollections[i].uid][j].start =='string') todosArray[todoCollections[i].uid][j].start = $.fullCalendar.parseDate(todosArray[todoCollections[i].uid][j].start); var dateStart = todosArray[todoCollections[i].uid][j].start; var previousOffset=getOffsetByTZ(previousTimezone, dateStart).getSecondsFromOffset(); var actualOffset=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') actualOffset=getOffsetByTZ(globalSessionTimeZone, dateStart).getSecondsFromOffset(); else actualOffset=dateStart.getTimezoneOffset()*60*-1; var intOffset=(actualOffset-previousOffset)*1000; todosArray[todoCollections[i].uid][j].start.setTime(todosArray[todoCollections[i].uid][j].start.getTime()+intOffset); } if(todosArray[todoCollections[i].uid][j].end) { if(typeof todosArray[todoCollections[i].uid][j].end =='string') todosArray[todoCollections[i].uid][j].end=$.fullCalendar.parseDate(todosArray[todoCollections[i].uid][j].end); var dateEnd = todosArray[todoCollections[i].uid][j].end; var previousOffset=getOffsetByTZ(previousTimezone, dateEnd).getSecondsFromOffset(); var actualOffset=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') actualOffset=getOffsetByTZ(globalSessionTimeZone, dateEnd).getSecondsFromOffset(); else actualOffset=dateEnd.getTimezoneOffset()*60*-1; if(typeof isEventLocal!='undefined') actualOffset=getOffsetByTZ(todosArray[todoCollections[i].uid][j].timeZone, dateStart).getSecondsFromOffset(); if(typeof isEventLocal!='undefined' && !isEventLocal) var intOffset=(previousOffset-actualOffset)*1000; else var intOffset=(actualOffset-previousOffset)*1000; todosArray[todoCollections[i].uid][j].end.setTime(todosArray[todoCollections[i].uid][j].end.getTime()+intOffset); } var todoEvent=todosArray[todoCollections[i].uid][j]; if(j==0 || j>0 && todosArray[todoCollections[i].uid][j].id!=todosArray[todoCollections[i].uid][j-1].id) if(todoEvent.alertTime.length>0) { if(todoEvent.end) var showDate= new Date(todoEvent.end.getTime()); else if(todoEvent.start) var showDate= new Date(todoEvent.start.getTime()); else var showDate=new Date(); for(var k=0; k<todoEvent.alertTimeOut.length; k++) clearTimeout(todoEvent.alertTimeOut[k]); var aTime='', now=''; for(var alarmIterator=0;alarmIterator<todoEvent.alertTime.length;alarmIterator++) { if(todoEvent.alertTime[alarmIterator].charAt(0)=='-' || todoEvent.alertTime[alarmIterator].charAt(0)=='+') { aTime=showDate.getTime(); var dur=parseInt(todoEvent.alertTime[alarmIterator].substring(1, todoEvent.alertTime[alarmIterator].length-1)); if(todoEvent.alertTime[alarmIterator].charAt(0)=='-') aTime=aTime-dur; else aTime=aTime+dur; now=new Date(); } else { var previousOffset=getOffsetByTZ(previousTimezone, $.fullCalendar.parseDate(todoEvent.alertTime[alarmIterator])).getSecondsFromOffset(); var actualOffset=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') actualOffset=getOffsetByTZ(globalSessionTimeZone, $.fullCalendar.parseDate(todoEvent.alertTime[alarmIterator])).getSecondsFromOffset(); else actualOffset=$.fullCalendar.parseDate(todoEvent.alertTime[alarmIterator]).getTimezoneOffset()*60*-1; if(typeof isEventLocal!='undefined') actualOffset=getOffsetByTZ(todosArray[todoCollections[i].uid][j].timeZone, $.fullCalendar.parseDate(todoEvent.alertTime[alarmIterator])).getSecondsFromOffset(); if(typeof isEventLocal!='undefined' && !isEventLocal) var intOffset=(previousOffset-actualOffset)*1000; else var intOffset=(actualOffset-previousOffset)*1000; aTime=new Date($.fullCalendar.parseDate(todoEvent.alertTime[alarmIterator]).getTime()+intOffset); todosArray[todoCollections[i].uid][j].alertTime[alarmIterator]=$.fullCalendar.formatDate(aTime, "yyyy-MM-dd HH:mm:ss"); now=new Date(); } if(aTime>now) { var delay=aTime-now; if(maxAlarmValue<delay) delay=maxAlarmValue; todosArray[todoCollections[i].uid][j].alertTimeOut[alarmIterator]=setTimeout(function(){ showAlertEvents(todoEvent.id, (aTime-now), {start:showDate, allDay:todoEvent.allDay, title:todoEvent.title}); }, delay); } } } } todoCounter++; if(todoCounter==todoCount) { refetchTodoEvents(); todosDone=true; if(eventsDone) $('#MainLoader').hide(); } },10,i); } } function getLocalOffset(date) { if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='') return getOffsetByTZ(globalSessionTimeZone, date).getSecondsFromOffset()*-1; else date.getTimezoneOffset()*60; } function changeRuleForFuture(inputEvent, repeatCount) { var vcalendar=inputEvent.vcalendar; var vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RRULE2']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); var ruleParts=parsed[4].split(';'); var foundUntil=false; var parsedLine=parsed[0]; for(var i=0; i<ruleParts.length;i++) { if(ruleParts[i].indexOf('UNTIL')!=-1 || ruleParts[i].indexOf('COUNT')!=-1) { parsedLine=parsedLine.replace(ruleParts[i],'COUNT='+(repeatCount-1)); foundUntil=true; } } if(!foundUntil) { var tmp=parsed[4]+';COUNT='+(repeatCount-1); parsedLine=parsedLine.replace(parsed[4], tmp); } vcalendar=vcalendar.replace(parsed[0], parsedLine); } return vcalendar; } function buildTimezoneComponent(tzName) { var component=''; var dayNames=['SU','MO', 'TU', 'WE', 'TH', 'FR', 'SA']; if(!tzName || tzName=='local' || tzName=='UTC') return component; if(tzName in timezones) { component+='BEGIN:VTIMEZONE\r\nTZID:'+tzName+'\r\n'; for(comp in timezones[tzName]) { if(comp=='daylightComponents') { var daylightC=timezones[tzName].daylightComponents; var compName='DAYLIGHT'; } else if(comp=='standardComponents') { var daylightC=timezones[tzName].standardComponents; var compName='STANDARD'; } for(var i in daylightC) { if(isNaN(i)) continue; component+='BEGIN:'+compName+'\r\n'; for(key in daylightC[i]) { switch(key) { case 'dtStart': component+='DTSTART:'+daylightC[i][key]+'\r\n'; break; case 'tzName': component+='TZNAME:'+daylightC[i][key]+'\r\n'; break; case 'tzOffsetFROM': component+='TZOFFSETFROM:'+daylightC[i][key]+'\r\n'; break; case 'tzOffsetTO': component+='TZOFFSETTO:'+daylightC[i][key]+'\r\n'; break; case 'startMonth': component+='RRULE:FREQ=YEARLY'; if(daylightC[i]['startMonth']) component+=';BYMONTH='+daylightC[i]['startMonth']; if(typeof daylightC[i]['startDay']!='undefined' && typeof dayNames[daylightC[i]['startDay']]!='undefined') { if(!daylightC[i]['startCount']) component+=';BYDAY='+dayNames[daylightC[i]['startDay']]; else component+=';BYDAY='+daylightC[i]['startCount']+dayNames[daylightC[i]['startDay']]; } component+='\r\n'; break; case 'rDates': if(daylightC[i]['rDates']) for(var j=0;j<daylightC[i]['rDates'].length;j++) component+='RDATE:'+daylightC[i]['rDates'][j]+'\r\n'; break; default: break; } } component+='END:'+compName+'\r\n'; } } component+='END:VTIMEZONE\r\n'; } return component; } function getOffsetByTZ(tZone, date,uid) { var offset='+0000'; if(tZone in timezones && tZone!='UTC') { var objDayLight='', objStandard=''; var checkRule=true; var daylightComponents=timezones[tZone].daylightComponents; var actualDaylightComponent; if(daylightComponents) { for(var i=0;i<daylightComponents.length;i++) { if(daylightComponents[i].dtStart.parseComnpactISO8601()>date) continue; if(checkRule && daylightComponents[i].startMonth) // is RRULE SET { objDayLight=daylightComponents[i]; actualDaylightComponent=getDateFromDay(objDayLight, date,false,uid); break; } else { for(var j=0;j<daylightComponents[i].rDates.length; j++) { if(daylightComponents[i].rDates[j].parseComnpactISO8601()<date && (actualDaylightComponent==null || (date-daylightComponents[i].rDates[j].parseComnpactISO8601())<(date-actualDaylightComponent.startDate))) { objDayLight=daylightComponents[i]; actualDaylightComponent={offsetFrom:objDayLight.tzOffsetFROM, offsetTo: objDayLight.tzOffsetTO,startDate: daylightComponents[i].rDates[j].parseComnpactISO8601()}; } } } checkRule=false; } } var standardComponents=timezones[tZone].standardComponents; var actualStandardComponent; checkRule=true; if(standardComponents) { for(var i=0;i<standardComponents.length;i++) { if(standardComponents[i].dtStart.parseComnpactISO8601()>date) continue; if(checkRule && standardComponents[i].startMonth) // is RRULE SET { objDayLight=standardComponents[i]; actualStandardComponent=getDateFromDay(objDayLight, date); break; } else { for(var j=0;j<standardComponents[i].rDates.length; j++) { if(standardComponents[i].rDates[j].parseComnpactISO8601()<date && (actualStandardComponent==null || (date-standardComponents[i].rDates[j].parseComnpactISO8601())<(date-actualStandardComponent.startDate))) { objStandard=standardComponents[i]; actualStandardComponent={offsetFrom:objStandard.tzOffsetFROM, offsetTo: objStandard.tzOffsetTO,startDate: standardComponents[i].rDates[j].parseComnpactISO8601()}; } } } checkRule=false; } } if(actualDaylightComponent && actualStandardComponent) { if(actualDaylightComponent.startDate>actualStandardComponent.startDate) offset=actualDaylightComponent.offsetTo; else offset=actualStandardComponent.offsetTo; } else if(actualDaylightComponent) offset=actualDaylightComponent.offsetTo; else if(actualStandardComponent) offset=actualStandardComponent.offsetTo; } else if(tZone == 'local') offset = getStringLocalOffset(date); return offset; } function getStringLocalOffset(date) { var offset = '+0000'; var localOffset = date.getTimezoneOffset(); if(localOffset>0) { var hours = Math.floor(localOffset/60); var minutes = localOffset - hours*60; offset = '-' + (hours<10 ? '0'+hours : hours); offset += (minutes<10 ? '0'+minutes : minutes); } else if(localOffset<0) { localOffset = localOffset*-1; var hours = Math.floor(localOffset/60); var minutes = localOffset - hours*60; offset = '+' + (hours<10 ? '0'+hours : hours); offset += (minutes<10 ? '0'+minutes : minutes); } return offset; } function getDayLightObject(tzObject,t) { var dayLightStartDate, dayLightEndDate, myDate=t; dayLightStartDate=getDateFromDay(tzObject, t); dayLightEndDate=getDateFromDay(tzObject, t); for(var i=0;i<tzObject.rDatesDT.length;i++) { var dateDT=tzObject.rDatesDT[i].parseComnpactISO8601(); if(dateDT) if(dateDT.getFullYear()==t.getFullYear()) { dayLightStartDate=dateDT; break; } } for(var i=0;i<tzObject.rDatesST.length;i++) { var dateST=tzObject.rDatesST[i].parseComnpactISO8601(); if(dateST && dateST.getFullYear()==t.getFullYear()) { dayLightEndDate=dateST; break; } } if(dayLightStartDate>dayLightEndDate) { if(myDate>dayLightStartDate) dayLightEndDate.setFullYear(dayLightEndDate.getFullYear()+1); else dayLightStartDate.setFullYear(dayLightStartDate.getFullYear()-1); } return {dayLightStartDate : dayLightStartDate, dayLightEndDate: dayLightEndDate}; } function deleteEventFromArray(uid) { var rid=uid.substring(0, uid.lastIndexOf('/')+1); var count=0; if(globalEventList.displayEventsArray[rid]!=null && typeof globalEventList.displayEventsArray[rid] != 'undefined') for(var i=globalEventList.displayEventsArray[rid].length-1;i>=0;i--) if(globalEventList.displayEventsArray[rid][i].id==uid) { count++; for(var o=0;o<globalEventList.displayEventsArray[rid][i].alertTimeOut.length;o++) clearTimeout(globalEventList.displayEventsArray[rid][i].alertTimeOut[o]); globalEventList.displayEventsArray[rid].splice(i, 1); } if(count==0) if(globalEventList.displayTodosArray[rid]!=null && typeof globalEventList.displayTodosArray[rid] != 'undefined') for(var i=globalEventList.displayTodosArray[rid].length-1;i>=0;i--) if(globalEventList.displayTodosArray[rid][i].id==uid) { for(var o=0;o<globalEventList.displayTodosArray[rid][i].alertTimeOut.length;o++) clearTimeout(globalEventList.displayTodosArray[rid][i].alertTimeOut[o]); globalEventList.displayTodosArray[rid].splice(i, 1); } } function findEventInArray(uid, isEvent,repeatHash) { var rid=uid.substring(0, uid.lastIndexOf('/')+1); var firstItem=null; if(isEvent) { for(var i=0; i<globalEventList.displayEventsArray[rid].length;i++) if(globalEventList.displayEventsArray[rid][i].id==uid) return globalEventList.displayEventsArray[rid][i]; } else { for(var i=0; i<globalEventList.displayTodosArray[rid].length;i++) if(globalEventList.displayTodosArray[rid][i].id==uid) { if(typeof repeatHash=='undefined' || repeatHash==null) return globalEventList.displayTodosArray[rid][i]; else if(globalEventList.displayTodosArray[rid][i].repeatHash==repeatHash) return globalEventList.displayTodosArray[rid][i]; else if(firstItem==null) firstItem=globalEventList.displayTodosArray[rid][i]; } } return firstItem || ''; } function getvCalendarstart(inputEvent) { var vcalendar_element='', itsOK=false; var vEvent=inputEvent.vcalendar; if(vEvent.match(vCalendar.pre['vcalendar'])) { vcalendar_element=vEvent.match(vCalendar.pre['beginVTODO']); if(vcalendar_element!=null) { var endVT=vEvent.match(vCalendar.pre['endVTODO']); if(endVT!=null) return '1970-01-01T01:01:01Z'; return false; } vcalendar_element=vEvent.match(vCalendar.pre['beginVEVENT']); if(vcalendar_element==null) itsOK=false; else itsOK=true; if(!itsOK) return false; vcalendar_element=vEvent.match(vCalendar.pre['endVEVENT']); if(vcalendar_element==null) itsOK=false; else itsOK=true; if(!itsOK) return false; var oo='', start='', help1; /* vcalendar_element=vEvent.match(vCalendar.pre['tzone']); if(vcalendar_element!=null) vEvent=vEvent.replace(vcalendar_element[0],''); */ //FIX // var beginTimeZone=vEvent.indexOf('BEGIN:VTIMEZONE'); // var startEndTimeZone=vEvent.lastIndexOf('END:VTIMEZONE'); // var endTimeZone=0; // if(beginTimeZone!=-1 && startEndTimeZone!=-1) // { // for(i=(startEndTimeZone+2);i<vEvent.length;i++) // { // if(vEvent.charAt(i)=='\n') // { // endTimeZone=i+1; // break; // } // } // vTimeZone=vEvent.substring(beginTimeZone, endTimeZone); // vEvent=vEvent.substring(0, beginTimeZone)+vEvent.substring(endTimeZone, vEvent.length); // } vEvent = vEvent.replace(/BEGIN:VTIMEZONE((\s|.)*?)END:VTIMEZONE\r\n/g, ''); vcalendar_element=vEvent.match(vCalendar.pre['contentline_DTSTART']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); start=parsed[4]; help1=start; if(help1.indexOf("T")==-1) help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T00:00:00Z'; else help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15)+'Z'; start=help1; } if(start!='') { var t=$.fullCalendar.parseDate(help1); if((t.toString())=='Invalid Date') return false; } return help1; } else return -1; } function giveMeUntilDate(start, count, frequency, interval, allDay) { var varDate=$.fullCalendar.parseDate(start); var monthPlus=0, dayPlus=0; if(frequency=="DAILY") { monthPlus=0, dayPlus=1; } else if(frequency=="WEEKLY") { monthPlus=0, dayPlus=7; } else if(frequency=="MONTHLY") { monthPlus=1, dayPlus=0; } else if(frequency=="YEARLY") { monthPlus=12, dayPlus=0; } var iterator=1, counter=1; while(iterator<count) { if(counter%interval==0) iterator++; if(allDay) var td=new Date(varDate.getFullYear(), varDate.getMonth()+monthPlus, varDate.getDate()+dayPlus); else var td=new Date(varDate.getFullYear(), varDate.getMonth()+monthPlus, varDate.getDate()+dayPlus, varDate.getHours(), varDate.getMinutes(), varDate.getSeconds()); varDate=td; counter++; } return varDate; } function checkAndFixMultipleUID(vcalendar, isEvent) { var vcalendarOrig = vcalendar; var uidArray={}; var uidC=0; var eventStringArray=new Array(); var componentS = 'VEVENT'; if(!isEvent) componentS='VTODO'; var checkVcalendar = vcalendarOrig; var valarm=checkVcalendar.match(vCalendar.pre['valarm']); if(valarm!=null) checkVcalendar=checkVcalendar.replace(valarm[0], ''); while(checkVcalendar.match(vCalendar.pre['contentline_UID'])!= null) { vcalendar_element=checkVcalendar.match(vCalendar.pre['contentline_UID']); if(vcalendar_element[0]!=null) { if(typeof uidArray[vcalendar_element[0]]=='undefined') { uidArray[vcalendar_element[0]]={isTimezone:false, string:''}; uidC++; } } checkVcalendar=checkVcalendar.replace(vcalendar_element[0], '\r\n'); } if(uidC==1) return [vcalendar]; var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE'); var startEndTimeZone=vcalendarOrig.lastIndexOf('END:VTIMEZONE'); var endTimeZone=0; var vTimeZone=''; if(beginTimeZone!=-1 && startEndTimeZone!=-1) { for(i=(startEndTimeZone+2);i<vcalendarOrig.length;i++) { if(vcalendarOrig.charAt(i)=='\n') { endTimeZone=i+1; break; } } vTimeZone=vcalendarOrig.substring(beginTimeZone, endTimeZone); vcalendarOrig=vcalendarOrig.substring(0, beginTimeZone)+vcalendarOrig.substring(endTimeZone, vcalendarOrig.length); } while(vcalendarOrig.match(vCalendar.pre[componentS.toLowerCase()])!=null) { if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:'+componentS)-2, vcalendarOrig.indexOf('BEGIN:'+componentS))=='\r\n') { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:'+componentS)-2,vcalendarOrig.indexOf('END:'+componentS)+('END:'+componentS).length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); } else { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:'+componentS),vcalendarOrig.indexOf('END:'+componentS)+('END:'+componentS).length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); partEvent+='\r\n'; } var tmpEvent = partEvent; var valarm=tmpEvent.match(vCalendar.pre['valarm']); if(valarm!=null) tmpEvent=tmpEvent.replace(valarm[0], ''); vcalendar_element=tmpEvent.match(vCalendar.pre['contentline_UID']); if(vcalendar_element[0]!=null) { var vcalendar_element_start=tmpEvent.match(vCalendar.pre['contentline_DTSTART']); if(vcalendar_element_start!=null) { var parsed=vcalendar_element_start[0].match(vCalendar.pre['contentline_parse']); var pars=vcalendarSplitParam(parsed[3]); if(pars.indexElementOf('TZID=')!=-1) uidArray[vcalendar_element[0]].isTimezone=true; } if(!isEvent && !uidArray[vcalendar_element[0]].isTimezone) { var vcalendar_element_start=tmpEvent.match(vCalendar.pre['contentline_DUE']); if(vcalendar_element_start!=null) { var parsed=vcalendar_element_start[0].match(vCalendar.pre['contentline_parse']); var pars=vcalendarSplitParam(parsed[3]); if(pars.indexElementOf('TZID=')!=-1) uidArray[vcalendar_element[0]].isTimezone=true; } } uidArray[vcalendar_element[0]].string+=partEvent; } } for(var uid in uidArray) { var vcalendarS = ''; // vEvent BEGIN (required by RFC) if(vCalendar.tplM['begin']!=null && (process_elem=vCalendar.tplM['begin'][0])!=undefined) vcalendarS+=vCalendar.tplM['begin'][0]; else { process_elem=vCalendar.tplC['begin']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vcalendarS+=process_elem; } // VERSION (required by RFC) if(vCalendar.tplM['contentline_VERSION']!=null && (process_elem=vCalendar.tplM['contentline_VERSION'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_VERSION']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); } process_elem=process_elem.replace('##:::##version##:::##', '2.0'); vcalendarS+=process_elem; // CALSCALE if(vCalendar.tplM['contentline_CALSCALE']!=null && (process_elem=vCalendar.tplM['contentline_CALSCALE'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_CALSCALE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); } process_elem=process_elem.replace('##:::##calscale##:::##', 'GREGORIAN'); vcalendarS+=process_elem; if(uidArray[uid].isTimezone) vcalendarS+=vTimeZone; vcalendarS=vcalendarS.substring(0, vcalendarS.length-2); vcalendarS+=uidArray[uid].string; if(vcalendarS.lastIndexOf('\r\n')!=(vcalendarS.length-2)) vcalendarS+='\r\n'; // PRODID if(vCalendar.tplM['contentline_PRODID']!=null && (process_elem=vCalendar.tplM['contentline_PRODID'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_PRODID']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN'); vcalendarS+=process_elem; if(typeof vCalendar.tplM['unprocessed']!='undefined' && vCalendar.tplM['unprocessed']!='' && vCalendar.tplM['unprocessed']!=null) vcalendarS+=vCalendar.tplM['unprocessed'].replace(RegExp('^\r\n'), ''); vCalendar.tplM['unprocessed']=new Array(); // vCalendar END (required by RFC) if(vCalendar.tplM['end']!=null && (process_elem=vCalendar.tplM['end'][0])!=undefined) vcalendarS+=vCalendar.tplM['end'][0]; else { process_elem=vCalendar.tplC['end']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vcalendarS+=process_elem; } eventStringArray.push(vcalendarS); } return eventStringArray; } function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFormHidden, deleteMode) { var vevent=false, vCalendarText='', groupCounter=0; var sel_option='local'; // vEvent BEGIN (required by RFC) if(vCalendar.tplM['begin']!=null && (process_elem=vCalendar.tplM['begin'][0])!=undefined) vCalendarText+=vCalendar.tplM['begin'][0]; else { process_elem=vCalendar.tplC['begin']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vCalendarText+=process_elem; } // VERSION (required by RFC) if(vCalendar.tplM['contentline_VERSION']!=null && (process_elem=vCalendar.tplM['contentline_VERSION'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_VERSION']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); } process_elem=process_elem.replace('##:::##version##:::##', '2.0'); vCalendarText+=process_elem; // CALSCALE if(vCalendar.tplM['contentline_CALSCALE']!=null && (process_elem=vCalendar.tplM['contentline_CALSCALE'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_CALSCALE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); } process_elem=process_elem.replace('##:::##calscale##:::##', 'GREGORIAN'); vCalendarText+=process_elem; if(delUID!='') var rid=delUID.substring(0, delUID.lastIndexOf('/')+1); else var rid=inputUID.substring(0, inputUID.lastIndexOf('/')+1); var inputEvents=jQuery.grep(globalEventList.displayEventsArray[rid],function(e){if(e.id==$('#uid').val() && (e.repeatCount<2 || !e.repeatCount))return true}); var tzArray=new Array(); var tzString=''; var isTimeZone=false; var origVcalendarString=''; var eventStringArray=new Array(); if(inputEvents.length>0) { var rid=$('#uid').val().substring(0, $('#uid').val().lastIndexOf('/')+1); if(rid) if(globalEventList.events[rid][$('#uid').val()].uid!=undefined) origVcalendarString=globalEventList.events[rid][$('#uid').val()].vcalendar; while(origVcalendarString.match(vCalendar.pre['vevent'])!=null) { if(origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT')-2, origVcalendarString.indexOf('BEGIN:VEVENT'))=='\r\n') { var partEvent=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT')-2,origVcalendarString.indexOf('END:VEVENT')+'END:VEVENT'.length); origVcalendarString=origVcalendarString.replace(partEvent, ''); } else { var partEvent=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VEVENT'),origVcalendarString.indexOf('END:VEVENT')+'END:VEVENT'.length); origVcalendarString=origVcalendarString.replace(partEvent, ''); partEvent+='\r\n'; } eventStringArray[eventStringArray.length]=partEvent; } } var origTimezone = ''; for(var iE=0;iE<inputEvents.length;iE++) { if(tzArray.indexOf(inputEvents[iE].timeZone)==-1) { if(inputEvents[iE].allDay ||(deleteMode && ($('#vcalendarHash').val()==hex_sha256(inputEvents[iE].vcalendar)))) continue; var component=buildTimezoneComponent(inputEvents[iE].timeZone); if(component!='' && ($('#vcalendarHash').val()!=hex_sha256(inputEvents[iE].vcalendar))) { tzArray[tzArray.length]=inputEvents[iE].timeZone; tzString+=component; if(tzString.lastIndexOf('\r\n')!=(tzString.length-2)) tzString+='\r\n'; isTimeZone=true; } else if(component!='' && $('#vcalendarHash').val()==hex_sha256(inputEvents[iE].vcalendar)) origTimezone+=component; } } if(isTimeZone) { if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) vCalendarText+='\r\n'; vCalendarText+=tzString; } var beginVcalendar = vCalendarText; var realEvent=''; var futureMode = false; for(var j=0;j<inputEvents.length;j++) { eventStringArray.splice(eventStringArray.indexOf(inputEvents[j].vcalendar),1); if(($('#futureStart').val()== '' && $('#vcalendarHash').val()!=hex_sha256(inputEvents[j].vcalendar)) || inputEvents[j].rec_id!=$('#recurrenceID').val()) { var stringUIDcurrent=inputEvents[j].vcalendar.match(vCalendar.pre['contentline_UID']); if(stringUIDcurrent!=null) stringUIDcurrent=stringUIDcurrent[0].match(vCalendar.pre['contentline_parse'])[4]; if((deleteMode && $('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) || (deleteMode && !inputEvents[j].rec_id && $('#vcalendarUID').val()==stringUIDcurrent)) { var ruleString=inputEvents[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']); var origRuleString=ruleString; var exDate=inputEvents[j].start; var process_elem=vCalendar.tplC['contentline_EXDATE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); if(inputEvents[j].allDay) { exDate=$('#recurrenceID').val(); process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(exDate)); } else { exDate=$('#recurrenceID').val().parseComnpactISO8601(); if(!$('#allday').prop('checked')) if(globalSettings.timezonesupport.value) sel_option=$('#timezone').val(); if(sel_option!='local') { var valOffsetFrom=getOffsetByTZ(sel_option, exDate); var intOffset = valOffsetFrom.getSecondsFromOffset()*-1; exDate = new Date(exDate.setSeconds(intOffset)); } else exDate=new Date(exDate.setSeconds(getLocalOffset(exDate))); exDate=$.fullCalendar.formatDate(exDate, "yyyyMMdd'T'HHmmss'Z'"); process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##TZID##:::##',''); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(exDate)); } inputEvents[j].vcalendar=inputEvents[j].vcalendar.replace(ruleString,ruleString+process_elem); } if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=inputEvents[j].vcalendar.substring(2,inputEvents[j].vcalendar.length); else if((inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputEvents[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) vCalendarText+=inputEvents[j].vcalendar; else vCalendarText+='\r\n'+inputEvents[j].vcalendar; } else if($('#futureStart').val().split(';')[0]!='' && $('#futureStart').val().split(';')[1]!=inputEvents[j].start) { if($('#futureStart').val().split(';')[0]>1 && $('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], $('#futureStart').val().split(';')[0]); if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=inputEvents[j].vcalendar.substring(2,inputEvents[j].vcalendar.length); else if((inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputEvents[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) vCalendarText+=inputEvents[j].vcalendar; else vCalendarText+='\r\n'+inputEvents[j].vcalendar; futureMode=true; } else if(deleteMode && $('#futureStart').val().split(';')[0]!='' && $('#futureStart').val().split(';')[1]==inputEvents[j].start) { if($('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) { inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], 2); } if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=inputEvents[j].vcalendar.substring(2,inputEvents[j].vcalendar.length); else if((inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputEvents[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) vCalendarText+=inputEvents[j].vcalendar; else vCalendarText+='\r\n'+inputEvents[j].vcalendar; } else { realEvent=inputEvents[j]; } } vCalendarText=vCalendarText.replace(realEvent.vcalendar,''); for(var ip=0; ip<eventStringArray.length;ip++) { if(eventStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=eventStringArray[ip].substring(2,eventStringArray[ip].length); else if((eventStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (eventStringArray[ip].indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) ) vCalendarText+=eventStringArray[ip]; else vCalendarText+='\r\n'+eventStringArray[ip]; } var origEvent = ''; if(deleteMode || futureMode) { if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) vCalendarText+='\r\n'; if(!isTimeZone && futureMode && origTimezone!='') { vCalendarText+=origTimezone; if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) vCalendarText+='\r\n'; } // PRODID if(vCalendar.tplM['contentline_PRODID']!=null && (process_elem=vCalendar.tplM['contentline_PRODID'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_PRODID']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN'); vCalendarText+=process_elem; if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) vCalendarText+=vCalendar.tplM['unprocessed'].replace(RegExp('^\r\n'), ''); vCalendar.tplM['unprocessed']=new Array(); // vCalendar END (required by RFC) if(vCalendar.tplM['end']!=null && (process_elem=vCalendar.tplM['end'][0])!=undefined) vCalendarText+=vCalendar.tplM['end'][0]; else { process_elem=vCalendar.tplC['end']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vCalendarText+=process_elem; } if(deleteMode) { var fixedArr = checkAndFixMultipleUID(vCalendarText,true); var inputS = fixedArr[0]; fixedArr.splice(0,1); return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID,'vevent',isFormHidden,deleteMode,fixedArr); } else if(futureMode) { origEvent = vCalendarText; vCalendarText = beginVcalendar; } } var timeZoneAttr=''; if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone) sel_option=globalSessionTimeZone; var isUTC=false; if(!$('#allday').prop('checked')) { if(globalSettings.timezonesupport.value) sel_option=$('#timezone').val(); //else //{ // if(inputEvents.length>0) // sel_option=inputEvents[0].timeZone; //} if(sel_option=='UTC') { isUTC=true; timeZoneAttr=''; } else if(sel_option=='local') timeZoneAttr=''; else if(sel_option=='custom') timeZoneAttr=';'+vcalendarEscapeValue('TZID='+realEvent.timeZone); else timeZoneAttr=';'+vcalendarEscapeValue('TZID='+sel_option); var timezoneComponent=''; if(globalSettings.rewritetimezonecomponent.value || !vCalendar.tplM['unprocessedVTIMEZONE']) { if(tzArray.indexOf(sel_option)==-1) timezoneComponent=buildTimezoneComponent(sel_option); } else timezoneComponent=vCalendar.tplM['unprocessedVTIMEZONE']; if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) vCalendarText+='\r\n'; vCalendarText+=timezoneComponent; } // ---------------------------------- EVENT ---------------------------------- // if(vCalendar.tplM['beginVEVENT']!=null && (process_elem=vCalendar.tplM['beginVEVENT'][0])!=undefined) { if(vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=vCalendar.tplM['beginVEVENT'][0]; else vCalendarText+='\r\n'+vCalendar.tplM['beginVEVENT'][0]; vevent=true; } else { process_elem=vCalendar.tplC['beginVEVENT']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); if(vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=process_elem; else vCalendarText+='\r\n'+process_elem; vevent=true; } var d, utc, d=new Date(); utc=d.getUTCFullYear()+(d.getUTCMonth()+1<10 ? '0' : '')+(d.getUTCMonth()+1)+(d.getUTCDate()<10 ? '0' : '')+d.getUTCDate()+'T'+(d.getUTCHours()<10 ? '0' : '')+d.getUTCHours()+(d.getUTCMinutes()<10 ? '0' : '')+d.getUTCMinutes()+(d.getUTCSeconds()<10 ? '0' : '')+d.getUTCSeconds()+'Z'; var create=true; if($('#recurrenceID').val()=='') var checkVal='orig'; else var checkVal=$('#recurrenceID').val(); var created=''; for(vev in vCalendar.tplM['contentline_CREATED']) { if(vev==checkVal) created=vCalendar.tplM['contentline_CREATED'][vev]; } if(created!='') { process_elem=created; // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_CREATED']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); } vCalendarText+=process_elem; if(vCalendar.tplM['contentline_LM']!=null && (process_elem=vCalendar.tplM['contentline_LM'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_LM']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); vCalendarText+=process_elem; if(vCalendar.tplM['contentline_DTSTAMP']!=null && (process_elem=vCalendar.tplM['contentline_DTSTAMP'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_DTSTAMP']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc)); vCalendarText+=process_elem; // UID (required by RFC) if($('#futureStart').val()=='' && (operation!='MOVE_IN'&& operation!='MOVE_OTHER') && (vCalendar.tplM['contentline_UID']!=null && (process_elem=vCalendar.tplM['contentline_UID'][0])!=undefined)) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_UID']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); // it is VERY small probability, that for 2 newly created vevents/vtodos the same UID is generated (but not impossible :( ...) var newUID=globalEventList.getNewUID(); process_elem=process_elem.replace('##:::##uid##:::##', newUID); } vCalendarText+=process_elem; if(vCalendar.tplM['contentline_SUMMARY']!=null && (process_elem=vCalendar.tplM['contentline_SUMMARY'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_SUMMARY']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#name').val())); //process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue('zmena')); vCalendarText+=process_elem; if($('#priority').val()!='0') { if(vCalendar.tplM['contentline_PRIORITY']!=null && (process_elem=vCalendar.tplM['contentline_PRIORITY'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_PRIORITY']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#priority').val())); vCalendarText+=process_elem; } if(vevent) { if($('#repeat').val()!='no-repeat') { var interval=$("#repeat_interval_detail").val(); var byDay=''; var monthDay=''; var bymonth=''; var wkst=''; var isCustom=false; if(interval==1 || interval=='') interval=''; else interval=";INTERVAL="+$("#repeat_interval_detail").val(); var frequency=$('#repeat').val(); if(frequency=='TWO_WEEKLY') { frequency='WEEKLY'; interval=";INTERVAL="+2; } else if(frequency=='BUSINESS') { frequency='WEEKLY'; byDay=';BYDAY='; if(globalSettings.weekenddays.value.length>0) { for(var i=0;i<7;i++) if(globalSettings.weekenddays.value.indexOf(i)==-1) byDay+=i+','; byDay=byDay.substring(0,byDay.length-1); byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); } else { byDay='SA,SU'; } interval=''; } else if(frequency=='WEEKEND') { frequency='WEEKLY'; byDay=';BYDAY='; if(globalSettings.weekenddays.value.length>0) { for(var i=0;i<globalSettings.weekenddays.value.length;i++) byDay+=globalSettings.weekenddays.value[i]+','; byDay=byDay.substring(0,byDay.length-1); byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); } else { byDay='SA,SU'; } interval=''; } else if(frequency=='CUSTOM_WEEKLY') { frequency='WEEKLY'; var byDayArray=$('#week_custom .customTable td.selected'); if(byDayArray.length>0) { byDay=';BYDAY='; for(var ri=0;ri<byDayArray.length;ri++) byDay+=$(byDayArray[ri]).attr('data-type')+','; byDay=byDay.substring(0,byDay.length-1); byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); if(globalSettings.mozillasupport.value==null || !globalSettings.mozillasupport.value) if(realEvent!='') { if(realEvent.wkst!='') wkst=';WKST='+realEvent.wkst.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); } else wkst=';WKST='+globalSettings.datepickerfirstdayofweek.value.toString().replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU'); } } else if(frequency=='CUSTOM_MONTHLY') { frequency='MONTHLY'; var byDayFirstPart=''; var monthCustomOption = $('#repeat_month_custom_select').val(); if(monthCustomOption!='custom' && $('#repeat_month_custom_select2').val()!='DAY') { if(monthCustomOption!='') byDay=';BYDAY='; switch(monthCustomOption) { case 'every': byDayFirstPart=''; break; case 'first': byDayFirstPart='1'; break; case 'second': byDayFirstPart='2'; break; case 'third': byDayFirstPart='3'; break; case 'fourth': byDayFirstPart='4'; break; case 'fifth': byDayFirstPart='5'; break; case 'last': byDayFirstPart='-1'; break; default: byDayFirstPart=''; break; } byDay+= byDayFirstPart+$('#repeat_month_custom_select2').val(); } else if(monthCustomOption!='custom' && $('#repeat_month_custom_select2').val()=='DAY') { byDay=''; switch(monthCustomOption) { case 'every': monthDay=';BYMONTHDAY='; for(var p=1;p<32;p++) monthDay+=p+','; monthDay=monthDay.substring(0,monthDay.length-1); break; case 'first': monthDay=';BYMONTHDAY=1'; break; case 'second': monthDay=';BYMONTHDAY=2'; break; case 'third': monthDay=';BYMONTHDAY=3'; break; case 'fourth': monthDay=';BYMONTHDAY=4'; break; case 'fifth': monthDay=';BYMONTHDAY=5'; break; case 'last': monthDay=';BYMONTHDAY=-1'; break; default: byDayFirstPart=''; monthDay=''; break; } } else { var monthDayArray = $('#month_custom2 .selected'); if(monthDayArray.length>0) { monthDay=';BYMONTHDAY='; for(var ri=0;ri<monthDayArray.length;ri++) monthDay+=$(monthDayArray[ri]).attr('data-type')+','; monthDay=monthDay.substring(0,monthDay.length-1); } } } else if(frequency=='CUSTOM_YEARLY') { frequency='YEARLY'; var byDayFirstPart=''; var monthCustomOption = $('#repeat_year_custom_select1').val(); var monthArray = $('#year_custom3 .selected'); if(monthArray.length>0) { bymonth=';BYMONTH='; for(var ri=0;ri<monthArray.length;ri++) { var val = parseInt($(monthArray[ri]).attr('data-type'),10); if(!isNaN(val)) bymonth+=(val+1)+','; } bymonth=bymonth.substring(0,bymonth.length-1); } if(monthCustomOption!='custom' && $('#repeat_year_custom_select2').val()!='DAY') { if(monthCustomOption!='') byDay=';BYDAY='; switch(monthCustomOption) { case 'every': byDayFirstPart=''; break; case 'first': byDayFirstPart='1'; break; case 'second': byDayFirstPart='2'; break; case 'third': byDayFirstPart='3'; break; case 'fourth': byDayFirstPart='4'; break; case 'fifth': byDayFirstPart='5'; break; case 'last': byDayFirstPart='-1'; break; default: byDayFirstPart=''; break; } byDay+= byDayFirstPart+$('#repeat_year_custom_select2').val(); } else if(monthCustomOption!='custom' && $('#repeat_year_custom_select2').val()=='DAY') { byDay=''; switch(monthCustomOption) { case 'every': monthDay=';BYMONTHDAY='; for(var p=1;p<32;p++) monthDay+=p+','; monthDay=monthDay.substring(0,monthDay.length-1); break; case 'first': monthDay=';BYMONTHDAY=1'; break; case 'second': monthDay=';BYMONTHDAY=2'; break; case 'third': monthDay=';BYMONTHDAY=3'; break; case 'fourth': monthDay=';BYMONTHDAY=4'; break; case 'fifth': monthDay=';BYMONTHDAY=5'; break; case 'last': monthDay=';BYMONTHDAY=-1'; break; default: byDayFirstPart=''; monthDay=''; break; } } else { var monthDayArray = $('#year_custom1 .selected'); if(monthDayArray.length>0) { monthDay=';BYMONTHDAY='; for(var ri=0;ri<monthDayArray.length;ri++) monthDay+=$(monthDayArray[ri]).attr('data-type')+','; monthDay=monthDay.substring(0,monthDay.length-1); } } } else if($('#repeat option:selected').attr('data-type')=="custom_repeat") isCustom=true; if(vCalendar.tplM['contentline_RRULE']!=null && (process_elem=vCalendar.tplM['contentline_RRULE'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_RRULE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } if(!isCustom) { if($('#repeat_end_details').val()=="on_date") { var dateUntil=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#repeat_end_date').val()); var datetime_until=''; if(!$('#allday').prop('checked')) { var tForR=new Date(Date.parse("01/02/1990, "+$('#time_from').val() )); dateUntil.setHours(tForR.getHours()); dateUntil.setMinutes(tForR.getMinutes()); dateUntil.setSeconds(tForR.getSeconds()); if(globalSettings.timezonesupport.value && sel_option in timezones) var valOffsetFrom=getOffsetByTZ(sel_option, dateUntil); if(valOffsetFrom) { var intOffset=valOffsetFrom.getSecondsFromOffset()*1000*-1; dateUntil.setTime(dateUntil.getTime()+intOffset); } datetime_until=$.fullCalendar.formatDate(dateUntil, "yyyyMMdd'T'HHmmss'Z'"); } else datetime_until=$.fullCalendar.formatDate(dateUntil, 'yyyyMMdd')+'T000000Z'; process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";UNTIL="+datetime_until+bymonth+monthDay+byDay+wkst); } else if($('#repeat_end_details').val()=="after") process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";COUNT="+(parseInt($('#repeat_end_after').val()))+bymonth+monthDay+byDay+wkst); else process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+bymonth+monthDay+byDay+wkst); } else process_elem=process_elem.replace('##:::##value##:::##',$('#repeat').val()); vCalendarText+=process_elem; if(realEvent.repeatStart) { var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_from').val()); var repeatStart=realEvent.repeatStart; var b=new Date(1970,1,1,0,0,0); if(!$('#allday').prop('checked')) { b=new Date(Date.parse("01/02/1990, "+$('#time_from').val() )); a.setHours(b.getHours()); a.setMinutes(b.getMinutes()); a.setSeconds(b.getSeconds()); } var offsetDate=a-repeatStart; for(var iter in vCalendar.tplM['contentline_EXDATE']) { if(isNaN(iter)) continue; var exStr=('\r\n'+vCalendar.tplM['contentline_EXDATE'][iter]).match(vCalendar.pre['contentline_parse']); var exVal=exStr[4].parseComnpactISO8601(); if(exVal) { if(exStr[4].indexOf('T')==-1 && !$('#allday').prop('checked')) { //HERE var timePart = new Date(Date.parse("01/02/1990, "+$('#time_from').val() )); var time_from = $.fullCalendar.formatDate(b, 'HHmmss'); exVal = (exStr[4] + 'T' + time_from).parseComnpactISO8601(); if(sel_option!='local') { var valOffsetFrom=getOffsetByTZ(sel_option, exVal); var intOffset = valOffsetFrom.getSecondsFromOffset()*-1; exVal = new Date(exVal.setSeconds(intOffset)); } } else if(exStr[4].indexOf('T')!=-1 && !$('#allday').prop('checked')) { if(sel_option!='local') { var valOffsetFrom=getOffsetByTZ(sel_option, exVal); var origValOffset = getOffsetByTZ(realEvent.timeZone, exVal); var intOffset = (valOffsetFrom.getSecondsFromOffset() - origValOffset.getSecondsFromOffset())*-1; exVal = new Date(exVal.setSeconds(intOffset)); } else { var origValOffset = getOffsetByTZ(realEvent.timeZone, exVal); exVal = new Date(exVal.setSeconds(origValOffset.getSecondsFromOffset())); } } var value=new Date(exVal.getTime()+offsetDate); process_elem=vCalendar.tplC['contentline_EXDATE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); if(!$('#allday').prop('checked')) { //if(exStr[4].indexOf('T')==-1) // var newValue=new Date(value.setMinutes(new Date().getTimezoneOffset())); newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss")+(sel_option!='local' ? 'Z' : ''); process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); } else { var newValue=$.fullCalendar.formatDate(value, "yyyyMMdd"); process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); } vCalendarText+=process_elem; } } } } var a=$('#eventDetailsTable').find("tr[data-id]"); var lastDataId=0; for(var i=0;i<a[a.length-1].attributes.length;i++) if(a[a.length-1].attributes[i].nodeName=="data-id") { lastDataId=a[a.length-1].attributes[i].value; break; } var alarmIterator=0; var alarmUniqueArray = new Array(); for(var t=0;t<lastDataId;t++) { if($(".alert[data-id="+(t+1)+"]").length>0) { var alarmText = ''; if($(".alert[data-id="+(t+1)+"]").val()!='none') { if(vCalendar.tplM['beginVALARM']!=null && (process_elem=vCalendar.tplM['beginVALARM'][0])!=undefined) alarmText+=vCalendar.tplM['beginVALARM'][0]; else { process_elem=vCalendar.tplC['beginVALARM']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); alarmText+=process_elem; vevent=true; } if($(".alert[data-id="+(t+1)+"]").val()=='message') { if($(".alert_message_details[data-id="+(t+1)+"]").val()=='on_date') { if(vCalendar.tplM['contentline_TRIGGER']!=null && (process_elem=vCalendar.tplM['contentline_TRIGGER'][0])!=undefined) { parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_TRIGGER']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value, $(".message_date_input[data-id="+(t+1)+"]").val()); var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyy-MM-dd'); var aDate=new Date(Date.parse("01/02/1990, "+$(".message_time_input[data-id="+(t+1)+"]").val() )); var time_to=$.fullCalendar.formatDate(aDate, 'HH:mm:ss'); var alarmDT=$.fullCalendar.parseDate(datetime_to+'T'+time_to); if(globalSettings.timezonesupport.value) sel_option=$('#timezone').val(); if($('.timezone_row').css('display')=='none') sel_option='local'; if(sel_option!='local') { var origValOffset=getOffsetByTZ(sel_option, alarmDT); var origIntOffset = origValOffset.getSecondsFromOffset()*-1; alarmDT = new Date(alarmDT.setSeconds(origIntOffset)); } var newValue=$.fullCalendar.formatDate(alarmDT, "yyyyMMdd'T'HHmmss")+(sel_option!='local' ? 'Z' : ''); process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ';VALUE=DATE-TIME'); process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ''); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); alarmText+=process_elem; } else { var duration=''; var before_after=$(".before_after_input[data-id="+(t+1)+"]").val(); if($(".alert_message_details[data-id="+(t+1)+"]").val()=='minutes_before') duration="-PT"+before_after+"M"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='hours_before') duration="-PT"+before_after+"H"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='days_before') duration="-P"+before_after+"D"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='weeks_before') duration="-P"+before_after+"W"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='seconds_before') duration="-PT"+before_after+"S"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='minutes_after') duration="PT"+before_after+"M"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='hours_after') duration="PT"+before_after+"H"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='days_after') duration="P"+before_after+"D"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='weeks_after') duration="P"+before_after+"W"; if($(".alert_message_details[data-id="+(t+1)+"]").val()=='seconds_after') duration="PT"+before_after+"S"; if(vCalendar.tplM['contentline_TRIGGER']!=null && (process_elem=vCalendar.tplM['contentline_TRIGGER'][0])!=undefined) { parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_TRIGGER']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ''); process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ';VALUE=DURATION'); process_elem=process_elem.replace('##:::##value##:::##', duration); alarmText+=process_elem; } if(vCalendar.tplM['contentline_ACTION']!=null && (process_elem=vCalendar.tplM['contentline_ACTION'][0])!=undefined) { parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_ACTION']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('DISPLAY')); alarmText+=process_elem; var a=new Date(); if(vCalendar.tplM['contentline_DESCRIPTION']!=null && (process_elem=vCalendar.tplM['contentline_DESCRIPTION'][0])!=undefined) { parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_DESCRIPTION']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('Reminder')); alarmText+=process_elem; } if((typeof vCalendar.tplM['unprocessedVALARM']!='undefined' && typeof vCalendar.tplM['unprocessedVALARM'][t]!='undefined') && (vCalendar.tplM['unprocessedVALARM'][t]!='') && (vCalendar.tplM['unprocessedVALARM'][t]!=null)) { tmp=vCalendar.tplM['unprocessedVALARM'][t].replace(RegExp('^\r\n'), '').replace(RegExp('\r\n$'), ''); if(tmp.indexOf('\r\n')==0) tmp=tmp.substring(2, tmp.length); if(tmp.lastIndexOf('\r\n')!=(tmp.length-2)) tmp+='\r\n'; alarmText+=tmp; } if(vCalendar.tplM['endVALARM']!=null && (process_elem=vCalendar.tplM['endVALARM'][0])!=undefined) alarmText+=vCalendar.tplM['endVALARM'][0]; else { process_elem=vCalendar.tplC['endVALARM']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); alarmText+=process_elem; } if(alarmUniqueArray.indexOf(alarmText)==-1) { alarmUniqueArray.push(alarmText); vCalendarText+=alarmText; } } } } vCalendar.tplM['unprocessedVALARM']=new Array(); if($('#avail').val()!='none') { if(vCalendar.tplM['contentline_TRANSP']!=null && (process_elem=vCalendar.tplM['contentline_TRANSP'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_TRANSP']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } if($('#avail').val()=='busy') process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('OPAQUE')); else process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('TRANSPARENT')); vCalendarText+=process_elem; } if($('#url_EVENT').val()!='') { if(vCalendar.tplM['contentline_URL']!=null && (process_elem=vCalendar.tplM['contentline_URL'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_URL']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#url_EVENT').val())); vCalendarText+=process_elem; } } //DESCRIPTION if($('#note').val()!='') { // NOTE if(vCalendar.tplM['contentline_NOTE']!=null && (process_elem=vCalendar.tplM['contentline_NOTE'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_NOTE']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#note').val())); vCalendarText+=process_elem; } if($('#status').val()!='NONE') { //if((value=$('[id="vcalendar_editor"] [data-type="\\%note"]').find('textarea').val())!='') //{ if(vCalendar.tplM['contentline_STATUS']!=null && (process_elem=vCalendar.tplM['contentline_STATUS'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_STATUS']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#status').val())); vCalendarText+=process_elem; } //CLASS if($('#type').val()!='') { // CLASS if(vCalendar.tplM['contentline_CLASS']!=null && (process_elem=vCalendar.tplM['contentline_CLASS'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_CLASS']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); if(typeof vCalendar.tplM['contentline_CLASS'] =='undefined' || vCalendar.tplM['contentline_CLASS']==null || vCalendar.tplM['contentline_CLASS'].length==0) process_elem=''; } if($('.row_type').css('display')!='none') { process_elem=vCalendar.tplC['contentline_CLASS']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#type').val().toUpperCase())); } vCalendarText+=process_elem; } //RECURRENCE-ID if($('#recurrenceID').val()) { if(vCalendar.tplM['contentline_REC_ID']!=null && (process_elem=vCalendar.tplM['contentline_REC_ID'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_REC_ID']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } var rec_id=$('#recurrenceID').val() if(rec_id.indexOf('T')==-1) { process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id)); } else { process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) { var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); if(checkTZID!=null) { parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); } else process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+ sel_option)); } else*/ process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr); if(isUTC && rec_id.charAt(rec_id.length-1)!='Z') rec_id+='Z'; process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id)); } vCalendarText+=process_elem; } if(vCalendar.tplM['contentline_E_DTSTART']!=null && (process_elem=vCalendar.tplM['contentline_E_DTSTART'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_E_DTSTART']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } var datetime_from='', datetime_to=''; var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_from').val()); var a2=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_to').val()); var b=new Date(1970, 1, 1, 0, 0, 0); if(datetime_from=='') datetime_from=$.fullCalendar.formatDate(a, 'yyyyMMdd'); if(datetime_to=='') datetime_to=$.fullCalendar.formatDate(a2, 'yyyyMMdd'); var dateTo=$.datepicker.parseDate('yymmdd',datetime_to); if($('#allday').prop('checked')) { process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from)); } else { b=new Date(Date.parse("01/02/1990, "+$('#time_from').val() )); var time_from=$.fullCalendar.formatDate(b, 'HHmmss'); process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) { var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); if(checkTZID!=null) { parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); } else process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+ sel_option)); } else*/ process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : ''))); } vCalendarText+=process_elem; if(realEvent!='') { if(realEvent.type!='') { var repeatStart=realEvent.repeatStart; a.setHours(b.getHours()); a.setMinutes(b.getMinutes()); a.setSeconds(b.getSeconds()); var changeDate=a; var offsetDate=changeDate-repeatStart; var realEventUID=realEvent.vcalendar.match(vCalendar.pre['contentline_UID']); if(realEventUID!=null) realEventUID=realEventUID[0].match(vCalendar.pre['contentline_parse'])[4]; if(offsetDate!=0) { var vcalendarOrig=vCalendarText; var eventArray=new Array(),backupEventArray= new Array(); while(vcalendarOrig.match(vCalendar.pre['vevent'])!=null) { if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2, vcalendarOrig.indexOf('BEGIN:VEVENT'))=='\r\n') { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2,vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); } else { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT'),vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); partEvent+='\r\n'; } eventArray[eventArray.length]=partEvent; backupEventArray[backupEventArray.length]=partEvent; } if(eventArray.length==0) console.log("Error: '"+inputUID+"': unable to parse vEvent"); for(var it=0;it<eventArray.length;it++) { var findUid=eventArray[it].match(vCalendar.pre['contentline_UID']); if(findUid!=null) { if(findUid[0].match(vCalendar.pre['contentline_parse'])[4]!=realEventUID) continue; } var findRec=eventArray[it].match(vCalendar.pre['contentline_RECURRENCE_ID']); if(findRec!=null) { var parsed=findRec[0].match(vCalendar.pre['contentline_parse']); process_elem=vCalendar.tplC['contentline_REC_ID']; process_elem=process_elem.replace('##:::##group_wd##:::##', parsed[1]); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); var value=parsed[4].parseComnpactISO8601(); if(value) { value=new Date(value.getTime()+offsetDate) var newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss"); if(isUTC) newValue+='Z'; if($('#allday').prop('checked')) { newValue=$.fullCalendar.formatDate(value, "yyyyMMdd"); process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue('')); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); } else { process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) { var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); if(checkTZID!=null) { parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); } else process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+ sel_option)); } else*/ process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue)); } eventArray[it]=eventArray[it].replace(findRec[0],'\r\n'+process_elem); } } vCalendarText=vCalendarText.replace(backupEventArray[it],eventArray[it]); } } } } if(vCalendar.tplM['contentline_E_DTEND']!=null && (process_elem=vCalendar.tplM['contentline_E_DTEND'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_E_DTEND']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } if($('#allday').prop('checked')) { var dateAfter=new Date(dateTo.getFullYear(), dateTo.getMonth(), dateTo.getDate()+1); dateAfter=dateAfter.getFullYear()+''+((dateAfter.getMonth()+1)<10 ? '0'+(dateAfter.getMonth()+1) : (dateAfter.getMonth()+1))+''+ ((dateAfter.getDate())<10 ? '0'+(dateAfter.getDate()) : (dateAfter.getDate())); process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE')); process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue("")); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(dateAfter)); } else { var b2=new Date(Date.parse("01/02/1990, "+$('#time_to').val() )); var time_to=$.fullCalendar.formatDate(b2, 'HHmmss'); process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue('')); /*if((typeof vCalendar.tplM['unprocessed']!='undefined') && (vCalendar.tplM['unprocessed']!='') && (vCalendar.tplM['unprocessed']!=null)) { var checkTZID=vCalendar.tplM['unprocessed'].match(vCalendar.pre['contentline_TZID']); if(checkTZID!=null) { parsed=checkTZID[0].match(vCalendar.pre['contentline_parse']); process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+parsed[4])); } else process_elem=process_elem.replace('##:::##TZID##:::##', ';'+vcalendarEscapeValue("TZID="+sel_option)); } else*/ process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr); process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_to+'T'+time_to+(isUTC ? 'Z' : ''))); } vCalendarText+=process_elem; //RFC OPTIONAL if(vCalendar.tplM['contentline_LOCATION']!=null && (process_elem=vCalendar.tplM['contentline_LOCATION'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)','m')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_LOCATION']; process_elem=process_elem.replace('##:::##group_wd##:::##',''); process_elem=process_elem.replace('##:::##params_wsc##:::##',''); } if($('#location').val()!='') { process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue($('#location').val())); vCalendarText+=process_elem; } if($('#recurrenceID').val()=='') var checkVal='orig'; else var checkVal=$('#recurrenceID').val(); if(typeof vCalendar.tplM['unprocessedVEVENT']!='undefined' && vCalendar.tplM['unprocessedVEVENT']!=null) { for(vev in vCalendar.tplM['unprocessedVEVENT']) if(vev==checkVal) vCalendarText+=vCalendar.tplM['unprocessedVEVENT'][vev].replace(RegExp('^\r\n'), ''); } //vCalendar.tplM['unprocessedVEVENT']=new Array(); if(vCalendar.tplM['endVEVENT']!=null && (process_elem=vCalendar.tplM['endVEVENT'][0])!=undefined) vCalendarText+=vCalendar.tplM['endVEVENT'][0]; else { process_elem=vCalendar.tplC['endVEVENT']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vCalendarText+=process_elem; } // PRODID if(vCalendar.tplM['contentline_PRODID']!=null && (process_elem=vCalendar.tplM['contentline_PRODID'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm')); if(parsed[1]!='') // if group is present, replace the object and related objects' group names process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2); } else { process_elem=vCalendar.tplC['contentline_PRODID']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); process_elem=process_elem.replace('##:::##params_wsc##:::##', ''); } process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN'); vCalendarText+=process_elem; if(typeof vCalendar.tplM['unprocessed']!='undefined' && vCalendar.tplM['unprocessed']!='' && vCalendar.tplM['unprocessed']!=null) vCalendarText+=vCalendar.tplM['unprocessed'].replace(RegExp('^\r\n'), ''); vCalendar.tplM['unprocessed']=new Array(); // vCalendar END (required by RFC) if(vCalendar.tplM['end']!=null && (process_elem=vCalendar.tplM['end'][0])!=undefined) vCalendarText+=vCalendar.tplM['end'][0]; else { process_elem=vCalendar.tplC['end']; process_elem=process_elem.replace('##:::##group_wd##:::##', ''); vCalendarText+=process_elem; } var nextVcalendars = new Array(); if(futureMode && origEvent!='') { var fixed = checkAndFixMultipleUID(origEvent,true); if(fixed.length==1) nextVcalendars[nextVcalendars.length]=origEvent; else nextVcalendars=fixed; } // replace unsupported XML characters vCalendarText=vCalendarText.replace(/[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g, ' '); var fixedArr = checkAndFixMultipleUID(vCalendarText,true); fixedArr = $.merge(nextVcalendars,fixedArr); var inputS = fixedArr[0]; fixedArr.splice(0,1); if(operation=='MOVE_IN') return moveVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID, 'vevent', isFormHidden, deleteMode, fixedArr); else return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID, 'vevent', isFormHidden, deleteMode, fixedArr); } function fullVcalendarToData(inputEvent) { CalDAVeditor_cleanup(); var vcalendar=''; var rid=inputEvent.id.substring(0, inputEvent.id.lastIndexOf('/')+1); if(globalEventList.events[rid][inputEvent.id].uid!=undefined) vcalendar=globalEventList.events[rid][inputEvent.id].vcalendar; if(!vcalendar) return false; var vcalendar_full=vcalendar.split('\r\n'); if((parsed=('\r\n'+vcalendar_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; //BEGIN, END VCALENDAR vCalendar.tplM['begin'][0]=vCalendar.tplC['begin'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]); // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" if((parsed=('\r\n'+vcalendar_full[vcalendar_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; // values not directly supported by the editor (old values are kept intact) vCalendar.tplM['end'][0]=vCalendar.tplC['end'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); if(vcalendar_begin_group!=vcalendar_end_group) return false;// the vCalendar BEGIN and END "group" are different // remove the vCalendar BEGIN and END vcalendar='\r\n'+vcalendar_full.slice(1, vcalendar_full.length-2).join('\r\n')+'\r\n'; /* vcalendar_element=vcalendar.match(vCalendar.pre['tzone']); if(vcalendar_element!=null) vcalendar=vcalendar.replace(vcalendar_element[0],''); */ //FIX TIMEZONE var beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE'); var startEndTimeZone=vcalendar.lastIndexOf('END:VTIMEZONE'); var endTimeZone=0; var vTimeZone=''; if(beginTimeZone!=-1 && startEndTimeZone!=-1) { for(i=(startEndTimeZone+2);i<vcalendar.length;i++) { if(vcalendar.charAt(i)=='\n') { endTimeZone=i+1; break; } } vTimeZone=vcalendar.substring(beginTimeZone, endTimeZone); vcalendar=vcalendar.substring(0, beginTimeZone)+vcalendar.substring(endTimeZone, vcalendar.length); } vcalendar_element=vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_CALSCALE'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; version=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_CALSCALE'][0]=vCalendar.tplC['contentline_CALSCALE']; vCalendar.tplM['contentline_CALSCALE'][0]=vCalendar.tplM['contentline_CALSCALE'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_CALSCALE'][0]=vCalendar.tplM['contentline_CALSCALE'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vcalendar.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_CALSCALE'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n'); } } } vcalendar_element=vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_VERSION'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; version=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_VERSION'][0]=vCalendar.tplC['contentline_VERSION']; vCalendar.tplM['contentline_VERSION'][0]=vCalendar.tplM['contentline_VERSION'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_VERSION'][0]=vCalendar.tplM['contentline_VERSION'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vcalendar.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_VERSION'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n'); } } } //PRODID vcalendar_element=vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_PRODID'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_PRODID'][0]=vCalendar.tplC['contentline_PRODID']; vCalendar.tplM['contentline_PRODID'][0]=vCalendar.tplM['contentline_PRODID'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_PRODID'][0]=vCalendar.tplM['contentline_PRODID'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vcalendar.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_PRODID'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n'); } } } var eventArray=new Array(); while(vcalendar.match(vCalendar.pre['vevent'])!=null) { var partEvent=vcalendar.substring(vcalendar.indexOf('BEGIN:VEVENT')-2,vcalendar.indexOf('END:VEVENT')+'END:VEVENT'.length); eventArray[eventArray.length]=partEvent; vcalendar=vcalendar.replace(partEvent, ''); } if(eventArray.length==0) console.log("Error: '"+inputEvent.id+"': unable to parse vEvent"); for(var it=0;it<eventArray.length;it++) { // ------------------------------ VEVENT ------------------------------ // var vevent=eventArray[it]; var vevent_full=vevent.split('\r\n'); if(vevent==null) return false; //vcalendar=vcalendar.replace(vevent[0], '\r\n'); //BEGIN if((parsed=('\r\nBEGIN:VEVENT\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; //BEGIN, END VCALENDAR vCalendar.tplM['beginVEVENT'][0]=vCalendar.tplC['beginVEVENT'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]); // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" if((parsed=('\r\n'+vcalendar_full[vevent_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; // values not directly supported by the editor (old values are kept intact) vCalendar.tplM['endVEVENT'][0]=vCalendar.tplC['endVEVENT'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); if(vcalendar_begin_group!=vcalendar_end_group) return false;// the vCalendar BEGIN and END "group" are different // remove the vCalendar BEGIN and END vevent='\r\n'+vevent_full.slice(2, vevent_full.length-1).join('\r\n')+'\r\n'; //SUMMARY vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_SUMMARY'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplC['contentline_SUMMARY']; vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplM['contentline_SUMMARY'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_SUMMARY'][0]=vCalendar.tplM['contentline_SUMMARY'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_SUMMARY'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_TRANSP'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplC['contentline_TRANSP']; vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplM['contentline_TRANSP'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_TRANSP'][0]=vCalendar.tplM['contentline_TRANSP'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_TRANSP'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_PRIORITY'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplC['contentline_PRIORITY']; vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplM['contentline_PRIORITY'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_PRIORITY'][0]=vCalendar.tplM['contentline_PRIORITY'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_PRIORITY'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //LOCATION vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_LOCATION'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplC['contentline_LOCATION']; vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplM['contentline_LOCATION'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_LOCATION'][0]=vCalendar.tplM['contentline_LOCATION'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_LOCATION'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //URL vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_URL'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); //note=String(vcalendar_element).split(':')[1]; title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_URL'][0]=vCalendar.tplC['contentline_URL']; vCalendar.tplM['contentline_URL'][0]=vCalendar.tplM['contentline_URL'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_URL'][0]=vCalendar.tplM['contentline_URL'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_URL'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } // ------------------------------ VALARM ------------------------------ // var valarm=vevent.match(vCalendar.pre['valarm']); if(valarm!=null) { vevent=vevent.replace(valarm[0], ''); var alarmString=''; var alarmArray=new Array(); for(var i=0;i<valarm[0].length;i++) { if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM') { alarmArray[alarmArray.length]=alarmString+'\r\n'; alarmString=''; } alarmString+=valarm[0][i]; } for(var j=0;j<alarmArray.length;j++) { checkA=alarmArray[j].match(vCalendar.re['valarm']); if(checkA!=null) { var valarm_full=checkA[0].split('\r\n'); //BEGIN if((parsed=('\r\n'+valarm_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; //BEGIN, END VCALENDAR vCalendar.tplM['beginVALARM'][j]=vCalendar.tplC['beginVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]); // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" if((parsed=('\r\n'+valarm_full[valarm_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null) return false; // values not directly supported by the editor (old values are kept intact) vCalendar.tplM['endVALARM'][j]=vCalendar.tplC['endVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]); if(vcalendar_begin_group!=vcalendar_end_group) return false;// the vCalendar BEGIN and END "group" are different // remove the vCalendar BEGIN and END alarmArray[j]='\r\n'+valarm_full.slice(1, valarm_full.length-2).join('\r\n')+'\r\n'; trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']); if(trigger!=null) { parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_TRIGGER'][j]=vCalendar.tplC['contentline_TRIGGER']; vCalendar.tplM['contentline_TRIGGER'][j]=vCalendar.tplM['contentline_TRIGGER'][j].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=vcalendarSplitParam(parsed[3]); var parString=''; for(var i=0;i<pars.length;i++) { if((pars[i]!='VALUE=DATE-TIME') && (pars[i]!='VALUE=DURATION') && (pars[i]!='')) parString+=';'+pars[i]; } vCalendar.tplM['contentline_TRIGGER'][j]=vCalendar.tplM['contentline_TRIGGER'][j].replace(/##:::##params_wsc##:::##/g, parString); alarmArray[j]=alarmArray[j].replace(trigger[0], ''); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_TRIGGER'][j]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], ''); } } } note=alarmArray[j].match(vCalendar.pre['contentline_NOTE']); if(note!=null) { parsed=note[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_VANOTE'][j]=vCalendar.tplC['contentline_VANOTE']; vCalendar.tplM['contentline_VANOTE'][j]=vCalendar.tplM['contentline_VANOTE'][j].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_VANOTE'][j]=vCalendar.tplM['contentline_VANOTE'][j].replace(/##:::##params_wsc##:::##/g, parsed[3]); alarmArray[j]=alarmArray[j].replace(note[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_VANOTE'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']); if(action!=null) { parsed=action[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_ACTION'][j]=vCalendar.tplC['contentline_ACTION']; vCalendar.tplM['contentline_ACTION'][j]=vCalendar.tplM['contentline_ACTION'][j].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_ACTION'][j]=vCalendar.tplM['contentline_ACTION'][j].replace(/##:::##params_wsc##:::##/g, parsed[3]); alarmArray[j]=alarmArray[j].replace(action[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_ACTION'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } var checkUnprocess=$.trim(alarmArray[j]); if(checkUnprocess!='') vCalendar.tplM['unprocessedVALARM'][j]=alarmArray[j]; } } } // NOTE vcalendar_element=vevent.match(vCalendar.pre['contentline_NOTE']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_NOTE'][0]=vCalendar.tplC['contentline_NOTE']; vCalendar.tplM['contentline_NOTE'][0]=vCalendar.tplM['contentline_NOTE'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_NOTE'][0]=vCalendar.tplM['contentline_NOTE'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_NOTE'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //CLASS vcalendar_element=vevent.match(vCalendar.pre['contentline_CLASS']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_CLASS'][0]=vCalendar.tplC['contentline_CLASS']; vCalendar.tplM['contentline_CLASS'][0]=vCalendar.tplM['contentline_CLASS'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_CLASS'][0]=vCalendar.tplM['contentline_CLASS'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vCalendar.tplM['contentline_CLASS'][0]=vCalendar.tplM['contentline_CLASS'][0].replace(/##:::##value##:::##/g, parsed[4]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_CLASS'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } vcalendar_element=vevent.match(vCalendar.pre['contentline_STATUS']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); title=vcalendarUnescapeValue(parsed[4]); vCalendar.tplM['contentline_STATUS'][0]=vCalendar.tplC['contentline_STATUS']; vCalendar.tplM['contentline_STATUS'][0]=vCalendar.tplM['contentline_STATUS'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_STATUS'][0]=vCalendar.tplM['contentline_STATUS'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_STATUS'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //RECURRENCE-ID var rec=''; vcalendar_element=vevent.match(vCalendar.pre['contentline_RECURRENCE_ID']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); var rec=parsed[4]; vCalendar.tplM['contentline_REC_ID'][0]=vCalendar.tplC['contentline_REC_ID']; vCalendar.tplM['contentline_REC_ID'][0]=vCalendar.tplM['contentline_REC_ID'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=vcalendarSplitParam(parsed[3]); var parString=''; for(var i=0;i<pars.length;i++) { if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!='')) parString+=';'+pars[i]; } vCalendar.tplM['contentline_REC_ID'][0]=vCalendar.tplM['contentline_REC_ID'][0].replace(/##:::##params_wsc##:::##/g, parString); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_REC_ID'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } if(rec=='') rec='orig'; //EXDATE var i=-1; while(vevent.match(vCalendar.pre['contentline_EXDATE'])!= null) { i++; vcalendar_element=vevent.match(vCalendar.pre['contentline_EXDATE']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplC['contentline_EXDATE']; vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=vcalendarSplitParam(parsed[3]); var parString='', dateStr=''; for(var j=0;j<pars.length;j++) { if(pars[j]!='VALUE=DATE' && pars[j]!='') parString+=';'+pars[j]; if(pars[j]=='VALUE=DATE') dateStr=pars[j]; } if(dateStr.indexOf('VALUE=DATE')!=-1) vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##AllDay##:::##/g, ';VALUE=DATE'); else vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##AllDay##:::##/g, ''); vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##TZID##:::##/g, ''); vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##params_wsc##:::##/g, parString); vCalendar.tplM['contentline_EXDATE'][i]=vCalendar.tplM['contentline_EXDATE'][i].replace(/##:::##value##:::##/g,parsed[4]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_EXDATE'][i]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } } //END vcalendar_element=vevent.match(vCalendar.pre['contentline_DTEND']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_E_DTEND'][0]=vCalendar.tplC['contentline_E_DTEND']; vCalendar.tplM['contentline_E_DTEND'][0]=vCalendar.tplM['contentline_E_DTEND'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=vcalendarSplitParam(parsed[3]); var parString=''; for(var i=0;i<pars.length;i++) { if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!='')) parString+=';'+pars[i]; } vCalendar.tplM['contentline_E_DTEND'][0]=vCalendar.tplM['contentline_E_DTEND'][0].replace(/##:::##params_wsc##:::##/g, parString); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_E_DTEND'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //START vcalendar_element=vevent.match(vCalendar.pre['contentline_DTSTART']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_E_DTSTART'][0]=vCalendar.tplC['contentline_E_DTSTART']; vCalendar.tplM['contentline_E_DTSTART'][0]=vCalendar.tplM['contentline_E_DTSTART'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=vcalendarSplitParam(parsed[3]); var parString=''; for(var i=0;i<pars.length;i++) { if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!='')) parString+=';'+pars[i]; } vCalendar.tplM['contentline_E_DTSTART'][0]=vCalendar.tplM['contentline_E_DTSTART'][0].replace(/##:::##params_wsc##:::##/g, parString); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_E_DTSTART'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //RRULE vcalendar_element=vevent.match(vCalendar.pre['contentline_RRULE2']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_RRULE'][0]=vCalendar.tplC['contentline_RRULE']; vCalendar.tplM['contentline_RRULE'][0]=vCalendar.tplM['contentline_RRULE'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); var pars=parsed[4].split(';'); var parString=''; for(var i=0;i<pars.length;i++) { if((pars[i].indexOf('FREQ=')==-1) && (pars[i].indexOf('COUNT=')==-1) && (pars[i].indexOf('UNTIL=')==-1) && (pars[i]!='') && (pars[i].indexOf('INTERVAL=')==-1) && (pars[i].indexOf('BYDAY=')==-1) && (pars[i].indexOf('BYMONTHDAY=')==-1) && (pars[i].indexOf('BYMONTH=')==-1) && (pars[i].indexOf('WKST=')==-1)) parString+=';'+pars[i]; } vCalendar.tplM['contentline_RRULE'][0]=vCalendar.tplM['contentline_RRULE'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vCalendar.tplM['contentline_RRULE'][0]=vCalendar.tplM['contentline_RRULE'][0].replace(/##:::##value##:::##/g, '##:::##value##:::##'+parString); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_RRULE'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //UID vcalendar_element=inputEvent.vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_UID'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_UID'][0]=vCalendar.tplC['contentline_UID']; vCalendar.tplM['contentline_UID'][0]=vCalendar.tplM['contentline_UID'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_UID'][0]=vCalendar.tplM['contentline_UID'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vCalendar.tplM['contentline_UID'][0]=vCalendar.tplM['contentline_UID'][0].replace(/##:::##uid##:::##/g,parsed[4]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_UID'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //CREATED vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_CREATED'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_CREATED'][rec]=vCalendar.tplC['contentline_CREATED']; vCalendar.tplM['contentline_CREATED'][rec]=vCalendar.tplM['contentline_CREATED'][rec].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_CREATED'][rec]=vCalendar.tplM['contentline_CREATED'][rec].replace(/##:::##params_wsc##:::##/g, parsed[3]); vCalendar.tplM['contentline_CREATED'][rec]=vCalendar.tplM['contentline_CREATED'][rec].replace(/##:::##value##:::##/g,parsed[4]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_CREATED'][rec]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //LAST-MODIFIED vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_LM'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_LM'][0]=vCalendar.tplC['contentline_LM']; vCalendar.tplM['contentline_LM'][0]=vCalendar.tplM['contentline_LM'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_LM'][0]=vCalendar.tplM['contentline_LM'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_LM'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } //DTSTAMP vcalendar_element=vevent.match(RegExp('\r\n'+vCalendar.re['contentline_DTSTAMP'], 'mi')); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); vCalendar.tplM['contentline_DTSTAMP'][0]=vCalendar.tplC['contentline_DTSTAMP']; vCalendar.tplM['contentline_DTSTAMP'][0]=vCalendar.tplM['contentline_DTSTAMP'][0].replace(/##:::##group_wd##:::##/g, parsed[1]); vCalendar.tplM['contentline_DTSTAMP'][0]=vCalendar.tplM['contentline_DTSTAMP'][0].replace(/##:::##params_wsc##:::##/g, parsed[3]); vevent=vevent.replace(vcalendar_element[0], '\r\n'); if(parsed[1]!='') { var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im'); while ((vcalendar_element_related=vevent.match(re))!=null) { // append the parameter to its parent vCalendar.tplM['contentline_DTSTAMP'][0]+=vcalendar_element_related[0].substr(2); // remove the processed parameter vevent=vevent.replace(vcalendar_element_related[0], '\r\n'); } } } if(vevent.indexOf('\r\n')==0) vevent=vevent.substring(2, vevent.length-2); if(vevent.lastIndexOf('\r\n')!=(vevent.length-2)) vevent+='\r\n'; vCalendar.tplM['unprocessedVEVENT'][rec]=vevent; } if(vcalendar.indexOf('\r\n')==0) vcalendar=vcalendar.substring(2, vcalendar.length-2); if(vcalendar.lastIndexOf('\r\n')!=(vcalendar.length-2)) vcalendar+='\r\n'; //if(vTimeZone!='') // vcalendar+=vTimeZone; vCalendar.tplM['unprocessedVTIMEZONE']=vTimeZone; vCalendar.tplM['unprocessed']=vcalendar; } function parseAlarmWeek(value) { var durValue=''; var durChar='W'; var toSecondsValue=60*60*24*7; value=value.substring(value.indexOf('P')+1); durValue=value.substring(0, value.indexOf(durChar)); return durValue*toSecondsValue*1000+durChar; } function parseAlarmDay(value) { var durValue=''; var durChar='D'; var toSecondsValue=60*60*24; var returnValue=0; value=value.substring(value.indexOf('P')+1); durValue=value.substring(0, value.indexOf(durChar)); returnValue=durValue*toSecondsValue*1000; value=value.substring(value.indexOf(durChar+1)); if(value.indexOf('T')!=-1) { durValue=parseAlarmTime(value); if(durValue) { durChar=durValue.substring(durValue.length-1); durValue=durValue.substring(0, durValue.length-1); returnValue+=durValue; } } return returnValue+durChar; } function parseAlarmTime(value) { var durValue=''; var durChar=''; var toSecondsValue=0; var returnValue=0; value=value.substring(value.indexOf('T')+1); while(value!='') { if(value.indexOf('H')!=-1) { durChar='H'; toSecondsValue=60*60; } else if(value.indexOf('M')!=-1) { durChar='M'; toSecondsValue=60; } else if(value.indexOf('S')!=-1) { durChar='S'; toSecondsValue=1; } durValue=value.substring(0, value.indexOf(durChar)) value=value.substring(value.indexOf(durChar)+1); returnValue+=durValue*toSecondsValue; } if(durChar!='') return returnValue*1000+durChar; else return false; } function getDateFromDay(objComponent, t, disableRecursion,uid) { var daylightStartsMonth=objComponent.startMonth-1, daylightStartsDay=objComponent.startDay, daylightStartCount=objComponent.startCount, daylightStartsHours=objComponent.dtStart.parseComnpactISO8601(uid).getHours(), daylightStartsMinutes=objComponent.dtStart.parseComnpactISO8601().getMinutes(); //daylightStartsDay++; if(daylightStartsDay==7) daylightStartsDay=0; var checkDate=new Date(t.getFullYear(), daylightStartsMonth,1,23,59,0); if(disableRecursion) checkDate.setFullYear(checkDate.getFullYear()-1); var firstOfMonthDayOfWeek=checkDate.getDay(); if(firstOfMonthDayOfWeek!=daylightStartsDay) { var daysUntilFirst=(1+daylightStartsDay-firstOfMonthDayOfWeek)%7; if(daysUntilFirst<=0) checkDate.setDate(daysUntilFirst+7); else checkDate.setDate(daysUntilFirst); } if(daylightStartCount>0) { var daysUntilDaylight=(parseInt(daylightStartCount)-1)*7; var dayLightStartDate=new Date(checkDate.getFullYear(), checkDate.getMonth(), checkDate.getDate()+daysUntilDaylight, daylightStartsHours, daylightStartsMinutes); } else { var tmpLastDay=21+checkDate.getDate(); var checkTmpDay=new Date(t.getFullYear(),daylightStartsMonth,tmpLastDay+7,23,59,0); if(checkTmpDay.getMonth()!=daylightStartsMonth) var lastDay=tmpLastDay; else var lastDay=tmpLastDay+7; var daysUntilDaylight=(daylightStartCount+1)*7; var dayLightStartDate=new Date(checkDate.getFullYear(), checkDate.getMonth(), lastDay+daysUntilDaylight, daylightStartsHours, daylightStartsMinutes); } if(dayLightStartDate>t && !disableRecursion) dayLightStartDate=getDateFromDay(objComponent, t, true).startDate; return {offsetFrom:objComponent.tzOffsetFROM, offsetTo: objComponent.tzOffsetTO, startDate: dayLightStartDate}; } function vcalendarToData(inputCollection, inputEvent, isNew) { var vcalendarOrig=inputEvent.vcalendar; var eventArray=new Array(); //CHECK CALSCALE var elem=vcalendarOrig.match(vCalendar.pre['contentline_CALSCALE']); if(elem!=null) { calscale=elem[0].match(vCalendar.pre['contentline_parse'])[4]; if(calscale!='GREGORIAN') { console.log("Error:'"+inputEvent.uid+"': Unsupported calscale in:"+vcalendarOrig); return false; } } //CHECK VERSION var elemV=vcalendarOrig.match(vCalendar.pre['contentline_VERSION']); if(elemV!=null) { var ver=elemV[0].match(vCalendar.pre['contentline_parse'])[4]; if(ver!='2.0') { console.log("Error:'"+inputEvent.uid+"': Unsupported version ("+ver+") in:"+vcalendarOrig); return false; } } //FIX TIMEZONE var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE'); var startEndTimeZone=vcalendarOrig.lastIndexOf('END:VTIMEZONE'); var endTimeZone=0; var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1); var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length); var isChange=false, needReload=false; if(!isNew) { var events=findEventInArray(inputEvent.uid, true); if(events!='') { if(events.etag!=inputEvent.etag) { for(var i=0; i<events.alertTimeOut.length; i++) clearTimeout(events.alertTimeOut[i]); deleteEventFromArray(inputEvent.uid); if($('#show').val()!='') { if($('#show').val()==inputEvent.uid) { if($('#repeatEvent').val()=="true" || $('#recurrenceID').val()!='') { var name=globalCalEvent.title; showEventForm(null, null, {title: name, id:inputEvent.uid}, globalJsEvent, 'show','', true); $('#editAll').css('visibility','hidden'); $('#editFuture').css('visibility','hidden'); $('#editOnlyOne').css('visibility','hidden'); $('#repeatConfirmBoxContent').html('<b>'+name+"</b> "+localization[globalInterfaceLanguage].repeatChangeTxt); $('#repeatConfirmBoxQuestion').html(localization[globalInterfaceLanguage].repeatChangeTxtClose); } else needReload=true; } } isChange=true; } } } if((beginTimeZone!=-1) && (startEndTimeZone!=-1)) { for(i=(startEndTimeZone+2);i<vcalendarOrig.length;i++) { if(vcalendarOrig.charAt(i)=='\n') { endTimeZone=i+1; break; } } vTimeZone=vcalendarOrig.substring(beginTimeZone, endTimeZone); vcalendar=vcalendarOrig.substring(0, beginTimeZone)+vcalendarOrig.substring(endTimeZone, vcalendarOrig.length); } /* vcalendar_element=vcalendar.match(vCalendar.pre['tzone']); if(vcalendar_element!=null) vcalendar=vcalendar.replace(vcalendar_element[0],''); */ var recurrence_id_array=new Array(); while(vcalendarOrig.match(vCalendar.pre['vevent'])!=null) { if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2, vcalendarOrig.indexOf('BEGIN:VEVENT'))=='\r\n') { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2,vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); } else { var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT'),vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); vcalendarOrig=vcalendarOrig.replace(partEvent, ''); partEvent+='\r\n'; } var rec_array=partEvent.match(vCalendar.pre['contentline_RECURRENCE_ID']); var uidString=partEvent.match(vCalendar.pre['contentline_UID']); if(uidString!=null && rec_array!=null) { recurrence_id_array[recurrence_id_array.length]=rec_array[0].match(vCalendar.pre['contentline_parse'])[4]+';'+uidString[0].match(vCalendar.pre['contentline_parse'])[4]; } eventArray[eventArray.length]=partEvent; } if(eventArray.length==0) console.log("Error: '"+inputEvent.uid+"': unable to parse vEvent"); for(var evIt=0; evIt<eventArray.length; evIt++) { var oo='', note='', start='', end='', title='', location='', all=false, frequency='', interval='', byMonthDay='', byDay='', until='', isUntilDate=false, isRepeat=false, alertTime=new Array(), alertNote=new Array(), alertTimeOut=new Array(), valOffsetFrom='', valOffsetTo='', intOffset=0, tzName='local', realStart='', realEnd='', rec_id='', wkst='', classType='', avail='', hrefUrl='', returnForValue = true, stringUID='', priority="0", status='', pars=new Array(); var dtStartTimezone=''; var dates = new Array(); var vcalendar=eventArray[evIt]; var stringUID=vcalendar.match(vCalendar.pre['contentline_UID']); if(stringUID!=null) stringUID=stringUID[0].match(vCalendar.pre['contentline_parse'])[4]; var exDates=new Array(); var exDate=null; var exDate_array=new Array(); var vcalendar2=vcalendar+''; while(vcalendar2.match(vCalendar.pre['contentline_EXDATE'])!= null) { exDate=vcalendar2.match(vCalendar.pre['contentline_EXDATE']); exDate_array[exDate_array.length]=exDate[0]; vcalendar2=vcalendar2.replace(exDate,'\r\n'); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RRULE2']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); // || ((parsed[4].indexOf('FREQ=MONTHLY')!=-1||parsed[4].indexOf('FREQ=YEARLY')!=-1)&&parsed[4].indexOf('BYDAY')!=-1)&&parsed[4].search('[0-9]')==-1) // if(parsed[4].indexOf('BYSETPOS')!=-1 || parsed[4].indexOf('BYWEEKNO')!=-1) // { // console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in event:"+vcalendar); // return false; // } pars=parsed[4].split(';'); var parString=''; if(pars.length>0) isRepeat=true; for(var i=0;i<pars.length;i++) { if(pars[i].indexOf('FREQ=')!=-1) frequency=pars[i].split('=')[1]; else if(pars[i].indexOf('INTERVAL=')!=-1) interval=pars[i].split('=')[1]; else if(pars[i].indexOf('COUNT=')!=-1) { until=pars[i].split('=')[1]; if(until==0) { returnForValue = false; break } else if(isNaN(until)) { returnForValue = false; break } } else if(pars[i].indexOf('UNTIL=')!=-1) { isUntilDate=true; until=pars[i].split('=')[1]; //if(until.indexOf('T')==-1) // until+='T000000Z'; } else if(pars[i].indexOf('WKST=')!=-1) { wkst=pars[i].split('=')[1].replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0); if(globalSettings.mozillasupport.value!=null && globalSettings.mozillasupport.value) wkst=''; } else if(pars[i].indexOf('BYMONTHDAY=')!=-1) byMonthDay=pars[i].split('=')[1]; else if(pars[i].indexOf('BYDAY=')!=-1) { byDay=pars[i].split('=')[1]; byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(','); if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) { console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in event:"+vcalendar); return false; } } } if(!returnForValue) { continue; } if(!interval) interval=1; } var dayLightStartDate, dayLightEndDate, tzObject; vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTSTART']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); start=parsed[4]; var help1=start; if(help1.indexOf("T")==-1) { help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8); all=true; } else { help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15); all=false; } var t=$.fullCalendar.parseDate(help1); if(t==null) return false; if(t.toString()=='Invalid Date') return false; if(!all) { parsed_value=vcalendarSplitParam(parsed[3]); for(h=1;h<parsed_value.length;h++) if(parsed_value[h]!='') dtStartTimezone=parsed_value[h]; dtStartTimezone=dtStartTimezone.split('=') if(start.charAt(start.length-1)=='Z') tzName='UTC'; if(dtStartTimezone.length>1 || tzName=='UTC') { if(tzName!='UTC') tzName=$.trim(dtStartTimezone[1]); var finTZ = checkTimezone(tzName); if(finTZ!=null) tzName = finTZ; if(globalSettings.timezonesupport.value && tzName in timezones) { valOffsetFrom=getOffsetByTZ(tzName, t); intOffset=(getLocalOffset(t)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; } } else if(processedTimezones.indexOf(tzName)==-1) { if(timeZonesEnabled.indexOf(tzName)==-1) timeZonesEnabled.push('local'); processedTimezones.push('local'); } if(tzName!='' && tzName != 'local') if(processedTimezones.indexOf(tzName)==-1) { if(timeZonesEnabled.indexOf(tzName)==-1) timeZonesEnabled.push(tzName); processedTimezones.push(tzName); } } else tzName = globalSessionTimeZone; realStart=$.fullCalendar.parseDate(help1); inputEvent.start=$.fullCalendar.parseDate(help1); start=$.fullCalendar.parseDate(help1); if(intOffset) { inputEvent.start.setTime(inputEvent.start.getTime()+intOffset); start.setTime(start.getTime()+intOffset); } if(exDate_array!=null) for(var j=0;j<exDate_array.length;j++) { var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4]; if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1) var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1); else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1) var utcTime=exString.parseComnpactISO8601(); else { if(help1.indexOf('T')!=-1) exString += 'T' + $.fullCalendar.formatDate(start,'HHmmss'); var utcTime=exString.parseComnpactISO8601(); } exDates[exDates.length]=new Date(utcTime).toString(); } var valarm=vcalendar.match(vCalendar.pre['valarm']); if(valarm!=null) { vcalendar=vcalendar.replace(valarm[0], ''); var alarmString=''; var alarmArray=new Array(); for(var i=0;i<valarm[0].length;i++) { if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM') { alarmArray[alarmArray.length]=alarmString+'\r\n'; alarmString=''; } alarmString+=valarm[0][i]; } for(var j=0;j<alarmArray.length;j++) { checkA=alarmArray[j].match(vCalendar.re['valarm']); if(checkA!=null) { action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']); if(action!=null) parsed=action[0].match(vCalendar.pre['contentline_parse']); else break; trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']); if(trigger!=null) { parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']); if(parsed!=null) { value=parsed[4]; var checkD=value.match(vCalendar.pre['date-time-value']); var intOffsetA=''; var tzNameA=''; if(checkD!=null) { if(parsed[3]) var dtStartTimezoneA=parsed[3].split('='); var alarmTimeA=$.fullCalendar.parseDate(value.substring(0, 4)+'-'+value.substring(4, 6)+'-'+value.substring(6, 8)+'T'+value.substring(9, 11)+':'+value.substring(11, 13)+':'+value.substring(13, 15)); if(value.charAt(value.length-1)=='Z') tzNameA='UTC'; if(dtStartTimezoneA.length>1 || tzNameA=='UTC') { if(tzNameA!='UTC' && dtStartTimezoneA[0]==';TZID') tzNameA=$.trim(dtStartTimezoneA[1]); var finTZ = checkTimezone(tzNameA); if(finTZ!=null) tzNameA = finTZ; if(globalSettings.timezonesupport.value && tzNameA in timezones) { var valOffsetFromA=getOffsetByTZ(tzNameA, alarmTimeA); intOffsetA=getOffsetByTZ(tzName, alarmTimeA).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000; } } else if(processedTimezones.indexOf(tzName)==-1) { if(timeZonesEnabled.indexOf(tzName)==-1) timeZonesEnabled.push('local'); processedTimezones.push('local'); } if(tzNameA!='' && tzNameA != 'local') if(processedTimezones.indexOf(tzNameA)==-1) { if(timeZonesEnabled.indexOf(tzNameA)==-1) timeZonesEnabled.push(tzNameA); processedTimezones.push(tzNameA); } if(intOffsetA!='') alarmTimeA.setTime(alarmTimeA.getTime()+intOffsetA); alertTime[j]=$.fullCalendar.formatDate(alarmTimeA,"yyyy-MM-dd'T'HH:mm:ss"); } else { alertTime[j]=0; if(value.indexOf('W')!=-1) alertTime[j]=parseAlarmWeek(value); else if(value.indexOf('D')!=-1) alertTime[j]=parseAlarmDay(value); else if(value.indexOf('T')!=-1) alertTime[j]=parseAlarmTime(value); if(parsed[4].charAt(0)=="-") alertTime[j]="-"+alertTime[j]; else alertTime[j]="+"+alertTime[j]; } } } else break; noteA=alarmArray[j].match(vCalendar.pre['contentline_NOTE']); if(noteA!=null) { parsed=noteA[0].match(vCalendar.pre['contentline_parse']); alertNote[j]=parsed[4]; } else alertNote[j]='Default note'; } } } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_LOCATION']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); location=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_NOTE']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); note=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_SUMMARY']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); title=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PRIORITY']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); priority=vcalendarUnescapeValue(parsed[4]); } var index=0; for(var p=0;p<globalResourceCalDAVList.collections.length;p++) if(typeof globalResourceCalDAVList.collections[p].uid !='undefined' && globalResourceCalDAVList.collections[p].uid==inputCollection.uid) { index=p; break; } var firstPart=index.pad(String(globalResourceCalDAVList.collections.length).length); var compareString=(firstPart + title).toLowerCase(); vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CLASS']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); classType=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_STATUS']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); status=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_TRANSP']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); avail=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_URL']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); hrefUrl=vcalendarUnescapeValue(parsed[4]); } vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RECURRENCE_ID']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); var rec=parsed[4]; /*if(rec.indexOf("T")==-1) { rec=rec.substring(0, 4)+'/'+rec.substring(4, 6)+'/'+rec.substring(6, 8); var d=$.fullCalendar.parseDate(rec); var da=new Date(d.getTime()-1*24*60*60*1000); var day=da.getDate(); if(day<10) day='0'+day; var month=da.getMonth(); month++; if(month<10) month='0'+month; rec=da.getFullYear()+'-'+month+'-'+day; } else rec=rec.substring(0, 4)+'-'+rec.substring(4, 6)+'-'+rec.substring(6, 8)+'T'+rec.substring(9, 11)+':'+rec.substring(11, 13)+':'+rec.substring(13, 15); rec_id=$.fullCalendar.parseDate(rec);*/ //if(!rec_id || rec_id=='Invalid Date') // rec_id=''; rec_id=rec; } var isDuration = false; var dur = 0; vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTEND']); if(vcalendar_element!=null) { parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); end=parsed[4]; var help=end; if(help.indexOf("T")==-1) { help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8); var d=$.fullCalendar.parseDate(help); var da=new Date(d.getTime()); if(help1.indexOf("T")==-1) da.setDate(da.getDate()-1); help=$.fullCalendar.formatDate(da, "yyyy-MM-dd"); all=true; if(help1.indexOf("T")!=-1) { all=false; help+='T00:00:00'; if(tzName == 'UTC') help+='Z'; } } else { help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8)+'T'+help.substring(9, 11)+':'+help.substring(11, 13)+':'+help.substring(13, 15); all=false; } } else { var checkDur=vcalendar.match(vCalendar.pre['dur-value']); if(checkDur!=null) { var checkP = (checkDur[0]+'\r\n').match(vCalendar.pre['contentline_parse']); if(checkP != null) { var value=checkP[4]; var number = 0; if(value.indexOf('W')!=-1) number=parseAlarmWeek(value); else if(value.indexOf('D')!=-1) number=parseAlarmDay(value); else if(value.indexOf('T')!=-1) number=parseAlarmTime(value); if(parsed[4].charAt(0)=="-") number="-"+number; else number="+"+number; dur=parseInt(number.substring(1, number.length-1),10); isDuration = true; } } } if(isDuration) { var st=''; if(!all) st = $.fullCalendar.parseDate(help1); else { st = $.fullCalendar.parseDate(help1+'T00:00:00'); //date object mindfuck problem st.setMilliseconds(-1); } var durDate = new Date(st.getTime() + dur); help = $.fullCalendar.formatDate(durDate,"yyyy-MM-dd'T'HH:mm:ss"); } if(typeof help=='undefined' || help=='' || help==null) help=help1; var t1=$.fullCalendar.parseDate(help); if(t1==null) return false; else if(t1.toString()=='Invalid Date') return false; if(!all) { if(end.charAt(end.length-1)=='Z') tzName='UTC'; if(dtStartTimezone.length>1 || tzName=='UTC') { if(tzName!='UTC') tzName=$.trim(dtStartTimezone[1]); var finTZ = checkTimezone(tzName); if(finTZ!=null) tzName = finTZ; if(globalSettings.timezonesupport.value && tzName in timezones) { valOffsetFrom=getOffsetByTZ(tzName, t1); intOffset=(getLocalOffset(t1)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; } } else if(processedTimezones.indexOf(tzName)==-1) { if(timeZonesEnabled.indexOf(tzName)==-1) timeZonesEnabled.push('local'); processedTimezones.push('local'); } //realEnd=$.fullCalendar.parseDate(help); //help1+=valOffsetFrom; if(tzName!='' && tzName != 'local') if(processedTimezones.indexOf(tzName)==-1) { if(timeZonesEnabled.indexOf(tzName)==-1) timeZonesEnabled.push(tzName); processedTimezones.push(tzName); } } else tzName = globalSessionTimeZone; realEnd=$.fullCalendar.parseDate(help); inputEvent.end=$.fullCalendar.parseDate(help); end=$.fullCalendar.parseDate(help); if(intOffset) { inputEvent.end.setTime(inputEvent.end.getTime()+intOffset); end.setTime(end.getTime()+intOffset); } } else return false; if(globalVisibleCalDAVCollections.indexOf(rid)!=-1 || isChange || isNew) { if(isRepeat) { var futureRLimit = new Date(globalToLoadedLimit.getTime()) futureRLimit.setDate(futureRLimit.getDate()+14); var ruleString=vcalendar.match(vCalendar.pre['contentline_RRULE2'])[0].match(vCalendar.pre['contentline_parse'])[4]; inputEvent.isRepeat=true; if(realStart) var varDate=new Date(realStart.getTime()); else var varDate=new Date(start.getTime()); if(realEnd) var varEndDate=new Date(realEnd.getTime()); else var varEndDate=new Date(end.getTime()); var lastGenDate=''; var repeatStart=new Date(varDate.getTime()); var repeatEnd=new Date(varEndDate.getTime()); var untilDate='',realUntilDate='',realUntil=''; if(until!=='') { if(isUntilDate) { if(until.indexOf('T')!=-1) { var uString = until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)+'T'+until.substring(9, 11)+':'+until.substring(11, 13)+':'+until.substring(13, 15); var ut=$.fullCalendar.parseDate(uString); if(ut==null) return false; if(ut.toString()=='Invalid Date') return false; if(!all) { if(globalSettings.timezonesupport.value && tzName in timezones) valOffsetFrom=getOffsetByTZ(tzName, ut); if(valOffsetFrom) { var intOffset=valOffsetFrom.getSecondsFromOffset()*1000; ut.setTime(ut.getTime()+intOffset); } } untilDate = new Date(ut.getTime()); } else { untilDate=$.fullCalendar.parseDate(until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)); untilDate.setHours(realStart.getHours()); untilDate.setMinutes(realStart.getMinutes()); untilDate.setSeconds(realStart.getSeconds()); } realUntil=''; } else { untilDate=''; realUntil=until; } realUntilDate=untilDate; inputEvent.untilDate=untilDate; } else { untilDate=new Date(futureRLimit.getTime()); realUntilDate=''; inputEvent.untilDate='never'; } var repeatCount=0, realRepeatCount=0; if(!inputEvent.isDrawn) { if(alertTime.length>0) { var aTime=''; var now=new Date(); if(!inputCollection.ignoreAlarms) alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title}, true, inputEvent.uid); } realRepeatCount++; var checkRec=isInRecurrenceArray(varDate,stringUID,recurrence_id_array, tzName); if(exDates.length>0) if(exDates.indexOf(varDate.toString())!=-1) checkRec=true; if(!checkRec) { repeatCount++; var tmpObj=new items(inputEvent.etag, start, end, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay,repeatCount, realRepeatCount, vcalendar, location, alertTimeOut,tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl, compareString,priority,status,ruleString); globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); } } var lastGenDate=generateRepeatInstances({ untilDate:realUntilDate, repeatStart:varDate, futureRLimit:futureRLimit, stringUID:stringUID, recurrence_id_array:recurrence_id_array, exDates:exDates, alertTime:alertTime, ignoreAlarms:inputCollection.ignoreAlarms, items:new items(inputEvent.etag, varDate, varEndDate, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay, repeatCount, realRepeatCount, vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString) }); } else { if(!inputCollection.ignoreAlarms) alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title},true,inputEvent.uid); var tmpObj=new items(inputEvent.etag, start, end, title, all, inputEvent.uid, rid, evid, note, inputEvent.displayValue, alertTime, alertNote, '', '', '', '', '', '', '', '', '', vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString); if(isChange) { if(needReload) showEventForm(null, null, tmpObj, globalJsEvent, 'show', ''); } globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); } } } inputEvent.isDrawn=true; } function notRFCDataToRFCData(vcalendarString) { // If vCalendar contains only '\n' instead of '\r\n' we correct this if(vcalendarString.match(RegExp('\r', 'm'))==null) vcalendarString=vcalendarString.replace(RegExp('\n', 'gm'), '\r\n'); // remove multiple empty lines vcalendarString=vcalendarString.replace(RegExp('(\r\n)+','gm'),'\r\n'); // remove line folding vcalendarString=vcalendarString.replace(RegExp('\r\n'+vCalendar.re['WSP'], 'gm'), ''); // append '\r\n' to the end of the vCalendar if missing if(vcalendarString[vcalendarString.length-1]!='\n') vcalendarString+='\r\n'; return vcalendarString; } function vCalendarCleanup(vcalendarString) { vcalendarString=notRFCDataToRFCData(vcalendarString); return vcalendarString; }