354 lines
12 KiB
JavaScript
354 lines
12 KiB
JavaScript
/*
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|