12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548 |
- /*
- CardDavMATE - the open source CardDAV Web Client
- Copyright (C) 2011-2015
- Jan Mate <jan.mate@inf-it.com>
- Andrej Lezo <andrej.lezo@inf-it.com>
- Matej Mihalik <matej.mihalik@inf-it.com>
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- function dataToVcard(accountUID, inputUID, inputFilterUID, inputEtag)
- {
- var vCardText='';
- var groupCounter=0;
- var tmpvCardEditorRef=$('#vCardEditor');
- if(typeof globalDisabledContactAttributes=='undefined' || !(globalDisabledContactAttributes instanceof Array))
- globalDisabledContactAttributes=[];
- // vCard BEGIN (required by RFC)
- if(vCard.tplM['begin']!=null && (process_elem=vCard.tplM['begin'][0])!=undefined)
- vCardText+=vCard.tplM['begin'][0];
- else
- {
- process_elem=vCard.tplC['begin'];
- process_elem=process_elem.replace('##:::##group_wd##:::##','');
- vCardText+=process_elem;
- }
- // VERSION (required by RFC)
- if(vCard.tplM['contentline_VERSION']!=null && (process_elem=vCard.tplM['contentline_VERSION'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_VERSION'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##version##:::##', '3.0');
- }
- vCardText+=process_elem;
- // UID (required by RFC)
- var newUID='';
- if(vCard.tplM['contentline_UID']!=null && (process_elem=vCard.tplM['contentline_UID'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_UID'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- newUID=globalAddressbookList.getNewUID();
- // it is VERY small probability, that for 2 newly created contacts the same UID is generated (but not impossible :( ...)
- process_elem=process_elem.replace('##:::##uid##:::##',newUID);
- }
- vCardText+=process_elem;
- // N (required by RFC)
- if(vCard.tplM['contentline_N']!=null && (process_elem=vCard.tplM['contentline_N'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_N'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##family##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="family"]').val()));
- process_elem=process_elem.replace('##:::##given##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="given"]').val()));
- process_elem=process_elem.replace('##:::##middle##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="middle"]').val()));
- process_elem=process_elem.replace('##:::##prefix##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="prefix"]').val()));
- process_elem=process_elem.replace('##:::##suffix##:::##',vcardEscapeValue(tmpvCardEditorRef.find('[data-type="suffix"]').val()));
- vCardText+=process_elem;
- // FN (extracted from newly created N [previous "process_elem"], required by RFC)
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- // parsed_value = [0]->Family, [1]->Given, [2]->Middle, [3]->Prefix, [4]->Suffix
- parsed_value=vcardSplitValue(parsed[4],';');
- // XXX toto je blbost, v settingsoch predsa musi byt jednoznacne ci sa uklada format A alebo B
- /* backward compatibility for stupid users (remove it in future) */
- if(typeof globalSettings.contactstorefn.value=='string')
- var tmp=globalSettings.contactstorefn.value.replace(RegExp(',', 'g'),', ').split(',');
- else /* new configuration options (arrays) */
- var tmp=globalSettings.contactstorefn.value.slice(); // copy the configuration array
- var first_found=false;
- for(var i=0;i<tmp.length;i++)
- {
- var tmp_found=false;
- if(tmp[i].match(RegExp('surname|lastname|last|family','ig'))!=null)
- {
- if(parsed_value[0]=='')
- tmp[i]='';
- else
- {
- tmp[i]=tmp[i].replace(RegExp((!first_found ? '.*' : '')+'(surname|lastname|last|family)','ig'),parsed_value[0]);
- first_found=true;
- }
- }
- if(tmp[i].match(RegExp('firstname|first|given','ig'))!=null)
- {
- if(parsed_value[1]=='')
- tmp[i]='';
- else
- {
- tmp[i]=tmp[i].replace(RegExp((!first_found ? '.*' : '')+'(firstname|first|given)','ig'),parsed_value[1]);
- first_found=true;
- }
- }
- if(tmp[i].match(RegExp('middlename|middle','ig'))!=null)
- {
- if(parsed_value[2]=='')
- tmp[i]='';
- else
- {
- tmp[i]=tmp[i].replace(RegExp((!first_found ? '.*' : '')+'(middlename|middle)','ig'),parsed_value[2]);
- first_found=true;
- }
- }
- if(tmp[i].match(RegExp('prefix','ig'))!=null)
- {
- if(parsed_value[3]=='')
- tmp[i]='';
- else
- {
- tmp[i]=tmp[i].replace(RegExp((!first_found ? '.*' : '')+'prefix','ig'),parsed_value[3]);
- first_found=true;
- }
- }
- if(tmp[i].match(RegExp('suffix','ig'))!=null)
- {
- if(parsed_value[4]=='')
- tmp[i]='';
- else
- {
- tmp[i]=tmp[i].replace(RegExp((!first_found ? '.*' : '')+'suffix','ig'),parsed_value[4]);
- first_found=true;
- }
- }
- }
- fn_value=tmp.join('');
- if(fn_value=='') //empty FN -> we use the company name as FN
- fn_value=vcardEscapeValue(tmpvCardEditorRef.find('[data-type="org"]').val());
- if(vCard.tplM['contentline_FN']!=null && (process_elem=vCard.tplM['contentline_FN'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_FN'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##fn##:::##',fn_value);
- vCardText+=process_elem;
- // CATEGORIES
- if(globalDisabledContactAttributes.indexOf('CATEGORIES')==-1 && (value=tmpvCardEditorRef.find('[data-type="\\%categories"]').find('input[data-type="value"]').val())!='')
- {
- if(vCard.tplM['contentline_CATEGORIES']!=null && (process_elem=vCard.tplM['contentline_CATEGORIES'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_CATEGORIES'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##', value); // we do not need to escape the value here!
- vCardText+=process_elem;
- }
- // NOTE
- if(globalDisabledContactAttributes.indexOf('NOTE')==-1 && (value=tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').val())!='')
- {
- if(vCard.tplM['contentline_NOTE']!=null && (process_elem=vCard.tplM['contentline_NOTE'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_NOTE'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- vCardText+=process_elem;
- }
- // REV
- if(vCard.tplM['contentline_REV']!=null && (process_elem=vCard.tplM['contentline_REV'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_REV'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- var d = new Date();
- var 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';
- process_elem=process_elem.replace('##:::##value##:::##', utc);
- vCardText+=process_elem;
- // NICKNAME
- if(globalDisabledContactAttributes.indexOf('NICKNAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="nickname"]').val())!='')
- {
- if(vCard.tplM['contentline_NICKNAME']!=null && (process_elem=vCard.tplM['contentline_NICKNAME'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_NICKNAME'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##', vcardEscapeValue(value));
- vCardText+=process_elem;
- }
- // X-PHONETIC-FIRST-NAME
- if(globalDisabledContactAttributes.indexOf('X-PHONETIC-FIRST-NAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="ph_firstname"]').val())!='')
- {
- if(vCard.tplM['contentline_X-PHONETIC-FIRST-NAME']!=null && (process_elem=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-PHONETIC-FIRST-NAME'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- vCardText+=process_elem;
- }
- // X-PHONETIC-LAST-NAME
- if(globalDisabledContactAttributes.indexOf('X-PHONETIC-LAST-NAME')==-1 && (value=tmpvCardEditorRef.find('[data-type="ph_lastname"]').val())!='')
- {
- if(vCard.tplM['contentline_X-PHONETIC-LAST-NAME']!=null && (process_elem=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-PHONETIC-LAST-NAME'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- vCardText+=process_elem;
- }
- // BDAY
- if(globalDisabledContactAttributes.indexOf('BDAY')==-1 && (value=tmpvCardEditorRef.find('[data-type="date_bday"]').val())!='')
- {
- var valid=true;
- try {var date=$.datepicker.parseDate(globalSettings.datepickerformat.value, value)}
- catch (e) {valid=false}
- if(valid==true)
- {
- if(vCard.tplM['contentline_BDAY']!=null && (process_elem=vCard.tplM['contentline_BDAY'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_BDAY'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', ';VALUE=date');
- }
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue($.datepicker.formatDate('yy-mm-dd', date)));
- vCardText+=process_elem;
- }
- }
- // X-ABDATE
- if(globalDisabledContactAttributes.indexOf('X-ABDATE')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%date"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="date_value"]').val())!='')
- {
- var valid=true;
- try {var date=$.datepicker.parseDate(globalSettings.datepickerformat.value, value)}
- catch (e) {valid=false}
- if(valid==true)
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_X-ABDATE']!=null && (process_elem=vCard.tplM['contentline_X-ABDATE'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter)+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-ABDATE'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- var date_value=$.datepicker.formatDate('yy-mm-dd', date);
- var tmp_type=$(element).find('[data-type="date_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="date_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(date_value));
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['date_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['date_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- if(globalSettings.compatibility.value.anniversaryOutputFormat.indexOf('other')!=-1)
- {
- // X-ANNIVERSARY
- if(tmp_type==':_$!<anniversary>!$_:')
- {
- if(globalSettings.compatibility.value.anniversaryOutputFormat.indexOf('apple')!=-1)
- vCardText+=process_elem;
- process_elem='X-ANNIVERSARY;VALUE=date:'+vcardEscapeValue(date_value)+'\r\n';
- }
- }
- vCardText+=process_elem;
- }
- }
- });
- }
- // TITLE
- if(globalDisabledContactAttributes.indexOf('TITLE')==-1 && (value=tmpvCardEditorRef.find('[data-type="title"]').val())!='')
- {
- if(vCard.tplM['contentline_TITLE']!=null && (process_elem=vCard.tplM['contentline_TITLE'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_TITLE'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- vCardText+=process_elem;
- }
- // ORG
- if(globalDisabledContactAttributes.indexOf('ORG')==-1)
- {
- value=tmpvCardEditorRef.find('[data-type="org"]:visible:not([readonly])').val();
- value2=tmpvCardEditorRef.find('[data-type="department"]:visible:not([readonly])').val();
- if((value!=undefined && value!='') || (value2!=undefined && value2!=''))
- {
- if(vCard.tplM['contentline_ORG']!=null && (process_elem=vCard.tplM['contentline_ORG'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_ORG'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- process_elem=process_elem.replace('##:::##units_wsc##:::##', '');
- }
- process_elem=process_elem.replace('##:::##org##:::##',vcardEscapeValue(value)+(value2!=undefined && value2!='' ? ';'+vcardEscapeValue(value2) : ''));
- vCardText+=process_elem;
- }
- }
- // X-ABShowAs
- if(globalDisabledContactAttributes.indexOf('X-ABShowAs')==-1 && tmpvCardEditorRef.find('[data-type="isorg"]').prop('checked'))
- {
- if(vCard.tplM['contentline_X-ABShowAs']!=null && (process_elem=vCard.tplM['contentline_X-ABShowAs'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-ABShowAs'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
- process_elem=process_elem.replace('##:::##value##:::##', 'COMPANY');
- }
- vCardText+=process_elem;
- }
- // PHOTO
- if(globalDisabledContactAttributes.indexOf('PHOTO')==-1 && !tmpvCardEditorRef.find('#photo').hasClass('photo_blank'))
- {
- var value = $('#photoURLHidden').val() || tmpvCardEditorRef.find('#photo').get(0).toDataURL('image/png');
- if(vCard.tplM['contentline_PHOTO']!=null && (process_elem=vCard.tplM['contentline_PHOTO'][0])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
- process_elem=process_elem.replace('##:::##value##:::##',value);
- }
- else
- {
- process_elem=vCard.tplC['contentline_PHOTO'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- process_elem=process_elem.replace('##:::##value##:::##', value);
- }
- // Data URL (non-remote) will always be a binary encoded png image
- if($('#photoURLHidden').val()==='') {
- process_elem=process_elem.replace('##:::##params_wsc##:::##', ';ENCODING=b;TYPE=png');
- }
- // For remote URL, we can't reliably determine its type, so we just append the VALUE=URI param
- else {
- process_elem=process_elem.replace('##:::##params_wsc##:::##', ';VALUE=URI');
- }
- vCardText+=process_elem;
- }
- // ADR
- if(globalDisabledContactAttributes.indexOf('ADR')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%address"]').each(
- function (index,element)
- {
- // if data is present for the selected country's address fields
- var found=0;
- $(element).find('[data-addr-field]').each(
- function(index,element)
- {
- if($(element).attr('data-addr-field')!='' && $(element).attr('data-addr-field')!='country' && $(element).val()!='')
- {
- found=1;
- return false;
- }
- }
- );
- if(found)
- {
- var incGroupCounter=false;
- if(vCard.tplM['contentline_ADR']!=null && (process_elem=vCard.tplM['contentline_ADR'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_ADR'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="address_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="address_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- var streetVal = $(element).find('[data-addr-field="street"]').map(function() {
- var val = $(this).val();
- if(val) {
- return val;
- }
- }).get().join('\n');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##pobox##:::##',vcardEscapeValue($(element).find('[data-addr-field="pobox"]').val()));
- process_elem=process_elem.replace('##:::##extaddr##:::##',vcardEscapeValue($(element).find('[data-addr-field="extaddr"]').val()));
- process_elem=process_elem.replace('##:::##street##:::##',vcardEscapeValue(streetVal));
- process_elem=process_elem.replace('##:::##locality##:::##',vcardEscapeValue($(element).find('[data-addr-field="locality"]').val()));
- process_elem=process_elem.replace('##:::##region##:::##',vcardEscapeValue($(element).find('[data-addr-field="region"]').val()));
- process_elem=process_elem.replace('##:::##code##:::##',vcardEscapeValue($(element).find('[data-addr-field="code"]').val()));
- process_elem=process_elem.replace('##:::##country##:::##',vcardEscapeValue($(element).find('[data-type="country_type"] option').filter(':selected').attr('data-full-name')));
- my_related='X-ABADR:'+vcardEscapeValue($(element).find('[data-type="country_type"] option').filter(':selected').attr('data-type'))+'\r\n';
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- incGroupCounter=true; // we always increate the group number, because the X-ABADR is always stored
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['address_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['address_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- vCardText+=process_elem;
- }
- }
- );
- }
- // TEL
- if(globalDisabledContactAttributes.indexOf('TEL')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%phone"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- var incGroupCounter=false;
- if(vCard.tplM['contentline_TEL']!=null && (process_elem=vCard.tplM['contentline_TEL'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_TEL'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="phone_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="phone_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['phone_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['phone_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- vCardText+=process_elem;
- }
- }
- );
- }
- // EMAIL
- if(globalDisabledContactAttributes.indexOf('EMAIL')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%email"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_EMAIL']!=null && (process_elem=vCard.tplM['contentline_EMAIL'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_EMAIL'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="email_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="email_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['email_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['email_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- vCardText+=process_elem;
- }
- }
- );
- }
- // URL
- if(globalDisabledContactAttributes.indexOf('URL')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%url"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_URL']!=null && (process_elem=vCard.tplM['contentline_URL'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_URL'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="url_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="url_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['url_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['url_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- vCardText+=process_elem;
- }
- }
- );
- }
- // X-ABRELATEDNAMES
- if(globalDisabledContactAttributes.indexOf('X-ABRELATEDNAMES')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%person"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_X-ABRELATEDNAMES']!=null && (process_elem=vCard.tplM['contentline_X-ABRELATEDNAMES'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-ABRELATEDNAMES'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="person_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="person_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##',vcardEscapeValue(value));
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['person_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['person_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- {
- // In addition of the X-ABRELATEDNAMES attributes add also the old style X-* attributes
- switch(tmp_related_type[1])
- {
- case '_$!<assistant>!$_':
- process_elem+='X-ASSISTANT:'+vcardEscapeValue(value)+'\r\n';
- // process_elem+='X-EVOLUTION-ASSISTANT:'+vcardEscapeValue(value)+'\r\n';
- break;
- case '_$!<manager>!$_':
- process_elem+='X-MANAGER:'+vcardEscapeValue(value)+'\r\n';
- // process_elem+='X-EVOLUTION-MANAGER:'+vcardEscapeValue(value)+'\r\n';
- break;
- case '_$!<spouse>!$_':
- process_elem+='X-SPOUSE:'+vcardEscapeValue(value)+'\r\n';
- // process_elem+='X-EVOLUTION-SPOUSE:'+vcardEscapeValue(value)+'\r\n';
- break;
- default:
- break;
- }
- }
- vCardText+=process_elem;
- }
- }
- );
- }
- // IMPP
- if(globalDisabledContactAttributes.indexOf('IMPP')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%im"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_IMPP']!=null && (process_elem=vCard.tplM['contentline_IMPP'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_IMPP'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="im_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]:first').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="im_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc=params_wsc_old_repr='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=params_wsc_old_repr=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=');
- tmp_service_type=$(element).find('[data-type="im_service_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_service_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]:last').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="im_service_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_service_type=tmp_cust_already_exists;
- else // use custom type
- tmp_service_type=':'+tmp_cust_value+':';
- }
- if(dataTypes['im_service_type_store_as'][tmp_service_type]!=undefined)
- tmp_service_type=dataTypes['im_service_type_store_as'][tmp_service_type];
- params_wsc=';X-SERVICE-TYPE='+vcardEscapeValue(tmp_service_type)+params_wsc;
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- switch(tmp_service_type.toLowerCase()) // RFC4770
- {
- case 'aim':
- im_value='aim:'+vcardEscapeValue(value);
- break;
- case 'facebook':
- im_value='xmpp:'+vcardEscapeValue(value);
- break;
- case 'googletalk':
- im_value='xmpp:'+vcardEscapeValue(value);
- break;
- case 'icq':
- im_value='aim:'+vcardEscapeValue(value);
- break;
- case 'irc':
- im_value='irc:'+vcardEscapeValue(value);
- break;
- case 'jabber':
- im_value='xmpp:'+vcardEscapeValue(value);
- break;
- case 'msn':
- im_value='msnim:'+vcardEscapeValue(value);
- break;
- case 'skype':
- im_value='skype:'+vcardEscapeValue(value);
- break;
- case 'yahoo':
- im_value='ymsgr:'+vcardEscapeValue(value);
- break;
- default: // 'gadugadu', 'qq', ...
- im_value='x-apple:'+vcardEscapeValue(value);
- break;
- }
- process_elem=process_elem.replace('##:::##value##:::##',im_value);
- my_related='';
- tmp_related_type=tmp_type.match(RegExp(':(.*):')); // only one element of related (X-ABLabel) is supported
- if(tmp_related_type!=null && tmp_related_type[1]!='')
- my_related='X-ABLabel:'+vcardEscapeValue((dataTypes['im_type_store_as'][tmp_related_type[1]]!=undefined ? dataTypes['im_type_store_as'][tmp_related_type[1]] : tmp_related_type[1]))+'\r\n';
- if(my_related!='')
- {
- incGroupCounter=true;
- parsed=('\r\n'+process_elem).match(vCard.pre['contentline_parse']);
- if(parsed[1]!='') // if group is present, we use it, otherwise we create a new group
- process_elem+=parsed[1]+my_related;
- else
- process_elem='item'+groupCounter+'.'+process_elem+'item'+groupCounter+'.'+my_related;
- }
- if(incGroupCounter) groupCounter++;
- // In addition of the IMPP attributes add also the old style X-* attributes
- process_elem_old_repr='';
- switch(tmp_service_type.toLowerCase())
- {
- case 'aim':
- new_group_wd='';
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-AIM').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- break;
- case 'jabber':
- new_group_wd='';
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-JABBER').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- break;
- case 'msn':
- new_group_wd='';
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-MSN').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- break;
- case 'yahoo':
- new_group_wd='';
- process_elem_tmp=process_elem;
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem_tmp).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-YAHOO').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- new_group_wd='';
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem_tmp).replace(RegExp('\r\nitem'+(groupCounter-2)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-YAHOO-ID').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- break;
- case 'icq':
- new_group_wd='';
- if(incGroupCounter)
- {
- new_group_wd='item'+groupCounter+'.';
- process_elem_old_repr=('\r\n'+process_elem).replace(RegExp('\r\nitem'+(groupCounter-1)+'\\.','mg'),'\r\n'+new_group_wd);
- groupCounter++;
- }
- else
- process_elem_old_repr='\r\n'+process_elem;
- process_elem+=process_elem_old_repr.replace('\r\n'+new_group_wd+'IMPP;X-SERVICE-TYPE='+ vcardEscapeValue(tmp_service_type),new_group_wd+'X-ICQ').replace(im_value+'\r\n',vcardEscapeValue(value)+'\r\n');
- break;
- default:
- break;
- }
- vCardText+=process_elem;
- }
- }
- );
- }
- // X-SOCIALPROFILE
- if(globalDisabledContactAttributes.indexOf('X-SOCIALPROFILE')==-1)
- {
- tmpvCardEditorRef.find('[data-type="\\%profile"]').each(
- function (index,element)
- {
- if((value=$(element).find('[data-type="value"]').val())!='')
- {
- incGroupCounter=false;
- if(vCard.tplM['contentline_X-SOCIALPROFILE']!=null && (process_elem=vCard.tplM['contentline_X-SOCIALPROFILE'][$(element).attr('data-id')])!=undefined)
- {
- // replace the object and related objects' group names (+ append the related objects after the processed)
- parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCard.re['group']+'\\.)?)','m'));
- if(parsed[1]!='') // if group is present, replace the object and related objects' group names
- {
- process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+groupCounter+'.').substring(2);
- incGroupCounter=true;
- }
- }
- else
- {
- process_elem=vCard.tplC['contentline_X-SOCIALPROFILE'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- }
- tmp_type=$(element).find('[data-type="profile_type"] option').filter(':selected').attr('data-type');
- /* construct the "custom" type */
- if(tmp_type==':custom')
- {
- var tmp_cust_value=$(element).find('[data-type="custom_value"]').val();
- var tmp_cust_value_processed=tmp_cust_value.replace(RegExp('^\\s*|\\s*$','g'),'').replaceAll(' ',' ');
- // if a custom type is already defined as standard type, use the standard definition
- if((tmp_cust_already_exists=$(element).find('[data-type="profile_type"] option').filter(function(){return $(this).html()==tmp_cust_value_processed;}).attr('data-type'))!=undefined)
- tmp_type=tmp_cust_already_exists;
- else // use custom type
- tmp_type=':'+tmp_cust_value+':';
- }
- params_wsc='';
- tmp_normal_types=tmp_type.replace(RegExp(':.*:','g'),',').replaceAll(',,',',').replace(RegExp('^,|,$','g'),'');
- if(tmp_normal_types!='')
- params_wsc=';TYPE='+vcardEscapeValue(tmp_normal_types).toUpperCase().replace(RegExp('\\\\,','g'),';TYPE=')+';x-user='+vcardEscapeValue(tmp_type=='twitter' ? value.replace(/^@+/, '') : value);
- process_elem=process_elem.replace('##:::##params_wsc##:::##',params_wsc);
- process_elem=process_elem.replace('##:::##value##:::##', vcardEscapeValue((globalSettings.urihandlerprofile.value[tmp_type]!=undefined ? globalSettings.urihandlerprofile.value[tmp_type] : 'x-apple:%u').replace('%u', (tmp_type=='twitter' ? value.replace(/^@+/, '') : value))));
- if(incGroupCounter) groupCounter++;
- vCardText+=process_elem;
- }
- }
- );
- }
- // extension hook
- if(typeof(globalContactsExtDataToVcard)=='function')
- vCardText=globalContactsExtDataToVcard(tmpvCardEditorRef, vCardText);
- // PRODID
- vCardText+='PRODID:-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN\r\n';
- if(typeof vCard.tplM['unprocessed_unrelated']!='undefined')
- vCardText+=vCard.tplM['unprocessed_unrelated'].replace(RegExp('^\r\n'),'');
- // vCard END (required by RFC)
- if(vCard.tplM['end']!=null && (process_elem=vCard.tplM['end'][0])!=undefined)
- vCardText+=vCard.tplM['end'][0];
- else
- {
- process_elem=vCard.tplC['end'];
- process_elem=process_elem.replace('##:::##group_wd##:::##', '');
- vCardText+=process_elem;
- }
- // replace unsupported XML characters
- vCardText=vCardText.replace(/[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD]/g, ' ');
- // line folding (RFC2426 - section 2.6) - maximum of 75 octects (and cannot break
- // multi-octet UTF8-characters) allowed on one line, excluding a line break (CRLF)
- vCardText=vObjectLineFolding(vCardText);
- if(typeof(globalContactsExtPutVcardToCollectionOverload)=='function')
- globalContactsExtPutVcardToCollectionOverload(accountUID, inputEtag, newUID, vCardText);
- else
- {
- var selAddr = tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').find('option:selected').attr('data-type')
- //addressbook selectbox was changed
- var orgAddr = $('#vCardEditor').attr('data-url').replace(RegExp('[^/]*$'),'');
- if($('#ExtendedDest').length>0)
- {
- var putGroups=new Array();
- var removeGroups=new Array();
- var myGroups = new Array()
- if(inputEtag!='')
- {
- myGroups=globalAddressbookList.getMyContactGroups($('#vCardEditor').attr('data-url'));
- for(var gi=0; gi<myGroups.length; gi++)
- if($('#ExtendedDest').find('.extended_dest_group').find('input:checked[data-id="'+myGroups[gi]+'"]').length==0)
- removeGroups.push(myGroups[gi]);
- }
- $('#ExtendedDest').find('.extended_dest_group').find('input:checked').each(function(){
- var guid = $(this).attr('data-id');
- if(myGroups.indexOf(guid)==-1)
- putGroups.push(guid);
- });
- }
- if(orgAddr!= selAddr && inputEtag!='')
- {
- var tmp2=globalAddressbookList.getContactByUID($('#vCardEditor').attr('data-url'));
- var vUID = $('#vCardEditor').attr('data-url').match(RegExp('[^/]*$'));
- // here we generate the destination for MOVE (we don't use the old vCard file name to minimalize the possible conflict situations)
- tmp2.vcard=vCardText;
- tmp2.newAccountUID=globalResourceCardDAVList.getCollectionByUID(selAddr).accountUID;
- tmp2.newUid=selAddr;
- tmp2.finalContactUID=tmp2.uid;
- tmp2.orgUID=selAddr+vUID;
- tmp2.addToContactGroupUID=new Array();
- tmp2.removeToContactGroupUID=new Array();
- // we need to store the ui object references for error handling in the GUI
- if($('#ExtendedDest').length>0)
- {
- tmp2.uiObjects={resource:globalRefAddContact.attr('data-filter-url')};
- if(putGroups.length>0)
- tmp2.addToContactGroupUID=putGroups.slice();
- if(removeGroups.length>0)
- tmp2.removeToContactGroupUID=removeGroups.slice();
- }
- tmp2.formSave=true;
- lockAndPerformToCollection(tmp2, globalRefAddContact.attr('data-filter-url'), 'IRM_DELETE');
- }
- else
- {
- if(inputEtag=='')
- inputUID=selAddr;
- if($('#ExtendedDest').length>0 && (putGroups.length>0 || removeGroups.length>0))
- {
- if(inputEtag!='')
- var tmp2=globalAddressbookList.getContactByUID($('#vCardEditor').attr('data-url'));
- else
- var tmp2={accountUID: accountUID, uid: inputUID, etag: inputEtag};
- var vUID = $('#vCardEditor').attr('data-url').match(RegExp('[^/]*$'));
- // here we generate the destination for MOVE (we don't use the old vCard file name to minimalize the possible conflict situations)
- tmp2.vcard=vCardText;
- tmp2.uiObjects={resource:globalRefAddContact.attr('data-filter-url')};
- tmp2.addToContactGroupUID=new Array();
- tmp2.removeToContactGroupUID=new Array();
- if(putGroups.length>0)
- tmp2.addToContactGroupUID=putGroups.slice();
- if(removeGroups.length>0)
- tmp2.removeToContactGroupUID=removeGroups.slice();
- tmp2.formSave=true;
- lockAndPerformToCollection(tmp2, globalRefAddContact.attr('data-filter-url'), 'PUT');
- }
- else
- putVcardToCollectionMain({accountUID: accountUID, uid: inputUID, etag: inputEtag, vcard: vCardText}, inputFilterUID);
- }
- }
- }
- function vcardToData(inputContact, inputIsReadonly, inputIsCompany, inputEditorMode)
- {
- if(typeof globalDebug!='undefined' && globalDebug instanceof Array && globalDebug.indexOf('vcard')!=-1)
- console.time('vcardToData timer');
- if(inputContact.vcard==undefined)
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- var tmpvCardEditorRef=CardDAVeditor_cleanup(false, inputIsCompany); // editor initialization
- $('#ABContactColor').css('background-color', inputContact.color);
- if(typeof globalDisabledContactAttributes=='undefined' || !(globalDisabledContactAttributes instanceof Array))
- globalDisabledContactAttributes=[];
- if(inputContact.vcard.match(vCard.pre['vcard']))
- {
- // ------------------------------------------------------------------------------------- //
- // BEGIN and END
- vcard_full=inputContact.vcard.split('\r\n'); // vCard data to array
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- if((parsed=('\r\n'+vcard_full[0]+'\r\n').match(vCard.pre['contentline_parse']))==null)
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['begin'][0]=vCard.tplC['begin'].replace('##:::##group_wd##:::##', vcard_begin_group=parsed[1]);
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- if((parsed=('\r\n'+vcard_full[vcard_full.length-2]+'\r\n').match(vCard.pre['contentline_parse']))==null)
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['end'][0]=vCard.tplC['end'].replace('##:::##group_wd##:::##', vcard_end_group=parsed[1]);
- if(vcard_begin_group!=vcard_end_group)
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // the vCard BEGIN and END "group" are different
- }
- // remove the vCard BEGIN and END
- vcard='\r\n'+vcard_full.slice(1, vcard_full.length-2).join('\r\n')+'\r\n';
- //console.time('VERSION timer');
- // ------------------------------------------------------------------------------------- //
- // VERSION -> what to do if present more than once?
- vcard_element=vcard.match(vCard.pre['contentline_VERSION']);
- if(vcard_element!=null && vcard_element.length==1) // if the VERSION attribute is not present exactly once, vCard is considered invalid
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- if(parsed[3]=='' && parsed[4]=='3.0') // RFC requirement
- {
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_VERSION'][0]=vCard.tplC['contentline_VERSION'];
- vCard.tplM['contentline_VERSION'][0]=vCard.tplM['contentline_VERSION'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_VERSION'][0]=vCard.tplM['contentline_VERSION'][0].replace('##:::##version##:::##', parsed[4]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_VERSION'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // invalid input for "VERSION" (we support only vCard 3.0)
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // vcard "VERSION" not present or present more than once
- }
- //console.timeEnd('VERSION timer');
- //console.time('UID timer');
- // ------------------------------------------------------------------------------------- //
- // UID -> TODO: what to do if present more than once?
- vcard_element=vcard.match(vCard.pre['contentline_UID']);
- if(vcard_element!=null && vcard_element.length==1) // if the UID attribute is not present exactly once, vCard is considered invalid
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_UID'][0]=vCard.tplC['contentline_UID'];
- vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- vCard.tplM['contentline_UID'][0]=vCard.tplM['contentline_UID'][0].replace('##:::##uid##:::##', parsed[4]);
- tmpvCardEditorRef.find('#vCardEditor').attr('data-vcard-uid', parsed[4]); // special hack; usually used by extension hooks
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_UID'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- // Old not RFC vCards not contain UID - we ignore this error (UID is generated if vCard is changed)
- // else
- // {
- // console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- // return false; // vcard UID not present or present more than once
- // }
- //console.timeEnd('UID timer');
- //console.time('FN timer');
- // ------------------------------------------------------------------------------------- //
- // FN -> TODO: what to do if present more than once?
- vcard_element=vcard.match(vCard.pre['contentline_FN']);
- if(vcard_element!=null && vcard_element.length==1) // if the FN attribute is not present exactly once, vCard is considered invalid
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_FN'][0]=vCard.tplC['contentline_FN'];
- vCard.tplM['contentline_FN'][0]=vCard.tplM['contentline_FN'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_FN'][0]=vCard.tplM['contentline_FN'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_FN'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // vcard FN not present or present more than once
- }
- //console.timeEnd('FN timer');
- //console.time('N timer');
- // ------------------------------------------------------------------------------------- //
- // N -> TODO: what to do if present more than once?
- vcard_element=vcard.match(vCard.pre['contentline_N']);
- if(vcard_element!=null && vcard_element.length==1) // if the N attribute is not present exactly once, vCard is considered invalid
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [0]->Family, [1]->Given, [2]->Middle, [3]->Prefix, [4]->Suffix
- parsed_value=vcardSplitValue(parsed[4],';');
- if(parsed_value[0]!=undefined && parsed_value[0]!='')
- tmpvCardEditorRef.find('[data-type="family"]').val(vcardUnescapeValue(parsed_value[0]));
- if(parsed_value[1]!=undefined && parsed_value[1]!='')
- tmpvCardEditorRef.find('[data-type="given"]').val(vcardUnescapeValue(parsed_value[1]));
- if(parsed_value[2]!=undefined && parsed_value[2]!='')
- tmpvCardEditorRef.find('[data-type="middle"]').val(vcardUnescapeValue(parsed_value[2]));
- if(parsed_value[3]!=undefined && parsed_value[3]!='')
- tmpvCardEditorRef.find('[data-type="prefix"]').val(vcardUnescapeValue(parsed_value[3]));
- if(parsed_value[4]!=undefined && parsed_value[4]!='')
- tmpvCardEditorRef.find('[data-type="suffix"]').val(vcardUnescapeValue(parsed_value[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_N'][0]=vCard.tplC['contentline_N'];
- vCard.tplM['contentline_N'][0]=vCard.tplM['contentline_N'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_N'][0]=vCard.tplM['contentline_N'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_N'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // vcard N not present or present more than once
- }
- //console.timeEnd('N timer');
- //console.time('CATEGORIES timer');
- // ------------------------------------------------------------------------------------- //
- // CATEGORIES -> present max. once because of the CardDavMATE vCard transformations
- if(globalDisabledContactAttributes.indexOf('CATEGORIES')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_CATEGORIES']);
- if(vcard_element!=null && vcard_element.length==1)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('#tags').importTags(parsed[4]); // we do not need to unescape the value here!
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplC['contentline_CATEGORIES'];
- vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplM['contentline_CATEGORIES'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_CATEGORIES'][0]=vCard.tplM['contentline_CATEGORIES'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_CATEGORIES'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('CATEGORIES timer');
- //console.time('NOTE timer');
- // ------------------------------------------------------------------------------------- //
- // NOTE -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('NOTE')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_NOTE']);
- if(vcard_element!=null)
- {
- if(vcard_element.length==1) // if the NOTE attribute is present exactly once
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').text(vcardUnescapeValue(parsed[4])).trigger('autosize.resize');
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_NOTE'][0]=vCard.tplC['contentline_NOTE'];
- vCard.tplM['contentline_NOTE'][0]=vCard.tplM['contentline_NOTE'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_NOTE'][0]=vCard.tplM['contentline_NOTE'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_NOTE'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // vcard NOTE present more than once
- }
- }
- }
- //console.timeEnd('NOTE timer');
- //console.time('REV timer');
- // ------------------------------------------------------------------------------------- //
- // REV -> what to do if present more than once?
- vcard_element=vcard.match(vCard.pre['contentline_REV']);
- if(vcard_element!=null) // if the REV attribute is exists
- {
- if(vcard_element.length==1) // and is present exactly once
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_REV'][0]=vCard.tplC['contentline_REV'];
- vCard.tplM['contentline_REV'][0]=vCard.tplM['contentline_REV'][0].replace('##:::##group_wd##:::##', parsed[1]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_REV'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // vcard REV present more than once
- }
- }
- //console.timeEnd('REV timer');
- //console.time('NICKNAME timer');
- // ------------------------------------------------------------------------------------- //
- // NICKNAME -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('NICKNAME')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_NICKNAME']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the NICKNAME attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('[data-type="nickname"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_NICKNAME'][0]=vCard.tplC['contentline_NICKNAME'];
- vCard.tplM['contentline_NICKNAME'][0]=vCard.tplM['contentline_NICKNAME'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_NICKNAME'][0]=vCard.tplM['contentline_NICKNAME'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_NICKNAME'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('NICKNAME timer');
- //console.time('X-PHONETIC-FIST-NAME timer');
- // ------------------------------------------------------------------------------------- //
- // X-PHONETIC-FIRST-NAME -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('X-PHONETIC-FIRST-NAME')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_X-PHONETIC-FIRST-NAME']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the X-PHONETIC-FIRST-NAME attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('[data-type="ph_firstname"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplC['contentline_X-PHONETIC-FIRST-NAME'];
- vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-PHONETIC-FIRST-NAME'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('X-PHONETIC-FIST-NAME timer');
- //console.time('X-PHONETIC-LAST-NAME timer');
- // ------------------------------------------------------------------------------------- //
- // X-PHONETIC-LAST-NAME -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('X-PHONETIC-LAST-NAME')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_X-PHONETIC-LAST-NAME']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the X-PHONETIC-LAST-NAME attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('[data-type="ph_lastname"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplC['contentline_X-PHONETIC-LAST-NAME'];
- vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]=vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-PHONETIC-LAST-NAME'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('X-PHONETIC-LAST-NAME timer');
- //console.time('BDAY timer');
- // ------------------------------------------------------------------------------------- //
- // BDAY
- if(globalDisabledContactAttributes.indexOf('BDAY')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_BDAY']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the BDAY attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- var valid=true;
- try {var date=$.datepicker.parseDate('yy-mm-dd', parsed[4])}
- catch (e) {valid=false}
- if(valid==true)
- {
- tmpvCardEditorRef.find('[data-type="date_bday"]').val(vcardUnescapeValue($.datepicker.formatDate(globalSettings.datepickerformat.value, date))).change();
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_BDAY'][0]=vCard.tplC['contentline_BDAY'];
- vCard.tplM['contentline_BDAY'][0]=vCard.tplM['contentline_BDAY'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_BDAY'][0]=vCard.tplM['contentline_BDAY'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_BDAY'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false; // if the date value is invalid, vCard is considered invalid
- }
- }
- }
- //console.timeEnd('BDAY timer');
- //console.time('X-ABDATE timer');
- // ------------------------------------------------------------------------------------- //
- // X-ABDATE
- if(globalDisabledContactAttributes.indexOf('X-ABDATE')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_X-ABDATE']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- var valid=true;
- try {var date=$.datepicker.parseDate('yy-mm-dd', parsed[4])}
- catch (e) {valid=false}
- if(valid==true)
- {
- // parsed_value = [1..]->X-ABDATE-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%date"]').last();
- if(tmp_sel.find('[data-type="date_value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred date
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home,internet'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet'
- if(type_values_txt=='') // if no person type defined, we use the 'other' type as default
- type_values_txt=type_values_txt_label='other';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%date"]:eq('+element_i+')').find('[data-type="date_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['date_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['date_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%date"]').find('[data-type="date_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // date type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%date"]:eq('+element_i+') [data-type="date_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected', true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="date_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="date_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%date"]:eq('+element_i+') [data-type="date_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%date"]:eq('+element_i+') [data-type="date_value"]').val(vcardUnescapeValue($.datepicker.formatDate(globalSettings.datepickerformat.value, date))).change();
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-ABDATE'][element_i]=vCard.tplC['contentline_X-ABDATE'];
- vCard.tplM['contentline_X-ABDATE'][element_i]=vCard.tplM['contentline_X-ABDATE'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the phone person was preferred, we keep it so (we not support preferred person selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_X-ABDATE'][element_i]=vCard.tplM['contentline_X-ABDATE'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-ABDATE'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- }
- //console.timeEnd('X-ABDATE timer');
- //console.time('TITLE timer');
- // ------------------------------------------------------------------------------------- //
- // TITLE -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('TITLE')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_TITLE']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the TITLE attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- tmpvCardEditorRef.find('[data-type="title"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_TITLE'][0]=vCard.tplC['contentline_TITLE'];
- vCard.tplM['contentline_TITLE'][0]=vCard.tplM['contentline_TITLE'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_TITLE'][0]=vCard.tplM['contentline_TITLE'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_TITLE'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('TITLE timer');
- //console.time('ORG timer');
- // ------------------------------------------------------------------------------------- //
- // ORG -> TODO: what to do if present more than once?
- if(globalDisabledContactAttributes.indexOf('ORG')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_ORG']);
- if(vcard_element!=null)
- {
- if(vcard_element.length!=1) // if the ORG attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [0]->Org, [1..]->Org Units
- parsed_value=vcardSplitValue(parsed[4], ';');
- if(parsed_value[0]!=undefined && parsed_value[0]!='')
- tmpvCardEditorRef.find('[data-type="org"]').val(vcardUnescapeValue(parsed_value[0]));
- if(parsed_value[1]!=undefined && parsed_value[1]!='')
- tmpvCardEditorRef.find('[data-type="department"]').val(vcardUnescapeValue(parsed_value[1]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_ORG'][0]=vCard.tplC['contentline_ORG'];
- vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- vCard.tplM['contentline_ORG'][0]=vCard.tplM['contentline_ORG'][0].replace('##:::##units_wsc##:::##', (parsed_value[2]==undefined ? '' : ';'+parsed_value.slice(2).join(';')));
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_ORG'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('ORG timer');
- //console.time('X-ABShowAs timer');
- // ------------------------------------------------------------------------------------- //
- // X-ABShowAs -> TODO: what to do if present more than once?
- var photo_show_org=false;
- if(globalDisabledContactAttributes.indexOf('X-ABShowAs')==-1)
- {
- vcard_element=vcard.match(vCard.pre['X-ABShowAs']);
- if(vcard_element!=null)
- {
- if(vcard_element.length>1) // if the X-ABShowAs attribute is present more than once, vCard is considered invalid
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- if(vcardUnescapeValue(parsed[4]).match(RegExp('^company$','i')))
- {
- tmpvCardEditorRef.find('[data-type="isorg"]').prop('checked', true);
- photo_show_org=true;
- }
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplC['contentline_X-ABShowAs'];
- vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##params_wsc##:::##', parsed[3]);
- vCard.tplM['contentline_X-ABShowAs'][0]=vCard.tplM['contentline_X-ABShowAs'][0].replace('##:::##value##:::##', parsed[4]);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-ABShowAs'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- }
- }
- //console.timeEnd('X-ABShowAs timer');
- //console.time('PHOTO timer');
- // ------------------------------------------------------------------------------------- //
- // PHOTO -> TODO: what to do if present more than once?
- if(photo_show_org)
- tmpvCardEditorRef.find('#photo').toggleClass('photo_user photo_company');
- if(globalDisabledContactAttributes.indexOf('PHOTO')==-1)
- {
- vcard_element=vcard.match(vCard.pre['contentline_PHOTO']);
- if(vcard_element!=null) // if the PHOTO attribute is present more than once, we use the first value
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- var img_type = '';
- var custom_params = '';
- var typeRe = RegExp('TYPE=(.*)', 'i');
- var othersRe = RegExp('(?:ENCODING|VALUE)=.*', 'i');
- parsed_value = vcardSplitParam(parsed[3]);
- for(i=1; i<parsed_value.length; i++) {
- if((type_value=parsed_value[i].match(typeRe))!=undefined) {
- img_type=type_value[1].toLowerCase();
- }
- else if(!othersRe.test(parsed_value[i])) {
- custom_params += ';'+parsed_value[i];
- }
- }
- // support also for unknown type of images (stupid clients)
- var photo = parsed[4];
- var isRemote = RegExp('^https?://', 'i').test(photo);
- var newImg = new Image();
- newImg.src = isRemote ? photo : 'data:image'+(img_type!='' ? '/'+img_type : '')+';base64,'+photo.replace(RegExp('^data:(?:image/.*?;)?(?:base64,)?','i'),'');
- newImg.onload = function(){
- loadImage(this);
- };
- if(isRemote) {
- tmpvCardEditorRef.find('#photoURL, #photoURLHidden').val(photo);
- }
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_PHOTO'][0]=vCard.tplC['contentline_PHOTO'];
- vCard.tplM['contentline_PHOTO'][0]=vCard.tplM['contentline_PHOTO'][0].replace('##:::##group_wd##:::##', parsed[1]);
- vCard.tplM['contentline_PHOTO'][0]=vCard.tplM['contentline_PHOTO'][0].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##'+custom_params);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_PHOTO'][0]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- // // photo URL is used by iCloud but it requires iCloud session cookie :-(
- // if(parsed[4].match(RegExp('^https?://','i'))!=null)
- // tmpvCardEditorRef.find('[data-type="photo"]').attr('src',parsed[4]);
- }
- else // use default icons (see X-ABShowAs above)
- tmpvCardEditorRef.find('#photo').addClass('photo_blank');
- }
- //console.timeEnd('PHOTO timer');
- //console.time('ADR timer');
- // ------------------------------------------------------------------------------------- //
- // ADR
- if(globalDisabledContactAttributes.indexOf('ADR')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_ADR']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_param = [1..]->ADR-params
- var parsed_param=vcardSplitParam(parsed[3]);
- // parsed_value = [1..]->ADR elements
- var parsed_value=vcardSplitValue(parsed[4],';');
- // click to "add" button if not enought data rows present
- var found=0;
- tmpvCardEditorRef.find('[data-type="\\%address"]').last().find('[data-type="value"]').each(
- function(index,element)
- {
- if($(element).val()!='')
- {
- found=1;
- return false;
- }
- }
- );
- if(found)
- tmpvCardEditorRef.find('[data-type="\\%address"]').last().find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred address
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_param.length; i++)
- if(parsed_param[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_param[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // find the corresponding group.X-ABADR: used by APPLE as short address country
- var addr_country='';
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABADR:(.*)')+'\r\n', 'm');
- if((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABADR value
- addr_country=vcardUnescapeValue(vcard_element_related[1]).toLowerCase();
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0],'\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax,home'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax home'
- if(type_values_txt=='') // if no address type defined, we use the 'work' type as default
- type_values_txt=type_values_txt_label='work';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+')').find('[data-type="address_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0;i<type_list.length;i++)
- if(dataTypes['address_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['address_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%address"]').find('[data-type="address_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // address type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-type="address_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected', true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="address_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="address_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-type="address_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- var tmp=tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+')');
- var found;
- if((found=tmp.find('[data-type="country_type"]').children('[data-type="'+jqueryEscapeSelector(addr_country)+'"]')).length>0 || (found=tmp.find('[data-type="country_type"]').children('[data-full-name="'+jqueryEscapeSelector(parsed_value[6])+'"]')).length>0)
- found.prop('selected', true);
- else if(globalSettings.addresscountryequivalence.value.length>0 && parsed_value[6]!=undefined) // unknown ADR format (country not detected)
- {
- // TODO: move regex object directly into config.js
- for(var i=0; i<globalSettings.addresscountryequivalence.value.length; i++)
- if(parsed_value[6].match(RegExp(globalSettings.addresscountryequivalence.value[i].regex, 'i'))!=null)
- {
- tmp.find('[data-type="country_type"]').children('[data-type="'+jqueryEscapeSelector(globalSettings.addresscountryequivalence.value[i].country)+'"]').prop('selected', true);
- break;
- }
- }
- // Note:
- // if no country detected, the default is used (see globalDefaultAddressCountry in config.js)
- tmp.find('[data-autoselect]').change();
- var streetVals = vcardUnescapeValue(parsed_value[2]).split('\n');
- for(var i=0; i<streetVals.length; i++) {
- var tmp = tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="street"]').last();
- tmp.val(streetVals[i]);
- if(i<streetVals.length-1) {
- tmp.trigger('keyup.street');
- }
- };
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="pobox"]').val(vcardUnescapeValue(parsed_value[0]));
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="extaddr"]').val(vcardUnescapeValue(parsed_value[1]));
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="locality"]').val(vcardUnescapeValue(parsed_value[3]));
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="region"]').val(vcardUnescapeValue(parsed_value[4]));
- tmpvCardEditorRef.find('[data-type="\\%address"]:eq('+element_i+') [data-addr-field="code"]').val(vcardUnescapeValue(parsed_value[5]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_ADR'][element_i]=vCard.tplC['contentline_ADR'];
- vCard.tplM['contentline_ADR'][element_i]=vCard.tplM['contentline_ADR'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the address was preferred, we keep it so (we not support preferred address selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_ADR'][element_i]=vCard.tplM['contentline_ADR'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_ADR'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('ADR timer');
- //console.time('TEL timer');
- // ------------------------------------------------------------------------------------- //
- // TEL
- if(globalDisabledContactAttributes.indexOf('TEL')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_TEL']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->TEL-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%phone"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred phone number
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax,home'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=HOME;TYPE=HOME;TYPE=FAX; -> array('FAX','HOME') -> 'fax home'
- if(type_values_txt=='') // if no phone type defined, we use the 'cell' type as default
- type_values_txt=type_values_txt_label='cell';
- // get the default available types (optimize in future)
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%phone"]:eq('+element_i+')').find('[data-type="phone_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the current vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['phone_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['phone_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%phone"]').find('[data-type="phone_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // phone type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%phone"]:eq('+element_i+') [data-type="phone_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected', true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="phone_type"] :first-child').first().clone().attr('data-type', type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="phone_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%phone"]:eq('+element_i+') [data-type="phone_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%phone"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_TEL'][element_i]=vCard.tplC['contentline_TEL'];
- vCard.tplM['contentline_TEL'][element_i]=vCard.tplM['contentline_TEL'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the phone number was preferred, we keep it so (we not support preferred number selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_TEL'][element_i]=vCard.tplM['contentline_TEL'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_TEL'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('TEL timer');
- //console.time('EMAIL timer');
- // ------------------------------------------------------------------------------------- //
- // EMAIL
- if(globalDisabledContactAttributes.indexOf('EMAIL')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_EMAIL']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->EMAIL-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%email"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred email address
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home,internet'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet'
- if(type_values_txt=='') // if no email type defined, we use the 'home' type as default
- type_values_txt=type_values_txt_label='home,internet';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%email"]:eq('+element_i+')').find('[data-type="email_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['email_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['email_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%email"]').find('[data-type="email_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // email type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%email"]:eq('+element_i+') [data-type="email_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected',true);
- else if(select_element.length==0)
- {
- // create the missing option
- new_opt=tmpvCardEditorRef.find('[data-type="email_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="email_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%email"]:eq('+element_i+') [data-type="email_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected',true);
- }
- tmpvCardEditorRef.find('[data-type="\\%email"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_EMAIL'][element_i]=vCard.tplC['contentline_EMAIL'];
- vCard.tplM['contentline_EMAIL'][element_i]=vCard.tplM['contentline_EMAIL'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the phone number was preferred, we keep it so (we not support preferred number selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_EMAIL'][element_i]=vCard.tplM['contentline_EMAIL'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_EMAIL'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('EMAIL timer');
- //console.time('X-SOCIALPROFILE timer');
- // ------------------------------------------------------------------------------------- //
- // X-SOCIALPROFILE
- if(globalDisabledContactAttributes.indexOf('X-SOCIALPROFILE')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_X-SOCIALPROFILE']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->X-SOCIALPROFILE-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%profile"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred X-SOCIALPROFILE
- var type_values=Array();
- var j=0;
- var social_user='';
- for(i=1;i<parsed_value.length;i++)
- if(parsed_value[i].toLowerCase().indexOf('x-user=')==0)
- social_user=parsed_value[i].substring('x-user='.length); //case insensitive remove of /^x-user=/
- else if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- // if there is no x-user parameter extract the username from the URL (last part of the URL before '/')
- if(social_user=='')
- social_user=parsed[4].split('/').slice(-2)[0];
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=B;TYPE=A;TYPE=C; -> array('B','A','C') -> 'a,b,c'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=B;TYPE=A;TYPE=C; -> array('B','A','C') -> 'a b c'
- if(type_values_txt=='') // if no X-SOCIALPROFILE type defined, we use the 'twitter' type as default
- type_values_txt=type_values_txt_label='twitter';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%profile"]:eq('+element_i+')').find('[data-type="profile_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['profile_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['profile_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%profile"]').find('[data-type="profile_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // X-SOCIALPROFILE type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%profile"]:eq('+element_i+') [data-type="profile_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected',true);
- else if(select_element.length==0)
- {
- // create the missing option
- new_opt=tmpvCardEditorRef.find('[data-type="profile_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="profile_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%profile"]:eq('+element_i+') [data-type="profile_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%profile"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(type_values_txt=='twitter' ? '@'+social_user : social_user));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-SOCIALPROFILE'][element_i]=vCard.tplC['contentline_X-SOCIALPROFILE'];
- vCard.tplM['contentline_X-SOCIALPROFILE'][element_i]=vCard.tplM['contentline_X-SOCIALPROFILE'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the X-SOCIALPROFILE was preferred, we keep it so (we not support preferred X-SOCIALPROFILE selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_X-SOCIALPROFILE'][element_i]=vCard.tplM['contentline_X-SOCIALPROFILE'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-SOCIALPROFILE'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('X-SOCIALPROFILE timer');
- //console.time('URL timer');
- // ------------------------------------------------------------------------------------- //
- // URL
- if(globalDisabledContactAttributes.indexOf('URL')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_URL']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->URL-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%url"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred url address
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=WORK;TYPE=WORK;TYPE=HOME; -> array('HOME','WORK') -> 'home,work'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=WORK;TYPE=WORK;TYPE=HOME; -> array('HOME','WORK') -> 'home work'
- if(type_values_txt=='') // if no url type defined, we use the 'homepage' type as default
- type_values_txt=type_values_txt_label='homepage';
- // get the default available types (optimize in future)
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%url"]:eq('+element_i+')').find('[data-type="url_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['url_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['url_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%url"]').find('[data-type="url_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // url type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%url"]:eq('+element_i+') [data-type="url_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected', true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="url_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="url_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%url"]:eq('+element_i+') [data-type="url_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%url"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_URL'][element_i]=vCard.tplC['contentline_URL'];
- vCard.tplM['contentline_URL'][element_i]=vCard.tplM['contentline_URL'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the URL was preferred, we keep it so (we not support preferred number selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_URL'][element_i]=vCard.tplM['contentline_URL'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_URL'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('URL timer');
- //
- //console.time('X-ABRELATEDNAMES timer');
- // ------------------------------------------------------------------------------------- //
- // X-ABRELATEDNAMES
- if(globalDisabledContactAttributes.indexOf('X-ABRELATEDNAMES')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->X-ABRELATEDNAMES-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%person"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" values array
- var pref=0; //by default there is no preferred person
- var type_values=Array();
- var j=0;
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- var type_values_txt=type_values_us.join(','); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home,internet'
- var type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet'
- if(type_values_txt=='') // if no person type defined, we use the 'other' type as default
- type_values_txt=type_values_txt_label='other';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%person"]:eq('+element_i+')').find('[data-type="person_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['person_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['person_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%person"]').find('[data-type="person_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // person type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%person"]:eq('+element_i+') [data-type="person_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected', true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="person_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="person_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%person"]:eq('+element_i+') [data-type="person_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%person"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(parsed[4]));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i]=vCard.tplC['contentline_X-ABRELATEDNAMES'];
- vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i]=vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the phone person was preferred, we keep it so (we not support preferred person selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i]=vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_X-ABRELATEDNAMES'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('X-ABRELATEDNAMES timer');
- //console.time('IMPP timer');
- // ------------------------------------------------------------------------------------- //
- // IMPP
- if(globalDisabledContactAttributes.indexOf('IMPP')==-1)
- {
- var element_i=0;
- while((vcard_element=vcard.match(vCard.pre['contentline_IMPP']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [1..]->IMPP-params
- var parsed_value=vcardSplitParam(parsed[3]);
- // click to "add" button if not enought data rows present
- var tmp_sel=tmpvCardEditorRef.find('[data-type="\\%im"]').last();
- if(tmp_sel.find('[data-type="value"]').val()!='')
- tmp_sel.find('[data-type="\\%add"]').find('input[type="image"]').click();
- // get the "TYPE=" & "X-SERVICE-TYPE" values array
- var pref=0; //by default there is no preferred IM
- var type_values=Array();
- var j=0;
- var service_type_value='';
- for(var i=1; i<parsed_value.length; i++)
- if(parsed_value[i].toLowerCase().indexOf('type=')==0)
- {
- var type_values_tmp=parsed_value[i].substring('type='.length); //case insensitive remove of /^type=/
- // if one value is a comma separated value of parameters
- var type_values_tmp_2=type_values_tmp.split(',');
- var type_value_tmp_2_lower='';
- for(var m=0; m<type_values_tmp_2.length; m++)
- if((type_value_tmp_2_lower=vcardUnescapeValue(type_values_tmp_2[m]).toLowerCase())!='pref')
- type_values[j++]=type_value_tmp_2_lower;
- else
- pref=1;
- }
- else if(parsed_value[i].toLowerCase().indexOf('x-service-type=')==0)
- service_type_value=vcardUnescapeValue(parsed_value[i].substring('x-service-type='.length)).toLowerCase(); //case insensitive remove of /^x-service-type=/
- if(parsed[1]!='') // APPLE SPECIFIC types: find the corresponding group.X-ABLabel: used by APPLE as "TYPE"
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.X-ABLabel:(.*)')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // get the X-ABLabel value
- if(type_values.indexOf(vcard_element_related[1].toLowerCase())==-1)
- type_values[j++]=vcardUnescapeValue(':'+vcard_element_related[1].toLowerCase()+':');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- // get the type value and label
- var type_values_us=type_values.unique().sort();
- type_values_txt=type_values_us.join(','); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home,internet'
- type_values_txt_label=type_values_us.join(' ').replace(vCard.pre['vcardToData_colon_begin_or_end'], ''); // TYPE=INTERNET;TYPE=INTERNET;TYPE=HOME; -> array('HOME','INTERNET') -> 'home internet'
- if(type_values_txt=='') // if no IMPP type defined, we use the 'other' type as default
- type_values_txt=type_values_txt_label='other';
- // get the default available types
- var type_list=new Array();
- tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+')').find('[data-type="im_type"]').children().each(function(index, element){type_list[type_list.length]=$(element).attr('data-type');});
- // if an existing type regex matches the new type, use the old type
- // and replace the old type definition with new type definition to comforn the server vCard type format
- for(var i=0; i<type_list.length; i++)
- if(dataTypes['im_type'][type_list[i]]!=undefined && type_values_txt.match(dataTypes['im_type'][type_list[i]])!=null)
- {
- tmpvCardEditorRef.find('[data-type="\\%im"]').find('[data-type="im_type"]').find('[data-type="'+type_list[i]+'"]').attr('data-type', type_values_txt);
- break;
- }
- // IM type: select or append to existing types and select
- var select_element=tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+') [data-type="im_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]');
- if(select_element.length==1)
- select_element.prop('selected',true);
- else if(select_element.length==0)
- {
- // create the missing option
- var new_opt=tmpvCardEditorRef.find('[data-type="im_type"] :first-child').first().clone().attr('data-type',type_values_txt).text(type_values_txt_label);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="im_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+') [data-type="im_type"]').find('[data-type="'+jqueryEscapeSelector(type_values_txt)+'"]').prop('selected', true);
- }
- // IM service type: select or append to existing types and select
- select_element=tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+') [data-type="im_service_type"]').find('[data-type="'+jqueryEscapeSelector(service_type_value)+'"]');
- if(select_element.length==1)
- select_element.prop('selected',true);
- else if(select_element.length==0)
- {
- // create the missing option
- new_opt=tmpvCardEditorRef.find('[data-type="im_service_type"] :first-child').first().clone().attr('data-type',service_type_value).text(service_type_value);
- // append the option to all element of this type
- tmpvCardEditorRef.find('[data-type="im_service_type"] :last-child').prev().after(new_opt);
- // select the option on the current type
- tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+') [data-type="im_service_type"]').find('[data-type="'+jqueryEscapeSelector(service_type_value)+'"]').prop('selected', true);
- }
- tmpvCardEditorRef.find('[data-type="\\%im"]:eq('+element_i+') [data-type="value"]').val(vcardUnescapeValue(parsed[4].replace(vCard.pre['vcardToData_before_val'], '')));
- // values not directly supported by the editor (old values are kept intact)
- vCard.tplM['contentline_IMPP'][element_i]=vCard.tplC['contentline_IMPP'];
- vCard.tplM['contentline_IMPP'][element_i]=vCard.tplM['contentline_IMPP'][element_i].replace('##:::##group_wd##:::##', parsed[1]);
- // if the IMPP accound was preferred, we keep it so (we not support preferred person selection directly by editor)
- if(pref==1)
- vCard.tplM['contentline_IMPP'][element_i]=vCard.tplM['contentline_IMPP'][element_i].replace('##:::##params_wsc##:::##', '##:::##params_wsc##:::##;TYPE=PREF');
- // remove the processed parameter
- vcard=vcard.replace(vcard_element[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var vcard_element_related=null;
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
- while((vcard_element_related=vcard.match(re))!=null)
- {
- // append the parameter to its parent
- vCard.tplM['contentline_IMPP'][element_i]+=vcard_element_related[0].substr(2);
- // remove the processed parameter
- vcard=vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- element_i++;
- }
- }
- //console.timeEnd('IMPP timer');
- // extension hook
- if(typeof(globalContactsExtVcardToData)=='function')
- vcard=globalContactsExtVcardToData(tmpvCardEditorRef, inputContact, vcard);
- // ------------------------------------------------------------------------------------- //
- // Store the vCard URL to XML
- tmpvCardEditorRef.find('#vCardEditor').attr('data-account-uid', inputContact.accountUID);
- tmpvCardEditorRef.find('#vCardEditor').attr('data-url', inputContact.uid);
- tmpvCardEditorRef.find('#vCardEditor').attr('data-etag', inputContact.etag);
- // UID is stored also in the Cancel button (for Add -> Cancel support /loading the previous active contact/)
- if(inputContact.uid!=undefined) // occurs if loadContactByVcard is used (it also appends the UID of previous contact into 'data-id')
- tmpvCardEditorRef.find('#vCardEditor').find('[data-type="cancel"]').attr('data-id', inputContact.uid);
- processEditorElements(tmpvCardEditorRef, inputEditorMode, inputIsReadonly, inputContact.isCompany);
- var tmp_optionslist=[];
- // create the list of available collections to the interface
- for(var i=0; i<globalResourceCardDAVList.collections.length; i++)
- if(globalResourceCardDAVList.collections[i].headerOnly!==true && globalResourceCardDAVList.collections[i].makeLoaded===true)
- tmp_optionslist[tmp_optionslist.length]=$('<option data-type=""></option>').attr({'data-type': globalResourceCardDAVList.collections[i].uid, 'data-color': globalResourceCardDAVList.collections[i].color}).text(globalResourceCardDAVList.collections[i].displayvalue);
- // add the list of available collections to the interface
- tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').append(tmp_optionslist);
- // bind the change event (color change in the editor)
- tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').change(function(){
- var selColl=globalResourceCardDAVList.getCollectionByUID($(this).find('option:selected').attr('data-type'));
- globalRefAddContact.attr('data-url', selColl.uid.replace(RegExp('[^/]+$'),''));
- globalRefAddContact.attr('data-filter-url',selColl.uid); // Set the current addressbook filter uid
- globalRefAddContact.attr('data-account-uid',selColl.accountUID);
- $('#ABContactColor').css('background-color', $(this).find('option:selected').attr('data-color'));
- });
- var collUID='';
- if(typeof inputContact.uid!='undefined')
- collUID= inputContact.uid.replace(RegExp('[^/]*$'),'');
- else
- collUID = globalRefAddContact.attr('data-url');
- var select_elem=tmpvCardEditorRef.find('[data-attr-name="_DEST_"]').find('[data-type="'+jqueryEscapeSelector(collUID)+'"]');
- if(select_elem.length==1)
- select_elem.prop('selected', true);
- if(typeof globalContactsExtVcardToData!='undefined' && !inputIsCompany)
- tmpvCardEditorRef.find('[data-type="DEST"]').addClass('element_no_display');
- // Unprocessed unrelated vCard elements
- vCard.tplM['unprocessed_unrelated']=vcard;
- if(typeof globalDebug!='undefined' && globalDebug instanceof Array && globalDebug.indexOf('vcard')!=-1)
- {
- console.timeEnd('vcardToData timer');
- if(vcard!='\r\n')
- console.log('Warning: [vCard unprocessed unrelated]: '+vcard);
- }
- //clean error message
- $('#ABMessage').height('0');
- $('#ABContact').empty().append(tmpvCardEditorRef);
- var foundGroup=0;
- for(var adr in globalAddressbookList.vcard_groups)
- {
- if(globalAddressbookList.vcard_groups[adr].length>0)
- {
- foundGroup=1;
- break;
- }
- }
- if(foundGroup)
- {
- if(typeof inputContact.uid!='undefined')
- extendDestSelect();
- else
- {
- var selGroup = $('#ResourceCardDAVList').find('.contact_group').find(':input.resourceCardDAV_selected').attr('data-id');
- extendDestSelect(selGroup);
- if(typeof selGroup!= 'undefined')
- select_elem.text(localization[globalInterfaceLanguage].txtVcardGroupsTextSingle.replace('%coll%',globalResourceCardDAVList.getCollectionByUID(collUID).displayvalue));
- }
- }
- if(typeof inputContact.uid !='undefined')
- checkForVcardGroups(inputContact.uid);
- if(typeof(globalContactsSelectProcess)=='function')
- globalContactsSelectProcess(tmpvCardEditorRef, inputContact);
- return true;
- }
- else
- {
- console.log("Error: '"+inputContact.uid+"': unable to parse vCard");
- return false;
- }
- }
- function basicRFCFixesAndCleanup(vcardString)
- {
- // If vCard contains only '\n' instead of '\r\n' we fix it
- if(vcardString.match(vCard.pre['basicRFCFixesAndCleanup_r-m'])==null)
- vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_n-gm'], '\r\n');
- // remove multiple empty lines
- vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_rnp-gm'], '\r\n');
- // append '\r\n' to the end of the vCard if missing
- if(vcardString[vcardString.length-1]!='\n')
- vcardString+='\r\n';
- // remove line folding
- vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_rnwsp-gm'], '');
- // RFC-obsolete PHOTO fix
- vcardString=vcardString.replace(vCard.pre['basicRFCFixesAndCleanup_photo-gim'], '\r\nPHOTO:');
- // ------------------------------------------------------------------------------------- //
- // begin CATEGORIES merge to one CATEGORIES attribute (sorry for related attributes)
- // note: we cannot do this in additionalRFCFixes or normalizeVcard
- var categoriesArr=[];
- var vcard_element=null;
- var vcard_element_related=null;
- while((vcard_element=vcardString.match(vCard.pre['contentline_CATEGORIES']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=vcard_element[0].match(vCard.pre['contentline_parse']);
- categoriesArr[categoriesArr.length]=parsed[4];
- // remove the processed parameter
- vcardString=vcardString.replace(vcard_element[0],'\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- // remove the processed parameter
- vcardString=vcardString.replace(vcard_element_related[0],'\r\n');
- }
- }
- var categoriesTxt=categoriesArr.join(',');
- var tmp=vcardString.split('\r\n');
- tmp.splice(tmp.length-2,0,'CATEGORIES:'+categoriesTxt);
- // end CATEGORIES cleanup
- // ------------------------------------------------------------------------------------- //
- // ------------------------------------------------------------------------------------- //
- // begin SoGo fixes (company vCards without N and FN attributes)
- // we must perform vCard fixes here because the N and FN attributes are used in the collection list
- // if N attribute is missing we add it
- if(vcardString.match(vCard.pre['contentline_N'])==null)
- tmp.splice(1,0,'N:;;;;');
- // if FN attribute is missing we add it
- if(vcardString.match(vCard.pre['contentline_FN'])==null)
- {
- var fn_value='';
- var tmp2=null;
- // if there is an ORG attribute defined, we use the company name as fn_value (instead of empty string)
- if((tmp2=vcardString.match(vCard.pre['contentline_ORG']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=tmp2[0].match(vCard.pre['contentline_parse']);
- // parsed_value = [0]->Org, [1..]->Org Units
- var parsed_value=vcardSplitValue(parsed[4],';');
- fn_value=parsed_value[0];
- }
- tmp.splice(1,0,'FN:'+fn_value);
- }
- vcardString=tmp.join('\r\n');
- // end SoGo fixes
- // ------------------------------------------------------------------------------------- //
- return {vcard: vcardString, categories: categoriesTxt};
- }
- function additionalRFCFixes(vcardString)
- {
- // ------------------------------------------------------------------------------------- //
- var tmp=vcardString.split('\r\n');
- // update non-RFC attributes (special transformations)
- for(var i=1;i<tmp.length-2;i++)
- {
- // parsed = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var parsed=('\r\n'+tmp[i]+'\r\n').match(vCard.pre['contentline_parse']);
- if(parsed!=null)
- {
- switch(parsed[2])
- {
- case 'TEL':
- // remove the non-RFC params (Evolution bug)
- var parsed_value=vcardSplitParam(parsed[3]);
- for(var j=parsed_value.length-1;j>0;j--)
- if(parsed_value[j].match(vCard.pre['additionalRFCFixes_tel-param'])==null)
- parsed_value.splice(j,1);
- parsed[3]=parsed_value.join(';');
- tmp[i]=parsed[1]+parsed[2]+parsed[3]+':'+parsed[4];
- break;
- case 'EMAIL':
- // transform the params separated by ',' to 'TYPE=' params and remove the non-RFC params (Evolution bug)
- var parsed_value=vcardSplitParam(parsed[3]);
- for(var j=parsed_value.length-1;j>0;j--)
- if(parsed_value[j].match(vCard.pre['additionalRFCFixes_email-param'])==null)
- {
- if((transformed=parsed_value[j].replace(vCard.pre['additionalRFCFixes_comma-g'], ';TYPE=')).match(vCard.pre['additionalRFCFixes_email-params'])!=null)
- parsed_value[j]=transformed;
- else
- parsed_value.splice(j,1);
- }
- parsed[3]=parsed_value.join(';');
- // add missing and required "internet" type (Sogo bug)
- if(parsed[3].match(vCard.pre['additionalRFCFixes_type-internet'])==null)
- parsed[3]+=';TYPE=INTERNET';
- tmp[i]=parsed[1]+parsed[2]+parsed[3]+':'+parsed[4];
- break;
- // the upcoming vCard 4.0 allows params for URL and many clients use it also in vCard 3.0
- // case 'URL': // no params allowed for URL (Evolution bug)
- // tmp[i]=parsed[1]+parsed[2]+':'+parsed[4];
- // break;
- default:
- break;
- }
- }
- }
- vcardString=tmp.join('\r\n');
- // ------------------------------------------------------------------------------------- //
- return vcardString;
- }
- // transform the vCard to the editor expected format
- function normalizeVcard(vcardString)
- {
- var parsed=null;
- // remove the PRODID element (unusable for the editor)
- while((parsed=vcardString.match(vCard.pre['contentline_PRODID']))!=null)
- vcardString=vcardString.replace(parsed[0],'\r\n');
- var tmp=vcardString.split('\r\n');
- var vcard_begin=tmp[0].replace(vCard.pre['normalizeVcard_group_w_dot'], 'item.')+'\r\n';
- var vcard_end=tmp[tmp.length-2].replace(vCard.pre['normalizeVcard_group_w_dot'], 'item.')+'\r\n';
- // remove the vCard BEGIN and END and all duplicate entries (usually created by other buggy clients)
- vcardString='\r\n'+tmp.slice(1, tmp.length-2).join('\r\n')+'\r\n';
- var vcard_out_grouped=new Array();
- while((parsed=vcardString.match(vCard.pre['contentline_parse']))!=null)
- {
- var additional_related='';
- var vcard_element_related='';
- var attr_name='';
- var params_swc='';
- var attr_value='';
- // parsed = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var params_array=vcardSplitParam(parsed[3]);
- // we transform the old X-* IM attributes to new IMPP (internally used by editor)
- switch(parsed[2])
- {
- case 'X-ABDATE':
- attr_name=parsed[2];
- params_swc=params_array.sort().join(';').toUpperCase(); // we need upper case here to remove duplicate values later
- tmp=parsed[4].match(vCard.pre['normalizeVcard_date']);
- attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support)
- break;
- case 'X-EVOLUTION-ANNIVERSARY':
- case 'X-ANNIVERSARY':
- attr_name='X-ABDATE';
- params_swc='';
- tmp=parsed[4].match(vCard.pre['normalizeVcard_date']);
- attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support)
- additional_related='X-ABLabel:_$!<Anniversary>!$_\r\n';
- // check for X-ABDATE attribute with the same value
- var found=false;
- var tmpVcardString=vcardString;
- var tmp_vcard_element=null;
- while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABDATE']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']);
- if(tmp_parsed[4]==parsed[4] || tmp_parsed[4]==attr_value)
- {
- found=true;
- break;
- }
- tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n');
- }
- if(found==true)
- {
- // remove the processed element
- vcardString=vcardString.replace(parsed[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter
- }
- continue;
- }
- break;
- case 'BDAY':
- attr_name=parsed[2];
- params_swc=';VALUE=date';
- tmp=parsed[4].match(vCard.pre['normalizeVcard_date']);
- attr_value=tmp[1]+'-'+tmp[2]+'-'+tmp[3]; // sorry, we support only date (no date-time support)
- break;
- case 'X-AIM':
- case 'X-JABBER':
- case 'X-MSN':
- case 'X-YAHOO':
- case 'X-YAHOO-ID':
- case 'X-ICQ':
- case 'X-SKYPE':
- attr_name='IMPP';
- if(params_array.length==0)
- params_array[0]=''; // after the join it generates ';' after the attribute name
- params_array[params_array.length]='X-SERVICE-TYPE='+parsed[2].replace(vCard.pre['normalizeVcard_xb_or_ide'], ''); // extract the IM type
- params_swc=params_array.sort().join(';');
- attr_value=parsed[4];
- // check for IMPP attribute with the same value
- var found=false;
- var tmpVcardString=vcardString;
- var tmp_vcard_element=null;
- while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_IMPP']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']);
- if(tmp_parsed[4].replace(vCard.pre['normalizeVcard_before_val'], '')==parsed[4])
- {
- found=true;
- break;
- }
- tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n');
- }
- if(found==true)
- {
- // remove the processed element
- vcardString=vcardString.replace(parsed[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter
- }
- continue;
- }
- break;
- case 'IMPP':
- attr_name=parsed[2];
- params_swc=params_array.sort().join(';').toUpperCase(); // we need upper case here to remove duplicate values later
- // remove the '*:' from the '*:value'
- // but we add them back during the vcard generation from the interface
- attr_value=vcardSplitValue(parsed[4], ':').splice(1, 1).join('')
- break;
- case 'X-ASSISTANT':
- case 'X-EVOLUTION-ASSISTANT':
- attr_name='X-ABRELATEDNAMES';
- params_swc='';
- attr_value=parsed[4];
- additional_related='X-ABLabel:_$!<Assistant>!$_\r\n';
- // check for X-ABRELATEDNAMES attribute with the same value
- var found=false;
- var tmpVcardString=vcardString;
- var tmp_vcard_element=null;
- while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']);
- if(tmp_parsed[4]==parsed[4])
- {
- found=true;
- break;
- }
- tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n');
- }
- if(found==true)
- {
- // remove the processed element
- vcardString=vcardString.replace(parsed[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter
- }
- continue;
- }
- break;
- case 'X-MANAGER':
- case 'X-EVOLUTION-MANAGER':
- attr_name='X-ABRELATEDNAMES';
- params_swc='';
- attr_value=parsed[4];
- additional_related='X-ABLabel:_$!<Manager>!$_\r\n';
- // check for X-ABRELATEDNAMES attribute with the same value
- var found=false;
- var tmpVcardString=vcardString;
- var tmp_vcard_element=null;
- while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']);
- if(tmp_parsed[4]==parsed[4])
- {
- found=true;
- break;
- }
- tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n');
- }
- if(found==true)
- {
- // remove the processed element
- vcardString=vcardString.replace(parsed[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter
- }
- continue;
- }
- break;
- case 'X-SPOUSE':
- case 'X-EVOLUTION-SPOUSE':
- attr_name='X-ABRELATEDNAMES';
- params_swc='';
- attr_value=parsed[4];
- additional_related='X-ABLabel:_$!<Spouse>!$_\r\n';
- // check for X-ABRELATEDNAMES attribute with the same value
- var found=false;
- var tmpVcardString=vcardString;
- var tmp_vcard_element=null;
- while((tmp_vcard_element=tmpVcardString.match(vCard.pre['contentline_X-ABRELATEDNAMES']))!=null)
- {
- // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
- var tmp_parsed=tmp_vcard_element[0].match(vCard.pre['contentline_parse']);
- if(tmp_parsed[4]==parsed[4])
- {
- found=true;
- break;
- }
- tmpVcardString=tmpVcardString.replace(tmp_vcard_element[0], '\r\n');
- }
- if(found==true)
- {
- // remove the processed element
- vcardString=vcardString.replace(parsed[0], '\r\n');
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.', '\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n'); // remove the processed parameter
- }
- continue;
- }
- break;
- default:
- attr_name=parsed[2];
- params_swc=params_array.sort().join(';');
- attr_value=parsed[4];
- break;
- }
- // remove the processed element
- vcardString=vcardString.replace(parsed[0],'\r\n');
- if(attr_name!='FN' && attr_name!='N' && attr_value=='') // attributes with empty values are not supported and are removed here
- {
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- // remove the processed parameter
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n');
- }
- continue;
- }
- // add the new element to output array (without group)
- grouped_elem=new Array();
- grouped_elem[grouped_elem.length]=attr_name+params_swc+':'+attr_value+'\r\n';
- if(additional_related!='') // used if we manually add related items as a part of transformation
- grouped_elem[grouped_elem.length]=additional_related;
- // find the corresponding group data (if exists)
- if(parsed[1]!='')
- {
- var re=RegExp('\r\n'+parsed[1].replace('.','\\.(.*)')+'\r\n', 'm');
- while((vcard_element_related=vcardString.match(re))!=null)
- {
- // add the related element to array
- grouped_elem[grouped_elem.length]=vcard_element_related[1]+'\r\n';
- // remove the processed parameter
- vcardString=vcardString.replace(vcard_element_related[0], '\r\n');
- }
- }
- // add the new grouped element to output
- vcard_out_grouped[vcard_out_grouped.length]=grouped_elem.sort().join('');
- }
- //
- // after the transformation and grouping we remove all identical elements and preserve sorting
- // (for example X-AIM and IMPP;X-SERVICE-TYPE=AIM, ...)
- for(var i=vcard_out_grouped.length-1;i>=0;i--)
- if(vcard_out_grouped.slice(0,i).indexOf(vcard_out_grouped[i])!=-1)
- vcard_out_grouped.splice(i,1);
- // add new group names ...
- elemCounter=0;
- for(i=0;i<vcard_out_grouped.length;i++)
- if(vcard_out_grouped[i].match(vCard.pre['normalizeVcard_rn-gm']).length>1)
- vcard_out_grouped[i]=(('\r\n'+vcard_out_grouped[i].substring(0, vcard_out_grouped[i].length-2)).replace(vCard.pre['normalizeVcard_rn-gm'], '\r\nitem'+(elemCounter++)+'.')+'\r\n').substring(2);
- vcard_out_grouped.unshift(vcard_begin);
- vcard_out_grouped.push(vcard_end);
- return vcard_out_grouped.join('');
- }
|