diff options
Diffstat (limited to 'radicale_infcloud/web/vcalendar.js')
-rw-r--r-- | radicale_infcloud/web/vcalendar.js | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/radicale_infcloud/web/vcalendar.js b/radicale_infcloud/web/vcalendar.js new file mode 100644 index 0000000..ee8eadb --- /dev/null +++ b/radicale_infcloud/web/vcalendar.js @@ -0,0 +1,353 @@ +/* +InfCloud - the open source CalDAV/CardDAV 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/>. +*/ + +// EventList Class +function EventList() +{ + this.events={}; + this.todos={}; + this.displayEventsArray={}; + this.displayTodosArray={}; + this.repeatable={}; + this.repeatableTodo={}; + + this.reset=function() + { + this.events={}; + this.todos={}; + this.repeatable={}; + this.repeatableTodo={}; + this.displayEventsArray={}; + this.displayTodosArray={}; + } + + this.getNewUID=function() + { + //we count with uniqueness of generated hash string + var newUID=null; + newUID=generateUID(); + return newUID; + } + + this.getSortKey=function(vcalendar_clean) + { + var vcalendar_element=('\r\n'+vcalendar_clean).match(RegExp('\r\n'+vCalendar.re['contentline_N'], 'm')); + if(vcalendar_element!=null && vcalendar_element.length==1) // if the N attribute is not present exactly once, vCalendar is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcalendar_element[0].match(RegExp('\r\n'+vCalendar.re['contentline_parse'], 'm')); + // parsed_value = [0]->Family, [1]->Given, [2]->Middle, [3]->Prefix, [4]->Suffix + var parsed_value=vcalendarSplitValue(parsed[4], ';'); + // TODO: allow users to set the sorting method + if(parsed_value[0]!='' || parsed_value[1]!='') + { + var sort_value=parsed_value[0]; + if (sort_value!='' && parsed_value[1]!='') + sort_value+=' '; + sort_value+=parsed_value[1]; + } + else // if no N value present, we use the FN instead + { + var vcalendar_element2=('\r\n'+vcalendar_clean).match(RegExp('\r\n'+vCalendar.re['contentline_FN'], 'm')); + if(vcalendar_element2!=null && vcalendar_element2.length==1) // if the FN attribute is not present exactly once, vCalendar is considered invalid + { + // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" + var parsed=vcalendar_element2[0].match(RegExp('\r\n'+vCalendar.re['contentline_parse'], 'm')); + var sort_value=parsed[4]; + } + } + return sort_value; + } + else + return false; + } + + // Resource list is not sorted, instead "insert sort" is performed + this.insertEvent=function(forceCall,inputCollection, inputEvent, forceReload, isEvent, isFromServer) + { + makeActive=null; + var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1); + var compObject = {}; + if(isEvent) + compObject = globalEventList.events; + else + compObject = globalEventList.todos; + // do not insert entry with duplicate UID + if(compObject[rid][inputEvent.uid]!=undefined) + { + if(compObject[rid][inputEvent.uid].etag!=inputEvent.etag) + { + this.removeOldEvent(inputEvent.uid, false, isEvent); + makeActive=inputEvent.uid; + } + else + { + checkEventLoader(globalResourceCalDAVList.counterList[inputCollection.uid+' '+inputCollection.listType], false); + return 0; + } + } + + if(isEvent) + { + // find the index where to insert the new event + var res=getvCalendarstart(inputEvent); + if(res!=false && res!=-1 && res!=undefined && res!=null) + inputEvent.sortStart=res; + else + { + console.log("Error: '"+inputEvent.uid+"': unable to parse vEvent"); + checkEventLoader(globalResourceCalDAVList.counterList[inputCollection.uid+' '+inputCollection.listType], true); + return false; + } + + globalEventList.events[rid][inputEvent.uid]=inputEvent; + } + else + globalEventList.todos[rid][inputEvent.uid]=inputEvent; + + if(makeActive!=null) + { + globalEventList.loadEventByUID(makeActive, isEvent,isFromServer); + return 0; + } + + var inputUID=inputEvent.uid; + rid=inputUID.substring(0, inputUID.lastIndexOf('/')+1); + +// setTimeout(function() +// { + if(!isEvent) + { + if(vcalendarTodoData(inputCollection, inputEvent, true) == false) + console.log("Error: '"+inputEvent.uid+"': unable to parse vTodo"); + } + else + { + if(vcalendarToData(inputCollection, inputEvent, true) == false) + console.log("Error: '"+inputEvent.uid+"': unable to parse vEvent"); + } + + if(isEvent) + { + if(inputEvent.counter==undefined) + { + if(globalVisibleCalDAVCollections.indexOf(rid)!=-1 || globalSettings.displayhiddenevents.value) + refetchCalendarEvents(); + else + { + var beforeScroll = $('#main').width()-$('#calendar').width(); + $('#calendar').fullCalendar('removeEvents', 'fooUID'); + var afterScroll = $('#main').width()-$('#calendar').width(); + rerenderCalendar(beforeScroll!=afterScroll); + } + } + } + else + { + if(inputEvent.counter==undefined) + { + if(globalVisibleCalDAVTODOCollections.indexOf(rid)!=-1 || globalSettings.displayhiddenevents.value) + refetchTodoEvents(); + } + } + if(inputEvent.counter!=undefined) + checkEventLoader(globalResourceCalDAVList.counterList[inputCollection.uid+' '+inputCollection.listType], true); + if(forceCall && !isEvent) + $('#todoList').fullCalendar('selectEvent',$('[data-id="'+inputEvent.uid+'"]')); +// }, 100); + } + + this.checkAndTouchIfExists=function(calendarUID,inputUID,inputEtag,inputTimestamp) + { + if(globalEventList.events[calendarUID]!=undefined && globalEventList.events[calendarUID][inputUID]!=undefined) + { + globalEventList.events[calendarUID][inputUID].timestamp=inputTimestamp; + if(globalEventList.events[calendarUID][inputUID].etag==inputEtag) + return true; + else + return false; + } + else if(globalEventList.todos[calendarUID]!=undefined && globalEventList.todos[calendarUID][inputUID]!=undefined) + { + globalEventList.todos[calendarUID][inputUID].timestamp=inputTimestamp; + if(globalEventList.todos[calendarUID][inputUID].etag==inputEtag) + return true; + else + return false; + } + else + return false; + } + + this.removeOldEvents=function(inputUidBase, inputTimestamp, isEvent) + { + if(isEvent) + { + for(var i=0; i<globalResourceCalDAVList.collections.length;i++) + if(globalResourceCalDAVList.collections[i].uid!=undefined) + for(var key in globalEventList.events[globalResourceCalDAVList.collections[i].uid]) + { + var event = globalEventList.events[globalResourceCalDAVList.collections[i].uid][key]; + if(event.timestamp!=undefined && event.uid.indexOf(inputUidBase)==0 && event.timestamp<inputTimestamp) + globalEventList.removeOldEvent(event.uid, true, isEvent); + } + } + else + { + for(var i=0; i<globalResourceCalDAVList.TodoCollections.length;i++) + if(globalResourceCalDAVList.TodoCollections[i].uid!=undefined) + for(var key in globalEventList.todos[globalResourceCalDAVList.TodoCollections[i].uid]) + { + var event = globalEventList.todos[globalResourceCalDAVList.TodoCollections[i].uid][key]; + if(event.timestamp!=undefined && event.uid.indexOf(inputUidBase)==0 && event.timestamp<inputTimestamp) + globalEventList.removeOldEvent(event.uid, true, isEvent); + } + } + } + + this.removeOldEvent=function(inputUid, fromInterface, isEvent) + { + var rid=inputUid.substring(0, inputUid.lastIndexOf('/')+1); + var uidRemoved=null; + var isEvent=true; + if(globalEventList.events[rid]!=undefined && globalEventList.events[rid][inputUid]!=undefined) + { + uidRemoved=inputUid; + delete globalEventList.events[rid][inputUid]; + isEvent=true; + } + else if(globalEventList.todos[rid]!=undefined && globalEventList.todos[rid][inputUid]!=undefined) + { + uidRemoved=inputUid; + delete globalEventList.todos[rid][inputUid]; + isEvent=false; + } + + if(uidRemoved!=null) + { + if(fromInterface) + { + deleteEventFromArray(uidRemoved); + if(isEvent) + refetchCalendarEvents(); + else + { + var prevIndex = ''; + if(globalCalTodo!=null) + prevIndex=$('.fc-view-todo .fc-list-day').find('.fc-event:visible').index($('[data-repeat-hash="'+globalCalTodo.repeatHash+'"]')); + refetchTodoEvents(); + if(prevIndex!=-1 && $('.fc-view-todo .fc-list-day').find('.fc-event:visible').length > 0 && prevIndex>($('.fc-view-todo .fc-list-day').find('.fc-event:visible').length-1)) + $('#todoList').fullCalendar('selectEvent',$($('.fc-view-todo .fc-list-day').find('.fc-event:visible').get($('.fc-view-todo .fc-list-day').find('.fc-event:visible').length-1))); + else if(prevIndex!=-1 && $('.fc-view-todo .fc-list-day').find('.fc-event:visible').length > 0 && prevIndex<=($('.fc-view-todo .fc-list-day').find('.fc-event:visible').length-1)) + $('#todoList').fullCalendar('selectEvent',$($('.fc-view-todo .fc-list-day').find('.fc-event:visible').get(prevIndex))); + else + $('#CATodo').attr('style','display:none'); + } + } + if(isEvent) + delete globalEventList.repeatable[inputUid]; + else + delete globalEventList.repeatableTodo[inputUid]; + } + } + + this.loadEventByUID=function(inputUID, isEvent,isFromServer) + { + var rid=''; + if(inputUID.charAt(inputUID.length-1)!='/') + { + rid=inputUID.substring(0, inputUID.lastIndexOf('/')+1); + if(isEvent) + { + if(globalEventList.events[rid][inputUID].uid!=undefined) + { + var evs=''; + if(!globalCalDAVInitLoad) + evs=findEventInArray(globalEventList.events[rid][inputUID].uid, isEvent); + + if(evs!='' && evs.etag!=globalEventList.events[rid][inputUID].etag) + { + vcalendarToData(globalResourceCalDAVList.getCollectionByUID(rid), globalEventList.events[rid][inputUID], false); + if(!isFromServer && (globalVisibleCalDAVCollections.indexOf(rid)!=-1 || globalSettings.displayhiddenevents.value)) + refetchCalendarEvents(); + else if(isFromServer) + checkEventLoader(globalResourceCalDAVList.counterList[rid+' '+globalResourceCalDAVList.getCollectionByUID(rid).listType], true); + } + } + } + else + { + if(globalEventList.todos[rid][inputUID].uid!=undefined) + { + var evs=''; + if(!globalCalDAVInitLoad) + evs=findEventInArray(globalEventList.todos[rid][inputUID].uid, isEvent); + if(evs!='' && evs.etag!=globalEventList.todos[rid][inputUID].etag) + { + vcalendarTodoData(globalResourceCalDAVList.getCollectionByUID(rid), globalEventList.todos[rid][inputUID], false); + if(globalVisibleCalDAVTODOCollections.indexOf(rid)!=-1 || globalSettings.displayhiddenevents.value) + { + $('#todoList').fullCalendar('allowSelectEvent',false); + refetchTodoEvents(); + $('#todoList').fullCalendar('allowSelectEvent',true); + if($('#showTODO').val()==inputUID) + { + var newTodo = findEventInArray(globalEventList.todos[rid][inputUID].uid,false,globalCalTodo!=null ? globalCalTodo.repeatHash : null); + if(newTodo!='') + { + if(globalCalTodo!=null) + { + if(isFromServer && $('#showTODO').val()==inputUID && ($('#repeatTodo').val()=="true" || $('#recurrenceIDTODO').val()!='')) + { + if(globalCalTodo.repeatHash != newTodo.repeatHash) + { + var name=globalCalTodo.title; + showTodoForm({title: name, id:inputUID}, 'show','', true); + $('#editAllTODO').css('visibility','hidden'); + $('#editFutureTODO').css('visibility','hidden'); + $('#editOnlyOneTODO').css('visibility','hidden'); + $('#repeatConfirmBoxContentTODO').html('<b>'+name+"</b> "+localization[globalInterfaceLanguage].repeatChangeTxt); + $('#repeatConfirmBoxQuestionTODO').html(localization[globalInterfaceLanguage].repeatTodoChangeTxtClose); + } + else + $('#todoList').fullCalendar('selectEvent'); + } + else + { + if($($('.fc-view-todo .fc-list-day').find('.fc-event[data-repeat-hash="'+$('#todoList').fullCalendar('getView').selectedElement+'"]')).length>0) + $('#todoList').fullCalendar('selectEvent',$($('.fc-view-todo .fc-list-day').find('.fc-event[data-repeat-hash="'+$('#todoList').fullCalendar('getView').selectedElement+'"]'))); + else + showTodoForm(globalCalTodo, 'show'); + } + } + } + else + $('#CATodo').attr('style','display:none'); + } + else + $('#todoList').fullCalendar('selectEvent',null,true); + } + } + } + } + } + } +} |