/* 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/>. */ function handleCalDAVError(isError, inputResource) { var collections=''; collections=globalResourceCalDAVList.collections; for(var i=0; i<collections.length;i++) { if(collections[i].uid!=undefined) { var tmp=collections[i].accountUID.match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)','i')); var resource_href=tmp[1]+tmp[3]+tmp[4]; var resource_user=tmp[2]; if(inputResource.href==resource_href && inputResource.userAuth.userName==resource_user) { if(globalSettingsSaving =='event' && isError) { var isLoaded=false; if(typeof globalCrossServerSettingsURL!='undefined'&&globalCrossServerSettingsURL!=null&globalCrossServerSettingsURL) { var uidParts=(collections[i].uid).match(RegExp('/([^/]+/[^/]+/)$')); var tmpParts = uidParts[1].match('^(.*/)([^/]+)/$'); var checkHref=decodeURIComponent(tmpParts[1])+tmpParts[2]+'/'; var found=false; for(var l=0;l<globalSettings.loadedcalendarcollections.value.length;l++) { var tmpParts2 = globalSettings.loadedcalendarcollections.value[l].match('^(.*/)([^/]+)/([^/]+)/$'); var checkHref2=decodeURIComponent(tmpParts2[2])+'/'+tmpParts2[3]+'/'; if(checkHref==checkHref2) { found=true; break; } } isLoaded=found; } else { var uidParts=(collections[i].uid).match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)')); var checkHref = uidParts[1]+uidParts[3]; isLoaded=(globalSettings.loadedcalendarcollections.value.indexOf(checkHref)!=-1); } if(isLoaded && collections[i].oldSyncToken=='') { var newObj = $.extend(collections[i],{makeLoaded:true}); globalResourceCalDAVList.insertResource(newObj, collections[i].resourceIndex, true); updateMainLoaderText(collections[i].listType); updateMainLoader(); } } if(isError) $('#ResourceCalDAVList').find('[data-id="'+collections[i].uid+'"]').addClass('r_error'); else $('#ResourceCalDAVList').find('[data-id="'+collections[i].uid+'"]').removeClass('r_error'); } } } collections=globalResourceCalDAVList.TodoCollections; for(var i=0; i<collections.length;i++) { if(collections[i].uid!=undefined) { var tmp=collections[i].accountUID.match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)','i')); var resource_href=tmp[1]+tmp[3]+tmp[4]; var resource_user=tmp[2]; if(inputResource.href==resource_href && inputResource.userAuth.userName==resource_user) { if(globalSettingsSaving =='todo' && isError) { var isLoaded=false; if(typeof globalCrossServerSettingsURL!='undefined'&&globalCrossServerSettingsURL!=null&globalCrossServerSettingsURL) { var uidParts=(collections[i].uid).match(RegExp('/([^/]+/[^/]+/)$')); var tmpParts = uidParts[1].match('^(.*/)([^/]+)/$'); var checkHref=decodeURIComponent(tmpParts[1])+tmpParts[2]+'/'; var found=false; for(var l=0;l<globalSettings.loadedtodocollections.value.length;l++) { var tmpParts2 = globalSettings.loadedtodocollections.value[l].match('^(.*/)([^/]+)/([^/]+)/$'); var checkHref2=decodeURIComponent(tmpParts2[2])+'/'+tmpParts2[3]+'/'; if(checkHref==checkHref2) { found=true; break; } } isLoaded=found; } else { var uidParts=(collections[i].uid).match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)')); var checkHref = uidParts[1]+uidParts[3]; isLoaded=(globalSettings.loadedtodocollections.value.indexOf(checkHref)!=-1); } if(isLoaded && collections[i].oldSyncToken=='') { var newObj = $.extend(collections[i],{makeLoaded:true}); globalResourceCalDAVList.insertResource(newObj, collections[i].resourceIndex, false); updateMainLoaderText(collections[i].listType); updateMainLoader(); } } if(isError) $('#ResourceCalDAVTODOList').find('[data-id="'+collections[i].uid+'"]').addClass('r_error'); else $('#ResourceCalDAVTODOList').find('[data-id="'+collections[i].uid+'"]').removeClass('r_error'); } } } } function unloadCalDAVCollection(unloadArray, isEvent) { var collArray = {}, todoString=''; if(isEvent) collArray=globalResourceCalDAVList.collections; else { collArray=globalResourceCalDAVList.TodoCollections; todoString='TODO'; } for(var i=0; i<collArray.length; i++) { if(collArray[i].uid!=undefined) { var uidParts=(collArray[i].uid).match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)')); var checkHref = uidParts[1]+uidParts[3]; if(unloadArray.indexOf(checkHref)!=-1) { $('#CalendarLoader'+todoString).children('.loaderInfo').text(localization[globalInterfaceLanguage].unloadingCalendars); if(window['globalVisibleCalDAV'+todoString+'Collections'].indexOf(collArray[i].uid)!=-1) window['globalVisibleCalDAV'+todoString+'Collections'].splice(window['globalVisibleCalDAV'+todoString+'Collections'].indexOf(collArray[i].uid),1); if(isEvent) { var beforeScroll = $('#main').width()-$('#calendar').width(); $('#calendar').fullCalendar('removeEventSource', collArray[i].fcSource); var afterScroll = $('#main').width()-$('#calendar').width(); rerenderCalendar(beforeScroll!=afterScroll); globalEventList.events[collArray[i].uid]={}; globalEventList.displayEventsArray[collArray[i].uid]=new Array(); } else { var beforeScroll = $('#mainTODO').width()-$('#todoList').width(); $('#todoList').fullCalendar('removeEventSource', collArray[i].fcSource); var afterScroll = $('#mainTODO').width()-$('#todoList').width(); rerenderTodo(beforeScroll!=afterScroll); globalEventList.todos[collArray[i].uid]={}; globalEventList.displayTodosArray[collArray[i].uid]=new Array(); } collArray[i].fcSource = null; collArray[i].someChanged=false; collArray[i].makeLoaded=false; collArray[i].syncToken=''; collArray[i].oldSyncToken=''; } } } if((globalSettingsSaving=='event' || globalSettingsSaving=='todo') && !globalFirstHideLoader) setTimeout(function(){hideUnloadCollectionCallback(globalSettingsSaving);},300); } function addLoadCalDAVCollection(loadingArray, isEvent) { var collArray = {}, todoString=''; if(isEvent) collArray=globalResourceCalDAVList.collections; else { collArray=globalResourceCalDAVList.TodoCollections; todoString='TODO'; } for(var i=0; i<collArray.length; i++) { if(collArray[i].uid!=undefined) { var uidParts=(collArray[i].uid).match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)')); var checkHref = uidParts[1]+uidParts[3]; if(loadingArray.indexOf(checkHref)!=-1&&!collArray[i].makeLoaded) { collArray[i].urlArray={}; var resDOMItem=$('#ResourceCalDAV'+todoString+'List').find('.resourceCalDAV'+todoString+'_item[data-id="'+jqueryEscapeSelector(collArray[i].uid)+'"]'); collArray[i].someChanged=true; collArray[i].makeLoaded=true; var rex=vCalendar.pre['accountUidParts']; var tmp=collArray[i].accountUID.match(rex); var resourceCalDAV_href=tmp[1]+tmp[3]+tmp[4]; var resourceCalDAV_user=tmp[2]; for(var j=0;j<globalAccountSettings.length;j++) if(globalAccountSettings[j].href==resourceCalDAV_href && globalAccountSettings[j].userAuth.userName==resourceCalDAV_user && globalLoadedPrincipals.indexOf(resourceCalDAV_href)==-1) { globalLoadedPrincipals.push(globalAccountSettings[j].href); break; } var resDOMHeader=resDOMItem.prevUntil('.resourceCalDAV'+todoString+'_header').last().prev(); if(!resDOMHeader.length) resDOMHeader=resDOMItem.prev(); resDOMHeader.css('display','block'); resDOMItem.css('display',''); var input=resDOMItem.find('input[type=checkbox]').not('.unloadCheck'); input.prop('checked',true); collectionChBoxClick(input.get(0), '#ResourceCalDAV'+todoString+'List', '.resourceCalDAV'+todoString+'_header', '.resourceCalDAV'+todoString+'_item', null, false); if(window['globalVisibleCalDAV'+todoString+'Collections'].indexOf(collArray[i].uid)==-1) window['globalVisibleCalDAV'+todoString+'Collections'].splice(window['globalVisibleCalDAV'+todoString+'Collections'].length, 0, collArray[i].uid); collArray[i].newlyAdded=true; } } } var calendarsArray=new Array(); for(var i=0;i<collArray.length;i++) if(collArray[i].uid!=undefined) calendarsArray[calendarsArray.length]={displayValue:collArray[i].displayvalue,uid:collArray[i].uid, permissions_read_only:collArray[i].permissions.read_only, makeLoaded:collArray[i].makeLoaded}; calendarsArray.sort(customResourceCompare); globalResourceCalDAVList.sortedCollections = calendarsArray; } // ResourceCalDAVList Class function ResourceCalDAVList() { this.collections=new Array(); this.TodoCollections=new Array(); this.calendarsLoaded=null; this.counterList=new Array(); this.sortedTodoCollections=new Array(); this.sortedCollections=new Array(); this.reset=function() { this.TodoCollections.splice(0, this.TodoCollections.length); this.collections.splice(0, this.collections.length); this.counterList=new Array(); this.sortedTodoCollections=new Array(); this.sortedCollections=new Array(); } // resource header value this.getHeaderValue=function(inputResource) { var re=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+).*/([^/]*)/','i'); var tmp=inputResource.accountUID.match(re); var tmp_host=tmp[3]; // hostname [%H] var tmp_host_wo_port=tmp[3].replace(vCalendar.pre['numberPortRex'],''); // hostname without port [%h] var tmp_domain=tmp_host_wo_port.replace(vCalendar.pre['domainRex'], ''); // domain name [%D] var tmp_domain_min=tmp_host_wo_port.match(vCalendar.pre['domainNameRex'])[2]; // domain name min. (only 1 or 2 level domain string) [%d] var tmp_principal=decodeURIComponent(tmp[4]); // principal username [%P] var tmp_principal_wo_domain=decodeURIComponent(tmp[4]).replace(vCalendar.pre['principalUserNameRex'],''); // principal username without @domain.com [%p] var tmp_user=inputResource.userAuth.userName; // login name [%U] var tmp_user_wo_domain=inputResource.userAuth.userName.replace(vCalendar.pre['loginRex'],''); // login name without @domain.com [%u] if(!inputResource.subscription && (typeof inputResource.hrefLabel!='string' || inputResource.hrefLabel=='' || (inputResource.hrefLabel=='%x' && inputResource.headervalue==''))) inputResource.hrefLabel='%d/%p [%u]'; else if(inputResource.subscription && (typeof inputResource.hrefLabel!='string' || inputResource.hrefLabel=='')) inputResource.hrefLabel=localization[globalInterfaceLanguage].txtSubscribed; var result=inputResource.hrefLabel; result=result.replace(vCalendar.pre['HRex'], tmp_host); result=result.replace(vCalendar.pre['hRex'], tmp_host_wo_port); result=result.replace(vCalendar.pre['DRex'], tmp_domain); result=result.replace(vCalendar.pre['dRex'], tmp_domain_min); result=result.replace(vCalendar.pre['PRex'], tmp_principal); result=result.replace(vCalendar.pre['pRex'], tmp_principal_wo_domain); result=result.replace(vCalendar.pre['URex'], tmp_user); result=result.replace(vCalendar.pre['uRex'], tmp_user_wo_domain); result=result.replace(vCalendar.pre['xRex'], inputResource.headervalue); inputResource.hrefLabel=result; return result; } this.getSortKey=function(inputResource, forHeader, inputResourceIndex) { var re=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]+/)([^/]*)','i'); var tmp=inputResource.uid.match(re); var out=''; if(!inputResource.subscription) out='A'; else out='B'; // custom sorting (instead of alphabetical) if(globalSettings.resourcealphabetsorting.value!=true) out+=inputResourceIndex.pad(String(globalAccountSettings.length).length); out+=tmp[1]+tmp[3]+'/'+(inputResource.hrefLabel==undefined || inputResource.hrefLabel==null ? tmp[5] : inputResource.hrefLabel)+' '+inputResource.userAuth.userName; if(forHeader==false) out+=' '+inputResource.displayvalue; return out; } // Resource list is not sorted, instead "insert sort" is performed this.insertResource=function(inputResource, index, isEvent) { var oldHrefLabel = inputResource.hrefLabel; var headerValue = this.getHeaderValue(inputResource); inputResource.sortkey=this.getSortKey(inputResource, false, index); var collObject={}; var todoString = ''; var makeChecked=false; var nameChanged=false; if(isEvent) collObject = this.collections; else { collObject = this.TodoCollections; todoString = 'TODO'; } // do not insert entry with duplicate UID for(var i=0;i<collObject.length;i++) if(collObject[i].uid==inputResource.uid) { collObject[i].urlArray={}; var resDOMItem=$('#ResourceCalDAV'+todoString+'List').find('.resourceCalDAV'+todoString+'_item[data-id="'+jqueryEscapeSelector(inputResource.uid)+'"]'); if(collObject[i].displayvalue==inputResource.displayvalue && collObject[i].permissions.read_only==inputResource.permissions.read_only && collObject[i].headervalue==inputResource.headervalue) { collObject[i]=$.extend(inputResource, {fcSource: collObject[i].fcSource, syncToken: collObject[i].syncToken, oldSyncToken: collObject[i].oldSyncToken, newlyAdded: collObject[i].newlyAdded,forceSyncPROPFIND: collObject[i].forceSyncPROPFIND}); return 0; } else { nameChanged=true; $.extend(inputResource, {fcSource: collObject[i].fcSource, syncToken: collObject[i].syncToken, oldSyncToken: collObject[i].oldSyncToken, newlyAdded: collObject[i].newlyAdded,forceSyncPROPFIND: collObject[i].forceSyncPROPFIND}); makeChecked=resDOMItem.find('input[type=checkbox]').not('.unloadCheck').prop('checked'); // the collection name is changed and must be moved to correct place (we first remove it and then reinsert) this.removeResource(inputResource.uid, false,isEvent); break; } } if(!globalCalDAVInitLoad&&!nameChanged) { var uidParts=inputResource.uid.match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)')); var checkHref = uidParts[1]+uidParts[3]; var loadedColl=null; var isLoaded=false; if(isEvent) loadedColl=globalSettings.loadedcalendarcollections.value; else loadedColl=globalSettings.loadedtodocollections.value; if(typeof globalCrossServerSettingsURL!='undefined'&&globalCrossServerSettingsURL!=null&globalCrossServerSettingsURL) { var uidParts=inputResource.uid.match(RegExp('/([^/]+/[^/]+/)$')); var tmpParts = uidParts[1].match('^(.*/)([^/]+)/$'); var checkHref3=decodeURIComponent(tmpParts[1])+tmpParts[2]+'/'; var found=false; for(var l=0;l<loadedColl.length;l++) { var tmpParts2 = loadedColl[l].match('^(.*/)([^/]+)/([^/]+)/$'); var checkHref2=decodeURIComponent(tmpParts2[2])+'/'+tmpParts2[3]+'/'; if(checkHref3==checkHref2) { found=true; break; } } isLoaded=found; } else isLoaded=(loadedColl.indexOf(checkHref)!=-1); // if(!isLoaded) // loadedColl.push(checkHref); if(!isLoaded) { inputResource.makeLoaded=false; inputResource.newlyAdded=false; } else { inputResource.makeLoaded=true; inputResource.newlyAdded=true; } inputResource.oldSyncToken = ''; inputResource.someChanged=false; makeChecked=true; } // create header var headerObject={headerOnly: true, sortkey: this.getSortKey(inputResource, true, index), displayvalue: (oldHrefLabel=='%x' ? headerValue.replace(RegExp('^[^#]+#'),'') : headerValue), index:0}; // find the index where to insert the new resource // find the index where to insert the new resource O(n*log(n)) var insertIndex=0; var low=0; var high=collObject.length-1; if(collObject.length>0) while(low<high) { insertIndex=low+Math.round((high-low)/2); var result=(cmp_str=collObject[insertIndex].sortkey).customCompare(inputResource.sortkey,globalSortAlphabet,1,false); if(result==-1) { if(insertIndex+1==collObject.length-1 && typeof collObject[insertIndex+1]!='undefined' && (cmp_str=collObject[insertIndex+1].sortkey).customCompare(inputResource.sortkey,globalSortAlphabet,1,false)==-1) { insertIndex+=2; break; } else low=++insertIndex; } else if(result==1) { if((cmp_str=collObject[insertIndex-1].sortkey).customCompare(inputResource.sortkey,globalSortAlphabet,1,false)==-1) break; else high=--insertIndex; } } // check for header existence var headerMiss=1; for(var i=0;i<collObject.length;i++) if(collObject[i].headerOnly==true && collObject[i].displayvalue==headerObject.displayvalue) { headerMiss=0; break; } // insert header if not exists if(headerMiss) { headerObject.index=insertIndex; collObject.splice(insertIndex, 0, headerObject); } // insert the resource if(collObject.length==1 && globalCalDAVInitLoad) $('#SystemCalDavZAP .fc-header-center ').addClass('r_operate_all'); this.counterList[inputResource.uid+' '+inputResource.listType]={collectionLength: 0, counter: 0, uid: inputResource.uid, isLoading: false, isSaving: false}; collObject.splice(insertIndex+headerMiss, 0, inputResource); if(!nameChanged) { if(isEvent) { globalEventList.displayEventsArray[inputResource.uid]=new Array(); globalEventList.events[inputResource.uid]={}; } else { globalEventList.displayTodosArray[inputResource.uid]=new Array(); globalEventList.todos[inputResource.uid]={}; } } var resList = '#ResourceCalDAV'+todoString+'List'; var resHeader = '.resourceCalDAV'+todoString+'_header'; var resItem = '.resourceCalDAV'+todoString+'_item'; if(headerMiss) { var newElement=$('#ResourceCalDAV'+todoString+'ListTemplate').find('.resourceCalDAV'+todoString+'_header').clone().wrap('<div>'); newElement.append(headerObject.displayvalue); if(todoString=='') newElement.find('input[type=checkbox]').attr('onclick','resourceChBoxClick(this, \'#\'+$(this).parent().parent().attr(\'id\'), \''+resHeader+'\', false);if(isCalDAVLoaded && $(this).parent().parent().attr(\'id\')== \'ResourceCalDAV'+todoString+'List\'){$(this).prop(\'checked\')?enableResource($(this).parent()):disableResource($(this).parent());}'); else newElement.find('input[type=checkbox]').attr('onclick','resourceChBoxClick(this, \'#\'+$(this).parent().parent().attr(\'id\'), \''+resHeader+'\', false);if(isCalDAVLoaded && $(this).parent().parent().attr(\'id\')== \'ResourceCalDAV'+todoString+'List\'){$(this).prop(\'checked\')?enableResourceTodo($(this).parent()):disableResourceTodo($(this).parent());}'); newElement.css('display', 'none'); newElement=newElement.parent().html(); $('#ResourceCalDAV'+todoString+'List').children().eq(insertIndex).after(newElement); } // insert the resource to interface var newElement = $('#ResourceCalDAV'+todoString+'ListTemplate').find('.resourceCalDAV'+todoString+'_item').clone().wrap('<div>'); var par=inputResource.uid.split('/'); if(inputResource.permissions.read_only) newElement.addClass('resourceCalDAV_item_ro'); newElement.attr('data-id', inputResource.uid); if(globalCalDAVInitLoad) newElement.addClass('r_operate'); newElement.html("<div class='resourceCalDAVColor' style='background:"+inputResource.ecolor+"'></div><input type='text' class='colorPicker'/><input type='checkbox' name="+inputResource.uid+" />"+$('<div/>').text(inputResource.displayvalue).html()); newElement.attr('title', $('<div/>').text(inputResource.displayvalue).html()); if(todoString=='') newElement.find('input[type=checkbox]').attr({'data-id':inputResource.uid, 'onclick':'var evt = arguments[0];evt.stopPropagation();collectionChBoxClick(this, \'#\'+$(this).parent().parent().attr(\'id\'), \''+resHeader+'\', \''+resItem+'\', null, false);if(isCalDAVLoaded && $(this).parent().parent().attr(\'id\')== \'ResourceCalDAV'+todoString+'List\'){$(this).prop(\'checked\')?enableCalendar(\''+inputResource.uid+'\'):disableCalendar(\''+inputResource.uid+'\');}'}); else newElement.find('input[type=checkbox]').attr({'data-id':inputResource.uid, 'onclick':'var evt = arguments[0];evt.stopPropagation();collectionChBoxClick(this, \'#\'+$(this).parent().parent().attr(\'id\'), \''+resHeader+'\', \''+resItem+'\', null, false);if(isCalDAVLoaded && $(this).parent().parent().attr(\'id\')== \'ResourceCalDAV'+todoString+'List\'){$(this).prop(\'checked\')?enableCalendarTodo(\''+inputResource.uid+'\'):disableCalendarTodo(\''+inputResource.uid+'\');}'}); newElement.click(function(e){ if(($(this).hasClass('resourceCalDAV_item')&&globalEventCollectionsLoading) || ($(this).hasClass('resourceCalDAVTODO_item')&&globalTodoCollectionsLoading)) return true; if(e.shiftKey) { if(isEvent) enableOne($(this).attr('data-id')); else enableOneTodo($(this).attr('data-id')); } $('#ResourceCalDAV'+todoString+'List .resourceCalDAV_item_selected').removeClass('resourceCalDAV_item_selected'); $(this).addClass('resourceCalDAV_item_selected'); }); if(typeof globalCalendarColorPropertyXmlns== 'undefined' || globalCalendarColorPropertyXmlns== null || globalCalendarColorPropertyXmlns==='' || globalCalendarColorPropertyXmlns!==false) bindColorPickerClick(newElement.find('.resourceCalDAVColor')); $('#ResourceCalDAV'+todoString+'List').children().eq(insertIndex+headerMiss).after(newElement); if(inputResource.makeLoaded) { var resDOMHeader=newElement.prevUntil('.resourceCalDAV'+todoString+'_header').last().prev(); if(!resDOMHeader.length) resDOMHeader=newElement.prev(); resDOMHeader.css('display','block'); var rex=vCalendar.pre['accountUidParts']; var tmp=inputResource.accountUID.match(rex); var resourceCalDAV_href=tmp[1]+tmp[3]+tmp[4]; var resourceCalDAV_user=tmp[2]; for(var i=0;i<globalAccountSettings.length;i++) if(globalAccountSettings[i].href==resourceCalDAV_href && globalAccountSettings[i].userAuth.userName==resourceCalDAV_user && globalLoadedPrincipals.indexOf(resourceCalDAV_href)==-1) { globalLoadedPrincipals.push(globalAccountSettings[i].href); break; } } else newElement.css('display','none'); // restore the checked state if(makeChecked) { if(window['globalVisibleCalDAV'+todoString+'Collections'].indexOf(inputResource.uid)==-1) window['globalVisibleCalDAV'+todoString+'Collections'].splice(window['globalVisibleCalDAV'+todoString+'Collections'].length, 0, inputResource.uid); $('#ResourceCalDAV'+todoString+'List').children().eq(insertIndex+headerMiss+1).find('input[type=checkbox]').prop('checked', true); } if(!globalCalDAVInitLoad) collectionChBoxClick(newElement.find('input[type=checkbox]').get(0), '#ResourceCalDAV'+todoString+'List', '.resourceCalDAV'+todoString+'_header', '.resourceCalDAV'+todoString+'_item', null, false); }; this.removeOldResources=function(inputUidBase, inputTimestamp) { var tmp=inputUidBase.match(vCalendar.pre['hrefRex']); var inputHref=tmp[2]; for(var i=this.collections.length-1;i>=0;i--) { if(this.collections[i]!=undefined && !this.collections[i].subscription && this.collections[i].timestamp!=undefined && this.collections[i].uid.indexOf(inputUidBase)==0 && this.collections[i].timestamp<inputTimestamp) { var uidRemoved=this.collections[i].uid; //if(globalEventList.displayEventsArray[uidRemoved].length>0) //{ var beforeScroll = $('#main').width()-$('#calendar').width(); $('#calendar').fullCalendar('removeEventSource', this.collections[i].fcSource); var afterScroll = $('#main').width()-$('#calendar').width(); rerenderCalendar(beforeScroll!=afterScroll); //} var item=$('#ResourceCalDAVList').find('.resourceCalDAV_item[data-id^="'+jqueryEscapeSelector(this.collections[i].uid)+'"]'); var item_header=item.prevUntil('.resourceCalDAV_header').last().prev(); if(!item_header.length) item_header=item.prev(); item.remove(); this.collections.splice(i, 1); // if next item is undefined or it is a header and the previous item is header delete it if((this.collections[i]==undefined || this.collections[i].headerOnly==true) && this.collections[i-1].headerOnly==true) { item_header.remove(); this.collections.splice(--i, 1); } else { var firstVisibleCollection=null; for(var vi=i-1;vi>0;vi--) { if(this.collections[vi].headerOnly==true) break; if(this.collections[vi].makeLoaded) { firstVisibleCollection=this.collections[vi]; break; } } if(firstVisibleCollection==null) { for(var vi=i;vi<this.collections.length;vi++) { if(this.collections[vi].headerOnly==true) break; if(this.collections[vi].makeLoaded) { firstVisibleCollection=this.collections[vi]; break; } } } if(firstVisibleCollection==null) item_header.css('display','none'); else { var triggerInput=$('#ResourceCalDAVList').find('.resourceCalDAV_item[data-id^="'+jqueryEscapeSelector(firstVisibleCollection.uid)+'"]').find('input[type=checkbox]'); collectionChBoxClick(triggerInput.get(0), '#ResourceCalDAVList', '.resourceCalDAV_header', '.resourceCalDAV_item', null, false); } } } } for(var i=this.TodoCollections.length-1;i>=0;i--) { if(this.TodoCollections[i]!=undefined && !this.TodoCollections[i].subscription && this.TodoCollections[i].timestamp!=undefined && this.TodoCollections[i].uid.indexOf(inputUidBase)==0 && this.TodoCollections[i].timestamp<inputTimestamp) { var uidRemoved=this.TodoCollections[i].uid; //if(globalEventList.displayEventsArray[uidRemoved].length>0) //{ var beforeScroll = $('#mainTODO').width()-$('#todoList').width(); $('#todoList').fullCalendar('removeEventSource', this.TodoCollections[i].fcSource); var afterScroll = $('#mainTODO').width()-$('#todoList').width(); rerenderTodo(beforeScroll!=afterScroll); //} var item=$('#ResourceCalDAVTODOList').find('.resourceCalDAVTODO_item[data-id^="'+jqueryEscapeSelector(this.TodoCollections[i].uid)+'"]'); var item_header=item.prevUntil('.resourceCalDAVTODO_header').last().prev(); if(!item_header.length) item_header=item.prev(); item.remove(); this.TodoCollections.splice(i, 1); // if next item is undefined or it is a header and the previous item is header delete it if((this.TodoCollections[i]==undefined || this.TodoCollections[i].headerOnly==true) && this.TodoCollections[i-1].headerOnly==true) { item_header.remove(); this.TodoCollections.splice(--i, 1); } else { var firstVisibleCollection=null; for(var vi=i-1;vi>0;vi--) { if(this.TodoCollections[vi].headerOnly==true) break; if(this.TodoCollections[vi].makeLoaded) { firstVisibleCollection=this.TodoCollections[vi]; break; } } if(firstVisibleCollection==null) { for(var vi=i;vi<this.TodoCollections.length;vi++) { if(this.TodoCollections[vi].headerOnly==true) break; if(this.TodoCollections[vi].makeLoaded) { firstVisibleCollection=this.TodoCollections[vi]; break; } } } if(firstVisibleCollection==null) item_header.css('display','none'); else { var triggerInput=$('#ResourceCalDAVTODOList').find('.resourceCalDAVTODO_item[data-id^="'+jqueryEscapeSelector(firstVisibleCollection.uid)+'"]').find('input[type=checkbox]'); collectionChBoxClick(triggerInput.get(0), '#ResourceCalDAVTODOList', '.resourceCalDAVTODO_header', '.resourceCalDAVTODO_item', null, false); } } } } }; this.removeResource=function(inputUid, loadNext,isEvent) { if(isEvent) { for(var i=this.collections.length-1;i>=0;i--) if(this.collections[i].uid==inputUid) { var uidRemoved=this.collections[i].uid; var item=$('#ResourceCalDAVList').find('[data-id^="'+jqueryEscapeSelector(this.collections[i].uid)+'"]'); var item_prev=item.prev(); item.remove(); this.collections.splice(i, 1); // if next item is undefined or it is a header and the previous item is header delete it if((this.collections[i]==undefined || this.collections[i].headerOnly==true) && i>0 && this.collections[i-1].headerOnly==true) { item_prev.remove(); this.collections.splice(i, 1); } } } else for(var i=this.TodoCollections.length-1;i>=0;i--) if(this.TodoCollections[i].uid==inputUid) { var uidRemoved=this.TodoCollections[i].uid; var item=$('#ResourceCalDAVTODOList').find('[data-id^="'+jqueryEscapeSelector(this.TodoCollections[i].uid)+'"]'); var item_prev=item.prev(); item.remove(); this.TodoCollections.splice(i, 1); // if next item is undefined or it is a header and the previous item is header delete it if((this.TodoCollections[i]==undefined || this.TodoCollections[i].headerOnly==true) && i>0 && this.TodoCollections[i-1].headerOnly==true) { item_prev.remove(); this.TodoCollections.splice(i, 1); } } }; this.getCollectionByUID=function(inputUID) { for(var i=0;i<this.collections.length;i++) { if(this.collections[i].uid==inputUID) return this.collections[i]; } for(var i=0;i<this.TodoCollections.length;i++) { if(this.TodoCollections[i].uid==inputUID) return this.TodoCollections[i]; } return null; }; this.getEventCollectionByUID=function(inputUID) { for(var i=0;i<this.collections.length;i++) { if(this.collections[i].uid==inputUID) return this.collections[i]; } return null; }; this.getTodoCollectionByUID=function(inputUID) { for(var i=0;i<this.TodoCollections.length;i++) { if(this.TodoCollections[i].uid==inputUID) return this.TodoCollections[i]; } return null; }; this.getTodoCollectionAndIndexByUID=function(inputUID) { for(var i=0;i<this.TodoCollections.length;i++) { if(this.TodoCollections[i].uid==inputUID) return {coll:this.TodoCollections[i],index:i}; } return null; }; this.getResources=function() { return this.collections; }; this.getSyncResourceArray=function() { return this.syncResourceArray; }; }