/* InfCloud - the open source CalDAV/CardDAV Web Client Copyright (C) 2011-2015 Jan Mate Andrej Lezo Matej Mihalik 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 . */ // 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 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(''+name+" "+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); } } } } } } }