main.js 93KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959
  1. /*
  2. CalDavZAP - the open source CalDAV Web Client
  3. Copyright (C) 2011-2015
  4. Jan Mate <jan.mate@inf-it.com>
  5. Andrej Lezo <andrej.lezo@inf-it.com>
  6. Matej Mihalik <matej.mihalik@inf-it.com>
  7. This program is free software: you can redistribute it and/or modify
  8. it under the terms of the GNU Affero General Public License as
  9. published by the Free Software Foundation, either version 3 of the
  10. License, or (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. var globalEventList=new EventList();
  19. var globalAppleSupport = new AppleSupportNextDateArray();
  20. var globalResourceCalDAVList=new ResourceCalDAVList();
  21. var maxAlarmValue=2147000000;
  22. var globalMultiWeekSize=3;
  23. var globalMaxNextInstanesTodoCheckingNumber=60;
  24. var globalEventIntervalID=null;
  25. var globalResourceRefreshNumber=0;
  26. var globalResourceRefreshNumberTodo=0;
  27. var globalCalDAVInitLoad=true;
  28. var globalCalDAVResourceSync=false;
  29. var globalCalDAVCollectionSync=false;
  30. var globalCalendarNumber=0;
  31. var globalOnlyCalendarNumber=0;
  32. var globalTodoCalendarNumber=0;
  33. var globalOnlyCalendarNumberCount=0;
  34. var globalOnlyTodoCalendarNumberCount=0;
  35. var globalCalendarNumberCount=0;
  36. var globalEventTimeoutID=0;
  37. var cleanResourceCalDAVListTemplate=null;
  38. var cleanResourceCalDAVTODOListTemplate=null;
  39. var cleanVcalendarTemplate=null;
  40. var cleanVtodoTemplate=null;
  41. var origResourceCalDAVListTemplate=null;
  42. var origResourceCalDAVTODOListTemplate=null;
  43. var origVcalendarTemplate=null;
  44. var origVtodoTemplate=null;
  45. var origVtodoLoaderTemplate=null;
  46. var globalSessionTimeZone=null;
  47. var globalCalDAVQs=null;
  48. var globalCalDAVTODOQs=null;
  49. var globalVisibleCalDAVCollections=new Array();
  50. var globalVisibleCalDAVTODOCollections=new Array();
  51. var isResourceComplete=false;
  52. var prevFunctionArray=new Array();
  53. var prevFunctionArrayIterator=0;
  54. var globalWorkerArray=new Array();
  55. var globalIntervalArray=new Array();
  56. var globalCurrentLoadingResource='';
  57. var timeZonesEnabled=new Array();
  58. var cLcouny=42;
  59. var processedTimezones = Array();
  60. var timelist=new Array();
  61. var minelems=[0,15,30,45];
  62. var frequencies = ["SECONDLY", "MINUTELY", "HOURLY", "DAILY", "WEEKLY", "MONTHLY", "YEARLY"];
  63. var globalToday=new Date();
  64. var isCalDAVLoaded=false;
  65. var isCalDAVAvaible=true;
  66. var globalLoadedLimit = new Date();
  67. var globalToLoadedLimit = new Date();
  68. var globalLimitLoading='';
  69. var globalLimitTodoLoading='';
  70. var globalBeginPast = new Date();
  71. var globalBeginFuture = new Date();
  72. var globalLoadedLimitTodo = new Date();
  73. var globalToLoadedLimitTodo = new Date();
  74. var globalDefaultCalendarCollectionLoadAll=(typeof globalNetworkCheckSettings=='undefined' && typeof globalNetworkAccountSettings=='undefined');
  75. var globalDefaultCalendarCollectionActiveAll=globalDefaultCalendarCollectionLoadAll;
  76. var globalDefaultTodoCalendarCollectionLoadAll=(typeof globalNetworkCheckSettings=='undefined' && typeof globalNetworkAccountSettings=='undefined');
  77. var globalDefaultTodoCalendarCollectionActiveAll=globalDefaultTodoCalendarCollectionLoadAll;
  78. var globalTodoLoaderHide='';
  79. var globalEventCollectionsLoading=false;
  80. var globalTodoCollectionsLoading=false;
  81. var globalCalEvent=null;
  82. var globalCalTodo=null;
  83. var globalJsEvent=null;
  84. var globalRevertFunction=null;
  85. var globalPrevDragEventAllDay=null;
  86. var globalPrevDate='';
  87. var globalAllowFcRerender=true;
  88. var globalCalWidth=0;
  89. var globalTodoCheckTimeout=null;
  90. var globalTodoCheckTimeoutDelay=1000;
  91. var globalTodolistStatusArray={};
  92. var globalSettings={
  93. version: {value: (typeof globalSettingsVersion!='undefined' && globalSettingsVersion!=null) ? globalSettingsVersion : 1, locked:false},
  94. resourcealphabetsorting: {value: (typeof globalResourceAlphabetSorting!='undefined' && globalResourceAlphabetSorting!=null) ? globalResourceAlphabetSorting : true, locked:false},
  95. usejqueryauth: {value: (typeof globalUseJqueryAuth!='undefined' && globalUseJqueryAuth!=null) ? globalUseJqueryAuth : false, locked:false},
  96. settingstype: {value: (typeof globalSettingsType!='undefined' && globalSettingsType!=null && globalSettingsType!='') ? globalSettingsType : 'principal-URL', locked:false},
  97. defaultactiveapp: {value: (typeof globalDefaultActiveApp!='undefined' && globalDefaultActiveApp!=null && globalDefaultActiveApp!='') ? globalDefaultActiveApp : null, locked:false},
  98. islastdefaultactiveapp: {value: false, locked:false},
  99. datepickerfirstdayofweek: {value: (typeof globalDatepickerFirstDayOfWeek!='undefined' && globalDatepickerFirstDayOfWeek!=null) ? globalDatepickerFirstDayOfWeek : 1, locked:false},
  100. syncresourcesinterval: {value: (typeof globalSyncResourcesInterval!='undefined' && globalSyncResourcesInterval!=null) ? globalSyncResourcesInterval :300000, locked:false},
  101. datepickerformat: {value: (typeof globalDatepickerFormat!='undefined' && globalDatepickerFormat!=null && globalDatepickerFormat!='') ? globalDatepickerFormat : localization[globalInterfaceLanguage]._default_datepicker_format_, locked:false},
  102. backgroundsync: {value: (typeof globalBackgroundSync!='undefined' && globalBackgroundSync!=null) ? globalBackgroundSync : true, locked:false},
  103. enablekbnavigation: {value: (typeof globalEnableKbNavigation!='undefined' && globalEnableKbNavigation!=null) ? globalEnableKbNavigation : true, locked:false},
  104. rewritetimezonecomponent: {value: (typeof globalRewriteTimezoneComponent!='undefined' && globalRewriteTimezoneComponent!=null) ? globalRewriteTimezoneComponent : true, locked:false},
  105. removeunknowntimezone: {value: (typeof globalRemoveUnknownTimezone!='undefined' && globalRemoveUnknownTimezone!=null) ? globalRemoveUnknownTimezone : false, locked:false},
  106. mozillasupport: {value: (typeof globalMozillaSupport!='undefined' && globalMozillaSupport!=null) ? globalMozillaSupport : false, locked:false},
  107. appleremindersmode: {value: (typeof globalAppleRemindersMode!='undefined' && globalAppleRemindersMode!=null) ? globalAppleRemindersMode : false, locked:false},
  108. titleformatmonth: {value: localization[globalInterfaceLanguage]._default_title_format_month_, locked:false},
  109. titleformatweek: {value: localization[globalInterfaceLanguage]._default_title_format_week_, locked:false},
  110. titleformatday: {value: localization[globalInterfaceLanguage]._default_title_format_day_, locked:false},
  111. titleformattable: {value: localization[globalInterfaceLanguage]._default_title_format_table_, locked:false},
  112. columnformatagenda: {value: localization[globalInterfaceLanguage]._default_column_format_agenda_, locked:false},
  113. activecalendarcollections: {value: (typeof globalActiveCalendarCollections!='undefined' && globalActiveCalendarCollections!=null) ? globalActiveCalendarCollections : new Array(), locked:false},
  114. activetodocollections: {value: (typeof globalActiveTodoCollections!='undefined' && globalActiveTodoCollections!=null) ? globalActiveTodoCollections : new Array(), locked:false},
  115. loadedcalendarcollections: {value: (typeof globalLoadedCalendarCollections!='undefined' && globalLoadedCalendarCollections!=null) ? globalLoadedCalendarCollections : new Array(), locked:false},
  116. loadedtodocollections: {value: (typeof globalLoadedTodoCollections!='undefined' && globalLoadedTodoCollections!=null) ? globalLoadedTodoCollections : new Array(), locked:false},
  117. todolistfilterselected: {value: (typeof globalTodoListFilterSelected!='undefined' && globalTodoListFilterSelected!=null && globalTodoListFilterSelected!='') ? globalTodoListFilterSelected : ['filterAction', 'filterProgress'], locked:false},
  118. activeview: {value: (typeof globalActiveView!='undefined' && globalActiveView!=null && globalActiveView!='') ? globalActiveView : 'multiWeek', locked:false},
  119. islastactiveview: {value: true, locked:false},
  120. calendarselected: {value: (typeof globalCalendarSelected!='undefined' && globalCalendarSelected!=null && globalCalendarSelected!='') ? globalCalendarSelected : '', locked:false},
  121. todocalendarselected: {value: (typeof globalTodoCalendarSelected!='undefined' && globalTodoCalendarSelected!=null && globalTodoCalendarSelected!='') ? globalTodoCalendarSelected : '', locked:false},
  122. timezone: {value: (typeof globalTimeZone!='undefined' && globalTimeZone!=null && globalTimeZone!='') ? globalTimeZone : 'local', locked:false},
  123. islasttimezone: {value: true, locked:false},
  124. openformmode: {value: (typeof globalOpenFormMode!='undefined' && globalOpenFormMode!=null && globalOpenFormMode!='') ? globalOpenFormMode : 'double', locked:false},
  125. calendarstartofbusiness: {value: (typeof globalCalendarStartOfBusiness!='undefined' && globalCalendarStartOfBusiness!=null) ? globalCalendarStartOfBusiness : 8, locked:false},
  126. calendarendofbusiness: {value: (typeof globalCalendarEndOfBusiness!='undefined' && globalCalendarEndOfBusiness!=null) ? globalCalendarEndOfBusiness : 17, locked:false},
  127. defaulteventduration: {value: (typeof globalDefaultEventDuration!='undefined' && globalDefaultEventDuration!=null && globalDefaultEventDuration>=0) ? globalDefaultEventDuration : null, locked:false},
  128. ampmformat: {value: (typeof globalAMPMFormat!='undefined' && globalAMPMFormat!=null) ? globalAMPMFormat : localization[globalInterfaceLanguage]._default_AMPM_format_, locked:false},
  129. timeformatagenda: {value: (typeof globalTimeFormatAgenda!='undefined' && globalTimeFormatAgenda!=null && globalTimeFormatAgenda!='') ? globalTimeFormatAgenda : null, locked:false},
  130. timeformatbasic: {value: (typeof globalTimeFormatBasic!='undefined' && globalTimeFormatBasic!=null && globalTimeFormatBasic!='') ? globalTimeFormatBasic : null, locked:false},
  131. displayhiddenevents: {value: (typeof globalDisplayHiddenEvents!='undefined' && globalDisplayHiddenEvents!=null) ? globalDisplayHiddenEvents : false, locked:false},
  132. timezonesupport: {value: (typeof globalTimeZoneSupport!='undefined' && globalTimeZoneSupport!=null) ? globalTimeZoneSupport : true, locked:false},
  133. timezonesenabled: {value: (typeof globalTimeZonesEnabled!='undefined' && globalTimeZonesEnabled!=null && globalTimeZonesEnabled!='') ? globalTimeZonesEnabled : [], locked:false},
  134. showhiddenalarms: {value: (typeof globalShowHiddenAlarms!='undefined' && globalShowHiddenAlarms!=null) ? globalShowHiddenAlarms : false, locked:false},
  135. ignorecompletedorcancelledalarms: {value: (typeof globalIgnoreCompletedOrCancelledAlarms!='undefined' && globalIgnoreCompletedOrCancelledAlarms!=null) ? globalIgnoreCompletedOrCancelledAlarms : true, locked:false},
  136. weekenddays: {value: (typeof globalWeekendDays!='undefined' && globalWeekendDays!=null && globalWeekendDays!='') ? globalWeekendDays : [0, 6], locked:false},
  137. eventstartpastlimit: {value: (typeof globalEventStartPastLimit!='undefined' && globalEventStartPastLimit!=null) ? globalEventStartPastLimit : 3, locked:false},
  138. todopastlimit: {value: (typeof globalTodoPastLimit!='undefined' && globalTodoPastLimit!=null) ? globalTodoPastLimit : 3, locked:false},
  139. eventstartfuturelimit: {value: (typeof globalEventStartFutureLimit!='undefined' && globalEventStartFutureLimit!=null) ? globalEventStartFutureLimit : 3, locked:false},
  140. compatibility: {value: (typeof globalCompatibility!='undefined' && globalCompatibility!=null && globalCompatibility!='') ? globalCompatibility : {anniversaryOutputFormat: ['apple']}, locked:false},
  141. contactstorefn: {value: (typeof globalContactStoreFN!='undefined' && globalContactStoreFN!=null && globalContactStoreFN!='') ? globalContactStoreFN : ['prefix',' last',' middle',' first',' suffix'], locked:false},
  142. urihandlertel: {value: (typeof globalUriHandlerTel!='undefined' && globalUriHandlerTel!=null && globalUriHandlerTel!='') ? globalUriHandlerTel : 'tel:', locked:false},
  143. urihandleremail: {value: (typeof globalUriHandlerEmail!='undefined' && globalUriHandlerEmail!=null && globalUriHandlerEmail!='') ? globalUriHandlerEmail : 'mailto:', locked:false},
  144. urihandlerurl: {value: (typeof globalUriHandlerUrl!='undefined' && globalUriHandlerUrl!=null && globalUriHandlerUrl!='') ? globalUriHandlerUrl : 'http://', locked:false},
  145. urihandlerprofile: {value: (typeof globalUriHandlerProfile!='undefined' && globalUriHandlerProfile!=null && globalUriHandlerProfile!='') ? globalUriHandlerProfile : {'twitter': 'http://twitter.com/%u', 'facebook': 'http://www.facebook.com/%u', 'flickr': 'http://www.flickr.com/photos/%u', 'linkedin': 'http://www.linkedin.com/in/%u', 'myspace': 'http://www.myspace.com/%u', 'sinaweibo': 'http://weibo.com/n/%u'}, locked:false},
  146. addresscountryequivalence: {value: (typeof globalAddressCountryEquivalence!='undefined' && globalAddressCountryEquivalence!=null && globalAddressCountryEquivalence!='') ? globalAddressCountryEquivalence : [{country: 'de', regex: '^\\W*Deutschland\\W*$'}, {country: 'sk', regex: '^\\W*Slovensko\\W*$'}], locked:false},
  147. addressbookselected: {value: (typeof globalAddressbookSelected!='undefined' && globalAddressbookSelected!=null && globalAddressbookSelected!='') ? globalAddressbookSelected : '', locked:false},
  148. collectiondisplay: {value: (typeof globalCollectionDisplay!='undefined' && globalCollectionDisplay!=null && globalCollectionDisplay!='') ? globalCollectionDisplay : (
  149. (typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies) ?
  150. [{label: '{Name}', value: {company: ['{Company}', ' [{Department}]'], personal: ['{LastName}', ' {MiddleName}', ' {FirstName}']}}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}] :
  151. [{label: '{Name}', value: ['{LastName}', ' {MiddleName}', ' {FirstName}']}, {label: '{Company} [{Department}]', value: ['{Company}', ' [{Department}]']}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}]
  152. ), locked:false},
  153. collectionsort: {value: (typeof globalCollectionSort!='undefined' && globalCollectionSort!=null && globalCollectionSort!='') ? globalCollectionSort : '', locked:false},
  154. defaultaddresscountry: {value: (typeof globalDefaultAddressCountry!='undefined' && globalDefaultAddressCountry!=null && globalDefaultAddressCountry!='') ? globalDefaultAddressCountry :'us', locked:false},
  155. addresscountryfavorites: {value: (typeof globalAddressCountryFavorites!='undefined' && globalAddressCountryFavorites!=null && globalAddressCountryFavorites!='') ? globalAddressCountryFavorites :[], locked:false},
  156. activeaddressbookcollections: {value: (typeof globalActiveAddressbookCollections!='undefined' && globalActiveAddressbookCollections!=null) ? globalActiveAddressbookCollections : new Array(), locked:false},
  157. loadedaddressbookcollections: {value: (typeof globalLoadedAddressbookCollections!='undefined' && globalLoadedAddressbookCollections!=null) ? globalLoadedAddressbookCollections : new Array(), locked:false}
  158. };
  159. function resetSettings()
  160. {
  161. globalSettings={
  162. version: {value: (typeof globalSettingsVersion!='undefined' && globalSettingsVersion!=null) ? globalSettingsVersion : 1, locked:false},
  163. resourcealphabetsorting: {value: (typeof globalResourceAlphabetSorting!='undefined' && globalResourceAlphabetSorting!=null) ? globalResourceAlphabetSorting : true, locked:false},
  164. usejqueryauth: {value: (typeof globalUseJqueryAuth!='undefined' && globalUseJqueryAuth!=null) ? globalUseJqueryAuth : false, locked:false},
  165. settingstype: {value: (typeof globalSettingsType!='undefined' && globalSettingsType!=null && globalSettingsType!='') ? globalSettingsType : 'principal-URL', locked:false},
  166. defaultactiveapp: {value: (typeof globalDefaultActiveApp!='undefined' && globalDefaultActiveApp!=null && globalDefaultActiveApp!='') ? globalDefaultActiveApp : null, locked:false},
  167. islastdefaultactiveapp: {value: false, locked:false},
  168. datepickerfirstdayofweek: {value: (typeof globalDatepickerFirstDayOfWeek!='undefined' && globalDatepickerFirstDayOfWeek!=null) ? globalDatepickerFirstDayOfWeek : 1, locked:false},
  169. syncresourcesinterval: {value: (typeof globalSyncResourcesInterval!='undefined' && globalSyncResourcesInterval!=null) ? globalSyncResourcesInterval :300000, locked:false},
  170. datepickerformat: {value: (typeof globalDatepickerFormat!='undefined' && globalDatepickerFormat!=null && globalDatepickerFormat!='') ? globalDatepickerFormat : localization[globalInterfaceLanguage]._default_datepicker_format_, locked:false},
  171. backgroundsync: {value: (typeof globalBackgroundSync!='undefined' && globalBackgroundSync!=null) ? globalBackgroundSync : true, locked:false},
  172. enablekbnavigation: {value: (typeof globalEnableKbNavigation!='undefined' && globalEnableKbNavigation!=null) ? globalEnableKbNavigation : true, locked:false},
  173. rewritetimezonecomponent: {value: (typeof globalRewriteTimezoneComponent!='undefined' && globalRewriteTimezoneComponent!=null) ? globalRewriteTimezoneComponent : true, locked:false},
  174. removeunknowntimezone: {value: (typeof globalRemoveUnknownTimezone!='undefined' && globalRemoveUnknownTimezone!=null) ? globalRemoveUnknownTimezone : false, locked:false},
  175. mozillasupport: {value: (typeof globalMozillaSupport!='undefined' && globalMozillaSupport!=null) ? globalMozillaSupport : false, locked:false},
  176. appleremindersmode: {value: (typeof globalAppleRemindersMode!='undefined' && globalAppleRemindersMode!=null) ? globalAppleRemindersMode : false, locked:false},
  177. titleformatmonth: {value: localization[globalInterfaceLanguage]._default_title_format_month_, locked:false},
  178. titleformatweek: {value: localization[globalInterfaceLanguage]._default_title_format_week_, locked:false},
  179. titleformatday: {value: localization[globalInterfaceLanguage]._default_title_format_day_, locked:false},
  180. titleformattable: {value: localization[globalInterfaceLanguage]._default_title_format_table_, locked:false},
  181. columnformatagenda: {value: localization[globalInterfaceLanguage]._default_column_format_agenda_, locked:false},
  182. activecalendarcollections: {value: (typeof globalActiveCalendarCollections!='undefined' && globalActiveCalendarCollections!=null) ? globalActiveCalendarCollections : new Array(), locked:false},
  183. activetodocollections: {value: (typeof globalActiveTodoCollections!='undefined' && globalActiveTodoCollections!=null) ? globalActiveTodoCollections : new Array(), locked:false},
  184. loadedcalendarcollections: {value: (typeof globalLoadedCalendarCollections!='undefined' && globalLoadedCalendarCollections!=null) ? globalLoadedCalendarCollections : new Array(), locked:false},
  185. loadedtodocollections: {value: (typeof globalLoadedTodoCollections!='undefined' && globalLoadedTodoCollections!=null) ? globalLoadedTodoCollections : new Array(), locked:false},
  186. todolistfilterselected: {value: (typeof globalTodoListFilterSelected!='undefined' && globalTodoListFilterSelected!=null && globalTodoListFilterSelected!='') ? globalTodoListFilterSelected : ['filterAction', 'filterProgress'], locked:false},
  187. activeview: {value: (typeof globalActiveView!='undefined' && globalActiveView!=null && globalActiveView!='') ? globalActiveView : 'multiWeek', locked:false},
  188. islastactiveview: {value: true, lockedlocked:false},
  189. calendarselected: {value: (typeof globalCalendarSelected!='undefined' && globalCalendarSelected!=null && globalCalendarSelected!='') ? globalCalendarSelected : '', locked:false},
  190. todocalendarselected: {value: (typeof globalTodoCalendarSelected!='undefined' && globalTodoCalendarSelected!=null && globalTodoCalendarSelected!='') ? globalTodoCalendarSelected : '', locked:false},
  191. timezone: {value: (typeof globalTimeZone!='undefined' && globalTimeZone!=null && globalTimeZone!='') ? globalTimeZone : 'local', locked:false},
  192. islasttimezone: {value: true, locked:false},
  193. openformmode: {value: (typeof globalOpenFormMode!='undefined' && globalOpenFormMode!=null && globalOpenFormMode!='') ? globalOpenFormMode : 'double', locked:false},
  194. calendarstartofbusiness: {value: (typeof globalCalendarStartOfBusiness!='undefined' && globalCalendarStartOfBusiness!=null) ? globalCalendarStartOfBusiness : 8, locked:false},
  195. calendarendofbusiness: {value: (typeof globalCalendarEndOfBusiness!='undefined' && globalCalendarEndOfBusiness!=null) ? globalCalendarEndOfBusiness : 17, locked:false},
  196. defaulteventduration: {value: (typeof globalDefaultEventDuration!='undefined' && globalDefaultEventDuration!=null && globalDefaultEventDuration>=0) ? globalDefaultEventDuration : null, locked:false},
  197. ampmformat: {value: (typeof globalAMPMFormat!='undefined' && globalAMPMFormat!=null) ? globalAMPMFormat : localization[globalInterfaceLanguage]._default_AMPM_format_, locked:false},
  198. timeformatagenda: {value: (typeof globalTimeFormatAgenda!='undefined' && globalTimeFormatAgenda!=null && globalTimeFormatAgenda!='') ? globalTimeFormatAgenda : null, locked:false},
  199. timeformatbasic: {value: (typeof globalTimeFormatBasic!='undefined' && globalTimeFormatBasic!=null && globalTimeFormatBasic!='') ? globalTimeFormatBasic : null, locked:false},
  200. displayhiddenevents: {value: (typeof globalDisplayHiddenEvents!='undefined' && globalDisplayHiddenEvents!=null) ? globalDisplayHiddenEvents : false, locked:false},
  201. timezonesupport: {value: (typeof globalTimeZoneSupport!='undefined' && globalTimeZoneSupport!=null) ? globalTimeZoneSupport : true, locked:false},
  202. timezonesenabled: {value: (typeof globalTimeZonesEnabled!='undefined' && globalTimeZonesEnabled!=null && globalTimeZonesEnabled!='') ? globalTimeZonesEnabled : [], locked:false},
  203. showhiddenalarms: {value: (typeof globalShowHiddenAlarms!='undefined' && globalShowHiddenAlarms!=null) ? globalShowHiddenAlarms : false, locked:false},
  204. ignorecompletedorcancelledalarms: {value: (typeof globalIgnoreCompletedOrCancelledAlarms!='undefined' && globalIgnoreCompletedOrCancelledAlarms!=null) ? globalIgnoreCompletedOrCancelledAlarms : true, locked:false},
  205. weekenddays: {value: (typeof globalWeekendDays!='undefined' && globalWeekendDays!=null && globalWeekendDays!='') ? globalWeekendDays : [0, 6], locked:false},
  206. eventstartpastlimit: {value: (typeof globalEventStartPastLimit!='undefined' && globalEventStartPastLimit!=null) ? globalEventStartPastLimit : 3, locked:false},
  207. todopastlimit: {value: (typeof globalTodoPastLimit!='undefined' && globalTodoPastLimit!=null) ? globalTodoPastLimit : 3, locked:false},
  208. eventstartfuturelimit: {value: (typeof globalEventStartFutureLimit!='undefined' && globalEventStartFutureLimit!=null) ? globalEventStartFutureLimit : 3, locked:false},
  209. compatibility: {value: (typeof globalCompatibility!='undefined' && globalCompatibility!=null && globalCompatibility!='') ? globalCompatibility : {anniversaryOutputFormat: ['apple']}, locked:false},
  210. contactstorefn: {value: (typeof globalContactStoreFN!='undefined' && globalContactStoreFN!=null && globalContactStoreFN!='') ? globalContactStoreFN : ['prefix',' last',' middle',' first',' suffix'], locked:false},
  211. urihandlertel: {value: (typeof globalUriHandlerTel!='undefined' && globalUriHandlerTel!=null && globalUriHandlerTel!='') ? globalUriHandlerTel : 'tel:', locked:false},
  212. urihandleremail: {value: (typeof globalUriHandlerEmail!='undefined' && globalUriHandlerEmail!=null && globalUriHandlerEmail!='') ? globalUriHandlerEmail : 'mailto:', locked:false},
  213. urihandlerurl: {value: (typeof globalUriHandlerUrl!='undefined' && globalUriHandlerUrl!=null && globalUriHandlerUrl!='') ? globalUriHandlerUrl : 'http://', locked:false},
  214. urihandlerprofile: {value: (typeof globalUriHandlerProfile!='undefined' && globalUriHandlerProfile!=null && globalUriHandlerProfile!='') ? globalUriHandlerProfile : {'twitter': 'http://twitter.com/%u', 'facebook': 'http://www.facebook.com/%u', 'flickr': 'http://www.flickr.com/photos/%u', 'linkedin': 'http://www.linkedin.com/in/%u', 'myspace': 'http://www.myspace.com/%u', 'sinaweibo': 'http://weibo.com/n/%u'}, locked:false},
  215. addresscountryequivalence: {value: (typeof globalAddressCountryEquivalence!='undefined' && globalAddressCountryEquivalence!=null && globalAddressCountryEquivalence!='') ? globalAddressCountryEquivalence : [{country: 'de', regex: '^\\W*Deutschland\\W*$'}, {country: 'sk', regex: '^\\W*Slovensko\\W*$'}], locked:false},
  216. addressbookselected: {value: (typeof globalAddressbookSelected!='undefined' && globalAddressbookSelected!=null && globalAddressbookSelected!='') ? globalAddressbookSelected : '', locked:false},
  217. collectiondisplay: {value: (typeof globalCollectionDisplay!='undefined' && globalCollectionDisplay!=null && globalCollectionDisplay!='') ? globalCollectionDisplay : (
  218. (typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies) ?
  219. [{label: '{Name}', value: {company: ['{Company}', ' [{Department}]'], personal: ['{LastName}', ' {MiddleName}', ' {FirstName}']}}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}] :
  220. [{label: '{Name}', value: ['{LastName}', ' {MiddleName}', ' {FirstName}']}, {label: '{Company} [{Department}]', value: ['{Company}', ' [{Department}]']}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}]
  221. ), locked:false},
  222. collectionsort: {value: (typeof globalCollectionSort!='undefined' && globalCollectionSort!=null && globalCollectionSort!='') ? globalCollectionSort : '', locked:false},
  223. defaultaddresscountry: {value: (typeof globalDefaultAddressCountry!='undefined' && globalDefaultAddressCountry!=null && globalDefaultAddressCountry!='') ? globalDefaultAddressCountry :'us', locked:false},
  224. addresscountryfavorites: {value: (typeof globalAddressCountryFavorites!='undefined' && globalAddressCountryFavorites!=null && globalAddressCountryFavorites!='') ? globalAddressCountryFavorites :[], locked:false},
  225. activeaddressbookcollections: {value: (typeof globalActiveAddressbookCollections!='undefined' && globalActiveAddressbookCollections!=null) ? globalActiveAddressbookCollections : new Array(), locked:false},
  226. loadedaddressbookcollections: {value: (typeof globalLoadedAddressbookCollections!='undefined' && globalLoadedAddressbookCollections!=null) ? globalLoadedAddressbookCollections : new Array(), locked:false}
  227. };
  228. }
  229. function transformToServer(inSettings)
  230. {
  231. var serverSettings={};
  232. for(var prop in inSettings)
  233. {
  234. serverSettings[prop]=inSettings[prop].value;
  235. }
  236. return serverSettings;
  237. }
  238. var globalWindowFocus=true;
  239. var globalLoginUsername='';
  240. var globalLoginPassword='';
  241. var isUserLogged=false;
  242. var isDelegationLoaded=false;
  243. var globalActiveApp='';
  244. var globalAvailableAppsArray=new Array();
  245. var globalEnableAppSwitch=true;
  246. var globalAppName='CalDavZAP';
  247. var globalVersion='0.13.1';
  248. var globalBuildNo=1442928599;
  249. var globalXMLCache=null;
  250. var globalVersionCheckURL=(location.protocol=='file:' ? 'http:' : location.protocol)+'//www.inf-it.com/versioncheck/'+globalAppName+'/?v='+globalVersion;
  251. var globalXClientHeader=globalAppName+' '+globalVersion+' (Inf-IT CalDAV Web Client)';
  252. var globalResourceNumberCount=0;
  253. var globalResourceNumber=0;
  254. var globalResourceIntervalID=null;
  255. var globalFirstLoadNextApp=false;
  256. var globalObjectLoading=false;
  257. var settingsLoaded=false;
  258. var globalKBNavigationPaddingRate=0.2;
  259. var globalParallelAjaxCallCardDAVEnabled=true;
  260. var globalParallelAjaxCallCalDAVEnabled=true;
  261. var globalCacheUpdateInterval=null;
  262. var isIntegrated=false;
  263. var SVG_select='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" x="0px" y="0px" width="19px" height="19px" viewBox="0 0 19 19" overflow="visible" enable-background="new 0 0 19 19" xml:space="preserve"><defs></defs><rect x="2" fill="#585858" width="17" height="19"/><polygon fill="#FFFFFF" points="14,7 10.5,13 7,7 "/><rect fill="#FFFFFF" width="2" height="19"/></svg>';
  264. var SVG_select_b='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" x="0px" y="0px" width="19px" height="19px" viewBox="0 0 19 19" overflow="visible" enable-background="new 0 0 19 19" xml:space="preserve"><defs></defs><rect x="2" fill="#585858" width="17" height="19"/><polygon fill="#FFFFFF" points="14,7 10.5,13 7,7 "/><rect fill="#F0F0F0" width="2" height="19"/></svg>';
  265. var SVG_select_login='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" x="0px" y="0px" width="19px" height="28px" viewBox="0 0 19 28" overflow="visible" enable-background="new 0 0 19 28" xml:space="preserve"><defs></defs><rect fill="#FFFFFF" width="19" height="28"/></svg>';
  266. var SVG_select_dis='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" x="0px" y="0px" width="22px" height="19px" viewBox="0 0 22 19" overflow="visible" enable-background="new 0 0 22 19" xml:space="preserve"><defs></defs><rect fill="#FFFFFF" width="22" height="19"/></svg>';
  267. var globalDefinedSettings = new Array();
  268. var globalLoadedPrincipals = new Array();
  269. var globalEnableAllResourceSync = true;
  270. if(typeof isSettingsAvaible == 'undefined')
  271. var globalPreviousSupportedSettings = ['activecalendarcollections','activetodocollections', 'activeaddressbookcollections','todolistfilterselected','activeview','defaultactiveapp','calendarselected', 'todocalendarselected','addressbookselected','timezone', 'loadedtodocollections', 'loadedcalendarcollections', 'loadedaddressbookcollections', 'version'];
  272. var globalSettingsSaving = '';
  273. var globalFirstHideLoader = true;
  274. var globalLoadedCollectionsNumber = 0;
  275. var globalLoadedCollectionsCount = 0;
  276. var ignoreServerSettings=false;
  277. var globalPreventLogoutSync=false;
  278. var globalEmailAddress='';
  279. var globalSettingsVersion=3;
  280. var globalSyncSettingsSave=false;
  281. // Timepicker hack (prevent IE to re-open the datepicker on date click + focus)
  282. var globalTmpTimePickerHackTime=new Object();
  283. function isAvaible(app)
  284. {
  285. return globalAvailableAppsArray.indexOf(app)!=-1
  286. }
  287. function loadAllResources()
  288. {
  289. if(globalResourceIntervalID==null)
  290. netFindResource(globalAccountSettings[0], 0, true, 0);
  291. }
  292. function getAccount(accountUID)
  293. {
  294. // find the original settings for the resource and user
  295. var tmp=accountUID.match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)','i'));
  296. var resource_href=tmp[1]+tmp[3]+tmp[4];
  297. var resource_user=tmp[2];
  298. for(var i=0;i<globalAccountSettings.length;i++)
  299. if(globalAccountSettings[i].href==resource_href && globalAccountSettings[i].userAuth.userName==resource_user)
  300. resourceSettings=globalAccountSettings[i];
  301. return resourceSettings;
  302. }
  303. function checkForUnloadedResources()
  304. {
  305. var rex=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)', 'i');
  306. for(var i=globalLoadedPrincipals.length-1; i>=0;i--)
  307. {
  308. var resourceCounter = 0;
  309. if(isAvaible('CardDavMATE'))
  310. for(var j=0; j<globalResourceCardDAVList.collections.length;j++)
  311. if(globalResourceCardDAVList.collections[j].uid!=undefined&&globalResourceCardDAVList.collections[j].makeLoaded)
  312. {
  313. var tmp=globalResourceCardDAVList.collections[j].accountUID.match(rex);
  314. var resourceCalDAV_href=tmp[1]+tmp[3]+tmp[4];
  315. if(globalLoadedPrincipals[i]==resourceCalDAV_href)
  316. resourceCounter++;
  317. }
  318. if(isAvaible('CalDavZAP'))
  319. {
  320. for(var j=0; j<globalResourceCalDAVList.collections.length;j++)
  321. if(globalResourceCalDAVList.collections[j].uid!=undefined&&globalResourceCalDAVList.collections[j].makeLoaded)
  322. {
  323. var tmp=globalResourceCalDAVList.collections[j].accountUID.match(rex);
  324. var resourceCalDAV_href=tmp[1]+tmp[3]+tmp[4];
  325. if(globalLoadedPrincipals[i]==resourceCalDAV_href)
  326. resourceCounter++;
  327. }
  328. for(var j=0; j<globalResourceCalDAVList.TodoCollections.length;j++)
  329. if(globalResourceCalDAVList.TodoCollections[j].uid!=undefined&&globalResourceCalDAVList.TodoCollections[j].makeLoaded)
  330. {
  331. var tmp=globalResourceCalDAVList.TodoCollections[j].accountUID.match(rex);
  332. var resourceCalDAV_href=tmp[1]+tmp[3]+tmp[4];
  333. if(globalLoadedPrincipals[i]==resourceCalDAV_href)
  334. resourceCounter++;
  335. }
  336. }
  337. if(resourceCounter==0)
  338. globalLoadedPrincipals.splice(i,1);
  339. }
  340. }
  341. function reloadResources(dontSaveSettings, loadArray)
  342. {
  343. if((isAvaible('CardDavMATE')&&(globalCardDAVInitLoad||globalCardDAVResourceSync)) || (isAvaible('CalDavZAP')&&(globalCalDAVInitLoad||globalCalDAVResourceSync))
  344. || (isAvaible('Projects')&&!isProjectsLoaded) || (isAvaible('Settings')&&(!isSettingsLoaded || (globalSettingsSaving!=''&&!dontSaveSettings))) || (isAvaible('CalDavZAP')&&(globalLimitLoading!='' || globalLimitTodoLoading!='')))
  345. return false;
  346. if(globalWindowFocus==false)
  347. return false;
  348. globalCardDAVResourceSync=true;
  349. globalCalDAVResourceSync=true;
  350. if(isAvaible('CalDavZAP'))
  351. {
  352. globalCalDAVResourceSync = true;
  353. globalToday.setHours(0);
  354. globalToday.setMinutes(0);
  355. globalToday.setSeconds(0);
  356. globalToday.setMilliseconds(0);
  357. var currentToday=new Date();
  358. currentToday.setHours(0);
  359. currentToday.setMinutes(0);
  360. currentToday.setSeconds(0);
  361. currentToday.setMilliseconds(0);
  362. if(currentToday.getTime()!=globalToday.getTime())
  363. {
  364. if(isAvaible('CalDavZAP'))
  365. $('.date').datepicker('refresh');
  366. if(isAvaible('CardDavMATE'))
  367. $('#vCardEditor').find('input[data-type^="date_"]').datepicker('refresh');
  368. if(isAvaible('Projects'))
  369. $('.project_date').datepicker('refresh');
  370. $('#calendar').fullCalendar('updateToday');
  371. $('#calendar').fullCalendar('gotoDate', currentToday);
  372. $('#todoList').fullCalendar('gotoDate', currentToday);
  373. if(currentToday.getTime()>globalToday.getTime())
  374. {
  375. getNextMonths($('#calendar').fullCalendar('getView').end);
  376. getNextMonthsTodo();
  377. }
  378. else //support for timezone with backward time flow
  379. {
  380. getPrevMonths($('#calendar').fullCalendar('getView').start);
  381. getPrevMonthsTodo();
  382. }
  383. globalToday=currentToday;
  384. }
  385. }
  386. checkForUnloadedResources();
  387. if(!globalEnableAllResourceSync&&(typeof loadArray=='undefined' || loadArray==null))
  388. netFindResource(globalAccountSettings[0], 0, false, 0, globalLoadedPrincipals);
  389. else
  390. netFindResource(globalAccountSettings[0], 0, false, 0, loadArray);
  391. }
  392. function ifLoadCollections()
  393. {
  394. if((isAvaible('CardDavMATE') && (globalCardDAVInitLoad || globalCardDAVResourceSync)) || (isAvaible('CalDavZAP') && (globalCalDAVInitLoad || globalCalDAVResourceSync)))
  395. return false;
  396. var changeCounter = 0;
  397. if(isAvaible('CardDavMATE'))
  398. for(var i=0; i<globalResourceCardDAVList.collections.length;i++)
  399. if(globalResourceCardDAVList.collections[i].uid!=undefined && globalResourceCardDAVList.collections[i].someChanged)
  400. changeCounter++;
  401. if(isAvaible('CalDavZAP'))
  402. {
  403. for(var i=0; i<globalResourceCalDAVList.collections.length;i++)
  404. if(globalResourceCalDAVList.collections[i].uid!=undefined && globalResourceCalDAVList.collections[i].someChanged)
  405. changeCounter++;
  406. for(var i=0; i<globalResourceCalDAVList.TodoCollections.length;i++)
  407. if(globalResourceCalDAVList.TodoCollections[i].uid!=undefined && globalResourceCalDAVList.TodoCollections[i].someChanged)
  408. changeCounter++;
  409. }
  410. if(changeCounter>0 || globalSettingsSaving!='')
  411. loadNextApplication(false);
  412. }
  413. function bindColorPickerClick(newElement)
  414. {
  415. newElement.click(function(event){
  416. var collectionType=null;
  417. var resourceSelectedClass=null;
  418. var resourceItems=null;
  419. if(newElement.parent().hasClass('resourceCalDAV_item'))
  420. {
  421. if(globalEventCollectionsLoading)
  422. return false;
  423. collectionType='event';
  424. resourceSelectedClass='resourceCalDAV_item_selected';
  425. resourceItems=newElement.parent().siblings('.resourceCalDAV_item_selected');
  426. }
  427. else if(newElement.parent().hasClass('resourceCalDAVTODO_item'))
  428. {
  429. if(globalTodoCollectionsLoading)
  430. return false;
  431. collectionType='todo';
  432. resourceSelectedClass='resourceCalDAV_item_selected';
  433. resourceItems=newElement.parent().siblings('.resourceCalDAV_item_selected');
  434. }
  435. else if(newElement.hasClass('resourceCardDAVColor'))
  436. {
  437. if(globalAddressbookCollectionsLoading)
  438. return false;
  439. collectionType='addressbook';
  440. resourceSelectedClass='resourceCardDAV_selected';
  441. resourceItems=newElement.parent().parent().siblings().find('.resourceCardDAV_selected');
  442. }
  443. var showInput = event.shiftKey;
  444. var colorpicker=$(this).siblings('.colorPicker');
  445. if(!$(this).hasClass('hasColorpicker'))
  446. {
  447. $(this).addClass('hasColorpicker');
  448. colorpicker.spectrum({
  449. chooseText: localization[globalInterfaceLanguage].buttonSave,
  450. cancelText: localization[globalInterfaceLanguage].buttonCancel,
  451. color: newElement.css('background-color'),
  452. showInput: showInput,
  453. preferredFormat: 'hex6',
  454. move: function(color)
  455. {
  456. newElement.css('background', color);
  457. },
  458. hide: function(color)
  459. {
  460. if(newElement.css('background-color') != colorpicker.spectrum('get').toRgbString())
  461. newElement.css('background', colorpicker.spectrum('get').toRgbString());
  462. },
  463. change: function(color)
  464. {
  465. newElement.css('background', color);
  466. if(collectionType=='event')
  467. {
  468. var coll = globalResourceCalDAVList.getEventCollectionByUID($(this).parent().attr('data-id'));
  469. netSaveProperty(coll, (typeof globalCalendarColorPropertyXmlns!='undefined'&&globalCalendarColorPropertyXmlns!=null&&globalCalendarColorPropertyXmlns!='' ? globalCalendarColorPropertyXmlns : 'http://apple.com/ns/ical/'), 'calendar-color', color.toHexString())
  470. }
  471. else if(collectionType=='todo')
  472. {
  473. var coll = globalResourceCalDAVList.getTodoCollectionByUID($(this).parent().attr('data-id'));
  474. netSaveProperty(coll, (typeof globalCalendarColorPropertyXmlns!='undefined'&&globalCalendarColorPropertyXmlns!=null&&globalCalendarColorPropertyXmlns!='' ? globalCalendarColorPropertyXmlns : 'http://apple.com/ns/ical/'), 'calendar-color', color.toHexString())
  475. }
  476. else if(collectionType=='addressbook')
  477. {
  478. var coll = globalResourceCardDAVList.getCollectionByUID($(this).parent().attr('data-id'));
  479. netSaveProperty(coll, (typeof globalAddrColorPropertyXmlns!='undefined'&&globalAddrColorPropertyXmlns!=null&&globalAddrColorPropertyXmlns!='' ? globalAddrColorPropertyXmlns : 'http://inf-it.com/ns/ab/'), 'addressbook-color', color.toHexString())
  480. }
  481. }
  482. });
  483. }
  484. else if(showInput!=colorpicker.spectrum('option', 'showInput'))
  485. colorpicker.spectrum('option', 'showInput',showInput);
  486. var container = colorpicker.spectrum('container');
  487. if(container.is(':visible')) {
  488. colorpicker.spectrum('hide');
  489. }
  490. else {
  491. var offset=$(this).offset();
  492. colorpicker.spectrum('show');
  493. if(event.pageY<$(window).height()/2) {
  494. offset.top+=$(this).outerHeight();
  495. container.removeClass('sp-inverse');
  496. }
  497. else {
  498. offset.top-=container.outerHeight();
  499. container.addClass('sp-inverse');
  500. }
  501. container.offset(offset);
  502. }
  503. resourceItems.removeClass(resourceSelectedClass);
  504. newElement.parent().addClass(resourceSelectedClass);
  505. return false;
  506. });
  507. }
  508. function loadNextApplication(forceLoad)
  509. {
  510. if(!globalFirstLoadNextApp)
  511. {
  512. if(isAvaible('CardDavMATE'))
  513. setAddressbookNumber();
  514. if(isAvaible('CalDavZAP'))
  515. setCalendarNumber(true);
  516. globalFirstLoadNextApp=true;
  517. }
  518. if(isAvaible('CardDavMATE') && !globalCardDAVCollectionSync && globalResourceCardDAVList.collections.length>0)
  519. {
  520. globalCardDAVCollectionSync=true;
  521. CardDAVnetLoadCollection(globalResourceCardDAVList.collections[0], forceLoad, false, null, 0, globalResourceCardDAVList.collections,true);
  522. }
  523. else if(isAvaible('CalDavZAP') && !globalCalDAVCollectionSync && globalResourceCalDAVList.collections.length>0)
  524. {
  525. globalCalDAVCollectionSync=true;
  526. CalDAVnetLoadCollection(globalResourceCalDAVList.collections[0], forceLoad, true, 0, globalResourceCalDAVList.collections);
  527. }
  528. else if(isAvaible('Projects') && !globalProjectSync && !isProjectsLoaded && getLoggedUser()!=null)
  529. {
  530. $('#MainLoaderInner').html('Loading projects');
  531. globalProjectSync=true;
  532. if(typeof globalCRMSettings != 'undefined')
  533. netLoadXSLT(globalCRMSettings.XSLTHref);
  534. else
  535. {
  536. console.log("Error: globalCRMSettings is not defined");
  537. loadNextApplication(false);
  538. }
  539. }
  540. else if(isAvaible('Reports') && !globalReportsSync && !isReportsLoaded && getLoggedUser()!=null)
  541. {
  542. $('#MainLoaderInner').html('Loading Reports');
  543. globalReportsSync=true;
  544. if(typeof globalCRMSettings != 'undefined')
  545. netLoadReportList(globalCRMSettings);
  546. else
  547. {
  548. console.log("Error: globalCRMSettings is not defined");
  549. loadNextApplication(false);
  550. }
  551. }
  552. else if(isAvaible('Settings') && !globalSettingsSync && !isSettingsLoaded && getLoggedUser()!=null)
  553. {
  554. globalSettingsSync = true;
  555. if(!isSettingsLoaded)
  556. loadNextApplication(false);
  557. if($('#ResourceSettingsList').children('.resourceSettings_item').length)
  558. $('#ResourceSettingsList').children().eq(0).trigger('click');
  559. }
  560. else
  561. {
  562. if((isAvaible('CalDavZAP') && !isCalDAVLoaded) || (isAvaible('CardDavMATE') && !isCardDAVLoaded))
  563. $('#MainLoader').fadeOut(1200, function(){$('#MainLoader').css('left','50px');});
  564. if(isAvaible('CardDavMATE'))
  565. {
  566. globalCardDAVCollectionSync=false;
  567. if(!isCardDAVLoaded)
  568. isCardDAVLoaded=true;
  569. }
  570. if(isAvaible('CalDavZAP'))
  571. {
  572. globalCalDAVCollectionSync=false;
  573. if(!isCalDAVLoaded)
  574. isCalDAVLoaded=true;
  575. }
  576. if(isAvaible('Projects'))
  577. {
  578. globalProjectSync=false;
  579. isProjectsLoaded = true;
  580. }
  581. if(isAvaible('Reports'))
  582. {
  583. globalReportsSync=false;
  584. isReportsLoaded = true;
  585. }
  586. if(isAvaible('Settings'))
  587. {
  588. globalSettingsSync=false;
  589. isSettingsLoaded = true;
  590. }
  591. }
  592. }
  593. function checkForApplication(inputApp)
  594. {
  595. if(!globalEnableAppSwitch || globalObjectLoading)
  596. return false;
  597. globalEnableAppSwitch=false;
  598. globalActiveApp=inputApp;
  599. var inputID = 'System'+inputApp;
  600. $('.System').not('#'+inputID).each(function(){
  601. $(this).animate({opacity : 0}, 666, function(){
  602. /* XXX - System display:none changes
  603. if($(this).attr('id').indexOf('CalDav')==-1)
  604. $(this).css('display','none');
  605. else*/
  606. $(this).css('visibility','hidden');
  607. });
  608. });
  609. /* XXX - System display:none changes
  610. if(inputID.indexOf('CalDav')==-1)
  611. $('#'+inputID).css('display','block').animate({opacity : 1}, 666, function(){globalEnableAppSwitch=true;});
  612. else*/
  613. $('#'+inputID).css('visibility','visible').animate({opacity : 1}, 666, function(){globalEnableAppSwitch=true;});
  614. }
  615. function getLoggedUser()
  616. {
  617. for(var i=0; i<globalAccountSettings.length;i++)
  618. if(globalAccountSettings[i].href.indexOf(globalLoginUsername)!=-1)
  619. return globalAccountSettings[i];
  620. return globalAccountSettings[0];
  621. }
  622. function login()
  623. {
  624. $('#LoginLoader').fadeTo(1200, 1, function(){
  625. globalLoginUsername=$('#LoginPage').find('[data-type="system_username"]').val();
  626. globalLoginPassword=$('#LoginPage').find('[data-type="system_password"]').val();
  627. loadConfig();
  628. });
  629. }
  630. function logout(forceLogout)
  631. {
  632. if((typeof forceLogout=='undefined' || forceLogout==null ) && (
  633. (isAvaible('CardDavMATE') && (!isCardDAVLoaded || globalCardDAVResourceSync)) ||
  634. (isAvaible('CalDavZAP') && (!isCalDAVLoaded || globalCalDAVResourceSync)) ||
  635. (isAvaible('Projects') && !isProjectsLoaded) ||
  636. (isAvaible('Settings') && (!isSettingsLoaded || (globalSettingsSaving!='' && !dontSaveSettings))) ||
  637. (isAvaible('CalDavZAP') && (globalLimitLoading!='' || globalLimitTodoLoading!=''))
  638. ))
  639. {
  640. globalPreventLogoutSync=true;
  641. return false;
  642. }
  643. clearInterval(globalResourceIntervalID);
  644. if(globalFirstLoadNextApp)
  645. globalFirstLoadNextApp=false;
  646. settingsLoaded=false;
  647. ignoreServerSettings=false;
  648. //save settings
  649. checkBeforeClose(false);
  650. globalResourceIntervalID=null;
  651. globalLoginUsername='';
  652. globalLoginPassword='';
  653. globalXMLCache=null;
  654. globalResourceNumber=0;
  655. globalResourceNumberCount=0;
  656. globalLoadedPrincipals=new Array();
  657. globalEmailAddress='';
  658. globalPreventLogoutSync=false;
  659. globalSyncSettingsSave=false;
  660. $(document.documentElement).unbind();
  661. // reset page title
  662. var tmpMatch = document.title.match('^(.*) \\[.*\\]$');
  663. if(tmpMatch!=null)
  664. document.title = tmpMatch[1];
  665. $('#LoginPage').fadeTo(2000, 1, function(){
  666. if(typeof isCalDAVLoaded!='undefined' && isCalDAVLoaded)
  667. {
  668. logoutCalDAV();
  669. isCalDAVLoaded=false;
  670. }
  671. if(typeof isCardDAVLoaded!='undefined' && isCardDAVLoaded)
  672. {
  673. logoutCardDAV();
  674. isCardDAVLoaded=false;
  675. }
  676. if(typeof isProjectsLoaded!='undefined' && isProjectsLoaded)
  677. {
  678. logoutProjects();
  679. isProjectsLoaded = false;
  680. }
  681. if(typeof isReportsLoaded!='undefined' && isReportsLoaded)
  682. {
  683. logoutReports();
  684. isReportsLoaded = false;
  685. }
  686. if(typeof isSettingsLoaded!='undefined' && isSettingsLoaded)
  687. {
  688. logoutSettings();
  689. isSettingsLoaded = false;
  690. }
  691. for(var i=globalAccountSettings.length-1;i>=0;i--)
  692. if(globalAccountSettings[i].type=='network')
  693. globalAccountSettings.splice(i, 1);
  694. if(typeof globalDemoMode=='undefined')
  695. {
  696. $('[data-type="system_username"]').val('').change();
  697. $('[data-type="system_password"]').val('').change();
  698. }
  699. $('.integration_d').hide();
  700. isUserLogged=false;
  701. if(globalSettings.defaultactiveapp.value==null)
  702. {
  703. if(isAvaible('CalDavZAP'))
  704. globalActiveApp='CalDavZAP';
  705. else if(isAvaible('CardDavMATE'))
  706. globalActiveApp='CardDavMATE';
  707. }
  708. else
  709. globalActiveApp=globalSettings.defaultactiveapp.value;
  710. resetSettings();
  711. if(isAvaible('CardDavMATE'))
  712. mainCardDAV();
  713. if(isAvaible('CalDavZAP'))
  714. mainCalDAV();
  715. if(isAvaible('Settings'))
  716. mainSettings();
  717. if(isAvaible('Projects'))
  718. mainProjects();
  719. if(isAvaible('Reports'))
  720. mainReports();
  721. init();
  722. });
  723. }
  724. function init()
  725. {
  726. // browser check
  727. if(($.browser.msie && parseInt($.browser.version, 10)<9) || $.browser.opera)
  728. $('#login_message').css('display','').text(localization[globalInterfaceLanguage].unsupportedBrowser);
  729. if(typeof globalDemoMode!='undefined')
  730. {
  731. if(typeof globalDemoMode.userName!=undefined)
  732. $('[data-type="system_username"]').val(globalDemoMode.userName).change();
  733. if(typeof globalDemoMode.userPassword!=undefined)
  734. $('[data-type="system_password"]').val(globalDemoMode.userPassword).change();
  735. }
  736. loadConfig();
  737. }
  738. function run()
  739. {
  740. isUserLogged=true;
  741. window.onfocus=function(){globalWindowFocus=true;}
  742. window.onblur=function(){if(globalSettings.backgroundsync.value==false) globalWindowFocus=false;}
  743. $('#LoginPage').fadeOut(2000);
  744. if(typeof globalAccountSettings=='undefined')
  745. {
  746. console.log('Error: \'no account configured\': see config.js!');
  747. return false;
  748. }
  749. if(typeof globalNewVersionNotifyUsers=='undefined' || globalNewVersionNotifyUsers!=null)
  750. netVersionCheck();
  751. document.title+=' ['+globalAccountSettings[0].userAuth.userName+']';
  752. // Automatically detect crossDomain settings
  753. var detectedHref=location.protocol+'//'+location.hostname+(location.port ? ':'+location.port : '');
  754. for(var i=0;i<globalAccountSettings.length;i++)
  755. {
  756. if(globalAccountSettings[i].crossDomain==undefined || typeof globalAccountSettings[i].crossDomain!='boolean')
  757. {
  758. if(globalAccountSettings[i].href.indexOf(detectedHref)==0)
  759. globalAccountSettings[i].crossDomain=false;
  760. else
  761. globalAccountSettings[i].crossDomain=true;
  762. console.log("Info: [userAccount: '"+globalAccountSettings[i].href.replace('\/\/', '//'+globalAccountSettings[i].userAuth.userName+'@')+"']: crossDomain set to: '"+(globalAccountSettings[i].crossDomain==true ? 'true' : 'false')+"'");
  763. }
  764. }
  765. if(typeof globalAvailableAppsArray!='undefined' && globalAvailableAppsArray!=null && globalAvailableAppsArray.length>1) {
  766. // show integration banner
  767. $('.integration_d').css('display', 'block');
  768. // show app buttons for available apps only
  769. if(globalAvailableAppsArray.indexOf('CalDavZAP')!=-1)
  770. $('#intCaldav').attr('title',localization[globalInterfaceLanguage].txtCalendars).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  771. if(globalAvailableAppsArray.indexOf('CalDavTODO')!=-1)
  772. $('#intCaldavTodo').attr('title',localization[globalInterfaceLanguage].txtTodos).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  773. if(globalAvailableAppsArray.indexOf('CardDavMATE')!=-1)
  774. $('#intCarddav').attr('title',localization[globalInterfaceLanguage].txtContacts).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  775. if(globalAvailableAppsArray.indexOf('Projects')!=-1)
  776. $('#intProjects').attr('title',localization[globalInterfaceLanguage].txtProjects).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  777. if(globalAvailableAppsArray.indexOf('Reports')!=-1)
  778. $('#intReports').attr('title',localization[globalInterfaceLanguage].txtReports).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  779. if(globalAvailableAppsArray.indexOf('Settings')!=-1)
  780. $('#intSettings').attr('title',localization[globalInterfaceLanguage].txtSettings).css('display', 'block').find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  781. // show the refresh button
  782. if(typeof globalEnableRefresh==='boolean' && globalEnableRefresh && (globalAvailableAppsArray.indexOf('CalDavZAP')!=-1 || globalAvailableAppsArray.indexOf('CalDavTODO')!=-1 || globalAvailableAppsArray.indexOf('CardDavMATE')!=-1)) {
  783. $('#intRefresh').attr('title',localization[globalInterfaceLanguage].txtRefresh).find('.int_error').attr('alt',localization[globalInterfaceLanguage].txtError);
  784. $('#intRefresh').prev().addBack().css('display', 'block');
  785. }
  786. }
  787. $('#cacheDialogText').text(localization[globalInterfaceLanguage].txtCacheText);
  788. $('#cacheDialogButton').attr('value',localization[globalInterfaceLanguage].txtCacheButton);
  789. }
  790. function loadConfig()
  791. {
  792. if(isUserLogged)// !!!!!! kedy moze toto nastat? nexapem ...
  793. return false;
  794. var configLoaded=true;
  795. // Automatically detect crossDomain settings
  796. var detectedHref=location.protocol+'//'+location.hostname+(location.port ? ':'+location.port : '');
  797. // check username and password against the server and create config from globalNetworkCheckSettings
  798. if(typeof globalNetworkCheckSettings!='undefined' && globalNetworkCheckSettings!=null)
  799. {
  800. if(globalLoginUsername=='' || globalLoginPassword=='')
  801. {
  802. $('#LoginPage').fadeTo(500, 1, function(){if(typeof globalDemoMode=='undefined') $('[data-type="system_username"]').focus()});
  803. $('#LoginLoader').fadeOut(1200);
  804. return false;
  805. }
  806. else
  807. {
  808. if(globalNetworkCheckSettings.crossDomain==undefined || typeof globalNetworkCheckSettings.crossDomain!='boolean')
  809. {
  810. if(globalNetworkCheckSettings.href.indexOf(detectedHref)==0)
  811. globalNetworkCheckSettings.crossDomain=false;
  812. else
  813. globalNetworkCheckSettings.crossDomain=true;
  814. console.log("Info: [globalNetworkCheckSettings: '"+globalNetworkCheckSettings.href+"']: crossDomain set to: '"+(globalNetworkCheckSettings.crossDomain==true ? 'true' : 'false')+"'");
  815. }
  816. // !!!! preco sa riesi s logout buttonom prave tu?
  817. // show the logout button
  818. if(typeof globalAvailableAppsArray!='undefined' && globalAvailableAppsArray!=null && globalAvailableAppsArray.length>1) {
  819. $('#intLogout').prev().addBack().css('display', 'block');
  820. $('#intLogout').attr('title',localization[globalInterfaceLanguage].altLogout);
  821. }
  822. else {
  823. $('#Logout').css('display', 'block');
  824. }
  825. netCheckAndCreateConfiguration(globalNetworkCheckSettings);
  826. return true;
  827. }
  828. }
  829. // load the configuration XML(s) from the network
  830. if(typeof globalNetworkAccountSettings!='undefined' && globalNetworkAccountSettings!=null)
  831. {
  832. if(globalLoginUsername=='' || globalLoginPassword=='')
  833. {
  834. $('#LoginPage').fadeTo(500, 1, function(){if(typeof globalDemoMode=='undefined') $('[data-type="system_username"]').focus()});
  835. $('#LoginLoader').fadeOut(1200);
  836. return false;
  837. }
  838. else
  839. {
  840. if(globalNetworkAccountSettings.crossDomain==undefined || typeof globalNetworkAccountSettings.crossDomain!='boolean')
  841. {
  842. if(globalNetworkAccountSettings.href.indexOf(detectedHref)==0)
  843. globalNetworkAccountSettings.crossDomain=false;
  844. else
  845. globalNetworkAccountSettings.crossDomain=true;
  846. console.log("Info: [globalNetworkAccountSettings: '"+globalNetworkAccountSettings.href+"']: crossDomain set to: '"+(globalNetworkAccountSettings.crossDomain==true ? 'true' : 'false')+"'");
  847. }
  848. // !!!! preco sa riesi s logout buttonom prave tu?
  849. // show the logout button
  850. if(typeof globalAvailableAppsArray!='undefined' && globalAvailableAppsArray!=null && globalAvailableAppsArray.length>1) {
  851. $('#intLogout').prev().addBack().css('display', 'block');
  852. $('#intLogout').attr('title',localization[globalInterfaceLanguage].altLogout);
  853. }
  854. else {
  855. $('#Logout').css('display', 'block');
  856. }
  857. netLoadConfiguration(globalNetworkAccountSettings);
  858. return true;
  859. }
  860. }
  861. if((typeof globalNetworkAccountSettings=='undefined' || globalNetworkAccountSettings==null) && (typeof globalNetworkCheckSettings=='undefined' || globalNetworkCheckSettings==null) && (typeof globalAccountSettings!='undefined' && globalAccountSettings!=null) && globalAccountSettings.length>0)
  862. {
  863. var delegCount=0, delegIndex=0;
  864. if(!isDelegationLoaded)
  865. {
  866. for(var i=0; i<globalAccountSettings.length; i++)
  867. if((typeof globalAccountSettings[i].delegation=='boolean' && globalAccountSettings[i].delegation) || (globalAccountSettings[i].delegation instanceof Array && globalAccountSettings[i].delegation.length>0))
  868. delegIndex=i;
  869. for(var i=0; i<globalAccountSettings.length; i++)
  870. if((typeof globalAccountSettings[i].delegation=='boolean' && globalAccountSettings[i].delegation) || (globalAccountSettings[i].delegation instanceof Array && globalAccountSettings[i].delegation.length>0))
  871. {
  872. delegCount++;
  873. DAVresourceDelegation(globalAccountSettings[i], i, delegIndex);
  874. }
  875. if(delegCount>0)
  876. isDelegationLoaded = true;
  877. }
  878. if(delegCount==0 && !isDelegationLoaded)
  879. {
  880. // start the client
  881. if(isAvaible('CardDavMATE'))
  882. runCardDAV();
  883. if(isAvaible('CalDavZAP'))
  884. runCalDAV();
  885. if(isAvaible('Projects'))
  886. runProjects();
  887. if(isAvaible('Settings'))
  888. runSettings();
  889. globalResourceNumber=globalAccountSettings.length;
  890. loadAllResources();
  891. }
  892. }
  893. }
  894. function globalMain()
  895. {
  896. for(var prop in globalSettings)
  897. globalDefinedSettings.push(prop);
  898. if(typeof globalEnabledApps=='undefined' || globalEnabledApps==null)
  899. {
  900. if(typeof isCalDAVAvaible!='undefined' && isCalDAVAvaible!=null && isCalDAVAvaible)
  901. {
  902. globalAvailableAppsArray[globalAvailableAppsArray.length]='CalDavZAP';
  903. globalAvailableAppsArray[globalAvailableAppsArray.length]='CalDavTODO';
  904. }
  905. if(typeof isCardDAVAvaible!='undefined' && isCardDAVAvaible!=null && isCardDAVAvaible)
  906. globalAvailableAppsArray[globalAvailableAppsArray.length]='CardDavMATE';
  907. if(typeof isSettingsAvaible!='undefined' && isSettingsAvaible!=null && isSettingsAvaible)
  908. globalAvailableAppsArray[globalAvailableAppsArray.length]='Settings';
  909. if(typeof isProjectsAvaible!='undefined' && isProjectsAvaible!=null && isProjectsAvaible)
  910. globalAvailableAppsArray[globalAvailableAppsArray.length]='Projects';
  911. if(typeof isReportsAvaible!='undefined' && isReportsAvaible!=null && isReportsAvaible)
  912. globalAvailableAppsArray[globalAvailableAppsArray.length]='Reports';
  913. }
  914. else
  915. {
  916. if(typeof isCalDAVAvaible!='undefined' && isCalDAVAvaible!=null && isCalDAVAvaible && (globalEnabledApps.indexOf('CalDavZAP')!=-1 || globalEnabledApps.indexOf('CalDavTODO')!=-1 ))
  917. {
  918. globalAvailableAppsArray[globalAvailableAppsArray.length]='CalDavZAP';
  919. globalAvailableAppsArray[globalAvailableAppsArray.length]='CalDavTODO';
  920. }
  921. if(typeof isCardDAVAvaible!='undefined' && isCardDAVAvaible!=null && isCardDAVAvaible && globalEnabledApps.indexOf('CardDavMATE')!=-1)
  922. globalAvailableAppsArray[globalAvailableAppsArray.length]='CardDavMATE';
  923. if(typeof isSettingsAvaible!='undefined' && isSettingsAvaible!=null && isSettingsAvaible && globalEnabledApps.indexOf('Settings')!=-1)
  924. globalAvailableAppsArray[globalAvailableAppsArray.length]='Settings';
  925. if(typeof isProjectsAvaible!='undefined' && isProjectsAvaible!=null && isProjectsAvaible && globalEnabledApps.indexOf('Projects')!=-1)
  926. globalAvailableAppsArray[globalAvailableAppsArray.length]='Projects';
  927. if(typeof isReportsAvaible!='undefined' && isReportsAvaible!=null && isReportsAvaible)
  928. globalAvailableAppsArray[globalAvailableAppsArray.length]='Reports';
  929. }
  930. if(globalAvailableAppsArray.length>1)
  931. isIntegrated=true;
  932. if(globalSettings.defaultactiveapp.value==null)
  933. {
  934. if(isAvaible('CardDavMATE'))
  935. globalActiveApp='CardDavMATE';
  936. else if(isAvaible('CalDavZAP'))
  937. globalActiveApp='CalDavZAP';
  938. }
  939. else
  940. globalActiveApp=globalSettings.defaultactiveapp.value;
  941. if(isAvaible('CardDavMATE'))
  942. {
  943. // Modify available inputs before making additional changes to vCard form
  944. if(typeof globalDisabledContactAttributes!='undefined' && globalDisabledContactAttributes instanceof Array)
  945. for(var i=0;i<globalDisabledContactAttributes.length;i++)
  946. $('#vCardTemplate').find('[data-attr-name="'+jqueryEscapeSelector(globalDisabledContactAttributes[i])+'"]').remove();
  947. // hook for vCard template extension
  948. if(typeof(globalContactsExtInitMain)=='function')
  949. globalContactsExtInitMain($('#vCardTemplate'));
  950. }
  951. /*************************** BAD HACKS SECTION ***************************/
  952. // here we fix the cross OS/cross broser problems (unfixable in pure CSS)
  953. if($.browser.webkit && !!window.chrome) /* Chrome */
  954. {
  955. if(navigator.platform.toLowerCase().indexOf('win')==0) /* Windows version */
  956. {
  957. $('#LoginPage, #vCardTemplate, #event_details_template, #todo_details_template, #EditorBoxSettings').find('input').css('text-indent', '2px');
  958. $('#LoginPage, #vCardTemplate, #event_details_template, #todo_details_template, #EditorBoxSettings').find('select').css({'padding-left': '0px', 'padding-right': '13px'});
  959. }
  960. else /* non-Windows version */
  961. $('#LoginPage, #vCardTemplate, #event_details_template, #todo_details_template, #EditorBoxSettings').find('input').css('text-indent', '1px');
  962. }
  963. else if($.browser.safari)
  964. {
  965. $('#LoginPage, #vCardTemplate, #event_details_template, #todo_details_template, #EditorBoxSettings').find('textarea').addClass('safari_hack');
  966. $('#LoginPage, #vCardTemplate, #event_details_template, #todo_details_template, #EditorBoxSettings').find('input').addClass('safari_hack');
  967. }
  968. else if($.browser.msie) /* IE */
  969. {
  970. if(parseInt($.browser.version, 10)==10) /* IE 10 (because there are no more conditional comments) */
  971. {
  972. $('select').css({'padding-top': '1px', 'padding-left': '0px', 'padding-right': '0px'});
  973. $('textarea').css('padding-top', '3px');
  974. $('input[type=button]').css('padding-top', '2px');
  975. }
  976. // ADD SVG to login screen
  977. var newSVG=$(SVG_select_login).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
  978. $('#Login').find('select[data-type="language"]').after($($('<div>').append($(newSVG).clone()).html()));
  979. }
  980. else if($.browser.mozilla)
  981. {
  982. // ADD SVG to login screen
  983. var newSVG=$(SVG_select_login).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
  984. $('#Login').find('select[data-type="language"]').after($($('<div>').append($(newSVG).clone()).html()));
  985. }
  986. /*************************** END OF BAD HACKS SECTION ***************************/
  987. /* language selector */
  988. var lang_num=0;
  989. var language_option=$('#Login').find('[data-type="language"]').find('option');
  990. $('#Login').find('[data-type="language"]').html('');
  991. if(typeof globalInterfaceCustomLanguages!='undefined' && globalInterfaceCustomLanguages.length!=undefined && globalInterfaceCustomLanguages.length>0)
  992. {
  993. for(var i=0; i<globalInterfaceCustomLanguages.length; i++)
  994. if(localization[globalInterfaceCustomLanguages[i]]!=undefined)
  995. {
  996. var tmp=language_option;
  997. tmp.attr('data-type',globalInterfaceCustomLanguages[i]);
  998. tmp.text(localization[globalInterfaceCustomLanguages[i]]['_name_']);
  999. $('#Login').find('[data-type="language"]').append(tmp.clone());
  1000. lang_num++;
  1001. }
  1002. }
  1003. if(lang_num==0) // no language option, use the default (all languages from localization.js)
  1004. for(var loc in localization)
  1005. {
  1006. var tmp=language_option;
  1007. tmp.attr('data-type',loc);
  1008. tmp.text(localization[loc]['_name_']); // translation
  1009. $('#Login').find('[data-type="language"]').append(tmp.clone());
  1010. }
  1011. // select the globalInterfaceLanguage in the interface
  1012. $('[data-type="language"]').find('[data-type='+globalInterfaceLanguage+']').prop('selected',true);
  1013. // set login screen logo
  1014. if(isAvaible('CalDavZAP') && !isAvaible('CardDavMATE'))
  1015. {
  1016. $('[data-size="login_logo"]').find('img').attr('src', "images/cdz_logo.svg");
  1017. $('#LoginPage').find('.footer').text('CalDavZAP - the open source CalDAV web client');
  1018. }
  1019. else if(isAvaible('CardDavMATE') && !isAvaible('CalDavZAP'))
  1020. {
  1021. $('[data-size="login_logo"]').find('img').attr('src', "carddavmate/images/cdm_logo.svg");
  1022. $('#LoginPage').find('.footer').text('CardDavMATE - the open source CardDAV web client');
  1023. }
  1024. else
  1025. {
  1026. $('#Login').css('margin-top', '41px');
  1027. $('[data-size="login_logo"]').find('img').attr('src', "images/infcloud_logo.svg");
  1028. $('#LoginPage').find('.footer').text('InfCloud - the open source CalDAV/CardDAV web client');
  1029. }
  1030. $('#LoginPage').find('.footer').attr('title', globalVersion);
  1031. if(isAvaible('CardDavMATE'))
  1032. globalMainCardDAV();
  1033. if(isAvaible('CalDavZAP'))
  1034. globalMainCalDAV();
  1035. if(isAvaible('Projects'))
  1036. globalMainProjects();
  1037. if(isAvaible('Reports'))
  1038. globalMainReports();
  1039. if(isAvaible('Settings'))
  1040. globalMainSettings();
  1041. if(isAvaible('CardDavMATE'))
  1042. mainCardDAV();
  1043. if(isAvaible('CalDavZAP'))
  1044. mainCalDAV();
  1045. if(isAvaible('Projects'))
  1046. mainProjects();
  1047. if(isAvaible('Reports'))
  1048. mainReports();
  1049. if(isAvaible('Settings'))
  1050. mainSettings();
  1051. init();
  1052. }
  1053. function saveSettings(isFormSave)
  1054. {
  1055. if(globalSettings.islastdefaultactiveapp.value)
  1056. globalSettings.defaultactiveapp.value=globalActiveApp;
  1057. globalSettings.version.value=globalSettingsVersion;
  1058. var rex = new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)');
  1059. if(isAvaible('CalDavZAP'))
  1060. {
  1061. globalSettings.activecalendarcollections.value.splice(0, globalSettings.activecalendarcollections.value.length);
  1062. globalSettings.activetodocollections.value.splice(0, globalSettings.activetodocollections.value.length);
  1063. globalSettings.todolistfilterselected.value.splice(0, globalSettings.todolistfilterselected.value.length);
  1064. for(var i=0;i<globalVisibleCalDAVCollections.length;i++)
  1065. {
  1066. var uidParts=globalVisibleCalDAVCollections[i].match(rex)
  1067. globalSettings.activecalendarcollections.value.splice(globalSettings.activecalendarcollections.value.length , 0, uidParts[1]+uidParts[3]);
  1068. }
  1069. for(var i=0;i<globalVisibleCalDAVTODOCollections.length;i++)
  1070. {
  1071. var uidParts=globalVisibleCalDAVTODOCollections[i].match(rex);
  1072. globalSettings.activetodocollections.value.splice(globalSettings.activetodocollections.value.length , 0, uidParts[1]+uidParts[3]);
  1073. }
  1074. if(globalSettings.islastactiveview.value)
  1075. {
  1076. var view= $('#calendar').fullCalendar('getView');
  1077. globalSettings.activeview.value=view.name;
  1078. }
  1079. if(globalSettings.islasttimezone.value)
  1080. globalSettings.timezone.value=globalSessionTimeZone;
  1081. var uidSelected=$('#ResourceCalDAVList').find('.resourceCalDAV_item_selected').attr('data-id');
  1082. if(uidSelected!=undefined && uidSelected!='')
  1083. {
  1084. var par=uidSelected.split('/');
  1085. globalSettings.calendarselected.value=par[par.length-3]+'/'+par[par.length-2]+'/';
  1086. }
  1087. uidSelected=$('#ResourceCalDAVTODOList').find('.resourceCalDAV_item_selected').attr('data-id');
  1088. if(uidSelected!=undefined && uidSelected!='')
  1089. {
  1090. var par=uidSelected.split('/');
  1091. globalSettings.todocalendarselected.value=par[par.length-3]+'/'+par[par.length-2]+'/';
  1092. }
  1093. var filterArray = $('.fc-filter-option-selected');
  1094. for(var i=0; i<filterArray.length; i++)
  1095. globalSettings.todolistfilterselected.value.splice(globalSettings.todolistfilterselected.value.length,0,$($('.fc-filter-option-selected')[i]).attr('data-type'));
  1096. }
  1097. if(isAvaible('CardDavMATE'))
  1098. {
  1099. globalSettings.activeaddressbookcollections.value.splice(0, globalSettings.activeaddressbookcollections.value.length);
  1100. var visAddrs = dataGetChecked('#ResourceCardDAVList');
  1101. for(var i=0;i<visAddrs.length;i++)
  1102. {
  1103. if(visAddrs[i]!='undefined')
  1104. {
  1105. var uidPart=visAddrs[i].match(RegExp('^(https?://)(.*)', 'i'))[1];
  1106. var uidPart2= visAddrs[i].match(RegExp('^(https?://)(.*)', 'i'))[2].split('@')[2];
  1107. globalSettings.activeaddressbookcollections.value.splice(globalSettings.activeaddressbookcollections.value.length , 0, uidPart+uidPart2);
  1108. }
  1109. }
  1110. if($('#ResourceCardDAVList').find('.group.resourceCardDAV_selected').length>0)
  1111. var uidASelected=$('#ResourceCardDAVList').find('.group.resourceCardDAV_selected').attr('data-id');
  1112. else if($('#ResourceCardDAVList').find('.resourceCardDAV_selected').length>0)
  1113. var uidASelected=$('#ResourceCardDAVList').find('.resourceCardDAV_selected').attr('data-id');
  1114. else
  1115. var uidASelected='';
  1116. if(uidASelected!=undefined && uidASelected!='')
  1117. globalSettings.addressbookselected.value=uidASelected;
  1118. }
  1119. if(isAvaible('Settings') && isFormSave)
  1120. return applyFormSettings();
  1121. else
  1122. return globalSettings;
  1123. }
  1124. function loadXMLSetings(settingsXML)
  1125. {
  1126. $(settingsXML).children().each(
  1127. function(ind,elm)
  1128. {
  1129. var type = $(elm).attr('type');
  1130. var locked = typeof $(elm).attr('locked')!='undefined'&&$(elm).attr('locked')!=null&&$(elm).attr('locked')=='true' ? true : false;
  1131. if(typeof globalSettings[$(elm).prop('tagName').toLowerCase()] == 'undefined')
  1132. return true;
  1133. if(locked)
  1134. globalSettings[$(elm).prop('tagName').toLowerCase()].locked=true;
  1135. if($(elm).children().length>0)
  1136. {
  1137. globalSettings[$(elm).prop('tagName').toLowerCase()].value = new Array();
  1138. $(elm).children().each(function(pind,pelm)
  1139. {
  1140. if($(elm).prop('tagName').toLowerCase() == 'urihandlerprofile')
  1141. {
  1142. globalSettings[$(elm).prop('tagName').toLowerCase()].value = {};
  1143. globalSettings[$(elm).prop('tagName').toLowerCase()].value[$(pelm).text().toLowerCase()] = $(pelm).attr('url');
  1144. }
  1145. else if($(elm).prop('tagName').toLowerCase() == 'addresscountryequivalence')
  1146. {
  1147. var eqObject = {};
  1148. eqObject['country'] = $(pelm).attr('name');
  1149. eqObject['regex'] = $(pelm).attr('regex');
  1150. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push(eqObject);
  1151. }
  1152. else if($(elm).prop('tagName').toLowerCase() == 'compatibility')
  1153. {
  1154. globalSettings[$(elm).prop('tagName').toLowerCase()].value = {};
  1155. globalSettings[$(elm).prop('tagName').toLowerCase()].value[$(pelm).attr('name')] = new Array();
  1156. $(pelm).children().each(function(rind,relm)
  1157. {
  1158. globalSettings[$(elm).prop('tagName').toLowerCase()].value[$(pelm).attr('name')].push($(relm).text());
  1159. });
  1160. }
  1161. else if($(pelm).text()!='')
  1162. {
  1163. switch(type)
  1164. {
  1165. case 'integer':
  1166. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push(parseInt($(pelm).text(),10));
  1167. break;
  1168. case 'string':
  1169. if($(pelm).text()!='null')
  1170. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push($(pelm).text());
  1171. else
  1172. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push(null);
  1173. break;
  1174. case 'boolean':
  1175. if($(pelm).text() == 'true')
  1176. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push(true);
  1177. else
  1178. globalSettings[$(elm).prop('tagName').toLowerCase()].value.push(false);
  1179. break;
  1180. default:
  1181. break;
  1182. }
  1183. }
  1184. });
  1185. }
  1186. else if($(elm).text()!='')
  1187. {
  1188. switch(type)
  1189. {
  1190. case 'integer':
  1191. globalSettings[$(elm).prop('tagName').toLowerCase()].value = parseInt($(elm).text(),10);
  1192. break;
  1193. case 'string':
  1194. if($(elm).text()!='null')
  1195. globalSettings[$(elm).prop('tagName').toLowerCase()].value = $(elm).text();
  1196. else
  1197. globalSettings[$(elm).prop('tagName').toLowerCase()].value = null;
  1198. break;
  1199. case 'boolean':
  1200. if($(elm).text() == 'true')
  1201. globalSettings[$(elm).prop('tagName').toLowerCase()].value = true;
  1202. else if($(elm).text() == 'false')
  1203. globalSettings[$(elm).prop('tagName').toLowerCase()].value = false;
  1204. break;
  1205. default:
  1206. break;
  1207. }
  1208. }
  1209. });
  1210. }
  1211. function applyServerSettings(inputSettings)
  1212. {
  1213. if(typeof inputSettings.activecalendarcollections == 'undefined' || inputSettings.activecalendarcollections==null)
  1214. inputSettings.activecalendarcollections = new Array();
  1215. if(typeof inputSettings.activetodocollections == 'undefined' || inputSettings.activetodocollections==null)
  1216. inputSettings.activetodocollections = new Array();
  1217. if(typeof inputSettings.loadedcalendarcollections == 'undefined' || inputSettings.loadedcalendarcollections==null)
  1218. {
  1219. inputSettings.loadedcalendarcollections = new Array();
  1220. if(isAvaible('CalDavZAP'))
  1221. $('#showUnloadedCalendars').css('display','none');
  1222. }
  1223. if(typeof inputSettings.loadedtodocollections == 'undefined' || inputSettings.loadedtodocollections==null)
  1224. {
  1225. inputSettings.loadedtodocollections = new Array();
  1226. if(isAvaible('CalDavZAP'))
  1227. $('#showUnloadedCalendarsTODO').css('display','none');
  1228. }
  1229. if(typeof inputSettings.activeaddressbookcollections == 'undefined' || inputSettings.activeaddressbookcollections==null)
  1230. inputSettings.activeaddressbookcollections = new Array();
  1231. if(typeof inputSettings.loadedaddressbookcollections == 'undefined' || inputSettings.loadedaddressbookcollections==null)
  1232. {
  1233. inputSettings.loadedaddressbookcollections = new Array();
  1234. if(isAvaible('CardDavMATE'))
  1235. $('#showUnloadedAddressbooks').css('display','none');
  1236. }
  1237. transformSettings(inputSettings);
  1238. for(var prop in inputSettings)
  1239. {
  1240. if(globalDefinedSettings.indexOf(prop)==-1 || (typeof globalPreviousSupportedSettings !='undefined' && globalPreviousSupportedSettings.indexOf(prop)==-1))
  1241. {
  1242. if(globalDefinedSettings.indexOf(prop)==-1)
  1243. console.log('Warning: Unsupported property: \''+prop+'\' (you can safely ignore this message)');
  1244. continue;
  1245. }
  1246. if(typeof globalSettings[prop] !='undefined' && !globalSettings[prop].locked)
  1247. globalSettings[prop].value=inputSettings[prop];
  1248. }
  1249. }
  1250. function transformSettings(settings) {
  1251. if(!settings.version) {
  1252. settings.version = 1;
  1253. }
  1254. while(settings.version<globalSettingsVersion) {
  1255. console.log('Warning: Detected outdated server settings (version ' + settings.version++ +') - transforming to version ' + settings.version);
  1256. switch(settings.version) {
  1257. case 2:
  1258. if(typeof globalActiveCalendarCollections!='undefined' && globalActiveCalendarCollections!=null)
  1259. settings.activecalendarcollections=globalActiveCalendarCollections.slice();
  1260. else
  1261. settings.activecalendarcollections.splice(0, settings.activecalendarcollections.length);
  1262. if(typeof globalActiveTodoCollections!='undefined' && globalActiveTodoCollections!=null)
  1263. settings.activetodocollections=globalActiveTodoCollections.slice();
  1264. else
  1265. settings.activetodocollections.splice(0, settings.activetodocollections.length);
  1266. if(typeof globalLoadedCalendarCollections!='undefined' && globalLoadedCalendarCollections!=null)
  1267. settings.loadedcalendarcollections=globalLoadedCalendarCollections.slice();
  1268. else
  1269. settings.loadedcalendarcollections.splice(0, settings.loadedcalendarcollections.length);
  1270. if(typeof globalLoadedTodoCollections!='undefined' && globalLoadedTodoCollections!=null)
  1271. settings.loadedtodocollections=globalLoadedTodoCollections.slice();
  1272. else
  1273. settings.loadedtodocollections.splice(0, settings.loadedtodocollections.length);
  1274. if(typeof globalActiveAddressbookCollections!='undefined' && globalActiveAddressbookCollections!=null)
  1275. settings.activeaddressbookcollections=globalActiveAddressbookCollections.slice();
  1276. else
  1277. settings.activeaddressbookcollections.splice(0, settings.activeaddressbookcollections.length);
  1278. if(typeof globalLoadedAddressbookCollections!='undefined' && globalLoadedAddressbookCollections!=null)
  1279. settings.loadedaddressbookcollections=globalLoadedAddressbookCollections.slice();
  1280. else
  1281. settings.loadedaddressbookcollections.splice(0, settings.loadedaddressbookcollections.length);
  1282. if(typeof globalContactStoreFN!='undefined' && globalContactStoreFN!=null)
  1283. settings.contactstorefn=globalContactStoreFN.slice();
  1284. else
  1285. settings.contactstorefn=['prefix', ' last', ' middle', ' first', ' suffix'];
  1286. break;
  1287. case 3:
  1288. settings.collectiondisplay=(typeof globalCollectionDisplay!='undefined' && globalCollectionDisplay!=null && globalCollectionDisplay!='') ? globalCollectionDisplay : (
  1289. (typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies) ?
  1290. [{label: '{Name}', value: {company: ['{Company}', ' [{Department}]'], personal: ['{LastName}', ' {MiddleName}', ' {FirstName}']}}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}] :
  1291. [{label: '{Name}', value: ['{LastName}', ' {MiddleName}', ' {FirstName}']}, {label: '{Company} [{Department}]', value: ['{Company}', ' [{Department}]']}, {label: '{JobTitle}', value: ['{JobTitle}']}, {label: '{Email}', value: ['{Email[:0]}']}, {label: '{Phone} 1', value: ['{Phone[:0]}']}, {label: '{Phone} 2', value: ['{Phone[:1]}']}, {label: '{NoteText}', value: ['{NoteText}']}]
  1292. );
  1293. settings.collectionsort=(typeof globalCollectionSort!='undefined' && globalCollectionSort!=null && globalCollectionSort!='') ? globalCollectionSort : '';
  1294. break;
  1295. default:
  1296. break;
  1297. }
  1298. }
  1299. }
  1300. function loadSettings(strobj, fromServer, syncMode)
  1301. {
  1302. if(settingsLoaded && !syncMode)
  1303. return false;
  1304. try
  1305. {
  1306. objNew = jQuery.parseJSON(strobj);
  1307. if(typeof objNew=='object')
  1308. {
  1309. if(!syncMode && typeof globalSettingsXML!='undefined' && globalSettingsXML!=null && globalSettingsXML!='')
  1310. loadXMLSetings($(globalSettingsXML));
  1311. if(fromServer)
  1312. applyServerSettings(objNew);
  1313. // $.extend(globalSettings,objNew);
  1314. }
  1315. }
  1316. catch(err)
  1317. {
  1318. console.log('load settings - JSON parsing error: '+err);
  1319. delete globalSettings.version.value;
  1320. loadSettings(JSON.stringify(globalSettings), false, false);
  1321. return false;
  1322. }
  1323. if(syncMode)
  1324. return false;
  1325. if(isAvaible('CalDavZAP'))
  1326. {
  1327. for(var i=0;i<globalSettings.timezonesenabled.value.length;i++)
  1328. if(timeZonesEnabled.indexOf(globalSettings.timezonesenabled.value[i])==-1)
  1329. timeZonesEnabled.push(globalSettings.timezonesenabled.value[i]);
  1330. if(globalSettings.timezonesupport.value)
  1331. {
  1332. globalSessionTimeZone=globalSettings.timezone.value;
  1333. if(globalSessionTimeZone != null && timeZonesEnabled.indexOf(globalSessionTimeZone)==-1)
  1334. timeZonesEnabled.push(globalSessionTimeZone);
  1335. }
  1336. else
  1337. {
  1338. globalSessionTimeZone = 'local';
  1339. timeZonesEnabled.push('local');
  1340. }
  1341. initTimepicker(globalSettings.ampmformat.value);
  1342. if(globalSettings.timeformatagenda.value==null)
  1343. {
  1344. if(globalSettings.ampmformat.value)
  1345. globalSettings.timeformatagenda.value='h:mm TT{ - h:mm TT}';
  1346. else
  1347. globalSettings.timeformatagenda.value='H:mm{ - H:mm}';
  1348. }
  1349. if(globalSettings.timeformatbasic.value==null)
  1350. {
  1351. if(globalSettings.ampmformat.value)
  1352. globalSettings.timeformatbasic.value = 'h:mmT{-h:mmT}';
  1353. else
  1354. globalSettings.timeformatbasic.value = 'H:mm{-H:mm}';
  1355. }
  1356. if(globalSettings.appleremindersmode.value)
  1357. {
  1358. if(globalSettings.todolistfilterselected.value.indexOf('filterAction')==-1 && globalSettings.todolistfilterselected.value.indexOf('filterCompleted')==-1)
  1359. {
  1360. if(globalSettings.todolistfilterselected.value.indexOf('filterProgress')!=-1)
  1361. globalSettings.todolistfilterselected.value[globalSettings.todolistfilterselected.value.indexOf('filterProgress')] = 'filterAction';
  1362. if(globalSettings.todolistfilterselected.value.indexOf('filterCanceled')!=-1)
  1363. globalSettings.todolistfilterselected.value[globalSettings.todolistfilterselected.value.indexOf('filterCanceled')] = 'filterAction';
  1364. }
  1365. }
  1366. if(globalSettings.eventstartfuturelimit.value == null)
  1367. {
  1368. var now=new Date();
  1369. globalToLoadedLimit = new Date(now.getFullYear(), now.getMonth()+12, 1, 0, 0, 0);
  1370. globalToLoadedLimit.setMilliseconds(0);
  1371. globalBeginFuture = new Date(globalToLoadedLimit.getTime());
  1372. globalBeginFuture.setDate(globalBeginFuture.getDate()+14);
  1373. globalToLoadedLimitTodo = new Date(now.getFullYear(), now.getMonth()+12, 1, 0, 0, 0);
  1374. globalToLoadedLimitTodo.setMilliseconds(0);
  1375. }
  1376. if(globalSettings.enablekbnavigation.value!==false)
  1377. initKbTodoNavigation();
  1378. initFullCalendar();
  1379. initTodoList();
  1380. $('#SystemCalDavZAP .fc-header-title').css('width', $('#main_h_placeholder').width()-$('#SystemCalDavZAP .fc-header-left').outerWidth()-$('#SystemCalDavZAP .fc-header-right').outerWidth());
  1381. $('#ResourceCalDAVList, #ResourceCalDAVTODOList').css('bottom',(globalSettings.timezonesupport.value ? 20 : 0));
  1382. $('#alertBox').css('left', ($(window).width()/2)-($('#alertBox').width()/2));
  1383. }
  1384. if(isAvaible('CardDavMATE'))
  1385. {
  1386. // set ABListTableLayout
  1387. globalRefAbListTableHeader = $('#ABListTable').find('.ablist_table_header');
  1388. var colgroups = $('#ABListTable').find('colgroup');
  1389. for(var i=0; i<getDataColumnCount(); i++) {
  1390. globalRefAbListTableHeader.append('<th>');
  1391. colgroups.append('<col>');
  1392. }
  1393. globalRefAbListTableHeader.children().slice(globalFixedContactDataColumnsCount).each(function(ind) {
  1394. $(this).text(getDataColumnLabelAtIndex(ind));
  1395. });
  1396. globalRefABListTableCols=$('#ABListTable').find('colgroup').first().children();
  1397. globalRefABListInnerTableCols=$('#ABListTableInner').find('colgroup').children();
  1398. $('#ABListTable').find('.ablist_table_container').children().attr('colspan', getDataColumnCount()+globalFixedContactDataColumnsCount);
  1399. globalRefABListTable.children('.ablist_header').children().attr('colspan', getDataColumnCount()+globalFixedContactDataColumnsCount);
  1400. if(!globalOrigABListHeader) {
  1401. globalOrigABListHeader=globalRefABListTable.children('.ablist_header').remove();
  1402. }
  1403. if(!globalOrigABListItem) {
  1404. globalOrigABListItem=globalRefABListTable.children('.ablist_item').remove();
  1405. }
  1406. if(globalSettings.enablekbnavigation.value!==false)
  1407. initKbAddrNavigation();
  1408. applyAddrSettings(globalTranslVcardTemplate);
  1409. applyAddrSettings($('#vCardEditor'));
  1410. }
  1411. if(isAvaible('Projects'))
  1412. if(globalSettings.enablekbnavigation.value!==false)
  1413. initKbProjectNavigation();
  1414. settingsLoaded=true;
  1415. if(!isAvaible(globalSettings.defaultactiveapp.value))
  1416. globalActiveApp = globalAvailableAppsArray[0];
  1417. else
  1418. globalActiveApp = globalSettings.defaultactiveapp.value;
  1419. }
  1420. function checkForLoadedCollections(inputSettings)
  1421. {
  1422. var val='', triggerSync=true;
  1423. globalLoadedCollectionsNumber=0;
  1424. globalLoadedCollectionsCount=0;
  1425. if(globalSettingsSaving=='event')
  1426. {
  1427. hideUnloadedCollections('event');
  1428. val = inputSettings.loadedcalendarcollections.value;
  1429. if(val.length>0)
  1430. globalLoadedCollectionsNumber+=$(val).not(globalSettings.loadedcalendarcollections.value).length;
  1431. else
  1432. globalLoadedCollectionsNumber++;
  1433. if($(globalSettings.loadedcalendarcollections.value).not(val).length>0)
  1434. {
  1435. if(globalLoadedCollectionsNumber==0)
  1436. {
  1437. triggerSync=false;
  1438. globalFirstHideLoader=false;
  1439. }
  1440. var unloadArray = $(globalSettings.loadedcalendarcollections.value).not(val);
  1441. unloadCalDAVCollection(unloadArray.toArray(),true);
  1442. }
  1443. if(triggerSync)
  1444. addLoadCalDAVCollection(val, true);
  1445. globalSettings.loadedcalendarcollections.value = val;
  1446. }
  1447. else if(globalSettingsSaving=='todo')
  1448. {
  1449. hideUnloadedCollections('todo');
  1450. val = inputSettings.loadedtodocollections.value;
  1451. if(val.length>0)
  1452. globalLoadedCollectionsNumber+=$(val).not(globalSettings.loadedtodocollections.value).length;
  1453. else
  1454. globalLoadedCollectionsNumber++;
  1455. if($(globalSettings.loadedtodocollections.value).not(val).length>0)
  1456. {
  1457. if(globalLoadedCollectionsNumber==0)
  1458. {
  1459. triggerSync=false;
  1460. globalFirstHideLoader=false;
  1461. }
  1462. var unloadArray = $(globalSettings.loadedtodocollections.value).not(val);
  1463. unloadCalDAVCollection(unloadArray.toArray(),false);
  1464. }
  1465. if(triggerSync)
  1466. addLoadCalDAVCollection(val, false);
  1467. globalSettings.loadedtodocollections.value = val;
  1468. }
  1469. else if(globalSettingsSaving=='addressbook')
  1470. {
  1471. hideUnloadedCardDAVCollections();
  1472. val = inputSettings.loadedaddressbookcollections.value;
  1473. if(val.length>0)
  1474. globalLoadedCollectionsNumber+=$(val).not(globalSettings.loadedaddressbookcollections.value).length;
  1475. else
  1476. globalLoadedCollectionsNumber++;
  1477. if($(globalSettings.loadedaddressbookcollections.value).not(val).length>0)
  1478. {
  1479. if(globalLoadedCollectionsNumber==0)
  1480. {
  1481. triggerSync=false;
  1482. globalFirstHideLoader=false;
  1483. }
  1484. var unloadArray = $(globalSettings.loadedaddressbookcollections.value).not(val);
  1485. unloadCardDAVCollection(unloadArray.toArray());
  1486. }
  1487. if(triggerSync)
  1488. addLoadCardDAVCollection(val)
  1489. globalSettings.loadedaddressbookcollections.value = val;
  1490. }
  1491. if(triggerSync)
  1492. ifLoadCollections();
  1493. }
  1494. function checkBeforeClose(isFormSave)
  1495. {
  1496. if((isAvaible('CalDavZAP') && globalCalDAVInitLoad) || (isAvaible('CardDavMATE') && globalCardDAVInitLoad))
  1497. return false;
  1498. var old_settings=JSON.stringify(globalSettings);
  1499. var settings=saveSettings(isFormSave);
  1500. var new_settings = JSON.stringify(settings);
  1501. if(old_settings == new_settings)
  1502. return false;
  1503. for(var i=0;i<globalAccountSettings.length;i++)
  1504. if(globalAccountSettings[i].href.indexOf(globalLoginUsername)!=-1 && globalAccountSettings[i].settingsAccount)
  1505. {
  1506. netSaveSettings(globalAccountSettings[i], settings, isFormSave,false);
  1507. break;
  1508. }
  1509. }
  1510. function isEachResourceLoaded()
  1511. {
  1512. var loaded = true;
  1513. for(var i=0; i< globalAccountSettings.length; i++)
  1514. if(typeof globalAccountSettings[i].errorLoaded!='undefined' && globalAccountSettings[i].errorLoaded!=null && globalAccountSettings[i].errorLoaded===true)
  1515. loaded=false;
  1516. return loaded;
  1517. }
  1518. window.onload=globalMain;
  1519. window.onkeydown=function(event)
  1520. {
  1521. switch(event.which) {
  1522. case 13:
  1523. if(!isUserLogged)
  1524. $('#Login').find('[data-type="system_login"]').trigger('click');
  1525. break;
  1526. case 27:
  1527. if(globalActiveApp=='CalDavZAP' && $('#CAEvent').is(':visible') && $('#EventDisabler').is(':hidden'))
  1528. $('#closeButton').trigger('click');
  1529. if(globalActiveApp=='Projects' && $('#ProjectEventForm').is(':visible') && $('#ProjectsDisabler').is(':hidden'))
  1530. $('#cancelActivity').trigger('click');
  1531. if($('.sp-container').is(':visible'))
  1532. $('html').trigger('click');
  1533. break;
  1534. default:
  1535. break;
  1536. }
  1537. };
  1538. function logoutCalDAV()
  1539. {
  1540. globalTodolistStatusArray={};
  1541. globalTodoCheckTimeout=null;
  1542. globalVisibleCalDAVCollections.splice(0, globalVisibleCalDAVCollections.length);
  1543. globalVisibleCalDAVTODOCollections.splice(0, globalVisibleCalDAVTODOCollections.length);
  1544. processedTimezones.splice(0, processedTimezones.length);
  1545. globalCalendarNumber=0;
  1546. globalOnlyCalendarNumber=0;
  1547. globalTodoCalendarNumber=0;
  1548. globalCalendarNumberCount=0;
  1549. globalLoadedLimit = new Date();
  1550. globalToLoadedLimit = new Date();
  1551. globalLimitLoading='';
  1552. globalLimitTodoLoading='';
  1553. globalBeginPast = new Date();
  1554. globalBeginFuture = new Date();
  1555. globalLoadedLimitTodo = new Date();
  1556. globalToLoadedLimitTodo = new Date();
  1557. globalDefaultCalendarCollectionActiveAll = false;
  1558. globalDefaultTodoCalendarCollectionActiveAll = false;
  1559. globalDefaultCalendarCollectionLoadAll = false;
  1560. globalDefaultTodoCalendarCollectionLoadAll = false;
  1561. globalCalDAVCollectionSync=false;
  1562. globalAllowFcRerender=true;
  1563. globalEventList.reset();
  1564. globalResourceCalDAVList.reset();
  1565. timeZonesEnabled.splice(0,timeZonesEnabled.length);
  1566. if(globalEventIntervalID!=null)
  1567. clearInterval(globalEventIntervalID);
  1568. $('#EventDisabler, #TodoDisabler, #AlertDisabler').fadeOut(2000);
  1569. $('#SystemCalDavZAP, #SystemCalDavTODO').animate({opacity : 0},200).promise().done(function(){
  1570. $('#SystemCalDavZAP, #SystemCalDavTODO').css('visibility','hidden');
  1571. $('#main, #mainTODO').animate({top: 25}, 0);
  1572. $('#searchForm, #searchFormTODO').hide();
  1573. $('#searchInput, #searchInputTODO').val('').trigger('keyup').trigger('blur');
  1574. $('#calendar').fullCalendar('destroy');
  1575. $('#todoList').fullCalendar('destroy');
  1576. $('#timezonePicker, #timezonePickerTODO').prop('disabled', false).empty();
  1577. $('#eventColor, #todoColor').css('background-color','');
  1578. if($('#ResourceCalDAVList').width()<1)
  1579. $('#ResourceCalDAVToggle').trigger('click');
  1580. if($('#ResourceCalDAVTODOList').width()<1)
  1581. $('#ResourceCalDAVTODOToggle').trigger('click');
  1582. });
  1583. }
  1584. function mainCalDAV()
  1585. {
  1586. localizeCalDAV();
  1587. // init();
  1588. }
  1589. function localizeCalDAV()
  1590. {
  1591. globalCalDAVInitLoad = true;
  1592. $('#ResourceCalDAVList').html(origResourceCalDAVListTemplate);
  1593. $('#ResourceCalDAVTODOList').html(origResourceCalDAVTODOListTemplate);
  1594. $('#CAEvent').html(origVcalendarTemplate);
  1595. $('#CATodo').html(origVtodoTemplate);
  1596. $('#todoLoader').html(origVtodoLoaderTemplate);
  1597. translate();
  1598. $('input[placeholder],textarea[placeholder]').placeholder();
  1599. cleanResourceCalDAVListTemplate=$('#ResourceCalDAVListTemplate').clone().wrap('<div>').parent().html();
  1600. cleanResourceCalDAVTODOListTemplate=$('#ResourceCalDAVTODOListTemplate').clone().wrap('<div>').parent().html();
  1601. cleanVcalendarTemplate=$('#CAEvent .saveLoader').clone().wrap('<div>').parent().html() + $('#repeatConfirmBox').clone().wrap('<div>').parent().html() + $('#event_details_template').clone().wrap('<div>').parent().html();
  1602. cleanVtodoTemplate=$('#repeatConfirmBoxTODO').clone().wrap('<div>').parent().html() + $('#todo_details_template').clone().wrap('<div>').parent().html();
  1603. $('#searchInput, #searchInputTODO').val('');
  1604. globalSettings.titleformatmonth.value = localization[globalInterfaceLanguage]._default_title_format_month_;
  1605. globalSettings.titleformatweek.value = localization[globalInterfaceLanguage]._default_title_format_week_;
  1606. globalSettings.titleformatday.value = localization[globalInterfaceLanguage]._default_title_format_day_;
  1607. globalSettings.titleformattable.value = localization[globalInterfaceLanguage]._default_title_format_table_;
  1608. globalSettings.columnformatagenda.value = localization[globalInterfaceLanguage]._default_column_format_agenda_;
  1609. }
  1610. function runCalDAV()
  1611. {
  1612. if(!isUserLogged)
  1613. run();
  1614. globalResourceRefreshNumber=0;
  1615. globalResourceRefreshNumberTodo=0;
  1616. $('#MainLoader').css('left','0px');
  1617. $('#MainLoader').fadeIn(200);
  1618. if(typeof globalSubscribedCalendars!='undefined' && globalSubscribedCalendars!=null)
  1619. {
  1620. globalAccountSettings[globalAccountSettings.length]=$.extend({},globalAccountSettings[0]);
  1621. globalAccountSettings[globalAccountSettings.length-1].hrefLabel = globalSubscribedCalendars.hrefLabel;
  1622. globalAccountSettings[globalAccountSettings.length-1].calendars = globalSubscribedCalendars.calendars;
  1623. globalAccountSettings[globalAccountSettings.length-1].ignoreAlarms = '';
  1624. }
  1625. }
  1626. function globalMainCalDAV()
  1627. {
  1628. $(window).resize(function(evt){
  1629. if(evt.target!=window)
  1630. return;
  1631. if(typeof globalCalDAVInitLoad!='undefined' && !globalCalDAVInitLoad && !globalResourceRefreshNumber && $('#main').width()!=globalCalWidth)
  1632. $('#CalendarLoader').children('.loaderInfo').text(localization[globalInterfaceLanguage].resizeLoader).parent().css('display','block');
  1633. $('#SystemCalDavZAP .fc-header-title').css('width', $('#main_h_placeholder').width()-$('#SystemCalDavZAP .fc-header-left').outerWidth()-$('#SystemCalDavZAP .fc-header-right').outerWidth());
  1634. $('#ResourceCalDAVList, #ResourceCalDAVTODOList').css('bottom',(globalSettings.timezonesupport.value ? 20 : 0));
  1635. $('#alertBox').css('left', ($(window).width()/2)-($('#alertBox').width()/2));
  1636. $('#calendar').fullCalendar('option', 'contentHeight', $('#main').height() - 14);
  1637. $('#todoList').fullCalendar('allowSelectEvent',false);
  1638. $('#todoList').fullCalendar('option', 'contentHeight', $('#mainTODO').height() - 14);
  1639. $('#todoList').fullCalendar('allowSelectEvent',true);
  1640. $('#todoList').fullCalendar('selectEvent', null, true);
  1641. if($('#CATodo').is(':visible')) {
  1642. checkTodoFormScrollBar();
  1643. }
  1644. if(globalSettings.displayhiddenevents.value)
  1645. {
  1646. hideEventCalendars();
  1647. hideTodoCalendars();
  1648. }
  1649. globalCalWidth = $('#main').width();
  1650. });
  1651. $('#ResourceCalDAVToggle').click(function(){
  1652. var transSpeedResource=70;
  1653. var isResourceVisible=$('#ResourceCalDAVList').width()>1;
  1654. var col0=isResourceVisible? 0:218;
  1655. var col1=isResourceVisible? 0:224;
  1656. var col2=isResourceVisible? 0:224;
  1657. var col3=isResourceVisible? 0:225;
  1658. if(isIntegrated)
  1659. {
  1660. col2+=isResourceVisible? 49:50;
  1661. col3+=50;
  1662. }
  1663. if(typeof globalCalDAVInitLoad!='undefined' && !globalCalDAVInitLoad && !globalResourceRefreshNumber)
  1664. $('#CalendarLoader').children('.loaderInfo').text(localization[globalInterfaceLanguage].resizeLoader).parent().css('display','block');
  1665. if(globalSettings.timezonesupport.value)
  1666. $('#timezoneWrapper').animate({width: col0}, transSpeedResource);
  1667. $('#resourceCalDAV_h, #ResourceCalDAVList').animate({width: col1}, transSpeedResource);
  1668. $('#CalendarLoader').animate({left: col3}, transSpeedResource);
  1669. $('#main_h, #searchForm, #main').animate({left: col2}, transSpeedResource).promise().done(function(){
  1670. $('#SystemCalDavZAP .fc-header-title').width($('#main_h_placeholder').width()-$('#SystemCalDavZAP .fc-header-left').width()-$('#SystemCalDavZAP .fc-header-right').width()-20);
  1671. $(window).resize();
  1672. });
  1673. });
  1674. $('#ResourceCalDAVTODOToggle').click(function(){
  1675. var transSpeedResource=70;
  1676. var isResourceVisible=$('#ResourceCalDAVTODOList').width()>1;
  1677. var col0=isResourceVisible? 0:218;
  1678. var col1=isResourceVisible? 0:224;
  1679. var col2=isResourceVisible? 0:224;
  1680. var col3=isResourceVisible? 0:225;
  1681. if(isIntegrated)
  1682. {
  1683. col2+=isResourceVisible? 49:50;
  1684. col3+=50;
  1685. }
  1686. if(globalSettings.timezonesupport.value)
  1687. $('#timezoneWrapperTODO').animate({width: col0}, transSpeedResource);
  1688. $('#resourceCalDAVTODO_h, #ResourceCalDAVTODOList').animate({width: col1}, transSpeedResource);
  1689. $('#CalendarLoaderTODO').animate({left: col3}, transSpeedResource);
  1690. $('#main_h_TODO, #searchFormTODO').animate({left: col2}, transSpeedResource);
  1691. $('#mainTODO').animate({left: col2}, transSpeedResource, function(){
  1692. $('#todoList').fullCalendar('allowSelectEvent',false);
  1693. $(window).resize();
  1694. $('#todoList').fullCalendar('allowSelectEvent',true);
  1695. $('#todoList').fullCalendar('selectEvent', null, true);
  1696. });
  1697. });
  1698. $('#eventFormShowerTODO').click(function(){
  1699. showNewEvent('TODO');
  1700. });
  1701. $('#eventFormShower').click(function(){
  1702. showNewEvent('');
  1703. });
  1704. $('#searchInput').bind('keyup change', function(){
  1705. if($(this).val()!='')
  1706. $('#reserButton').css('visibility', 'visible');
  1707. else
  1708. $('#reserButton').css('visibility', 'hidden');
  1709. });
  1710. $('#searchInputTODO').bind('keyup change', function(){
  1711. if($(this).val()!='')
  1712. $('#resetButtonTODO').css('visibility', 'visible');
  1713. else
  1714. $('#resetButtonTODO').css('visibility', 'hidden');
  1715. });
  1716. $('#timezonePicker, #timezonePickerTODO').change(function(){
  1717. var previousTimezone=globalSessionTimeZone;
  1718. globalSessionTimeZone=$(this).val();
  1719. $('#timezonePicker').val($(this).val());
  1720. $('#timezonePickerTODO').val($(this).val());
  1721. applyTimezone(previousTimezone);
  1722. });
  1723. /*************************** BAD HACKS SECTION ***************************/
  1724. if($.browser.msie || $.browser.mozilla)
  1725. {
  1726. var newSVG=$(SVG_select_b).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
  1727. $('#timezoneWrapper, #timezoneWrapperTODO').find('select').after($($('<div>').append($(newSVG).clone()).html()));
  1728. }
  1729. // INFO LABEL ALIGN WITH UNDELYING SELECT FIX
  1730. if($.browser.webkit && !!$.browser.safari)
  1731. $('.infoSpan[data-type="txt_interval"]').css('padding-left', '3px');
  1732. /*************************** END OF BAD HACKS SECTION ***************************/
  1733. globalCalWidth = $('#main').width();
  1734. origResourceCalDAVListTemplate = $('#ResourceCalDAVListTemplate').clone().wrap('<div>').parent().html();
  1735. origResourceCalDAVTODOListTemplate = $('#ResourceCalDAVTODOListTemplate').clone().wrap('<div>').parent().html();
  1736. origVcalendarTemplate = $('#CAEvent .saveLoader').clone().wrap('<div>').parent().html() + $('#repeatConfirmBox').clone().wrap('<div>').parent().html() + $('#event_details_template').clone().wrap('<div>').parent().html();
  1737. origVtodoTemplate = $('#repeatConfirmBoxTODO').clone().wrap('<div>').parent().html() + $('#todo_details_template').clone().wrap('<div>').parent().html();
  1738. origVtodoLoaderTemplate=$('#todoLoader .saveLoader').clone().wrap('<div>').parent().html();
  1739. populateTimezoneKeys();
  1740. }
  1741. function setCalendarNumber(initSearch)
  1742. {
  1743. /*if($('.resourceCalDAV_header:visible').length>1 || (!$('.resourceCalDAV_header:visible').length && $('.resourceCalDAV_item:visible').length>1))
  1744. $('.addRemoveAllCalDAV').show();
  1745. if($('.resourceCalDAVTODO_header:visible').length>1 || (!$('.resourceCalDAVTODO_header:visible').length && $('.resourceCalDAVTODO_item:visible').length>1))
  1746. $('.addRemoveAllCalDAVTODO').show();*/
  1747. if(initSearch)
  1748. initSearchEngine();
  1749. globalCalendarNumber=0;
  1750. globalOnlyCalendarNumber=0;
  1751. globalTodoCalendarNumber=0;
  1752. for(var i=0; i<globalResourceCalDAVList.collections.length;i++)
  1753. if(globalResourceCalDAVList.collections[i].uid!=undefined && globalResourceCalDAVList.collections[i].makeLoaded)
  1754. {
  1755. globalCalendarNumber++;
  1756. globalOnlyCalendarNumber++;
  1757. }
  1758. for(var i=0; i<globalResourceCalDAVList.TodoCollections.length;i++)
  1759. if(globalResourceCalDAVList.TodoCollections[i].uid!=undefined && globalResourceCalDAVList.TodoCollections[i].makeLoaded)
  1760. {
  1761. globalCalendarNumber++;
  1762. globalTodoCalendarNumber++;
  1763. }
  1764. }
  1765. function algoo_get_basehref_for_href(href, globalAccountSettings) {
  1766. for (config_key in globalAccountSettings) {
  1767. var config = globalAccountSettings[config_key];
  1768. if (config.href == href && config.basehref) {
  1769. return config.basehref;
  1770. }
  1771. }
  1772. }
  1773. function algoo_replace_regex(href, globalAccountSettings) {
  1774. var protocol_re = new RegExp('^(https?://)(.*)','i');
  1775. var base_href = algoo_get_basehref_for_href(href, globalAccountSettings);
  1776. var protocol_match = href.match(protocol_re);
  1777. var protocol = protocol_match[1];
  1778. var path = protocol_match[2].replace(base_href, '');
  1779. return [href, protocol, base_href, path]
  1780. }