vtodo.js 141 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531
  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. function AppleSupportNextDateArray()
  19. {
  20. this.nextDates={};
  21. this.reset=function()
  22. {
  23. this.nextDates={};
  24. };
  25. }
  26. function addAndEditTODO(deleteMode)
  27. {
  28. var inputUID='';
  29. if($('#uidTODO').val()!='')
  30. var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/')+1));
  31. else
  32. var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#todo_calendar').val());
  33. var res = getAccount(coll.accountUID);
  34. var tmp=res.href.match(vCalendar.pre['hrefRex']);
  35. var origUID=tmp[1]+res.userAuth.userName+'@'+tmp[2];
  36. if($('#etagTODO').val()!='')
  37. inputUID=$('#uidTODO').val();
  38. else if($('#todo_calendar').val()!='choose')
  39. inputUID=$('#todo_calendar').val()+'';
  40. else
  41. return false;
  42. todoToVcalendar('EDIT',origUID, inputUID, $('#etagTODO').val(), '',deleteMode);
  43. }
  44. function interResourceEditTODO(operation, delUID)
  45. {
  46. var inputUID='';
  47. if($('#uidTODO').val()!='')
  48. var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/')+1));
  49. else
  50. var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#todo_calendar').val());
  51. var res = getAccount(coll.accountUID);
  52. var tmp=res.href.match(vCalendar.pre['hrefRex']);
  53. var origUID=tmp[1]+res.userAuth.userName+'@'+tmp[2];
  54. if(operation != 'MOVE_IN')
  55. $('#etagTODO').val('');
  56. var srcUID=$('#uidTODO').val().substring($('#uidTODO').val().lastIndexOf('/')+1, $('#uidTODO').val().length);
  57. inputUID=$('#todo_calendar').val()+srcUID;
  58. todoToVcalendar(operation, origUID, inputUID, '', delUID, false);
  59. }
  60. function saveTodo(deleteMode)
  61. {
  62. $('#todo_details_template').scrollTop(0);
  63. var calUID=$('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/'));
  64. var newUID=$('#todo_calendar').val().substring(0, $('#todo_calendar').val().length-1);
  65. if($('#todo_details_template').find('img[data-type=invalidVerySmall],img[data-type=invalidSmall]').filter(function(){return this.style.display!='none'}).length>0)
  66. {
  67. show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtErorInputTodo);
  68. return false;
  69. }
  70. if($('#todo_calendar').val()!='choose')
  71. {
  72. if($('#nameTODO').val()=='')
  73. $('#name').val(localization[globalInterfaceLanguage].pholderNewTODO);
  74. if($('#todo_type').val()=='start' || $('#todo_type').val()=='due' || $('#todo_type').val()=='both')
  75. {
  76. if($('#date_toTODO').val()!='' && $('#date_fromTODO').val()!='')
  77. {
  78. var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
  79. var a2=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
  80. var datetime_from=$.fullCalendar.formatDate(a, 'yyyy-MM-dd');
  81. var datetime_to=$.fullCalendar.formatDate(a2, 'yyyy-MM-dd');
  82. var time_from='00:00';
  83. var time_to='00:00';
  84. if($('#time_fromTODO').val()!='' && $('#time_toTODO').val()!='')
  85. {
  86. time_from=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
  87. time_from=$.fullCalendar.formatDate(time_from, 'HH:mm' );
  88. time_to=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
  89. time_to=$.fullCalendar.formatDate(time_to, 'HH:mm' );
  90. }
  91. if($('#todo_type').val()=='both' && $.fullCalendar.parseDate(datetime_from+'T'+time_from+'Z')>$.fullCalendar.parseDate(datetime_to+'T'+time_to+'Z'))
  92. {
  93. show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtErrorDatesTodo);
  94. return false;
  95. }
  96. }
  97. if($('#date_toTODO').val()!='' || $('#date_fromTODO').val()!='')
  98. {
  99. if(newUID==calUID || $('#etagTODO').val()=='')
  100. addAndEditTODO(deleteMode);
  101. // else if(calUID.substring(0, calUID.lastIndexOf('/'))==newUID.substring(0, newUID.lastIndexOf('/')))
  102. // {
  103. // var delUID=$('#uidTODO').val();
  104. // interResourceEditTODO('MOVE_IN',delUID);
  105. // }
  106. else if(/*calUID.substring(0, calUID.lastIndexOf('/'))!=newUID.substring(0, newUID.lastIndexOf('/')) && */$('#etagTODO').val()!='')
  107. {
  108. var delUID=$('#uidTODO').val();
  109. interResourceEditTODO('MOVE_OTHER',delUID);
  110. }
  111. }
  112. else
  113. show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtDateTimeErrorTodo);
  114. }
  115. else
  116. {
  117. if((newUID==calUID) || ($('#etagTODO').val()==''))
  118. addAndEditTODO(deleteMode);
  119. // else if(calUID.substring(0, calUID.lastIndexOf('/'))==newUID.substring(0, newUID.lastIndexOf('/')))
  120. // {
  121. // var delUID=$('#uidTODO').val();
  122. // interResourceEditTODO('MOVE_IN',delUID);
  123. // }
  124. else if(/*calUID.substring(0, calUID.lastIndexOf('/'))!=newUID.substring(0, newUID.lastIndexOf('/')) && */ $('#etagTODO').val()!='')
  125. {
  126. var delUID=$('#uidTODO').val();
  127. interResourceEditTODO('MOVE_OTHER',delUID);
  128. }
  129. }
  130. }
  131. else
  132. show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtNotChooseTodo);
  133. }
  134. function deleteTodo()
  135. {
  136. var delUID=$('#uidTODO').val();
  137. if(delUID!='')
  138. deleteVcalendarFromCollection(delUID,'vtodo');
  139. }
  140. function getRepeatTodoObject(inputRepeatObj)
  141. {
  142. var appleTodoMode = false;
  143. var tzArray=new Array();
  144. var tzString='';
  145. var isTimeZone=false;
  146. var origTimezone = '';
  147. var vCalendarText = inputRepeatObj.vCalendarText;
  148. var sel_option = '';
  149. var inputTodos=jQuery.grep(globalEventList.displayTodosArray[inputRepeatObj.rid],function(e){if(e.id==inputRepeatObj.uidTodo && ((globalSettings.appleremindersmode.value || e.repeatCount<2) || !e.repeatCount))return true});
  150. if(globalSettings.appleremindersmode.value && inputTodos.length==1)
  151. {
  152. if(inputRepeatObj.recurrenceId!='' || inputRepeatObj.futureStart!='')
  153. appleTodoMode = true;
  154. }
  155. for(var iE=0;iE<inputTodos.length;iE++)
  156. {
  157. if(tzArray.indexOf(inputTodos[iE].timeZone)==-1)
  158. {
  159. if(!appleTodoMode && inputRepeatObj.deleteMode && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar)))
  160. continue;
  161. var component=buildTimezoneComponent(inputTodos[iE].timeZone);
  162. if(component!='' && (inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[iE].vcalendar)))
  163. {
  164. tzArray[tzArray.length]=inputTodos[iE].timeZone;
  165. tzString+=component;
  166. if(tzString.lastIndexOf('\r\n')!=(tzString.length-2))
  167. tzString+='\r\n';
  168. isTimeZone=true;
  169. }
  170. else if(component!='' && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar)))
  171. origTimezone+=component;
  172. }
  173. }
  174. if(isTimeZone)
  175. {
  176. if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
  177. vCalendarText+='\r\n';
  178. vCalendarText+=tzString;
  179. }
  180. var newFirst = vCalendarText;
  181. var origRepeatRule = '';
  182. var realTodo='';
  183. var origVcalendarString='';
  184. var todoStringArray=new Array();
  185. if(inputTodos.length>0)
  186. {
  187. var rid=inputRepeatObj.uidTodo.substring(0, inputRepeatObj.uidTodo.lastIndexOf('/')+1);
  188. if(rid && globalEventList.todos[rid][inputRepeatObj.uidTodo].uid!=undefined)
  189. origVcalendarString=globalEventList.todos[rid][inputRepeatObj.uidTodo].vcalendar;
  190. while(origVcalendarString.match(vCalendar.pre['vtodo'])!=null)
  191. {
  192. if(origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO')-2, origVcalendarString.indexOf('BEGIN:VTODO'))=='\r\n')
  193. {
  194. var partTodo=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO')-2,origVcalendarString.indexOf('END:VTODO')+'END:VTODO'.length);
  195. origVcalendarString=origVcalendarString.replace(partTodo, '');
  196. }
  197. else
  198. {
  199. var partTodo=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO'),origVcalendarString.indexOf('END:VTODO')+'END:VTODO'.length);
  200. origVcalendarString=origVcalendarString.replace(partTodo, '');
  201. partTodo+='\r\n';
  202. }
  203. todoStringArray[todoStringArray.length]=partTodo;
  204. }
  205. }
  206. var beginVcalendar = vCalendarText;
  207. var futureMode = false;
  208. for(var j=0;j<inputTodos.length;j++)
  209. {
  210. todoStringArray.splice(todoStringArray.indexOf(inputTodos[j].vcalendar),1);
  211. if((inputRepeatObj.futureStart== '' && inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[j].vcalendar)) || inputTodos[j].rec_id!=inputRepeatObj.recurrenceId)
  212. {
  213. var stringUIDcurrent=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_UID']);
  214. if(stringUIDcurrent!=null)
  215. stringUIDcurrent=stringUIDcurrent[0].match(vCalendar.pre['contentline_parse'])[4];
  216. if((inputRepeatObj.deleteMode && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar)) || (inputRepeatObj.deleteMode && !inputTodos[j].rec_id && inputRepeatObj.vcalendarUID==stringUIDcurrent) || appleTodoMode)
  217. {
  218. var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
  219. var origRuleString=ruleString;
  220. origRepeatRule = ruleString;
  221. var exDate=inputTodos[j].start;
  222. var process_elem=vCalendar.tplC['VTcontentline_EXDATE'];
  223. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  224. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  225. exDate=inputRepeatObj.recurrenceId.parseComnpactISO8601();
  226. if(globalSettings.timezonesupport.value)
  227. sel_option=inputRepeatObj.timezoneTODO;
  228. if(sel_option!='local')
  229. {
  230. var valOffsetFrom=getOffsetByTZ(sel_option, exDate);
  231. var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
  232. exDate = new Date(exDate.setSeconds(intOffset));
  233. }
  234. else
  235. exDate=new Date(exDate.setSeconds(getLocalOffset(exDate)));
  236. exDate=$.fullCalendar.formatDate(exDate, "yyyyMMdd'T'HHmmss'Z'");
  237. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  238. process_elem=process_elem.replace('##:::##TZID##:::##','');
  239. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(exDate));
  240. if(inputTodos[j].finalString.length>2);
  241. inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));
  242. if(!appleTodoMode)
  243. inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+process_elem);
  244. }
  245. else
  246. {
  247. var endPart = (inputTodos[j].vcalendar+'\r\n').match(vCalendar.pre['endVTODO']);
  248. if(endPart!=null)
  249. {
  250. if(inputTodos[j].finalString.length>2)
  251. inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(endPart[0].substring(0,endPart[0].length-2),(inputTodos[j].finalString)+endPart[0].substring(2,endPart[0].length));
  252. }
  253. }
  254. var origVcalendar = inputTodos[j].vcalendar;
  255. if(appleTodoMode && typeof globalAppleSupport.nextDates[inputTodos[j].id] != 'undefined')
  256. {
  257. var startPart='',endPart='';
  258. if(origVcalendar.match(vCalendar.pre['contentline_DTSTART'])!=null && origVcalendar.match(vCalendar.pre['contentline_DUE'])!=null)
  259. {
  260. startPart = origVcalendar.match(vCalendar.pre['contentline_DTSTART'])[0].match(vCalendar.pre['contentline_parse'])[4];
  261. endPart = origVcalendar.match(vCalendar.pre['contentline_DUE'])[0].match(vCalendar.pre['contentline_parse'])[4];
  262. }
  263. var isUTC=false;
  264. if(globalSettings.timezonesupport.value)
  265. sel_option=inputRepeatObj.timezoneTODO;
  266. if(sel_option=='UTC')
  267. isUTC=true;
  268. var newStart = new Date(globalAppleSupport.nextDates[inputTodos[j].id].getTime());
  269. var valOffsetFrom=getOffsetByTZ(sel_option,newStart );
  270. var intOffset='';
  271. if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='')
  272. intOffset=getOffsetByTZ(globalSessionTimeZone, newStart).getSecondsFromOffset();
  273. else
  274. intOffset=newStart.getTimezoneOffset()*60*-1;
  275. intOffset = valOffsetFrom.getSecondsFromOffset() - intOffset;
  276. newStart.setSeconds(intOffset);
  277. var datetime_to=$.fullCalendar.formatDate(newStart, "yyyyMMdd'T'HHmmss");
  278. inputTodos[j].vcalendar = inputTodos[j].vcalendar.replace(endPart,vcalendarEscapeValue(datetime_to+(isUTC ? 'Z' : '')));
  279. inputTodos[j].vcalendar = inputTodos[j].vcalendar.replace(startPart,vcalendarEscapeValue(datetime_to+(isUTC ? 'Z' : '')));
  280. if(inputTodos[j].after!='')
  281. inputTodos[j].vcalendar = changeRuleForFuture(inputTodos[j], inputTodos[j].after);
  282. origVcalendar = inputTodos[j].vcalendar;
  283. }
  284. if(origVcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
  285. vCalendarText+=origVcalendar.substring(2,origVcalendar.length);
  286. else if((origVcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (origVcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
  287. vCalendarText+=origVcalendar;
  288. else
  289. vCalendarText+='\r\n'+origVcalendar;
  290. }
  291. else if(inputRepeatObj.futureStart.split(';')[0]!='' && inputRepeatObj.futureStart.split(';')[1]!=inputTodos[j].start && inputRepeatObj.futureStart.split(';')[1]!=inputTodos[j].end)
  292. {
  293. var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
  294. if(inputTodos[j].finalString.length>2);
  295. inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));
  296. if(inputRepeatObj.futureStart.split(';')[0]>1 && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar))
  297. inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], inputRepeatObj.futureStart.split(';')[0]);
  298. if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
  299. vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length);
  300. else if((inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputTodos[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
  301. vCalendarText+=inputTodos[j].vcalendar;
  302. else
  303. vCalendarText+='\r\n'+inputTodos[j].vcalendar;
  304. futureMode=true;
  305. }
  306. else if(inputRepeatObj.deleteMode && inputRepeatObj.futureStart.split(';')[0]!='' && (inputRepeatObj.futureStart.split(';')[1]==inputTodos[j].start || inputRepeatObj.futureStart.split(';')[1]==inputTodos[j].end))
  307. {
  308. var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
  309. if(inputTodos[j].finalString.length>2);
  310. inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));
  311. if(inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar))
  312. inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], 2);
  313. if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
  314. vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length);
  315. else if((inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputTodos[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
  316. vCalendarText+=inputTodos[j].vcalendar;
  317. else
  318. vCalendarText+='\r\n'+inputTodos[j].vcalendar;
  319. }
  320. else
  321. realTodo=inputTodos[j];
  322. }
  323. vCalendarText=vCalendarText.replace(realTodo.vcalendar,'');
  324. if(!appleTodoMode)
  325. for(var ip=0; ip<todoStringArray.length;ip++)
  326. {
  327. if(todoStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
  328. vCalendarText+=todoStringArray[ip].substring(2,todoStringArray[ip].length);
  329. else if((todoStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (todoStringArray[ip].indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
  330. vCalendarText+=todoStringArray[ip];
  331. else
  332. vCalendarText+='\r\n'+todoStringArray[ip];
  333. }
  334. return {
  335. tzArray:tzArray,
  336. tzString:tzString,
  337. isTimeZone:isTimeZone,
  338. origTimezone:origTimezone,
  339. vCalendarText:vCalendarText,
  340. realTodo:realTodo,
  341. sel_option: sel_option,
  342. futureMode:futureMode,
  343. appleTodoMode:appleTodoMode,
  344. newFirst:newFirst,
  345. beginVcalendar:beginVcalendar
  346. };
  347. }
  348. function todoToVcalendar(operation, accountUID, inputUID, inputEtag, delUID, deleteMode)
  349. {
  350. var vtodo=false;
  351. var vCalendarText='',
  352. groupCounter=0;
  353. var repeatHash = 'form';
  354. if(delUID!='')
  355. var rid=delUID.substring(0, delUID.lastIndexOf('/')+1);
  356. else
  357. var rid=inputUID.substring(0, inputUID.lastIndexOf('/')+1);
  358. // vCalendar BEGIN (required by RFC)
  359. if(vCalendar.tplM['VTbegin'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbegin'][repeatHash][0])!=undefined)
  360. vCalendarText+=vCalendar.tplM['VTbegin'][repeatHash][0];
  361. else
  362. {
  363. process_elem=vCalendar.tplC['VTbegin'];
  364. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  365. vCalendarText+=process_elem;
  366. }
  367. // VERSION (required by RFC)
  368. if(vCalendar.tplM['VTcontentline_VERSION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0])!=undefined)
  369. {
  370. // replace the object and related objects' group names (+ append the related objects after the processed)
  371. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  372. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  373. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  374. }
  375. else
  376. {
  377. process_elem=vCalendar.tplC['VTcontentline_VERSION'];
  378. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  379. }
  380. process_elem=process_elem.replace('##:::##version##:::##', '2.0');
  381. vCalendarText+=process_elem;
  382. // CALSCALE
  383. if(vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0])!=undefined)
  384. {
  385. // replace the object and related objects' group names (+ append the related objects after the processed)
  386. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  387. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  388. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  389. }
  390. else
  391. {
  392. process_elem=vCalendar.tplC['VTcontentline_CALSCALE'];
  393. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  394. }
  395. process_elem=process_elem.replace('##:::##calscale##:::##', 'GREGORIAN');
  396. vCalendarText+=process_elem;
  397. var resultTodoObj = getRepeatTodoObject({
  398. rid:rid,
  399. uidTodo:$('#uidTODO').val(),
  400. vcalendarHash: $('#vcalendarHashTODO').val(),
  401. vcalendarUID: $('#vcalendarUIDTODO').val(),
  402. recurrenceId: $('#recurrenceIDTODO').val(),
  403. timezoneTODO: $('#timezoneTODO').val(),
  404. futureStart: $('#futureStartTODO').val(),
  405. deleteMode: deleteMode,
  406. vCalendarText:vCalendarText
  407. });
  408. vCalendarText = resultTodoObj.vCalendarText;
  409. var tzArray=resultTodoObj.tzArray;
  410. var tzString=resultTodoObj.tzString;
  411. var isTimeZone=resultTodoObj.isTimeZone;
  412. var origTimezone =resultTodoObj.origTimezone;
  413. var appleTodoMode=resultTodoObj.appleTodoMode;
  414. var realTodo = resultTodoObj.realTodo;
  415. var newFirst = resultTodoObj.newFirst;
  416. var sel_option = resultTodoObj.sel_option;
  417. //until here will function TODOCLICK
  418. var origEvent='';
  419. if(deleteMode || resultTodoObj.futureMode)
  420. {
  421. if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
  422. vCalendarText+='\r\n';
  423. if(!isTimeZone && ( appleTodoMode || (resultTodoObj.futureMode && origTimezone!='')))
  424. {
  425. vCalendarText+=origTimezone;
  426. if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
  427. vCalendarText+='\r\n';
  428. }
  429. // PRODID
  430. if(vCalendar.tplM['VTcontentline_PRODID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0])!=undefined)
  431. {
  432. // replace the object and related objects' group names (+ append the related objects after the processed)
  433. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  434. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  435. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  436. }
  437. else
  438. {
  439. process_elem=vCalendar.tplC['VTcontentline_PRODID'];
  440. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  441. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  442. }
  443. process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN');
  444. vCalendarText+=process_elem;
  445. if(typeof vCalendar.tplM['VTunprocessed'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessed'][repeatHash]!='' && vCalendar.tplM['VTunprocessed'][repeatHash]!=null)
  446. vCalendarText+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');
  447. vCalendar.tplM['VTunprocessed'][repeatHash]=new Array();
  448. // vCalendar END (required by RFC)
  449. if(vCalendar.tplM['VTend'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTend'][repeatHash][0])!=undefined)
  450. vCalendarText+=vCalendar.tplM['VTend'][repeatHash][0];
  451. else
  452. {
  453. process_elem=vCalendar.tplC['VTend'];
  454. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  455. vCalendarText+=process_elem;
  456. }
  457. if(deleteMode)
  458. {
  459. var fixedArr = checkAndFixMultipleUID(vCalendarText,false);
  460. var inputS = fixedArr[0];
  461. fixedArr.splice(0,1);
  462. return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID,'vtodo',false,deleteMode,fixedArr);
  463. }
  464. else if(resultTodoObj.futureMode)
  465. {
  466. origEvent = vCalendarText;
  467. vCalendarText = resultTodoObj.beginVcalendar;
  468. }
  469. }
  470. var timeZoneAttr='';
  471. if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone)
  472. sel_option=globalSessionTimeZone;
  473. var isUTC=false;
  474. var origFirst=vCalendarText;
  475. if(appleTodoMode)
  476. vCalendarText='';
  477. if($('#todo_type').val()!='none')
  478. {
  479. if(globalSettings.timezonesupport.value)
  480. sel_option=$('#timezoneTODO').val();
  481. if(sel_option=='UTC')
  482. {
  483. isUTC=true;
  484. timeZoneAttr='';
  485. }
  486. else if(sel_option=='local')
  487. timeZoneAttr='';
  488. else if(sel_option=='custom')
  489. timeZoneAttr=';'+vcalendarEscapeValue('TZID='+realTodo.timeZone);
  490. else
  491. timeZoneAttr=';'+vcalendarEscapeValue('TZID='+sel_option);
  492. if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
  493. vCalendarText+='\r\n';
  494. if(globalSettings.rewritetimezonecomponent.value || !vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash])
  495. {
  496. if(tzArray.indexOf(sel_option)==-1)
  497. vCalendarText+= buildTimezoneComponent(sel_option);
  498. }
  499. else
  500. vCalendarText+=vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash];
  501. }
  502. origFirst+=vCalendarText;
  503. // ---------------------------------------------------------------------------------------------------- //
  504. if(vCalendar.tplM['VTbeginVTODO'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbeginVTODO'][repeatHash][0])!=undefined)
  505. vCalendarText+=vCalendar.tplM['VTbeginVTODO'][repeatHash][0];
  506. else
  507. {
  508. process_elem=vCalendar.tplC['VTbeginVTODO'];
  509. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  510. vCalendarText+=process_elem;
  511. vtodo=true;
  512. }
  513. var d, utc;
  514. d=new Date();
  515. utc=d.getUTCFullYear()+(d.getUTCMonth()+1<10 ? '0': '')+(d.getUTCMonth()+1)+(d.getUTCDate()<10 ? '0': '')+d.getUTCDate()+'T'+(d.getUTCHours()<10 ? '0': '')+d.getUTCHours()+(d.getUTCMinutes()<10 ? '0': '')+d.getUTCMinutes()+(d.getUTCSeconds()<10 ? '0': '')+d.getUTCSeconds()+'Z';
  516. var create=true;
  517. if($('#recurrenceIDTODO').val()=='')
  518. var checkVal='orig';
  519. else
  520. var checkVal=$('#recurrenceIDTODO').val();
  521. var created='';
  522. for(vev in vCalendar.tplM['VTcontentline_CREATED'][repeatHash])
  523. {
  524. if(vev==checkVal)
  525. created=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][vev];
  526. }
  527. if(created!='')
  528. {
  529. process_elem=created;
  530. // replace the object and related objects' group names (+ append the related objects after the processed)
  531. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  532. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  533. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  534. }
  535. else
  536. {
  537. process_elem=vCalendar.tplC['VTcontentline_CREATED'];
  538. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  539. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  540. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
  541. }
  542. vCalendarText+=process_elem;
  543. if(vCalendar.tplM['VTcontentline_LM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_LM'][repeatHash][0])!=undefined)
  544. {
  545. // replace the object and related objects' group names (+ append the related objects after the processed)
  546. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  547. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  548. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  549. }
  550. else
  551. {
  552. process_elem=vCalendar.tplC['VTcontentline_LM'];
  553. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  554. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  555. }
  556. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
  557. vCalendarText+=process_elem;
  558. if(vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0])!=undefined)
  559. {
  560. // replace the object and related objects' group names (+ append the related objects after the processed)
  561. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  562. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  563. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  564. }
  565. else
  566. {
  567. process_elem=vCalendar.tplC['VTcontentline_DTSTAMP'];
  568. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  569. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  570. }
  571. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
  572. vCalendarText+=process_elem;
  573. // UID (required by RFC)
  574. if(!appleTodoMode && $("#futureStartTODO").val()=='' && (operation!='MOVE_IN'&& operation!='MOVE_OTHER') && vCalendar.tplM['VTcontentline_UID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_UID'][repeatHash][0])!=undefined)
  575. {
  576. // replace the object and related objects' group names (+ append the related objects after the processed)
  577. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  578. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  579. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  580. }
  581. else
  582. {
  583. process_elem=vCalendar.tplC['VTcontentline_UID'];
  584. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  585. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  586. }
  587. var newUID=globalEventList.getNewUID();
  588. // it is VERY small probability, that for 2 newly created events the same UID is generated (but not impossible :( ...)
  589. process_elem=process_elem.replace('##:::##uid##:::##', newUID);
  590. vCalendarText+=process_elem;
  591. if(vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0])!=undefined)
  592. {
  593. // replace the object and related objects' group names (+ append the related objects after the processed)
  594. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  595. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  596. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  597. }
  598. else
  599. {
  600. process_elem=vCalendar.tplC['VTcontentline_SUMMARY'];
  601. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  602. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  603. }
  604. if($('#nameTODO').val()=='')
  605. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("New TODO"));
  606. else
  607. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#nameTODO').val()));
  608. //process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue('zmena'));
  609. vCalendarText+=process_elem;
  610. if($('#statusTODO').val()!='NONE')
  611. {
  612. //if((value=$('[id="vcalendar_editor"] [data-type="\\%note"]').find('textarea').val())!='')
  613. //{
  614. if(vCalendar.tplM['VTcontentline_STATUS'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0])!=undefined)
  615. {
  616. // replace the object and related objects' group names (+ append the related objects after the processed)
  617. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  618. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  619. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  620. }
  621. else
  622. {
  623. process_elem=vCalendar.tplC['VTcontentline_STATUS'];
  624. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  625. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  626. }
  627. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#statusTODO').val()));
  628. vCalendarText+=process_elem;
  629. }
  630. if($('#percenteCompleteValue').val()!='')
  631. {
  632. if(vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0])!=undefined)
  633. {
  634. // replace the object and related objects' group names (+ append the related objects after the processed)
  635. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  636. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  637. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  638. }
  639. else
  640. {
  641. process_elem=vCalendar.tplC['VTcontentline_PERCENT-COMPLETE'];
  642. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  643. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  644. }
  645. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#percenteCompleteValue').val()));
  646. vCalendarText+=process_elem;
  647. }
  648. if($('#priority_TODO').val()!='0')
  649. {
  650. if(vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0])!=undefined)
  651. {
  652. // replace the object and related objects' group names (+ append the related objects after the processed)
  653. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  654. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  655. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  656. }
  657. else
  658. {
  659. process_elem=vCalendar.tplC['VTcontentline_PRIORITY'];
  660. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  661. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  662. }
  663. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#priority_TODO').val()));
  664. vCalendarText+=process_elem;
  665. }
  666. if($('#noteTODO').val()!='')
  667. {
  668. // NOTE
  669. if(vCalendar.tplM['VTcontentline_NOTE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0])!=undefined)
  670. {
  671. // replace the object and related objects' group names (+ append the related objects after the processed)
  672. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  673. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  674. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  675. }
  676. else
  677. {
  678. process_elem=vCalendar.tplC['VTcontentline_NOTE'];
  679. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  680. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  681. }
  682. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#noteTODO').val()));
  683. vCalendarText+=process_elem;
  684. }
  685. if($('#typeTODO').val()!='')
  686. {
  687. // CLASS
  688. if(vCalendar.tplM['VTcontentline_CLASS'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0])!=undefined)
  689. {
  690. // replace the object and related objects' group names (+ append the related objects after the processed)
  691. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  692. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  693. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  694. }
  695. else
  696. {
  697. process_elem=vCalendar.tplC['VTcontentline_CLASS'];
  698. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  699. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  700. if(typeof vCalendar.tplM['VTcontentline_CLASS'][repeatHash] =='undefined' || vCalendar.tplM['VTcontentline_CLASS'][repeatHash]==null || vCalendar.tplM['VTcontentline_CLASS'][repeatHash].length==0)
  701. process_elem='';
  702. }
  703. if($('.row_typeTODO').css('display')!='none')
  704. {
  705. process_elem=vCalendar.tplC['VTcontentline_CLASS'];
  706. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  707. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  708. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#typeTODO').val().toUpperCase()));
  709. }
  710. vCalendarText+=process_elem;
  711. }
  712. if($('#url_TODO').val()!='')
  713. {
  714. if(vCalendar.tplM['VTcontentline_URL'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_URL'][repeatHash][0])!=undefined)
  715. {
  716. // replace the object and related objects' group names (+ append the related objects after the processed)
  717. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  718. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  719. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  720. }
  721. else
  722. {
  723. process_elem=vCalendar.tplC['VTcontentline_URL'];
  724. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  725. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  726. }
  727. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#url_TODO').val()));
  728. vCalendarText+=process_elem;
  729. }
  730. //RFC OPTIONAL
  731. if(vCalendar.tplM['VTcontentline_LOCATION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0])!=undefined)
  732. {
  733. // replace the object and related objects' group names (+ append the related objects after the processed)
  734. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)','m'));
  735. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  736. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
  737. }
  738. else
  739. {
  740. process_elem=vCalendar.tplC['VTcontentline_LOCATION'];
  741. process_elem=process_elem.replace('##:::##group_wd##:::##','');
  742. process_elem=process_elem.replace('##:::##params_wsc##:::##','');
  743. }
  744. if($('#location_TODO').val()!='')
  745. {
  746. process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue($('#location_TODO').val()));
  747. vCalendarText+=process_elem;
  748. }
  749. if($('#repeat_TODO').val()!='no-repeat')
  750. {
  751. var interval=$("#repeat_interval_detail_TODO").val();
  752. var byDay='';
  753. var isCustom=false;
  754. var monthDay='';
  755. var bymonth='';
  756. var wkst='';
  757. if(interval==1 || interval=='')
  758. interval='';
  759. else interval=";INTERVAL="+$("#repeat_interval_detail_TODO").val();
  760. var frequency=$('#repeat_TODO').val();
  761. if(frequency=='TWO_WEEKLY')
  762. {
  763. frequency='WEEKLY';
  764. interval=";INTERVAL="+2;
  765. }
  766. else if(frequency=='BUSINESS')
  767. {
  768. frequency='WEEKLY';
  769. byDay=';BYDAY=';
  770. if(globalSettings.weekenddays.value.length>0)
  771. {
  772. for(var i=0;i<7;i++)
  773. if(globalSettings.weekenddays.value.indexOf(i)==-1)
  774. byDay+=i+',';
  775. byDay=byDay.substring(0,byDay.length-1);
  776. byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
  777. }
  778. else
  779. {
  780. byDay='SA,SU';
  781. }
  782. interval='';
  783. }
  784. else if(frequency=='WEEKEND')
  785. {
  786. frequency='WEEKLY';
  787. byDay=';BYDAY=';
  788. if(globalSettings.weekenddays.value.length>0)
  789. {
  790. for(var i=0;i<globalSettings.weekenddays.value.length;i++)
  791. byDay+=globalSettings.weekenddays.value[i]+',';
  792. byDay=byDay.substring(0,byDay.length-1);
  793. byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
  794. }
  795. else
  796. {
  797. byDay='SA,SU';
  798. }
  799. interval='';
  800. }
  801. else if(frequency=='CUSTOM_WEEKLY')
  802. {
  803. frequency='WEEKLY';
  804. var byDayArray=$('#week_custom_TODO .customTable td.selected');
  805. if(byDayArray.length>0)
  806. {
  807. byDay=';BYDAY=';
  808. for(var ri=0;ri<byDayArray.length;ri++)
  809. byDay+=$(byDayArray[ri]).attr('data-type')+',';
  810. byDay=byDay.substring(0,byDay.length-1);
  811. byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
  812. if(globalSettings.mozillasupport.value==null || !globalSettings.mozillasupport.value)
  813. if(realTodo!='')
  814. {
  815. if(realTodo.wkst!='')
  816. wkst=';WKST='+realTodo.wkst.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
  817. }
  818. else
  819. wkst=';WKST='+globalSettings.datepickerfirstdayofweek.value.toString().replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
  820. }
  821. }
  822. else if(frequency=='CUSTOM_MONTHLY')
  823. {
  824. frequency='MONTHLY';
  825. var byDayFirstPart='';
  826. var monthCustomOption = $('#repeat_month_custom_select_TODO').val();
  827. if(monthCustomOption!='custom' && $('#repeat_month_custom_select2_TODO').val()!='DAY')
  828. {
  829. if(monthCustomOption!='')
  830. byDay=';BYDAY=';
  831. switch(monthCustomOption)
  832. {
  833. case 'every':
  834. byDayFirstPart='';
  835. break;
  836. case 'first':
  837. byDayFirstPart='1';
  838. break;
  839. case 'second':
  840. byDayFirstPart='2';
  841. break;
  842. case 'third':
  843. byDayFirstPart='3';
  844. break;
  845. case 'fourth':
  846. byDayFirstPart='4';
  847. break;
  848. case 'fifth':
  849. byDayFirstPart='5';
  850. break;
  851. case 'last':
  852. byDayFirstPart='-1';
  853. break;
  854. default:
  855. byDayFirstPart='';
  856. break;
  857. }
  858. byDay+= byDayFirstPart+$('#repeat_month_custom_select2_TODO').val();
  859. }
  860. else if(monthCustomOption!='custom' && $('#repeat_month_custom_select2_TODO').val()=='DAY')
  861. {
  862. byDay='';
  863. switch(monthCustomOption)
  864. {
  865. case 'every':
  866. monthDay=';BYMONTHDAY=';
  867. for(var p=1;p<32;p++)
  868. monthDay+=p+',';
  869. monthDay=monthDay.substring(0,monthDay.length-1);
  870. break;
  871. case 'first':
  872. monthDay=';BYMONTHDAY=1';
  873. break;
  874. case 'second':
  875. monthDay=';BYMONTHDAY=2';
  876. break;
  877. case 'third':
  878. monthDay=';BYMONTHDAY=3';
  879. break;
  880. case 'fourth':
  881. monthDay=';BYMONTHDAY=4';
  882. break;
  883. case 'fifth':
  884. monthDay=';BYMONTHDAY=5';
  885. break;
  886. case 'last':
  887. monthDay=';BYMONTHDAY=-1';
  888. break;
  889. default:
  890. byDayFirstPart='';
  891. monthDay='';
  892. break;
  893. }
  894. }
  895. else
  896. {
  897. var monthDayArray = $('#month_custom2_TODO .selected');
  898. if(monthDayArray.length>0)
  899. {
  900. monthDay=';BYMONTHDAY=';
  901. for(var ri=0;ri<monthDayArray.length;ri++)
  902. monthDay+=$(monthDayArray[ri]).attr('data-type')+',';
  903. monthDay=monthDay.substring(0,monthDay.length-1);
  904. }
  905. }
  906. }
  907. else if(frequency=='CUSTOM_YEARLY')
  908. {
  909. frequency='YEARLY';
  910. var byDayFirstPart='';
  911. var monthCustomOption = $('#repeat_year_custom_select1_TODO').val();
  912. var monthArray = $('#year_custom3_TODO .selected');
  913. if(monthArray.length>0)
  914. {
  915. bymonth=';BYMONTH=';
  916. for(var ri=0;ri<monthArray.length;ri++)
  917. {
  918. var val = parseInt($(monthArray[ri]).attr('data-type'),10);
  919. if(!isNaN(val))
  920. bymonth+=(val+1)+',';
  921. }
  922. bymonth=bymonth.substring(0,bymonth.length-1);
  923. }
  924. if(monthCustomOption!='custom' && $('#repeat_year_custom_select2_TODO').val()!='DAY')
  925. {
  926. if(monthCustomOption!='')
  927. byDay=';BYDAY=';
  928. switch(monthCustomOption)
  929. {
  930. case 'every':
  931. byDayFirstPart='';
  932. break;
  933. case 'first':
  934. byDayFirstPart='1';
  935. break;
  936. case 'second':
  937. byDayFirstPart='2';
  938. break;
  939. case 'third':
  940. byDayFirstPart='3';
  941. break;
  942. case 'fourth':
  943. byDayFirstPart='4';
  944. break;
  945. case 'fifth':
  946. byDayFirstPart='5';
  947. break;
  948. case 'last':
  949. byDayFirstPart='-1';
  950. break;
  951. default:
  952. byDayFirstPart='';
  953. break;
  954. }
  955. byDay+= byDayFirstPart+$('#repeat_month_custom_select2_TODO').val();
  956. }
  957. else if(monthCustomOption!='custom' && $('#repeat_year_custom_select2_TODO').val()=='DAY')
  958. {
  959. byDay='';
  960. switch(monthCustomOption)
  961. {
  962. case 'every':
  963. monthDay=';BYMONTHDAY=';
  964. for(var p=1;p<32;p++)
  965. monthDay+=p+',';
  966. monthDay=monthDay.substring(0,monthDay.length-1);
  967. break;
  968. case 'first':
  969. monthDay=';BYMONTHDAY=1';
  970. break;
  971. case 'second':
  972. monthDay=';BYMONTHDAY=2';
  973. break;
  974. case 'third':
  975. monthDay=';BYMONTHDAY=3';
  976. break;
  977. case 'fourth':
  978. monthDay=';BYMONTHDAY=4';
  979. break;
  980. case 'fifth':
  981. monthDay=';BYMONTHDAY=5';
  982. break;
  983. case 'last':
  984. monthDay=';BYMONTHDAY=-1';
  985. break;
  986. default:
  987. byDayFirstPart='';
  988. monthDay='';
  989. break;
  990. }
  991. }
  992. else
  993. {
  994. var monthDayArray = $('#year_custom1_TODO .selected');
  995. if(monthDayArray.length>0)
  996. {
  997. monthDay=';BYMONTHDAY=';
  998. for(var ri=0;ri<monthDayArray.length;ri++)
  999. monthDay+=$(monthDayArray[ri]).attr('data-type')+',';
  1000. monthDay=monthDay.substring(0,monthDay.length-1);
  1001. }
  1002. }
  1003. }
  1004. else if($('#repeat_TODO option:selected').attr('data-type')=="custom_repeat")
  1005. isCustom=true;
  1006. if(vCalendar.tplM['VTcontentline_RRULE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0])!=undefined)
  1007. {
  1008. // replace the object and related objects' group names (+ append the related objects after the processed)
  1009. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1010. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1011. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1012. }
  1013. else
  1014. {
  1015. process_elem=vCalendar.tplC['VTcontentline_RRULE'];
  1016. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1017. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1018. }
  1019. if(!isCustom)
  1020. {
  1021. if($('#repeat_end_details_TODO').val()=="on_date")
  1022. {
  1023. var dateUntil=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#repeat_end_date_TODO').val());
  1024. var datetime_until='';
  1025. if($('#todo_type').val()=='start')
  1026. var tForR=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
  1027. else
  1028. var tForR=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
  1029. dateUntil.setHours(tForR.getHours());
  1030. dateUntil.setMinutes(tForR.getMinutes());
  1031. dateUntil.setSeconds(tForR.getSeconds());
  1032. if(globalSettings.timezonesupport.value && sel_option in timezones)
  1033. var valOffsetFrom=getOffsetByTZ(sel_option, dateUntil);
  1034. if(valOffsetFrom)
  1035. {
  1036. var intOffset=valOffsetFrom.getSecondsFromOffset()*1000*-1;
  1037. dateUntil.setTime(dateUntil.getTime()+intOffset);
  1038. }
  1039. datetime_until=$.fullCalendar.formatDate(dateUntil, "yyyyMMdd'T'HHmmss'Z'");
  1040. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";UNTIL="+datetime_until+bymonth+monthDay+byDay+wkst);
  1041. }
  1042. else if($('#repeat_end_details_TODO').val()=="after")
  1043. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";COUNT="+(parseInt($('#repeat_end_after_TODO').val()))+bymonth+monthDay+byDay+wkst);
  1044. else
  1045. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+bymonth+monthDay+byDay+wkst);
  1046. }
  1047. else
  1048. process_elem=process_elem.replace('##:::##value##:::##', $('#repeat_TODO').val());
  1049. vCalendarText+=process_elem;
  1050. if(realTodo.repeatStart || realTodo.repeatEnd)
  1051. {
  1052. if(realTodo.repeatStart)
  1053. var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
  1054. else
  1055. var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
  1056. if(realTodo.repeatStart)
  1057. var repeatStart=realTodo.repeatStart;
  1058. else
  1059. var repeatStart=realTodo.repeatEnd;
  1060. var b=new Date(1970,1,1,0,0,0);
  1061. if(realTodo.repeatStart)
  1062. b=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
  1063. else
  1064. b=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
  1065. a.setHours(b.getHours());
  1066. a.setMinutes(b.getMinutes());
  1067. a.setSeconds(b.getSeconds());
  1068. var offsetDate=a-repeatStart;
  1069. for(var iter in vCalendar.tplM['VTcontentline_EXDATE'][repeatHash])
  1070. {
  1071. if(isNaN(iter))
  1072. continue;
  1073. var exStr=('\r\n'+vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][iter]).match(vCalendar.pre['contentline_parse']);
  1074. var exVal=exStr[4].parseComnpactISO8601();
  1075. if(exVal)
  1076. {
  1077. if(exStr[4].indexOf('T')==-1)
  1078. {
  1079. //HERE
  1080. if(realTodo.repeatStart)
  1081. var timePart = new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
  1082. else
  1083. var timePart = new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
  1084. var time_from = $.fullCalendar.formatDate(b, 'HHmmss');
  1085. exVal = (exStr[4] + 'T' + time_from).parseComnpactISO8601();
  1086. if(sel_option!='local')
  1087. {
  1088. var valOffsetFrom=getOffsetByTZ(sel_option, exVal);
  1089. var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
  1090. exVal = new Date(exVal.setSeconds(intOffset));
  1091. }
  1092. }
  1093. else if(exStr[4].indexOf('T')!=-1)
  1094. {
  1095. if(sel_option!='local')
  1096. {
  1097. var valOffsetFrom=getOffsetByTZ(sel_option, exVal);
  1098. var origValOffset = getOffsetByTZ(realTodo.timeZone, exVal);
  1099. var intOffset = (valOffsetFrom.getSecondsFromOffset() - origValOffset.getSecondsFromOffset())*-1;
  1100. exVal = new Date(exVal.setSeconds(intOffset));
  1101. }
  1102. else
  1103. {
  1104. var origValOffset = getOffsetByTZ(realTodo.timeZone, exVal);
  1105. exVal = new Date(exVal.setSeconds(origValOffset.getSecondsFromOffset()));
  1106. }
  1107. }
  1108. var value=new Date(exVal.getTime()+offsetDate);
  1109. process_elem=vCalendar.tplC['VTcontentline_EXDATE'];
  1110. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1111. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1112. newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss")+(sel_option!='local' ? 'Z' : '');
  1113. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1114. process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue(''));
  1115. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
  1116. vCalendarText+=process_elem;
  1117. }
  1118. }
  1119. }
  1120. }
  1121. //RECURRENCE-ID
  1122. if($('#recurrenceIDTODO').val() && !appleTodoMode)
  1123. {
  1124. if(vCalendar.tplM['VTcontentline_REC_ID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0])!=undefined)
  1125. {
  1126. // replace the object and related objects' group names (+ append the related objects after the processed)
  1127. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1128. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1129. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1130. }
  1131. else
  1132. {
  1133. process_elem=vCalendar.tplC['VTcontentline_REC_ID'];
  1134. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1135. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1136. }
  1137. var rec_id=$('#recurrenceIDTODO').val()
  1138. if(rec_id.indexOf('T')==-1)
  1139. {
  1140. process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE'));
  1141. process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue(''));
  1142. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id));
  1143. }
  1144. else
  1145. {
  1146. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1147. process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr);
  1148. if(isUTC && rec_id.charAt(rec_id.length-1)!='Z')
  1149. rec_id+='Z';
  1150. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id));
  1151. }
  1152. vCalendarText+=process_elem;
  1153. }
  1154. var a=$('#todoDetailsTable').find("tr[data-id]");
  1155. var lastDataId=0;
  1156. for(var i=0;i<a[a.length-1].attributes.length;i++)
  1157. if(a[a.length-1].attributes[i].nodeName=="data-id")
  1158. {
  1159. lastDataId=a[a.length-1].attributes[i].value;
  1160. break;
  1161. }
  1162. var alarmIterator=0;
  1163. var alarmUniqueArray = new Array();
  1164. for(var t=0;t<lastDataId;t++)
  1165. {
  1166. if($(".alertTODO[data-id="+(t+1)+"]").length>0)
  1167. {
  1168. var alarmText = '';
  1169. if($(".alertTODO[data-id="+(t+1)+"]").val()!='none')
  1170. {
  1171. if(vCalendar.tplM['VTbeginVALARM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbeginVALARM'][repeatHash][0])!=undefined)
  1172. alarmText+=vCalendar.tplM['VTbeginVALARM'][repeatHash][0];
  1173. else
  1174. {
  1175. process_elem=vCalendar.tplC['VTbeginVALARM'];
  1176. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1177. alarmText+=process_elem;
  1178. vevent=true;
  1179. }
  1180. if($(".alertTODO[data-id="+(t+1)+"]").val()=='message')
  1181. {
  1182. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='on_date')
  1183. {
  1184. if(vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][0])!=undefined)
  1185. {
  1186. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1187. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1188. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1189. }
  1190. else
  1191. {
  1192. process_elem=vCalendar.tplC['VTcontentline_TRIGGER'];
  1193. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1194. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1195. }
  1196. var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value,$(".message_date_inputTODO[data-id="+(t+1)+"]").val());
  1197. var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyy-MM-dd');
  1198. var aDate=new Date(Date.parse("01/02/1990, "+$(".message_time_inputTODO[data-id="+(t+1)+"]").val()));
  1199. var time_to=$.fullCalendar.formatDate(aDate, 'HH:mm:ss');
  1200. var alarmDT=$.fullCalendar.parseDate(datetime_to+'T'+time_to);
  1201. if(globalSettings.timezonesupport.value)
  1202. sel_option=$('#timezoneTODO').val();
  1203. if($('.timezone_rowTODO').css('display')=='none')
  1204. sel_option='local';
  1205. if(sel_option!='local')
  1206. {
  1207. var valOffsetFrom=getOffsetByTZ(sel_option, alarmDT);
  1208. var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
  1209. alarmDT = new Date(alarmDT.setSeconds(intOffset));
  1210. }
  1211. else
  1212. {
  1213. var intOffset = getLocalOffset(alarmDT);
  1214. alarmDT = new Date(alarmDT.setSeconds(intOffset));
  1215. }
  1216. var newValue=$.fullCalendar.formatDate(alarmDT, "yyyyMMdd'T'HHmmss")+'Z';
  1217. process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ';VALUE=DATE-TIME');
  1218. process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', '');
  1219. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
  1220. alarmText+=process_elem;
  1221. }
  1222. else
  1223. {
  1224. var duration='';
  1225. var before_after=$(".before_after_inputTODO[data-id="+(t+1)+"]").val();
  1226. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='minutes_before')
  1227. duration="-PT"+before_after+"M";
  1228. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='hours_before')
  1229. duration="-PT"+before_after+"H";
  1230. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='days_before')
  1231. duration="-P"+before_after+"D";
  1232. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='weeks_before')
  1233. duration="-P"+before_after+"W";
  1234. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='seconds_before')
  1235. duration="-PT"+before_after+"S";
  1236. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='minutes_after')
  1237. duration="PT"+before_after+"M";
  1238. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='hours_after')
  1239. duration="PT"+before_after+"H";
  1240. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='days_after')
  1241. duration="P"+before_after+"D";
  1242. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='weeks_after')
  1243. duration="P"+before_after+"W";
  1244. if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='seconds_after')
  1245. duration="PT"+before_after+"S";
  1246. if(vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][0])!=undefined)
  1247. {
  1248. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1249. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1250. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1251. }
  1252. else
  1253. {
  1254. process_elem=vCalendar.tplC['VTcontentline_TRIGGER'];
  1255. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1256. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1257. }
  1258. process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', '');
  1259. process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ';VALUE=DURATION');
  1260. process_elem=process_elem.replace('##:::##value##:::##', duration);
  1261. alarmText+=process_elem;
  1262. }
  1263. if(vCalendar.tplM['VTcontentline_ACTION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][0])!=undefined)
  1264. {
  1265. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1266. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1267. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1268. }
  1269. else
  1270. {
  1271. process_elem=vCalendar.tplC['VTcontentline_ACTION'];
  1272. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1273. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1274. }
  1275. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('DISPLAY'));
  1276. alarmText+=process_elem;
  1277. if(vCalendar.tplM['VTcontentline_DESCRIPTION']!=null && (process_elem=vCalendar.tplM['VTcontentline_DESCRIPTION'][0])!=undefined)
  1278. {
  1279. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1280. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1281. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1282. }
  1283. else
  1284. {
  1285. process_elem=vCalendar.tplC['VTcontentline_DESCRIPTION'];
  1286. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1287. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1288. }
  1289. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('Reminder'));
  1290. alarmText+=process_elem;
  1291. }
  1292. if(typeof vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!='' && vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!=null)
  1293. {
  1294. if(vCalendar.tplM['VTunprocessedVALARM'][repeatHash][t]!=undefined)
  1295. {
  1296. tmp=vCalendar.tplM['VTunprocessedVALARM'][repeatHash][t].replace(RegExp('^\r\n'), '').replace(RegExp('\r\n$'), '');
  1297. if(tmp.indexOf('\r\n')==0)
  1298. tmp=tmp.substring(2, tmp.length);
  1299. if(tmp.lastIndexOf('\r\n')!=(tmp.length-2))
  1300. tmp+='\r\n';
  1301. alarmText+=tmp;
  1302. }
  1303. }
  1304. if(vCalendar.tplM['VTendVALARM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTendVALARM'][repeatHash][0])!=undefined)
  1305. alarmText+=vCalendar.tplM['VTendVALARM'][repeatHash][0];
  1306. else
  1307. {
  1308. process_elem=vCalendar.tplC['VTendVALARM'];
  1309. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1310. alarmText+=process_elem;
  1311. }
  1312. if(alarmUniqueArray.indexOf(alarmText)==-1)
  1313. {
  1314. alarmUniqueArray.push(alarmText);
  1315. vCalendarText+=alarmText;
  1316. }
  1317. }
  1318. }
  1319. }
  1320. if($('#todo_type').val()=='start' || $('#todo_type').val()=='due' || $('#todo_type').val()=='both')
  1321. {
  1322. if($('#date_fromTODO').val()=='' && $('#date_toTODO').val()=='')
  1323. {
  1324. alert("Not enough data!");
  1325. return false;
  1326. }
  1327. if(($('#todo_type').val()=='start' || ($('#todo_type').val()=='both' && !appleTodoMode)) && $('#date_fromTODO').val()!='')
  1328. {
  1329. if(vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0])!=undefined)
  1330. {
  1331. // replace the object and related objects' group names (+ append the related objects after the processed)
  1332. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1333. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1334. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1335. }
  1336. else
  1337. {
  1338. process_elem=vCalendar.tplC['VTcontentline_E_DTSTART'];
  1339. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1340. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1341. }
  1342. var dateFrom=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
  1343. var datetime_from=$.fullCalendar.formatDate(dateFrom, 'yyyyMMdd');
  1344. var timeFrom=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
  1345. var time_from=((timeFrom.getHours())<10 ? '0'+(timeFrom.getHours()): (timeFrom.getHours()))+''+((timeFrom.getMinutes())<10 ? '0'+(timeFrom.getMinutes()): (timeFrom.getMinutes()))+'00';
  1346. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1347. process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr);
  1348. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : '')));
  1349. if(appleTodoMode)
  1350. {
  1351. var process_elem2 = '';
  1352. if(vCalendar.tplM['VTcontentline_DUE'][repeatHash]!=null && (process_elem2=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0])!=undefined)
  1353. {
  1354. // replace the object and related objects' group names (+ append the related objects after the processed)
  1355. parsed=('\r\n'+process_elem2).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1356. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1357. process_elem2=('\r\n'+process_elem2).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1358. }
  1359. else
  1360. {
  1361. process_elem2=vCalendar.tplC['VTcontentline_DUE'];
  1362. process_elem2=process_elem2.replace('##:::##group_wd##:::##', '');
  1363. process_elem2=process_elem2.replace('##:::##params_wsc##:::##', '');
  1364. }
  1365. process_elem2=process_elem2.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1366. process_elem2=process_elem2.replace('##:::##TZID##:::##',timeZoneAttr);
  1367. process_elem2=process_elem2.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : '')));
  1368. vCalendarText+=process_elem2;
  1369. }
  1370. vCalendarText+=process_elem;
  1371. }
  1372. if(($('#todo_type').val()=='due' || $('#todo_type').val()=='both') && $('#date_toTODO').val()!='')
  1373. {
  1374. if(vCalendar.tplM['VTcontentline_DUE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0])!=undefined)
  1375. {
  1376. // replace the object and related objects' group names (+ append the related objects after the processed)
  1377. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1378. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1379. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1380. }
  1381. else
  1382. {
  1383. process_elem=vCalendar.tplC['VTcontentline_DUE'];
  1384. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1385. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1386. }
  1387. var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value,$('#date_toTODO').val());
  1388. var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyyMMdd');
  1389. var timeTo=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
  1390. var time_to=((timeTo.getHours())<10 ? '0'+(timeTo.getHours()): (timeTo.getHours()))+''+((timeTo.getMinutes())<10 ? '0'+(timeTo.getMinutes()): (timeTo.getMinutes()))+'00';
  1391. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1392. process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr);
  1393. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_to+'T'+time_to+(isUTC ? 'Z' : '')));
  1394. if(globalSettings.appleremindersmode.value)
  1395. {
  1396. var process_elem2 = '';
  1397. if(vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash]!=null && (process_elem2=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0])!=undefined)
  1398. {
  1399. // replace the object and related objects' group names (+ append the related objects after the processed)
  1400. parsed=('\r\n'+process_elem2).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1401. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1402. process_elem2=('\r\n'+process_elem2).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1403. }
  1404. else
  1405. {
  1406. process_elem2=vCalendar.tplC['VTcontentline_E_DTSTART'];
  1407. process_elem2=process_elem2.replace('##:::##group_wd##:::##', '');
  1408. process_elem2=process_elem2.replace('##:::##params_wsc##:::##', '');
  1409. }
  1410. process_elem2=process_elem2.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1411. process_elem2=process_elem2.replace('##:::##TZID##:::##',timeZoneAttr);
  1412. process_elem2=process_elem2.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_to+'T'+time_to+(isUTC ? 'Z' : '')));
  1413. vCalendarText+=process_elem2;
  1414. }
  1415. vCalendarText+=process_elem;
  1416. }
  1417. }
  1418. if(realTodo!='')
  1419. {
  1420. if(realTodo.type!='')
  1421. {
  1422. if(realTodo.repeatStart)
  1423. {
  1424. var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
  1425. var b=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
  1426. }
  1427. else if(realTodo.repeatEnd)
  1428. {
  1429. var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
  1430. var b=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
  1431. }
  1432. if(realTodo.repeatStart)
  1433. var repeatStart=realTodo.repeatStart;
  1434. else if(realTodo.repeatEnd)
  1435. var repeatEnd=realTodo.repeatEnd;
  1436. a.setHours(b.getHours());
  1437. a.setMinutes(b.getMinutes());
  1438. a.setSeconds(b.getSeconds());
  1439. var changeDate=new Date(a.getTime());
  1440. var offsetDate=0;
  1441. if(realTodo.repeatStart)
  1442. offsetDate=changeDate-repeatStart;
  1443. else if(realTodo.repeatEnd)
  1444. offsetDate=changeDate-repeatEnd;
  1445. var realEventUID=realTodo.vcalendar.match(vCalendar.pre['contentline_UID']);
  1446. if(realEventUID!=null)
  1447. realEventUID=realEventUID[0].match(vCalendar.pre['contentline_parse'])[4];
  1448. if(offsetDate!=0)
  1449. {
  1450. var vcalendarOrig=vCalendarText;
  1451. var eventArray=new Array(),backupEventArray= new Array();
  1452. while(vcalendarOrig.match(vCalendar.pre['vtodo'])!=null)
  1453. {
  1454. if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2, vcalendarOrig.indexOf('BEGIN:VTODO'))=='\r\n')
  1455. {
  1456. var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2,vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
  1457. vcalendarOrig=vcalendarOrig.replace(partEvent, '');
  1458. }
  1459. else
  1460. {
  1461. var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO'),vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
  1462. vcalendarOrig=vcalendarOrig.replace(partEvent, '');
  1463. partEvent+='\r\n';
  1464. }
  1465. eventArray[eventArray.length]=partEvent;
  1466. backupEventArray[backupEventArray.length]=partEvent;
  1467. }
  1468. if(eventArray.length==0)
  1469. console.log("Error: '"+inputUID+"': unable to parse vTodo");
  1470. for(var it=0;it<eventArray.length;it++)
  1471. {
  1472. var findUid=eventArray[it].match(vCalendar.pre['contentline_UID']);
  1473. if(findUid!=null)
  1474. {
  1475. if(findUid[0].match(vCalendar.pre['contentline_parse'])[4]!=realEventUID)
  1476. continue;
  1477. }
  1478. var findRec=eventArray[it].match(vCalendar.pre['contentline_RECURRENCE_ID']);
  1479. if(findRec!=null)
  1480. {
  1481. var parsed=findRec[0].match(vCalendar.pre['contentline_parse']);
  1482. process_elem=vCalendar.tplC['VTcontentline_REC_ID'];
  1483. process_elem=process_elem.replace('##:::##group_wd##:::##', parsed[1]);
  1484. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1485. var value=parsed[4].parseComnpactISO8601();
  1486. if(value)
  1487. {
  1488. value=new Date(value.getTime()+offsetDate)
  1489. var newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss");
  1490. if(isUTC)
  1491. newValue+='Z';
  1492. process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
  1493. process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr);
  1494. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
  1495. eventArray[it]=eventArray[it].replace(findRec[0],'\r\n'+process_elem);
  1496. }
  1497. }
  1498. vCalendarText=vCalendarText.replace(backupEventArray[it],eventArray[it]);
  1499. }
  1500. }
  1501. }
  1502. }
  1503. if($('.completedOnTr').css('display')!='none')
  1504. {
  1505. if(vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][0])!=undefined)
  1506. {
  1507. // replace the object and related objects' group names (+ append the related objects after the processed)
  1508. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1509. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1510. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1511. }
  1512. else
  1513. {
  1514. process_elem=vCalendar.tplC['VTcontentline_COMPLETED'];
  1515. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1516. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1517. }
  1518. if($('.completedOnTr .date').val()!='' && $('.completedOnTr .time').val()!='')
  1519. {
  1520. var completedDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('.completedOnTr .date').val());
  1521. var timeCompleted=new Date(Date.parse("01/02/1990, "+$('#completedOnTime').val()));
  1522. var datetime_completed=$.fullCalendar.parseDate($.fullCalendar.formatDate(completedDate, "yyyy'-'MM'-'dd")+'T'+$.fullCalendar.formatDate(timeCompleted, "HH':'mm'-'ss"));
  1523. if(globalSettings.timezonesupport.value)
  1524. sel_option=$('#timezoneTODO').val();
  1525. if($('.timezone_rowTODO').css('display')=='none')
  1526. sel_option='local';
  1527. if(sel_option!='local')
  1528. {
  1529. var valOffsetFrom=getOffsetByTZ(sel_option, datetime_completed);
  1530. var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
  1531. datetime_completed = new Date(datetime_completed.setSeconds(intOffset));
  1532. }
  1533. var newValue=$.fullCalendar.formatDate(datetime_completed, "yyyyMMdd'T'HHmmss")+'Z';
  1534. process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
  1535. vCalendarText+=process_elem;
  1536. }
  1537. }
  1538. if(appleTodoMode)
  1539. {
  1540. if(vCalendarText.indexOf('\r\n')==0 && newFirst.lastIndexOf('\r\n')==(newFirst.length-2))
  1541. newFirst+=vCalendarText.substring(2,vCalendarText.length);
  1542. else if((vCalendarText.indexOf('\r\n')==0 && newFirst.lastIndexOf('\r\n')!=(newFirst.length-2)) || (vCalendarText.indexOf('\r\n')!=0 && newFirst.lastIndexOf('\r\n')==(newFirst.length-2)) )
  1543. newFirst+=vCalendarText;
  1544. else
  1545. newFirst+='\r\n'+vCalendarText;
  1546. }
  1547. if($('#recurrenceIDTODO').val()=='')
  1548. var checkVal='orig';
  1549. else
  1550. var checkVal=$('#recurrenceIDTODO').val();
  1551. if(typeof vCalendar.tplM['VTunprocessedVTODO'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessedVTODO'][repeatHash]!=null)
  1552. {
  1553. for(vev in vCalendar.tplM['VTunprocessedVTODO'][repeatHash])
  1554. if(vev==checkVal)
  1555. vCalendarText+=vCalendar.tplM['VTunprocessedVTODO'][repeatHash][vev].replace(RegExp('^\r\n'), '');
  1556. }
  1557. if(appleTodoMode)
  1558. vCalendarText = '';
  1559. if(vCalendar.tplM['VTendVTODO'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTendVTODO'][repeatHash][0])!=undefined)
  1560. {
  1561. if(!appleTodoMode)
  1562. vCalendarText+=vCalendar.tplM['VTendVTODO'][repeatHash][0];
  1563. else
  1564. newFirst+=vCalendar.tplM['VTendVTODO'][repeatHash][0];
  1565. }
  1566. else
  1567. {
  1568. process_elem=vCalendar.tplC['VTendVTODO'];
  1569. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1570. if(!appleTodoMode)
  1571. vCalendarText+=process_elem;
  1572. else
  1573. newFirst+=process_elem;
  1574. }
  1575. // PRODID
  1576. if(vCalendar.tplM['VTcontentline_PRODID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0])!=undefined)
  1577. {
  1578. // replace the object and related objects' group names (+ append the related objects after the processed)
  1579. parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
  1580. if(parsed[1]!='') // if group is present, replace the object and related objects' group names
  1581. process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
  1582. }
  1583. else
  1584. {
  1585. process_elem=vCalendar.tplC['VTcontentline_PRODID'];
  1586. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1587. process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
  1588. }
  1589. process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN');
  1590. vCalendarText+=process_elem;
  1591. if(typeof vCalendar.tplM['VTunprocessed'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessed'][repeatHash]!='' && vCalendar.tplM['VTunprocessed'][repeatHash]!=null)
  1592. {
  1593. if(!appleTodoMode)
  1594. vCalendarText+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');
  1595. else
  1596. origFirst+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');;
  1597. }
  1598. vCalendar.tplM['VTunprocessed'][repeatHash]=new Array();
  1599. // vCalendar END (required by RFC)
  1600. if(vCalendar.tplM['VTend'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTend'][repeatHash][0])!=undefined)
  1601. vCalendarText+=vCalendar.tplM['VTend'][repeatHash][0];
  1602. else
  1603. {
  1604. process_elem=vCalendar.tplC['VTend'];
  1605. process_elem=process_elem.replace('##:::##group_wd##:::##', '');
  1606. vCalendarText+=process_elem;
  1607. }
  1608. var textArray = new Array();
  1609. if(appleTodoMode)
  1610. {
  1611. newFirst += vCalendarText;
  1612. if(origFirst.lastIndexOf('\r\n')!=(origFirst.length-2))
  1613. origFirst += '\r\n';
  1614. origFirst += vCalendarText;
  1615. var fixed = checkAndFixMultipleUID(newFirst,false);
  1616. if(fixed.length==1)
  1617. textArray[textArray.length]=origFirst;
  1618. else
  1619. textArray=fixed;
  1620. vCalendarText = newFirst;
  1621. }
  1622. else if(resultTodoObj.futureMode && origEvent!='')
  1623. {
  1624. var fixed = checkAndFixMultipleUID(origEvent,false);
  1625. if(fixed.length==1)
  1626. textArray[textArray.length]=origEvent;
  1627. else
  1628. textArray=fixed;
  1629. }
  1630. var fixedArr = checkAndFixMultipleUID(vCalendarText,false);
  1631. fixedArr = $.merge(textArray,fixedArr);
  1632. var inputS = fixedArr[0];
  1633. fixedArr.splice(0,1);
  1634. if(operation=='MOVE_IN')
  1635. return moveVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID, 'vtodo', false, deleteMode, fixedArr);
  1636. else
  1637. return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID,'vtodo',false,deleteMode,fixedArr);
  1638. }
  1639. function fullVcalendarToTodoData(inputEvent, formMode)
  1640. {
  1641. var vcalendar='';
  1642. if(formMode)
  1643. var repeatHash = 'form';
  1644. else
  1645. var repeatHash = inputEvent.repeatHash;
  1646. CalDAVeditor_cleanup(repeatHash);
  1647. var rid=inputEvent.id.substring(0, inputEvent.id.lastIndexOf('/')+1);
  1648. if(rid)
  1649. if(globalEventList.todos[rid][inputEvent.id].uid!=undefined)
  1650. vcalendar=globalEventList.todos[rid][inputEvent.id].vcalendar;
  1651. if(!vcalendar)
  1652. return false;
  1653. var vcalendar_full=vcalendar.split('\r\n');
  1654. if((parsed=('\r\n'+vcalendar_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
  1655. return false;
  1656. //BEGIN, END VCALENDAR
  1657. vCalendar.tplM['VTbegin'][repeatHash]=new Array();
  1658. vCalendar.tplM['VTbegin'][repeatHash][0]=vCalendar.tplC['VTbegin'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
  1659. // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
  1660. if((parsed=('\r\n'+vcalendar_full[vcalendar_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
  1661. return false;
  1662. // values not directly supported by the editor (old values are kept intact)
  1663. vCalendar.tplM['VTend'][repeatHash]=new Array();
  1664. vCalendar.tplM['VTend'][repeatHash][0]=vCalendar.tplC['VTend'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);
  1665. if(vcalendar_begin_group!=vcalendar_end_group)
  1666. return false; // the vCalendar BEGIN and END "group" are different
  1667. // remove the vCalendar BEGIN and END
  1668. vcalendar='\r\n'+vcalendar_full.slice(1, vcalendar_full.length-2).join('\r\n')+'\r\n';
  1669. //FIX TIMEZONE
  1670. var beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE');
  1671. var startEndTimeZone=vcalendar.indexOf('END:VTIMEZONE');
  1672. var endTimeZone=0;
  1673. var vTimeZone='';
  1674. while(beginTimeZone!=-1 && startEndTimeZone!=-1)
  1675. {
  1676. for(i=(startEndTimeZone+2);i<vcalendar.length;i++)
  1677. {
  1678. if(vcalendar.charAt(i)=='\n')
  1679. {
  1680. endTimeZone=i+1;
  1681. break;
  1682. }
  1683. }
  1684. vTimeZone=vcalendar.substring(beginTimeZone, endTimeZone);
  1685. vcalendar=vcalendar.substring(0, beginTimeZone)+vcalendar.substring(endTimeZone, vcalendar.length);
  1686. beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE');
  1687. startEndTimeZone=vcalendar.indexOf('END:VTIMEZONE');
  1688. }
  1689. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_VERSION']);
  1690. if(vcalendar_element!=null)
  1691. {
  1692. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1693. version=vcalendarUnescapeValue(parsed[4]);
  1694. vCalendar.tplM['VTcontentline_VERSION'][repeatHash] = new Array();
  1695. vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplC['VTcontentline_VERSION'];
  1696. vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1697. vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1698. vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');
  1699. if(parsed[1]!='')
  1700. {
  1701. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1702. while ((vcalendar_element_related=vcalendar.match(re))!=null)
  1703. {
  1704. // append the parameter to its parent
  1705. vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1706. // remove the processed parameter
  1707. vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
  1708. }
  1709. }
  1710. }
  1711. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CALSCALE']);
  1712. if(vcalendar_element!=null)
  1713. {
  1714. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1715. version=vcalendarUnescapeValue(parsed[4]);
  1716. vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash] = new Array();
  1717. vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplC['VTcontentline_CALSCALE'];
  1718. vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1719. vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1720. vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');
  1721. if(parsed[1]!='')
  1722. {
  1723. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1724. while ((vcalendar_element_related=vcalendar.match(re))!=null)
  1725. {
  1726. // append the parameter to its parent
  1727. vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1728. // remove the processed parameter
  1729. vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
  1730. }
  1731. }
  1732. }
  1733. //PRODID
  1734. vcalendar_element=vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_PRODID'], 'mi'));
  1735. if(vcalendar_element!=null)
  1736. {
  1737. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1738. vCalendar.tplM['VTcontentline_PRODID'][repeatHash] = new Array();
  1739. vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplC['VTcontentline_PRODID'];
  1740. vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1741. vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1742. vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');
  1743. if(parsed[1]!='')
  1744. {
  1745. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1746. while ((vcalendar_element_related=vcalendar.match(re))!=null)
  1747. {
  1748. // append the parameter to its parent
  1749. vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1750. // remove the processed parameter
  1751. vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
  1752. }
  1753. }
  1754. }
  1755. // -------------------VTODO---------------------- //
  1756. var todoArray=new Array();
  1757. while(vcalendar.match(vCalendar.pre['vtodo'])!=null)
  1758. {
  1759. if(vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO')-2, vcalendar.indexOf('BEGIN:VTODO'))=='\r\n')
  1760. {
  1761. var partTodo=vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO')-2,vcalendar.indexOf('END:VTODO')+'END:VTODO'.length);
  1762. vcalendar=vcalendar.replace(partTodo, '');
  1763. }
  1764. else
  1765. {
  1766. var partTodo=vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO'),vcalendar.indexOf('END:VTODO')+'END:VTODO'.length);
  1767. vcalendar=vcalendar.replace(partTodo, '');
  1768. partTodo+='\r\n';
  1769. }
  1770. todoArray[todoArray.length]=partTodo;
  1771. }
  1772. if(todoArray.length==0)
  1773. console.log("Error: '"+inputEvent.id+"': unable to parse vTodo");
  1774. for(var it=0;it<todoArray.length;it++)
  1775. {
  1776. var vtodo=todoArray[it];
  1777. var vtodo_full=vtodo.split('\r\n');
  1778. var isThisTODO=false;
  1779. if(vtodo==null)
  1780. return false;
  1781. //BEGIN
  1782. if((parsed=('\r\nBEGIN:VTODO\r\n').match(vCalendar.pre['contentline_parse']))==null)
  1783. return false;
  1784. //BEGIN, END VCALENDAR
  1785. vCalendar.tplM['VTbeginVTODO'][repeatHash] = new Array();
  1786. vCalendar.tplM['VTbeginVTODO'][repeatHash][0]=vCalendar.tplC['VTbeginVTODO'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
  1787. // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
  1788. if((parsed=('\r\n'+vcalendar_full[vtodo_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
  1789. return false;
  1790. // values not directly supported by the editor (old values are kept intact)
  1791. vCalendar.tplM['VTendVTODO'][repeatHash] = new Array();
  1792. vCalendar.tplM['VTendVTODO'][repeatHash][0]=vCalendar.tplC['VTendVTODO'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);
  1793. if(vcalendar_begin_group!=vcalendar_end_group)
  1794. return false; // the vCalendar BEGIN and END "group" are different
  1795. // remove the vCalendar BEGIN and END
  1796. vtodo='\r\n'+vtodo_full.slice(2, vtodo_full.length-1).join('\r\n')+'\r\n';
  1797. var created='',recurr_id='', frequency='';
  1798. //RECURRENCE-ID
  1799. var rec='';
  1800. vcalendar_element=vtodo.match(vCalendar.pre['contentline_RECURRENCE_ID']);
  1801. if(vcalendar_element!=null)
  1802. {
  1803. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1804. var rec=parsed[4];
  1805. vCalendar.tplM['VTcontentline_REC_ID'][repeatHash]= new Array();
  1806. vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplC['VTcontentline_REC_ID'];
  1807. vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1808. var pars=vcalendarSplitParam(parsed[3]);
  1809. var parString='';
  1810. for(var i=0;i<pars.length;i++)
  1811. {
  1812. if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!=''))
  1813. parString+=';'+pars[i];
  1814. }
  1815. vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);
  1816. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1817. if(parsed[1]!='')
  1818. {
  1819. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1820. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1821. {
  1822. // append the parameter to its parent
  1823. vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1824. // remove the processed parameter
  1825. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1826. }
  1827. }
  1828. }
  1829. if(rec=='')
  1830. rec='orig';
  1831. else
  1832. recurr_id=rec;
  1833. //CREATED
  1834. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_CREATED'], 'mi'));
  1835. if(vcalendar_element!=null)
  1836. {
  1837. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1838. vCalendar.tplM['VTcontentline_CREATED'][repeatHash]={};
  1839. vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplC['VTcontentline_CREATED'];
  1840. vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1841. vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1842. created = parsed[4];
  1843. vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##value##:::##/g,parsed[4]);
  1844. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1845. if(parsed[1]!='')
  1846. {
  1847. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1848. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1849. {
  1850. // append the parameter to its parent
  1851. vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]+=vcalendar_element_related[0].substr(2);
  1852. // remove the processed parameter
  1853. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1854. }
  1855. }
  1856. }
  1857. //RRULE
  1858. vcalendar_element=vtodo.match(vCalendar.pre['contentline_RRULE2']);
  1859. if(vcalendar_element!=null)
  1860. {
  1861. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1862. vCalendar.tplM['VTcontentline_RRULE'][repeatHash] = new Array();
  1863. vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplC['VTcontentline_RRULE'];
  1864. vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1865. var pars=parsed[4].split(';');
  1866. var parString='';
  1867. for(var i=0;i<pars.length;i++)
  1868. {
  1869. if((pars[i].indexOf('FREQ=')==-1) && (pars[i].indexOf('COUNT=')==-1) && (pars[i].indexOf('UNTIL=')==-1) && (pars[i]!='') && (pars[i].indexOf('INTERVAL=')==-1) && (pars[i].indexOf('BYDAY=')==-1)
  1870. && (pars[i].indexOf('BYMONTHDAY=')==-1) && (pars[i].indexOf('BYMONTH=')==-1) && (pars[i].indexOf('WKST=')==-1))
  1871. parString+=';'+pars[i];
  1872. if(pars[i].indexOf('FREQ=')!=-1)
  1873. frequency=pars[i].split('FREQ=')[1];
  1874. }
  1875. vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1876. vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##value##:::##/g, '##:::##value##:::##'+parString);
  1877. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1878. if(parsed[1]!='')
  1879. {
  1880. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1881. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1882. {
  1883. // append the parameter to its parent
  1884. vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1885. // remove the processed parameter
  1886. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1887. }
  1888. }
  1889. }
  1890. var tmpR=''
  1891. if(frequency!='')
  1892. tmpR=inputEvent.id+'#'+created+'#'+frequency;
  1893. else
  1894. tmpR=inputEvent.id+'#'+created+'#'+recurr_id;
  1895. if(tmpR==repeatHash)
  1896. isThisTODO=true;
  1897. //SUMMARY
  1898. vcalendar_element=vtodo.match(vCalendar.pre['contentline_SUMMARY']);
  1899. if(vcalendar_element!=null)
  1900. {
  1901. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1902. title=vcalendarUnescapeValue(parsed[4]);
  1903. vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash] = new Array();
  1904. vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplC['VTcontentline_SUMMARY'];
  1905. vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1906. vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1907. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1908. if(parsed[1]!='')
  1909. {
  1910. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1911. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1912. {
  1913. // append the parameter to its parent
  1914. vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1915. // remove the processed parameter
  1916. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1917. }
  1918. }
  1919. }
  1920. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_TRANSP'], 'mi'));
  1921. if(vcalendar_element!=null)
  1922. {
  1923. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1924. vCalendar.tplM['VTcontentline_TRANSP'][repeatHash] = new Array();
  1925. vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplC['VTcontentline_TRANSP'];
  1926. vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1927. vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1928. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1929. if(parsed[1]!='')
  1930. {
  1931. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1932. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1933. {
  1934. // append the parameter to its parent
  1935. vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1936. // remove the processed parameter
  1937. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1938. }
  1939. }
  1940. }
  1941. vcalendar_element=vtodo.match(vCalendar.pre['contentline_STATUS']);
  1942. if(vcalendar_element!=null)
  1943. {
  1944. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1945. title=vcalendarUnescapeValue(parsed[4]);
  1946. vCalendar.tplM['VTcontentline_STATUS'][repeatHash] = new Array();
  1947. vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplC['VTcontentline_STATUS'];
  1948. vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1949. vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1950. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1951. if(parsed[1]!='')
  1952. {
  1953. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1954. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1955. {
  1956. // append the parameter to its parent
  1957. vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1958. // remove the processed parameter
  1959. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1960. }
  1961. }
  1962. }
  1963. //LOCATION
  1964. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_LOCATION'], 'mi'));
  1965. if(vcalendar_element!=null)
  1966. {
  1967. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1968. //note=String(vcalendar_element).split(':')[1];
  1969. title=vcalendarUnescapeValue(parsed[4]);
  1970. vCalendar.tplM['VTcontentline_LOCATION'][repeatHash] = new Array();
  1971. vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplC['VTcontentline_LOCATION'];
  1972. vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1973. vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1974. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1975. if(parsed[1]!='')
  1976. {
  1977. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  1978. while ((vcalendar_element_related=vtodo.match(re))!=null)
  1979. {
  1980. // append the parameter to its parent
  1981. vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  1982. // remove the processed parameter
  1983. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  1984. }
  1985. }
  1986. }
  1987. //URL
  1988. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_URL'], 'mi'));
  1989. if(vcalendar_element!=null)
  1990. {
  1991. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  1992. //note=String(vcalendar_element).split(':')[1];
  1993. title=vcalendarUnescapeValue(parsed[4]);
  1994. vCalendar.tplM['VTcontentline_URL'][repeatHash] = new Array();
  1995. vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplC['VTcontentline_URL'];
  1996. vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplM['VTcontentline_URL'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  1997. vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplM['VTcontentline_URL'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  1998. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  1999. if(parsed[1]!='')
  2000. {
  2001. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2002. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2003. {
  2004. // append the parameter to its parent
  2005. vCalendar.tplM['VTcontentline_URL'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2006. // remove the processed parameter
  2007. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2008. }
  2009. }
  2010. }
  2011. vcalendar_element=vtodo.match(vCalendar.pre['contentline_PERCENT-COMPLETE']);
  2012. if(vcalendar_element!=null)
  2013. {
  2014. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2015. //note=String(vcalendar_element).split(':')[1];
  2016. title=vcalendarUnescapeValue(parsed[4]);
  2017. vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash] = new Array();
  2018. vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplC['VTcontentline_PERCENT-COMPLETE'];
  2019. vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2020. vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2021. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2022. if(parsed[1]!='')
  2023. {
  2024. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2025. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2026. {
  2027. // append the parameter to its parent
  2028. vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2029. // remove the processed parameter
  2030. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2031. }
  2032. }
  2033. }
  2034. vcalendar_element=vtodo.match(vCalendar.pre['contentline_PRIORITY']);
  2035. if(vcalendar_element!=null)
  2036. {
  2037. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2038. //note=String(vcalendar_element).split(':')[1];
  2039. title=vcalendarUnescapeValue(parsed[4]);
  2040. vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash] = new Array();
  2041. vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplC['VTcontentline_PRIORITY'];
  2042. vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2043. vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2044. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2045. if(parsed[1]!='')
  2046. {
  2047. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2048. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2049. {
  2050. // append the parameter to its parent
  2051. vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2052. // remove the processed parameter
  2053. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2054. }
  2055. }
  2056. }
  2057. // ---------------- VALARM --------------- //
  2058. var valarm=vtodo.match(vCalendar.pre['valarm']);
  2059. if(valarm!=null)
  2060. {
  2061. vtodo=vtodo.replace(valarm[0], '');
  2062. vCalendar.tplM['VTalarm_STRING'][repeatHash]='';
  2063. var alarmString='';
  2064. var alarmArray=new Array();
  2065. for(var i=0;i<valarm[0].length;i++)
  2066. {
  2067. if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM')
  2068. {
  2069. alarmArray[alarmArray.length]=alarmString+'\r\n';
  2070. if(isThisTODO)
  2071. vCalendar.tplM['VTalarm_STRING'][repeatHash]+=alarmString+'\r\n';
  2072. alarmString='';
  2073. }
  2074. alarmString+=valarm[0][i];
  2075. }
  2076. for(var j=0;j<alarmArray.length;j++)
  2077. {
  2078. checkA=alarmArray[j].match(vCalendar.re['valarm']);
  2079. if(checkA!=null)
  2080. {
  2081. var valarm_full=checkA[0].split('\r\n');
  2082. //BEGIN
  2083. if((parsed=('\r\n'+valarm_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
  2084. return false;
  2085. //BEGIN, END VCALENDAR
  2086. vCalendar.tplM['VTbeginVALARM'][repeatHash] = new Array();
  2087. vCalendar.tplM['VTbeginVALARM'][repeatHash][j]=vCalendar.tplC['VTbeginVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
  2088. // parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
  2089. if((parsed=('\r\n'+valarm_full[valarm_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
  2090. return false;
  2091. // values not directly supported by the editor (old values are kept intact)
  2092. vCalendar.tplM['VTendVALARM'][repeatHash] = new Array();
  2093. vCalendar.tplM['VTendVALARM'][repeatHash][j]=vCalendar.tplC['VTendVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);
  2094. if(vcalendar_begin_group!=vcalendar_end_group)
  2095. return false; // the vCalendar BEGIN and END "group" are different
  2096. // remove the vCalendar BEGIN and END
  2097. alarmArray[j]='\r\n'+valarm_full.slice(1, valarm_full.length-2).join('\r\n')+'\r\n';
  2098. trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']);
  2099. if(trigger!=null)
  2100. {
  2101. parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']);
  2102. vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash] = new Array();
  2103. vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplC['VTcontentline_TRIGGER'];
  2104. vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2105. var pars=vcalendarSplitParam(parsed[3]);
  2106. var parString='';
  2107. for(var i=0;i<pars.length;i++)
  2108. {
  2109. if((pars[i]!='VALUE=DATE-TIME') && (pars[i]!='VALUE=DURATION') && (pars[i]!=''))
  2110. parString+=';'+pars[i];
  2111. }
  2112. vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parString);
  2113. alarmArray[j]=alarmArray[j].replace(trigger[0], '\r\n');
  2114. if(parsed[1]!='')
  2115. {
  2116. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2117. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2118. {
  2119. // append the parameter to its parent
  2120. vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
  2121. // remove the processed parameter
  2122. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2123. }
  2124. }
  2125. }
  2126. note=alarmArray[j].match(vCalendar.pre['contentline_NOTE']);
  2127. if(note!=null)
  2128. {
  2129. parsed=note[0].match(vCalendar.pre['contentline_parse']);
  2130. vCalendar.tplM['VTcontentline_VANOTE'][repeatHash] = new Array();
  2131. vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplC['VTcontentline_VANOTE'];
  2132. vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2133. vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2134. alarmArray[j]=alarmArray[j].replace(note[0], '\r\n');
  2135. if(parsed[1]!='')
  2136. {
  2137. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2138. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2139. {
  2140. // append the parameter to its parent
  2141. vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
  2142. // remove the processed parameter
  2143. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2144. }
  2145. }
  2146. }
  2147. action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']);
  2148. if(action!=null)
  2149. {
  2150. parsed=action[0].match(vCalendar.pre['contentline_parse']);
  2151. vCalendar.tplM['VTcontentline_ACTION'][repeatHash] = new Array();
  2152. vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplC['VTcontentline_ACTION'];
  2153. vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2154. vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2155. alarmArray[j]=alarmArray[j].replace(action[0], '\r\n');
  2156. if(parsed[1]!='')
  2157. {
  2158. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2159. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2160. {
  2161. // append the parameter to its parent
  2162. vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
  2163. // remove the processed parameter
  2164. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2165. }
  2166. }
  2167. }
  2168. var checkUnprocess=$.trim(alarmArray[j]);
  2169. vCalendar.tplM['VTunprocessedVALARM'][repeatHash] = new Array();
  2170. if(checkUnprocess!='')
  2171. vCalendar.tplM['VTunprocessedVALARM'][repeatHash][j]=alarmArray[j];
  2172. }
  2173. }
  2174. }
  2175. //NOTE
  2176. vcalendar_element=vtodo.match(vCalendar.pre['contentline_NOTE']);
  2177. if(vcalendar_element!=null)
  2178. {
  2179. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2180. vCalendar.tplM['VTcontentline_NOTE'][repeatHash]=new Array();
  2181. vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplC['VTcontentline_NOTE'];
  2182. vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2183. vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2184. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2185. if(parsed[1]!='')
  2186. {
  2187. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2188. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2189. {
  2190. // append the parameter to its parent
  2191. vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2192. // remove the processed parameter
  2193. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2194. }
  2195. }
  2196. }
  2197. //NOTE
  2198. vcalendar_element=vtodo.match(vCalendar.pre['contentline_CLASS']);
  2199. if(vcalendar_element!=null)
  2200. {
  2201. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2202. vCalendar.tplM['VTcontentline_CLASS'][repeatHash]=new Array()
  2203. vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplC['VTcontentline_CLASS'];
  2204. vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2205. vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2206. vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##value##:::##/g, parsed[4]);
  2207. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2208. if(parsed[1]!='')
  2209. {
  2210. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2211. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2212. {
  2213. // append the parameter to its parent
  2214. vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2215. // remove the processed parameter
  2216. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2217. }
  2218. }
  2219. }
  2220. //END
  2221. vcalendar_element=vtodo.match(vCalendar.pre['contentline_DUE']);
  2222. if(vcalendar_element!=null)
  2223. {
  2224. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2225. vCalendar.tplM['VTcontentline_DUE'][repeatHash]= new Array();
  2226. vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplC['VTcontentline_DUE'];
  2227. vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2228. var pars=vcalendarSplitParam(parsed[3]);
  2229. var parString='';
  2230. for(var i=0;i<pars.length;i++)
  2231. {
  2232. if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!=''))
  2233. parString+=';'+pars[i];
  2234. }
  2235. vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);
  2236. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2237. if(parsed[1]!='')
  2238. {
  2239. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2240. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2241. {
  2242. // append the parameter to its parent
  2243. vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2244. // remove the processed parameter
  2245. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2246. }
  2247. }
  2248. }
  2249. //START
  2250. vcalendar_element=vtodo.match(vCalendar.pre['contentline_DTSTART']);
  2251. if(vcalendar_element!=null)
  2252. {
  2253. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2254. vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash] = new Array();
  2255. vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplC['VTcontentline_E_DTSTART'];
  2256. vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2257. var pars=vcalendarSplitParam(parsed[3]);
  2258. var parString='';
  2259. for(var i=0;i<pars.length;i++)
  2260. {
  2261. if(pars[i]!='VALUE=DATE' && pars[i].indexOf('TZID=')==-1 && pars[i]!='')
  2262. parString+=';'+pars[i];
  2263. }
  2264. vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);
  2265. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2266. if(parsed[1]!='')
  2267. {
  2268. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2269. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2270. {
  2271. // append the parameter to its parent
  2272. vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2273. // remove the processed parameter
  2274. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2275. }
  2276. }
  2277. }
  2278. //UID
  2279. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_UID'], 'mi'));
  2280. if(vcalendar_element!=null)
  2281. {
  2282. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2283. vCalendar.tplM['VTcontentline_UID'][repeatHash] = new Array();
  2284. vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplC['VTcontentline_UID'];
  2285. vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2286. vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2287. vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##uid##:::##/g,parsed[4]);
  2288. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2289. if(parsed[1]!='')
  2290. {
  2291. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2292. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2293. {
  2294. // append the parameter to its parent
  2295. vCalendar.tplM['VTcontentline_UID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2296. // remove the processed parameter
  2297. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2298. }
  2299. }
  2300. }
  2301. //LAST-MODIFIED
  2302. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_LM'], 'mi'));
  2303. if(vcalendar_element!=null)
  2304. {
  2305. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2306. vCalendar.tplM['VTcontentline_LM'][repeatHash]=new Array();
  2307. vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplC['VTcontentline_LM'];
  2308. vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplM['VTcontentline_LM'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2309. vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplM['VTcontentline_LM'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2310. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2311. if(parsed[1]!='')
  2312. {
  2313. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2314. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2315. {
  2316. // append the parameter to its parent
  2317. vCalendar.tplM['VTcontentline_LM'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2318. // remove the processed parameter
  2319. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2320. }
  2321. }
  2322. }
  2323. //DTSTAMP
  2324. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_DTSTAMP'], 'mi'));
  2325. if(vcalendar_element!=null)
  2326. {
  2327. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2328. vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash] = new Array();
  2329. vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplC['VTcontentline_DTSTAMP'];
  2330. vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2331. vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2332. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2333. if(parsed[1]!='')
  2334. {
  2335. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2336. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2337. {
  2338. // append the parameter to its parent
  2339. vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
  2340. // remove the processed parameter
  2341. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2342. }
  2343. }
  2344. }
  2345. var i=-1;
  2346. while(vtodo.match(vCalendar.pre['contentline_EXDATE'])!= null)
  2347. {
  2348. i++;
  2349. vcalendar_element=vtodo.match(vCalendar.pre['contentline_EXDATE']);
  2350. if(vcalendar_element!=null)
  2351. {
  2352. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2353. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash]=new Array();
  2354. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplC['VTcontentline_EXDATE'];
  2355. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2356. var pars=vcalendarSplitParam(parsed[3]);
  2357. var parString='', dateStr='';
  2358. for(var j=0;j<pars.length;j++)
  2359. {
  2360. if(pars[j]!='VALUE=DATE' && pars[j]!='')
  2361. parString+=';'+pars[j];
  2362. if(pars[j]=='VALUE=DATE')
  2363. dateStr=pars[j];
  2364. }
  2365. if(dateStr.indexOf('VALUE=DATE')!=-1)
  2366. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##AllDay##:::##/g, ';VALUE=DATE');
  2367. else
  2368. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##AllDay##:::##/g, '');
  2369. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##TZID##:::##/g, '');
  2370. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##params_wsc##:::##/g, parString);
  2371. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##value##:::##/g,parsed[4]);
  2372. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2373. if(parsed[1]!='')
  2374. {
  2375. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2376. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2377. {
  2378. // append the parameter to its parent
  2379. vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]+=vcalendar_element_related[0].substr(2);
  2380. // remove the processed parameter
  2381. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2382. }
  2383. }
  2384. }
  2385. }
  2386. //COMPLETED
  2387. vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_COMPLETED'], 'mi'));
  2388. if(vcalendar_element!=null)
  2389. {
  2390. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2391. vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash] = {};
  2392. vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplC['VTcontentline_COMPLETED'];
  2393. vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec].replace(/##:::##group_wd##:::##/g, parsed[1]);
  2394. vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec].replace(/##:::##params_wsc##:::##/g, parsed[3]);
  2395. vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
  2396. if(parsed[1]!='')
  2397. {
  2398. var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
  2399. while ((vcalendar_element_related=vtodo.match(re))!=null)
  2400. {
  2401. // append the parameter to its parent
  2402. vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]+=vcalendar_element_related[0].substr(2);
  2403. // remove the processed parameter
  2404. vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
  2405. }
  2406. }
  2407. }
  2408. if(vcalendar.indexOf('\r\n')==0)
  2409. vcalendar=vcalendar.substring(2, vcalendar.length-2);
  2410. if(vcalendar.lastIndexOf('\r\n')!=(vcalendar.length-2))
  2411. vcalendar+='\r\n';
  2412. vCalendar.tplM['VTunprocessedVTODO'][repeatHash]={};
  2413. vCalendar.tplM['VTunprocessedVTODO'][repeatHash][rec]=vtodo;
  2414. // if(vTimeZone!='')
  2415. // vcalendar+=vTimeZone;
  2416. isThisTODO=false;
  2417. }
  2418. if(vcalendar.indexOf('\r\n')==0)
  2419. vcalendar=vcalendar.substring(2, vcalendar.length-2);
  2420. if(vcalendar.lastIndexOf('\r\n')!=(vcalendar.length-2))
  2421. vcalendar+='\r\n';
  2422. vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash]=vTimeZone;
  2423. vCalendar.tplM['VTunprocessed'][repeatHash]=vcalendar;
  2424. }
  2425. function vcalendarTodoData(inputCollection, inputEvent, isNew)
  2426. {
  2427. var vcalendarOrig=inputEvent.vcalendar;
  2428. var todoArray=new Array();
  2429. var preTodoArray=new Array();
  2430. if((check=inputEvent.vcalendar.match(vCalendar.pre['vtodo']))==null)
  2431. {
  2432. console.log("Error: '"+inputEvent.uid+"': unable to parse vTodo");
  2433. return false;
  2434. }
  2435. //CHECK CALSCALE
  2436. var elem=vcalendarOrig.match(vCalendar.pre['contentline_CALSCALE']);
  2437. if(elem!=null)
  2438. {
  2439. var calscale=elem[0].match(vCalendar.pre['contentline_parse'])[4];
  2440. if(calscale!='GREGORIAN')
  2441. {
  2442. console.log("Error:'"+inputEvent.uid+"': Unsupported calscale in:"+vcalendarOrig);
  2443. return false;
  2444. }
  2445. }
  2446. //CHECK VERSION
  2447. var elemV=vcalendarOrig.match(vCalendar.pre['contentline_VERSION']);
  2448. if(elemV!=null)
  2449. {
  2450. var ver=elemV[0].match(vCalendar.pre['contentline_parse'])[4];
  2451. if(ver!='2.0')
  2452. {
  2453. console.log("Error:'"+inputEvent.uid+"': Unsupported version ("+ver+") in:"+vcalendarOrig);
  2454. return false;
  2455. }
  2456. }
  2457. //FIX TIMEZONE
  2458. var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE');
  2459. var startEndTimeZone=vcalendarOrig.indexOf('END:VTIMEZONE');
  2460. var endTimeZone=0;
  2461. while(vcalendarOrig.indexOf('BEGIN:VTIMEZONE')!=-1)
  2462. if(beginTimeZone!=-1 && startEndTimeZone!=-1)
  2463. {
  2464. for(i=(startEndTimeZone+2);i<vcalendarOrig.length;i++)
  2465. {
  2466. if(vcalendarOrig.charAt(i)=='\n')
  2467. {
  2468. endTimeZone=i+1;
  2469. break;
  2470. }
  2471. }
  2472. vTimeZone=vcalendarOrig.substring(beginTimeZone, endTimeZone);
  2473. vcalendarOrig=vcalendarOrig.substring(0, beginTimeZone)+vcalendarOrig.substring(endTimeZone, vcalendarOrig.length);
  2474. }
  2475. var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1);
  2476. var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length);
  2477. var recurrence_id_array=new Array();
  2478. while(vcalendarOrig.match(vCalendar.pre['vtodo'])!=null)
  2479. {
  2480. if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2, vcalendarOrig.indexOf('BEGIN:VTODO'))=='\r\n')
  2481. {
  2482. var partTodo=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2,vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
  2483. vcalendarOrig=vcalendarOrig.replace(partTodo, '');
  2484. }
  2485. else
  2486. {
  2487. var partTodo=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO'),vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
  2488. vcalendarOrig=vcalendarOrig.replace(partTodo, '');
  2489. partTodo+='\r\n';
  2490. }
  2491. var rec_array=partTodo.match(vCalendar.pre['contentline_RECURRENCE_ID']);
  2492. var uidString=partTodo.match(vCalendar.pre['contentline_UID']);
  2493. if(uidString!=null && rec_array!=null)
  2494. recurrence_id_array[recurrence_id_array.length]=rec_array[0].match(vCalendar.pre['contentline_parse'])[4]+';'+uidString[0].match(vCalendar.pre['contentline_parse'])[4];
  2495. todoArray[todoArray.length]=partTodo;
  2496. }
  2497. if(todoArray.length==0)
  2498. return false;
  2499. var repeatHashEquals = false;
  2500. for(var toIt=0; toIt<todoArray.length; toIt++)
  2501. {
  2502. var oo='',
  2503. note='',
  2504. start='',
  2505. end='',
  2506. title='',
  2507. all=false,
  2508. frequency='',
  2509. until='',
  2510. complete='',
  2511. isUntilDate=false,
  2512. alertTime=new Array(),
  2513. alertNote=new Array(),
  2514. alertTimeOut=new Array(),
  2515. valOffsetFrom='',
  2516. tzName='local',
  2517. classType='',
  2518. url='',
  2519. tmpObj='',
  2520. isRepeat=false,
  2521. intOffset='',
  2522. realStart='',
  2523. realEnd='',
  2524. interval='',
  2525. until='',
  2526. completedOn='',
  2527. location='',
  2528. isUntilDate=false,
  2529. wkst='',
  2530. byMonthDay='',
  2531. byDay='',
  2532. rec_id='',
  2533. created='',
  2534. repeatHash='',
  2535. returnForValue = true,
  2536. pars=new Array();
  2537. var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1);
  2538. var status='',filterStatus='',renderPriority=0,
  2539. percent="0",
  2540. priority="0",
  2541. alarms=new Array();
  2542. var vcalendar=inputEvent.vcalendar;
  2543. var dates = new Array();
  2544. var vcalendar=todoArray[toIt];
  2545. var stringUID=vcalendar.match(vCalendar.pre['contentline_UID']);
  2546. if(stringUID!=null)
  2547. stringUID=stringUID[0].match(vCalendar.pre['contentline_parse'])[4];
  2548. var exDates=new Array();
  2549. var exDate=null;
  2550. var exDate_array=new Array();
  2551. var vcalendar2=vcalendar+'';
  2552. while(vcalendar2.match(vCalendar.pre['contentline_EXDATE'])!= null)
  2553. {
  2554. exDate=vcalendar2.match(vCalendar.pre['contentline_EXDATE']);
  2555. exDate_array[exDate_array.length]=exDate[0];
  2556. vcalendar2=vcalendar2.replace(exDate,'\r\n');
  2557. }
  2558. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RRULE2']);
  2559. if(vcalendar_element!=null)
  2560. {
  2561. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2562. // if(parsed[4].indexOf('BYSETPOS')!=-1 || parsed[4].indexOf('BYWEEKNO')!=-1)
  2563. // {
  2564. // console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar);
  2565. // return false;
  2566. // }
  2567. pars=parsed[4].split(';');
  2568. var parString='';
  2569. if(pars.length>0)
  2570. isRepeat=true;
  2571. for(var i=0;i<pars.length;i++)
  2572. {
  2573. if(pars[i].indexOf('FREQ=')!=-1)
  2574. frequency=pars[i].split('=')[1];
  2575. else if(pars[i].indexOf('INTERVAL=')!=-1)
  2576. interval=pars[i].split('=')[1];
  2577. else if(pars[i].indexOf('COUNT=')!=-1)
  2578. {
  2579. until=pars[i].split('=')[1];
  2580. if(until==0)
  2581. {
  2582. returnForValue = false;
  2583. break
  2584. }
  2585. else if(isNaN(until))
  2586. {
  2587. returnForValue = false;
  2588. break
  2589. }
  2590. }
  2591. else if(pars[i].indexOf('UNTIL=')!=-1)
  2592. {
  2593. isUntilDate=true;
  2594. until=pars[i].split('=')[1];
  2595. }
  2596. else if(pars[i].indexOf('WKST=')!=-1)
  2597. {
  2598. wkst=pars[i].split('=')[1].replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0);
  2599. if(globalSettings.mozillasupport.value!=null && globalSettings.mozillasupport.value)
  2600. wkst='';
  2601. }
  2602. else if(pars[i].indexOf('BYMONTHDAY=')!=-1)
  2603. byMonthDay=pars[i].split('=')[1];
  2604. else if(pars[i].indexOf('BYDAY=')!=-1)
  2605. {
  2606. byDay=pars[i].split('=')[1];
  2607. byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(',');
  2608. if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY'))
  2609. {
  2610. console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar);
  2611. return false;
  2612. }
  2613. }
  2614. }
  2615. if(!returnForValue)
  2616. return false;
  2617. if(!interval)
  2618. interval=1;
  2619. }
  2620. var help1 = '';
  2621. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTSTART']);
  2622. if(vcalendar_element!=null)
  2623. {
  2624. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2625. start=parsed[4];
  2626. help1=start;
  2627. if(help1.indexOf("T")==-1)
  2628. {
  2629. help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8);
  2630. all=true;
  2631. }
  2632. else
  2633. {
  2634. help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15);
  2635. all=false;
  2636. }
  2637. var t=$.fullCalendar.parseDate(help1);
  2638. start=help1;
  2639. if(t==null)
  2640. return false;
  2641. if((t.toString())=='Invalid Date')
  2642. return false;
  2643. if(exDate_array!=null)
  2644. for(var j=0;j<exDate_array.length;j++)
  2645. {
  2646. var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4];
  2647. if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1)
  2648. var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1);
  2649. else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1)
  2650. var utcTime=exString.parseComnpactISO8601();
  2651. else
  2652. {
  2653. if(start.indexOf('T')!=-1)
  2654. exString += 'T' + $.fullCalendar.formatDate(t,'HHmmss');
  2655. var utcTime=exString.parseComnpactISO8601();
  2656. }
  2657. exDates[exDates.length]=new Date(utcTime).toString();
  2658. }
  2659. var dtStartTimezone=parsed[3].split('=');
  2660. if(!all)
  2661. {
  2662. if(parsed[4].charAt(parsed[4].length-1)=='Z')
  2663. tzName='UTC';
  2664. if(dtStartTimezone.length>1 || tzName=='UTC')
  2665. {
  2666. if(tzName!='UTC')
  2667. tzName=$.trim(dtStartTimezone[1]);
  2668. var finTZ = checkTimezone(tzName);
  2669. if(finTZ!=null)
  2670. tzName = finTZ;
  2671. if(globalSettings.timezonesupport.value && tzName in timezones)
  2672. {
  2673. valOffsetFrom=getOffsetByTZ(tzName, t);
  2674. intOffset=(getLocalOffset(t)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000;
  2675. }
  2676. }
  2677. else if(processedTimezones.indexOf(tzName)==-1)
  2678. {
  2679. if(timeZonesEnabled.indexOf(tzName)==-1)
  2680. timeZonesEnabled.push('local');
  2681. processedTimezones.push('local');
  2682. }
  2683. if(tzName!='' && tzName != 'local')
  2684. if(processedTimezones.indexOf(tzName)==-1)
  2685. {
  2686. if(timeZonesEnabled.indexOf(tzName)==-1)
  2687. timeZonesEnabled.push(tzName);
  2688. processedTimezones.push(tzName);
  2689. }
  2690. }
  2691. realStart=start;
  2692. if(help1.indexOf("T")!=-1)
  2693. {
  2694. if(intOffset!='')
  2695. t.setTime(t.getTime()+intOffset);
  2696. start=$.fullCalendar.formatDate(t,'u');
  2697. }
  2698. inputEvent.start=$.fullCalendar.parseDate(start);
  2699. }
  2700. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DUE']);
  2701. if(vcalendar_element!=null)
  2702. {
  2703. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2704. end=parsed[4];
  2705. var help=end;
  2706. var oldEnd = '';
  2707. if(help.indexOf("T")==-1)
  2708. {
  2709. help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8);
  2710. var d=$.fullCalendar.parseDate(help);
  2711. var da=new Date(d.getTime());
  2712. if(help1.indexOf("T")==-1)
  2713. da.setDate(da.getDate()-1);
  2714. help=$.fullCalendar.formatDate(da, "yyyy-MM-dd");
  2715. all=true;
  2716. oldEnd = help;
  2717. if(help1.indexOf("T")!=-1)
  2718. {
  2719. all=false;
  2720. help+='T00:00:00';
  2721. if(tzName == 'UTC')
  2722. help+='Z';
  2723. }
  2724. }
  2725. else
  2726. {
  2727. help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8)+'T'+help.substring(9, 11)+':'+help.substring(11, 13)+':'+help.substring(13, 15);
  2728. oldEnd = help;
  2729. all=false;
  2730. }
  2731. end=help;
  2732. var t1=$.fullCalendar.parseDate(end);
  2733. if(t1==null)
  2734. return false;
  2735. if((t1.toString())=='Invalid Date')
  2736. return false;
  2737. if(exDate_array!=null && exDates.length==0)
  2738. for(var j=0;j<exDate_array.length;j++)
  2739. {
  2740. var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4];
  2741. if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1)
  2742. var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1);
  2743. else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1)
  2744. var utcTime=exString.parseComnpactISO8601();
  2745. else
  2746. {
  2747. if(end.indexOf('T')!=-1)
  2748. exString += 'T' + $.fullCalendar.formatDate(t1,'HHmmss');
  2749. var utcTime=exString.parseComnpactISO8601();
  2750. }
  2751. exDates[exDates.length]=new Date(utcTime).toString();
  2752. }
  2753. if(intOffset=='' && (help1.indexOf("T")!=-1 || oldEnd.indexOf("T")!=-1))
  2754. {
  2755. var dtStartTimezone=parsed[3].split('=');
  2756. if(parsed[4].charAt(parsed[4].length-1)=='Z')
  2757. tzName='UTC';
  2758. if(dtStartTimezone.length>1 || tzName=='UTC')
  2759. {
  2760. if(tzName!='UTC' && oldEnd.indexOf("T")!=-1)
  2761. tzName=$.trim(dtStartTimezone[1]);
  2762. var finTZ = checkTimezone(tzName);
  2763. if(finTZ!=null)
  2764. tzName = finTZ;
  2765. if(globalSettings.timezonesupport.value && tzName in timezones)
  2766. {
  2767. valOffsetFrom=getOffsetByTZ(tzName, t1);
  2768. intOffset=(getLocalOffset(t1)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000;
  2769. }
  2770. }
  2771. }
  2772. realEnd=help;
  2773. if(globalSettings.appleremindersmode.value)
  2774. realStart=help;
  2775. if(help.indexOf("T")!=-1)
  2776. {
  2777. if(intOffset!='')
  2778. t1.setTime(t1.getTime()+intOffset);
  2779. end=$.fullCalendar.formatDate(t1,'u');
  2780. }
  2781. inputEvent.end=end;
  2782. if(globalSettings.appleremindersmode.value)
  2783. start=end;
  2784. }
  2785. if(globalSettings.appleremindersmode.value && realEnd=='' && realStart!='')
  2786. {
  2787. realStart='';
  2788. start='';
  2789. }
  2790. var finalAString='';
  2791. var valarm=vcalendar.match(vCalendar.pre['valarm']);
  2792. if(valarm!=null)
  2793. {
  2794. vcalendar=vcalendar.replace(valarm[0], '');
  2795. var alarmString='';
  2796. var alarmArray=new Array();
  2797. for(var i=0;i<valarm[0].length;i++)
  2798. {
  2799. if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM')
  2800. {
  2801. alarmArray[alarmArray.length]=alarmString+'\r\n';
  2802. alarmString='';
  2803. }
  2804. alarmString+=valarm[0][i];
  2805. }
  2806. for(var j=0;j<alarmArray.length;j++)
  2807. {
  2808. if(alarmArray[j].indexOf('\r\n')==0 && finalAString.lastIndexOf('\r\n')==(finalAString.length-2))
  2809. finalAString+=alarmArray[j].substring(2,alarmArray[j].length);
  2810. else if((alarmArray[j].indexOf('\r\n')==0 && finalAString.lastIndexOf('\r\n')!=(finalAString.length-2)) || (alarmArray[j].indexOf('\r\n')!=0 && finalAString.lastIndexOf('\r\n')==(finalAString.length-2)) )
  2811. finalAString+=alarmArray[j];
  2812. else
  2813. finalAString+='\r\n'+alarmArray[j];
  2814. checkA=alarmArray[j].match(vCalendar.re['valarm']);
  2815. if(checkA!=null)
  2816. {
  2817. action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']);
  2818. if(action!=null)
  2819. parsed=action[0].match(vCalendar.pre['contentline_parse']);
  2820. else
  2821. break;
  2822. trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']);
  2823. if(trigger!=null)
  2824. {
  2825. parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']);
  2826. if(parsed!=null)
  2827. {
  2828. value=parsed[4];
  2829. var checkD=value.match(vCalendar.pre['date-time-value']);
  2830. var intOffsetA='';
  2831. var tzNameA='';
  2832. if(checkD!=null)
  2833. {
  2834. if(parsed[3])
  2835. var dtStartTimezoneA=parsed[3].split('=');
  2836. var alarmTimeA=$.fullCalendar.parseDate(value.substring(0, 4)+'-'+value.substring(4, 6)+'-'+value.substring(6, 8)+'T'+value.substring(9, 11)+':'+value.substring(11, 13)+':'+value.substring(13, 15));
  2837. if(value.charAt(value.length-1)=='Z')
  2838. tzNameA='UTC';
  2839. if(dtStartTimezoneA.length>1 || tzNameA=='UTC')
  2840. {
  2841. if(tzNameA!='UTC' && dtStartTimezoneA[0]==';TZID')
  2842. tzNameA=$.trim(dtStartTimezoneA[1]);
  2843. var finTZ = checkTimezone(tzNameA);
  2844. if(finTZ!=null)
  2845. tzNameA = finTZ;
  2846. if(globalSettings.timezonesupport.value && tzNameA in timezones)
  2847. {
  2848. var valOffsetFromA=getOffsetByTZ(tzNameA, alarmTimeA);
  2849. if(tzName != 'local')
  2850. intOffsetA=getOffsetByTZ(tzName, alarmTimeA).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000;
  2851. else
  2852. intOffsetA=-1*getLocalOffset(alarmTimeA)*1000-valOffsetFromA.getSecondsFromOffset()*1000;
  2853. }
  2854. }
  2855. else if(processedTimezones.indexOf(tzName)==-1)
  2856. {
  2857. if(timeZonesEnabled.indexOf(tzName)==-1)
  2858. timeZonesEnabled.push('local');
  2859. processedTimezones.push('local');
  2860. }
  2861. if(tzNameA!='' && tzName != 'local')
  2862. if(processedTimezones.indexOf(tzNameA)==-1)
  2863. {
  2864. if(timeZonesEnabled.indexOf(tzNameA)==-1)
  2865. timeZonesEnabled.push(tzNameA);
  2866. processedTimezones.push(tzNameA);
  2867. }
  2868. if(intOffsetA!='')
  2869. alarmTimeA.setTime(alarmTimeA.getTime()+intOffsetA);
  2870. alertTime[j]=$.fullCalendar.formatDate(alarmTimeA,"yyyy-MM-dd'T'HH:mm:ss");
  2871. }
  2872. else
  2873. {
  2874. alertTime[j]=0;
  2875. if(value.indexOf('W')!=-1)
  2876. alertTime[j]=parseAlarmWeek(value);
  2877. else if(value.indexOf('D')!=-1)
  2878. alertTime[j]=parseAlarmDay(value);
  2879. else if(value.indexOf('T')!=-1)
  2880. alertTime[j]=parseAlarmTime(value);
  2881. if(parsed[4].charAt(0)=="-")
  2882. alertTime[j]="-"+alertTime[j];
  2883. else
  2884. alertTime[j]="+"+alertTime[j];
  2885. }
  2886. }
  2887. }
  2888. else
  2889. break;
  2890. alnote=alarmArray[j].match(vCalendar.pre['contentline_NOTE']);
  2891. if(alnote!=null)
  2892. {
  2893. parsed=alnote[0].match(vCalendar.pre['contentline_parse']);
  2894. alertNote[j]=parsed[4];
  2895. }
  2896. else
  2897. alertNote[j]='Default note';
  2898. }
  2899. }
  2900. }
  2901. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_LOCATION']);
  2902. if(vcalendar_element!=null)
  2903. {
  2904. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2905. location=vcalendarUnescapeValue(parsed[4]);
  2906. }
  2907. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_NOTE']);
  2908. if(vcalendar_element!=null)
  2909. {
  2910. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2911. note=vcalendarUnescapeValue(parsed[4]);
  2912. }
  2913. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CLASS']);
  2914. if(vcalendar_element!=null)
  2915. {
  2916. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2917. classType=vcalendarUnescapeValue(parsed[4]);
  2918. }
  2919. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_URL']);
  2920. if(vcalendar_element!=null)
  2921. {
  2922. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2923. url=vcalendarUnescapeValue(parsed[4]);
  2924. }
  2925. //NEEDS-ACTION
  2926. //COMPLETED
  2927. //IN-PROCESS
  2928. //CANCELLED
  2929. //PERCENT-COMPLETE
  2930. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RECURRENCE_ID']);
  2931. if(vcalendar_element!=null)
  2932. {
  2933. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2934. var rec=parsed[4];
  2935. /*if(rec.indexOf("T")==-1)
  2936. {
  2937. rec=rec.substring(0, 4)+'/'+rec.substring(4, 6)+'/'+rec.substring(6, 8);
  2938. var d=$.fullCalendar.parseDate(rec);
  2939. var da=new Date(d.getTime()-1*24*60*60*1000);
  2940. var day=da.getDate();
  2941. if(day<10)
  2942. day='0'+day;
  2943. var month=da.getMonth();
  2944. month++;
  2945. if(month<10)
  2946. month='0'+month;
  2947. rec=da.getFullYear()+'-'+month+'-'+day;
  2948. }
  2949. else
  2950. rec=rec.substring(0, 4)+'-'+rec.substring(4, 6)+'-'+rec.substring(6, 8)+'T'+rec.substring(9, 11)+':'+rec.substring(11, 13)+':'+rec.substring(13, 15);
  2951. rec_id=$.fullCalendar.parseDate(rec);*/
  2952. //if(!rec_id || rec_id=='Invalid Date')
  2953. // rec_id='';
  2954. rec_id=rec;
  2955. }
  2956. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_SUMMARY']);
  2957. if(vcalendar_element!=null)
  2958. {
  2959. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2960. title=vcalendarUnescapeValue(parsed[4]);
  2961. }
  2962. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CREATED']);
  2963. if(vcalendar_element!=null)
  2964. {
  2965. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2966. created=vcalendarUnescapeValue(parsed[4]);
  2967. }
  2968. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_STATUS']);
  2969. if(vcalendar_element!=null)
  2970. {
  2971. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2972. status=vcalendarUnescapeValue(parsed[4]);
  2973. }
  2974. if(globalSettings.appleremindersmode.value && (status=='IN-PROCESS' || status=='CANCELLED'))
  2975. status = 'NEEDS-ACTION';
  2976. switch(status)
  2977. {
  2978. case 'NEEDS-ACTION':
  2979. filterStatus = 'filterAction';
  2980. break;
  2981. case 'COMPLETED':
  2982. filterStatus = 'filterCompleted';
  2983. break;
  2984. case 'IN-PROCESS':
  2985. filterStatus = 'filterProgress';
  2986. break;
  2987. case 'CANCELLED':
  2988. filterStatus = 'filterCanceled';
  2989. break;
  2990. default:
  2991. filterStatus = 'filterAction';
  2992. break;
  2993. }
  2994. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_COMPLETED']);
  2995. if(vcalendar_element!=null)
  2996. {
  2997. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  2998. var tmpDate=parsed[4];
  2999. if(tmpDate.indexOf("T")!=-1)
  3000. tmpDate=tmpDate.substring(0, 4)+'-'+tmpDate.substring(4, 6)+'-'+tmpDate.substring(6, 8)+'T'+tmpDate.substring(9, 11)+':'+tmpDate.substring(11, 13)+':'+tmpDate.substring(13, 15);
  3001. var t1=$.fullCalendar.parseDate(tmpDate);
  3002. if(t1==null || ((t1.toString())=='Invalid Date'))
  3003. completedOn='';
  3004. else
  3005. completedOn=new Date(t1.getTime());
  3006. if(completedOn!='')
  3007. {
  3008. var intOffsetA='';
  3009. var dtStartTimezoneA = new Array();
  3010. if(parsed[3])
  3011. dtStartTimezoneA=parsed[3].split('=');
  3012. if(parsed[4].charAt(parsed[4].length-1)=='Z')
  3013. tzNameA='UTC';
  3014. if(dtStartTimezoneA.length>1 || tzNameA=='UTC')
  3015. {
  3016. if(tzNameA!='UTC')
  3017. tzNameA=$.trim(dtStartTimezoneA[1]);
  3018. var finTZ = checkTimezone(tzNameA);
  3019. if(finTZ!=null)
  3020. tzNameA = finTZ;
  3021. if(globalSettings.timezonesupport.value && tzNameA in timezones)
  3022. {
  3023. var valOffsetFromA=getOffsetByTZ(tzNameA, completedOn);
  3024. intOffsetA=getOffsetByTZ(tzName, completedOn).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000;
  3025. }
  3026. }
  3027. else if(processedTimezones.indexOf(tzName)==-1)
  3028. {
  3029. if(timeZonesEnabled.indexOf(tzName)==-1)
  3030. timeZonesEnabled.push('local');
  3031. processedTimezones.push('local');
  3032. }
  3033. if(tzName!='' && tzName != 'local')
  3034. if(processedTimezones.indexOf(tzNameA)==-1)
  3035. {
  3036. if(timeZonesEnabled.indexOf(tzNameA)==-1)
  3037. timeZonesEnabled.push(tzNameA);
  3038. processedTimezones.push(tzNameA);
  3039. }
  3040. if(intOffsetA!='')
  3041. completedOn.setTime(completedOn.getTime()+intOffsetA);
  3042. }
  3043. }
  3044. if(status=='COMPLETED' && completedOn=='' && end!='' && typeof end=='object')
  3045. completedOn=new Date(end.getTime());
  3046. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PERCENT-COMPLETE']);
  3047. if(vcalendar_element!=null)
  3048. {
  3049. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  3050. complete=vcalendarUnescapeValue(parsed[4]);
  3051. percent=complete;
  3052. }
  3053. vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PRIORITY']);
  3054. if(vcalendar_element!=null)
  3055. {
  3056. parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
  3057. priority=vcalendarUnescapeValue(parsed[4]);
  3058. var priorN = parseInt(priority,10);
  3059. if(!isNaN(priorN))
  3060. {
  3061. if(priority>5 && priority<10)
  3062. renderPriority=3;
  3063. else if(priority<5 && priority>0)
  3064. renderPriority=1;
  3065. else if(priority==5)
  3066. renderPriority=2;
  3067. else
  3068. renderPriority=0;
  3069. }
  3070. }
  3071. var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length);
  3072. var todos='',
  3073. p=0;
  3074. var isChange=false;
  3075. if(isRepeat &&(realStart || realEnd))
  3076. repeatHash=inputEvent.uid+'#'+created+'#'+frequency;
  3077. else if(!isRepeat)
  3078. repeatHash=inputEvent.uid+'#'+created+'#'+rec_id;
  3079. if(percent!='' && percent!='0' && percent!='100' && percent!='50')
  3080. {
  3081. if(typeof globalTodolistStatusArray[repeatHash]=='undefined')
  3082. globalTodolistStatusArray[repeatHash] = {};
  3083. globalTodolistStatusArray[repeatHash].percent = percent;
  3084. }
  3085. if(!isNew && !repeatHashEquals)
  3086. {
  3087. var checkForChangeTodo=findEventInArray(inputEvent.uid, false, globalCalTodo!=null ? globalCalTodo.repeatHash : null);
  3088. if(checkForChangeTodo!='')
  3089. {
  3090. if(checkForChangeTodo.etag!=inputEvent.etag || ($('#showTODO').val()==inputEvent.uid && ($('#repeatTodo').val()=="true" || $('#recurrenceIDTODO').val()!='') && !repeatHashEquals))
  3091. {
  3092. for(var it=0; it<checkForChangeTodo.alertTimeOut.length; it++)
  3093. clearTimeout(checkForChangeTodo.alertTimeOut[it]);
  3094. if($('#showTODO').val()==inputEvent.uid)
  3095. {
  3096. if($('#repeatTodo').val()=="true" || $('#recurrenceIDTODO').val()!='')
  3097. {
  3098. if(!(typeof globalCalTodo!='undefined' && globalCalTodo!=null && globalCalTodo.repeatHash == repeatHash))
  3099. {
  3100. var name=globalCalTodo.title;
  3101. //showTodoForm({title: name, id:inputEvent.uid}, 'show','', true);
  3102. $('#editAllTODO').css('visibility','hidden');
  3103. $('#editFutureTODO').css('visibility','hidden');
  3104. $('#editOnlyOneTODO').css('visibility','hidden');
  3105. $('#repeatConfirmBoxContentTODO').html('<b>'+name+"</b> "+localization[globalInterfaceLanguage].repeatChangeTxt);
  3106. $('#repeatConfirmBoxQuestionTODO').html(localization[globalInterfaceLanguage].repeatTodoChangeTxtClose);
  3107. }
  3108. else
  3109. {
  3110. isChange=true;
  3111. repeatHashEquals=true;
  3112. $('#todoList').fullCalendar('selectEvent');
  3113. }
  3114. }
  3115. else
  3116. isChange=true;
  3117. }
  3118. }
  3119. }
  3120. }
  3121. var res=0;
  3122. var index=0;
  3123. for(var p=0;p<globalResourceCalDAVList.TodoCollections.length;p++)
  3124. if(typeof globalResourceCalDAVList.TodoCollections[p].uid !='undefined' && globalResourceCalDAVList.TodoCollections[p].uid==inputCollection.uid)
  3125. {
  3126. index=p;
  3127. break;
  3128. }
  3129. var re=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]+/)([^/]*)', 'i');
  3130. var tmp=rid.match(re);
  3131. var firstPart=index.pad(String(globalResourceCalDAVList.TodoCollections.length).length);
  3132. var compareString=(firstPart + title).toLowerCase();
  3133. var isall=false;
  3134. if(isRepeat &&(realStart || realEnd))
  3135. {
  3136. var firstDateSaved = false;
  3137. if(globalAppleSupport.nextDates[inputEvent.uid]!=undefined)
  3138. delete globalAppleSupport.nextDates[inputEvent.uid];
  3139. var ruleString=vcalendar.match(vCalendar.pre['contentline_RRULE2'])[0].match(vCalendar.pre['contentline_parse'])[4];
  3140. inputEvent.isRepeat=true;
  3141. if(realStart)
  3142. var varDate=new Date($.fullCalendar.parseDate(realStart).getTime());
  3143. else if(realEnd)
  3144. var varDate=new Date($.fullCalendar.parseDate(realEnd).getTime());
  3145. if(realEnd)
  3146. var varEndDate=new Date($.fullCalendar.parseDate(realEnd).getTime());
  3147. var lastGenDate='';
  3148. var repeatStart='', repeatEnd='';
  3149. if(realStart)
  3150. repeatStart=new Date(varDate.getTime());
  3151. if(realEnd)
  3152. repeatEnd=new Date(varEndDate.getTime());
  3153. var untilDate='',
  3154. realUntilDate='',
  3155. realUntil='';
  3156. if(until!=='')
  3157. {
  3158. if(isUntilDate)
  3159. {
  3160. if(until.indexOf('T')!=-1)
  3161. {
  3162. var uString = until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)+'T'+until.substring(9, 11)+':'+until.substring(11, 13)+':'+until.substring(13, 15);
  3163. var ut=$.fullCalendar.parseDate(uString);
  3164. if(ut==null)
  3165. return false;
  3166. if(ut.toString()=='Invalid Date')
  3167. return false;
  3168. if(globalSettings.timezonesupport.value && tzName in timezones)
  3169. valOffsetFrom=getOffsetByTZ(tzName, ut);
  3170. if(valOffsetFrom)
  3171. {
  3172. var intOffset=valOffsetFrom.getSecondsFromOffset()*1000;
  3173. ut.setTime(ut.getTime()+intOffset);
  3174. }
  3175. untilDate = new Date(ut.getTime());
  3176. }
  3177. else
  3178. {
  3179. untilDate=$.fullCalendar.parseDate(until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8));
  3180. if(realStart!='')
  3181. {
  3182. untilDate.setHours($.fullCalendar.parseDate(realStart).getHours());
  3183. untilDate.setMinutes($.fullCalendar.parseDate(realStart).getMinutes());
  3184. untilDate.setSeconds($.fullCalendar.parseDate(realStart).getSeconds());
  3185. }
  3186. else if(realEnd!='')
  3187. {
  3188. untilDate.setHours($.fullCalendar.parseDate(realEnd).getHours());
  3189. untilDate.setMinutes($.fullCalendar.parseDate(realEnd).getMinutes());
  3190. untilDate.setSeconds($.fullCalendar.parseDate(realEnd).getSeconds());
  3191. }
  3192. }
  3193. realUntil='';
  3194. }
  3195. else
  3196. {
  3197. untilDate='';
  3198. realUntil=until;
  3199. }
  3200. realUntilDate=untilDate;
  3201. inputEvent.untilDate=untilDate;
  3202. }
  3203. else
  3204. {
  3205. untilDate=globalToLoadedLimitTodo;
  3206. realUntilDate='';
  3207. inputEvent.untilDate='never';
  3208. }
  3209. var repeatCount=0, realRepeatCount=0;
  3210. var repeatLimit = new Date(globalToLoadedLimitTodo.getTime());
  3211. repeatLimit.setMonth(repeatLimit.getMonth() + 2);
  3212. var dayDifference=0;
  3213. if(realEnd)
  3214. dayDifference=varEndDate.getTime()-varDate.getTime();
  3215. var lastGenDate=generateTodoRepeatInstances({
  3216. dayDifference:dayDifference,
  3217. untilDate:realUntilDate,
  3218. repeatStart:repeatStart,
  3219. repeatEnd:repeatEnd,
  3220. futureRLimit:repeatLimit,
  3221. stringUID:stringUID,
  3222. recurrence_id_array:recurrence_id_array,
  3223. exDates:exDates,
  3224. alertTime:alertTime,
  3225. ignoreAlarms:inputCollection.ignoreAlarms,
  3226. isChange:isChange,
  3227. todoArray:todoArray,
  3228. preTodoArray:preTodoArray,
  3229. realRepeatCount:realRepeatCount,
  3230. repeatCount:repeatCount,
  3231. items:new todoItems(start,end, realUntilDate, frequency, interval, realUntil, wkst, repeatStart, repeatEnd, repeatCount, realRepeatCount, byDay, location, note, title, inputEvent.uid, vcalendar, inputEvent.etag, alertTime, alertNote, status, filterStatus, rec_id, repeatHash, percent, inputEvent.displayValue, rid, compareString, tzName, realStart, realEnd, alertTimeOut,classType,url,completedOn, toIt, priority,renderPriority, finalAString,ruleString)
  3232. });
  3233. }
  3234. else
  3235. {
  3236. if(end!='' && typeof end == 'string')
  3237. {
  3238. var ttt = $.fullCalendar.parseDate(end);
  3239. end=new Date(ttt.getTime());
  3240. }
  3241. if(!inputCollection.ignoreAlarms)
  3242. alertTimeOut=setAlertTimeouts(true, alertTime, start,end, {title:title, status:status},true, inputEvent.uid);
  3243. var tmpObj=new todoItems(start, end, '', '', '', '', '', '', '', '', '', '', location, note, title, inputEvent.uid, vcalendar, inputEvent.etag, alertTime, alertNote, status, filterStatus, rec_id, repeatHash, percent, inputEvent.displayValue, rid, compareString, tzName, realStart, realEnd, alertTimeOut,classType,url,completedOn,toIt, priority,renderPriority, finalAString,'');
  3244. preTodoArray.splice(preTodoArray.length, 0, tmpObj);
  3245. if(isChange)
  3246. globalCalTodo=tmpObj;
  3247. }
  3248. deleteEventFromArray(inputEvent.uid);
  3249. $.merge(globalEventList.displayTodosArray[rid],preTodoArray);
  3250. }
  3251. }