123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298 |
- /*
- 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/>.
- */
- // reorder countries according to localization (returns array becaouse object are unsorted according to ECMA)
- function sortCountries(obj)
- {
- var arr=[];
- for(var prop in obj)
- if(obj.hasOwnProperty(prop))
- arr.push({'key': prop, 'value': obj[prop], 'translated_value': localization[globalInterfaceLanguage]['txtAddressCountry'+prop.toUpperCase()]});
- return arr.sort(function(a, b){return a.translated_value.customCompare(b.translated_value, globalSortAlphabet, 1, false)});
- }
- function loadAdditionalCardDAVCollections()
- {
- if(globalSettingsSaving!='')
- return false;
- globalSettingsSaving='addressbook';
- var inSettings = $.extend({},globalSettings);
- var rex = new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)');
- var key='loadedaddressbookcollections';
- inSettings.loadedaddressbookcollections = {value : new Array(), locked: globalSettings[key].locked};
- $('#ResourceCardDAVList').find('.unloadCheck').each(function(cin,cel)
- {
- if($(cel).prop('checked'))
- {
- var uidParts=$(cel).attr('data-id').match(rex);
- inSettings.loadedaddressbookcollections.value.splice(inSettings.loadedaddressbookcollections.value.length , 0, uidParts[1]+uidParts[3]);
- }
- });
- if($(inSettings[key]).not(globalSettings[key].value).length > 0 || $(globalSettings[key].value).not(inSettings[key]).length > 0)
- {
- $('#AddressbookOverlay').removeClass('loader_hidden');
- $('#ResourceCardDAVList').find('input[type="checkbox"]').prop('disabled',true);
- var setC=0;
- for(var i=0;i<globalAccountSettings.length;i++)
- if(globalAccountSettings[i].href.indexOf(globalLoginUsername)!=-1 && globalAccountSettings[i].settingsAccount)
- {
- setC++;
- netSaveSettings(globalAccountSettings[i], inSettings, false, true);
- break;
- }
- if(setC==0)
- cancelUnloadedCardDAVCollections();
- }
- else
- hideUnloadedCardDAVCollections(true);
- }
- function showUnloadedCardDAVCollections()
- {
- if(globalAddressbookCollectionsLoading)
- return false;
- globalAddressbookCollectionsLoading=true;
- if(isAvaible('CalDavZAP'))
- {
- $('#showUnloadedCalendars').css('display','none');
- $('#showUnloadedCalendarsTODO').css('display','none');
- }
- $('#ResourceCardDAVList').find('input[type="checkbox"]').prop('disabled',true);
- $('#AddressbookOverlay').children('.loaderInfo').text(localization[globalInterfaceLanguage].loadingCollectionList).parent().fadeIn(300);
- var resList=$('#ResourceCardDAVList');
- var resHeader='.resourceCardDAV_header';
- var resItem='.resourceCardDAV';
- $('#ResourceCardDAVList').find('input[type="checkbox"]').prop('disabled',false);
- $('#AddressbookOverlay').children('.loaderInfo').text('').parent().addClass('loader_hidden');
- resList.find('.resourceCardDAV_selected').removeClass('resourceCardDAV_selected');
- resList.find('input').css('display','none');
- // header display
- resList.children('.resourceCardDAV_header').each(function(){
- if($(this).css('display')=='none')
- $(this).addClass('unloaded').css('display','');
- var headerClickElm = $('<input type="checkbox" class="unloadCheckHeader" style="position:absolute;top:3px;right:0px;margin-right:6px;"/>');
- headerClickElm.change(function(){
- loadResourceChBoxClick(this, '#ResourceCardDAVList', resHeader, resItem, '.resourceCardDAV_item');
- });
- $(this).addClass('load_mode').append(headerClickElm);
- });
- // carddav_item display
- resList.find('.resourceCardDAV').each(function(){
- if(typeof $(this).attr('data-id') != 'undefined')
- {
- var newInputElm = $('<input type="checkbox" class="unloadCheck" data-id="'+$(this).attr('data-id')+'" style="position:absolute;top:8px;right:0px;margin-right:6px;"/>');
- newInputElm.change(function(){
- loadCollectionChBoxClick(this, '#ResourceCardDAVList', resHeader, resItem, '.resourceCardDAV_item');
- });
- $(this).siblings('.contact_group').addBack().addClass('load_mode');
- $(this).append(newInputElm);
- if($(this).parent().css('display')=='none')
- $(this).addClass('unloaded');
- else
- newInputElm.prop('checked',true);
- newInputElm.trigger('change');
- }
- });
- $('#showUnloadedAddressbooks').css('display','none');
- $('.resourcesCardDAV_h').text(localization[globalInterfaceLanguage].txtEnabledAddressbooks);
- var origH = resList.find('.resourceCardDAV_header.unloaded').eq(0).css('height');
- var origC = resList.find('.resourceCardDAV.unloaded').parent().eq(0).css('height');
- resList.find('.resourceCardDAV_header.unloaded').css({'height':0,'display':''}).animate({height:origH},300);
- resList.find('.resourceCardDAV.unloaded').parent().css({'height':0,'display':''}).animate({height:origC},300);
- resList.animate({'top':49},300);
- }
- function cancelUnloadedCardDAVCollections()
- {
- $('#ResourceCardDAVList').children('.resourceCardDAV_item').children('.resourceCardDAV ').each(function(){
- var uidParts=$(this).attr('data-id').match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)'));
- var checkHref=uidParts[1]+uidParts[3];
- var isLoaded=false;
- if(typeof globalCrossServerSettingsURL!='undefined'&&globalCrossServerSettingsURL!=null&globalCrossServerSettingsURL)
- {
- var uidParts=$(this).attr('data-id').match(RegExp('/([^/]+/[^/]+/)$'));
- var tmpParts = uidParts[1].match('^(.*/)([^/]+)/$');
- var checkHref=decodeURIComponent(tmpParts[1])+tmpParts[2]+'/';
- var found=false;
- for(var l=0;l<globalSettings.loadedaddressbookcollections.value.length;l++)
- {
- var tmpParts2 = globalSettings.loadedaddressbookcollections.value[l].match('^(.*/)([^/]+)/([^/]+)/$');
- var checkHref2=decodeURIComponent(tmpParts2[2])+'/'+tmpParts2[3]+'/';
- if(checkHref==checkHref2)
- {
- found=true;
- break;
- }
- }
- isLoaded=found;
- }
- else
- isLoaded=(globalSettings.loadedaddressbookcollections.value.indexOf(checkHref)!=-1)
- var unloadCh=$(this).find('.unloadCheck');
- var checked=unloadCh.prop('checked');
- if((isLoaded && !checked) || (!isLoaded && checked))
- unloadCh.prop('checked',!checked).trigger('change');
- });
- hideUnloadedCardDAVCollections(true);
- }
- function hideUnloadedCardDAVCollections(withCallback)
- {
- var resList=$('#ResourceCardDAVList');
- resList.find(':input.unloadCheck').remove();
- resList.find(':input.unloadCheckHeader').remove();
- resList.find('.load_mode').removeClass('load_mode');
- resList.find(':input').css('display','');
- resList.find('.resourceCardDAV').not('.unloaded').parent().css('height','');
- $('.resourcesCardDAV_h').text(localization[globalInterfaceLanguage].txtAddressbooks);
- resList.find('.resourceCardDAV_header.unloaded').animate({height:0},300).promise().done(function(){
- resList.find('.resourceCardDAV_header.unloaded').css({'display':'none','height':''});
- });
- resList.find('.resourceCardDAV.unloaded').parent().animate({height:0},300).promise().done(function(){
- resList.find('.resourceCardDAV.unloaded').parent().css({'display':'none','height':''});
- resList.find('.resourceCardDAV_header').not('.unloaded').each(function(){
- var triggerInput=$(this).nextUntil('.resourceCardDAV_header').filter(':visible').first().find('input[type="checkbox"]');
- collectionChBoxClick(triggerInput.get(0), '#ResourceCardDAVList', '.resourceCardDAV_header', '.resourceCardDAV', null, false);
- });
- resList.find('.unloaded').removeClass('unloaded');
- globalAddressbookCollectionsLoading=false;
- if(withCallback)
- hideUnloadedCardDAVCollectionsCallBack();
- });
- resList.animate({'top':24},300);
- if(withCallback)
- $('#AddressbookOverlay').fadeOut(300,function(){
- $(this).removeClass('loader_hidden');
- });
- if(isAvaible('CalDavZAP'))
- {
- $('#showUnloadedCalendars').css('display','block');
- $('#showUnloadedCalendarsTODO').css('display','block');
- }
- }
- function hideUnloadedCardDAVCollectionsCallBack()
- {
- if(globalAddressbookList.contactLoaded!=null)
- globalAddressbookList.loadContactByUID(globalAddressbookList.contactLoaded.uid);
- $('#showUnloadedAddressbooks').css('display','');
- globalFirstHideLoader=true;
- globalSettingsSaving='';
- selectActiveAddressbook();
- $('#AddressbookOverlay').css('display','none');
- $('#ResourceCardDAVList').find('input[type="checkbox"]').prop('disabled',false);
- }
- function selectActiveAddressbook()
- {
- if(globalAddressbookCollectionsLoading)
- return false;
- for(var i=0; i<globalResourceCardDAVList.collections.length;i++)
- if(globalResourceCardDAVList.collections[i].uid!=undefined)
- {
- var inputResource=globalResourceCardDAVList.collections[i].uid;
- var par=inputResource.split('/');
- if(globalSettings.addressbookselected.value!='')
- {
- if(typeof globalSettings.addressbookselected.value=='string' && inputResource==globalSettings.addressbookselected.value.substring(0,globalSettings.addressbookselected.value.lastIndexOf('/')+1))
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id="'+globalSettings.addressbookselected.value+'"]:visible').addClass('resourceCardDAV_selected');
- }
- else if(typeof globalSettings.addressbookselected.value=='string' && globalSettings.addressbookselected.value.charAt(globalSettings.addressbookselected.value.length-1)=='/' && (par[par.length-3]+'/'+par[par.length-2]+'/')==globalSettings.addressbookselected.value)
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id="'+inputResource+'"]:visible').addClass('resourceCardDAV_selected');
- }
- else if(typeof globalSettings.addressbookselected.value=='string' && globalSettings.addressbookselected.value.charAt(globalSettings.addressbookselected.value.length-1)!='/')
- {
- if((par[par.length-3]+'/'+par[par.length-2]+'/') == globalSettings.addressbookselected.value.substring(0,globalSettings.addressbookselected.value.lastIndexOf('/')+1) && $('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV[data-id="'+inputResource+globalSettings.addressbookselected.value.substring(globalSettings.addressbookselected.value.lastIndexOf('/')+1,globalSettings.addressbookselected.value.length)+'"]:visible').length>0)
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id="'+inputResource+globalSettings.addressbookselected.value.substring(globalSettings.addressbookselected.value.lastIndexOf('/')+1,globalSettings.addressbookselected.value.length)+'"]:visible').addClass('resourceCardDAV_selected');
- }
- }
- else if (typeof globalSettings.addressbookselected.value=='object' && inputResource.match(globalSettings.addressbookselected.value)!=null)
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id="'+inputResource+'"]:visible').addClass('resourceCardDAV_selected');
- }
- }
- }
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length==0)
- for(var i=0; i<globalResourceCardDAVList.collections.length;i++)
- if(globalResourceCardDAVList.collections[i].uid!=undefined)
- {
- var inputResource=globalResourceCardDAVList.collections[i].uid;
- var par=inputResource.split('/');
- if(typeof globalAddressbookSelected!='undefined' && globalAddressbookSelected!=null && globalAddressbookSelected!='')
- {
- globalSettings.addressbookselected.value = globalAddressbookSelected;
- if(typeof globalAddressbookSelected=='string' && inputResource==globalAddressbookSelected.substring(0,globalAddressbookSelected.lastIndexOf('/')+1))
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('[data-id="'+globalAddressbookSelected+'"]:visible').addClass('resourceCardDAV_selected');
- }
- else if(typeof globalAddressbookSelected=='string' && globalAddressbookSelected.charAt(globalAddressbookSelected.length-1)=='/' && (par[par.length-3]+'/'+par[par.length-2]+'/')==globalAddressbookSelected)
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('[data-id="'+inputResource+'"]:visible').addClass('resourceCardDAV_selected');
- }
- else if(typeof globalAddressbookSelected=='string' && globalAddressbookSelected.charAt(globalAddressbookSelected.length-1)!='/')
- {
- if((par[par.length-3]+'/'+par[par.length-2]+'/') == globalAddressbookSelected.substring(0,globalAddressbookSelected.lastIndexOf('/')+1) && $('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- {
- if($('#ResourceCardDAVList').find('[data-id="'+inputResource+globalAddressbookSelected.substring(globalAddressbookSelected.lastIndexOf('/')+1,globalAddressbookSelected.length)+'"]:visible').length>0)
- $('#ResourceCardDAVList').find('[data-id="'+inputResource+globalAddressbookSelected.substring(globalAddressbookSelected.lastIndexOf('/')+1,globalAddressbookSelected.length)+'"]:visible').addClass('resourceCardDAV_selected');
- }
- }
- else if (typeof globalAddressbookSelected=='object' && inputResource.match(globalAddressbookSelected)!=null)
- {
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- $('#ResourceCardDAVList').find('[data-id="'+inputResource+'"]:visible').addClass('resourceCardDAV_selected');
- }
- else if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0)
- {
- globalSettings.addressbookselected.value=par[par.length-3]+'/'+par[par.length-2]+'/';
- $('#ResourceCardDAVList').find('[data-id="'+inputResource+'"]:visible').addClass('resourceCardDAV_selected');
- }
- }
- }
- if($('#ResourceCardDAVList').find('.resourceCardDAV_selected:visible').length == 0 && $('#ResourceCardDAVList').find('.resourceCardDAV[data-id]:visible').length > 0)
- {
- var ui_d = $('#ResourceCardDAVList').find('.resourceCardDAV[data-id]:visible').eq(0).attr('data-id');
- var part_u = ui_d.split('/');
- globalSettings.addressbookselected.value=part_u[part_u.length-3]+'/'+part_u[part_u.length-2]+'/';
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id]:visible').eq(0).addClass('resourceCardDAV_selected');
- }
- var selColl=globalResourceCardDAVList.getCollectionByUID($('#ResourceCardDAVList').find('.resourceCardDAV[data-id].resourceCardDAV_selected').attr('data-id'));
- if(selColl!=null)
- {
- selColl.filterUID=selColl.uid;
- if(selColl.permissions.read_only==true)
- globalRefAddContact.addClass('element_no_display');
- else
- globalRefAddContact.removeClass('element_no_display');
- globalRefAddContact.attr('data-url', selColl.uid.replace(RegExp('[^/]+$'),''));
- globalRefAddContact.attr('data-filter-url',selColl.filterUID); // Set the current addressbook filter uid
- globalRefAddContact.attr('data-account-uid',selColl.accountUID);
- globalRefAddContact.attr('data-color',selColl.color);
- // Make the selected collection active
- if(!globalCardDAVInitLoad)
- {
- if(typeof(globalContactsABChange)=='function')
- globalContactsABChange(selColl.uid);
- $('#ResourceCardDAVList').find('.resourceCardDAV_item').find('.resourceCardDAV_selected').removeClass('resourceCardDAV_selected');
- $('#ResourceCardDAVList').find('[data-id='+jqueryEscapeSelector(selColl.uid)+']').addClass('resourceCardDAV_selected');
- if(selColl.filterUID[selColl.filterUID.length-1]!='/')
- $('#ResourceCardDAVList').find('[data-id='+jqueryEscapeSelector(selColl.filterUID)+']').addClass('resourceCardDAV_selected');
- }
- }
- }
- function CardDAVUpdateMainLoader(inputCollection)
- {
- if(!globalCardDAVInitLoad)
- {
- if(globalSettingsSaving=='addressbook')
- {
- globalLoadedCollectionsCount++;
- $('#AddressbookOverlay').children('.loaderInfo').text(localization[globalInterfaceLanguage].loadingAddressbooks.replace('%act%', globalLoadedCollectionsCount).replace('%total%', globalLoadedCollectionsNumber));
- if(globalSettingsSaving!='' && globalLoadedCollectionsCount==globalLoadedCollectionsNumber)
- setTimeout(function(){hideUnloadedCardDAVCollectionsCallBack();if(isAvaible('Settings'))hideSettingsOverlay();},300);
- }
- selectActiveAddressbook();
- for(var adr in globalAddressbookList.vcard_groups)
- {
- if(globalAddressbookList.vcard_groups[adr].length>0)
- {
- extendDestSelect();
- if(typeof $('#vCardEditor').attr('data-vcard-uid')=='undefined')
- $('#vCardEditor').find('[data-attr-name="_DEST_"]').find('optiotn[data-type$="'+$('#ResourceCardDAVList').find('.resourceCardDAV_selected').find(':input[data-id]').attr('data-id')+'"]').prop('selected',true)
- }
- }
- return false;
- }
- if(inputCollection.makeLoaded)
- {
- globalAddressbookNumberCount++;
- $('#MainLoaderInner').html(localization[globalInterfaceLanguage].loadingAddressbooks.replace('%act%', (globalAddressbookNumberCount)).replace('%total%', globalAddressbookNumber));
- }
- inputCollection.isLoaded=true;
- $('#ResourceCardDAVList [data-id="'+inputCollection.uid+'"]').removeClass('r_operate');
- var unloadedCount=0;
- for(var i=0; i<globalResourceCardDAVList.collections.length;i++)
- if(globalResourceCardDAVList.collections[i].uid!=undefined && !globalResourceCardDAVList.collections[i].isLoaded)
- unloadedCount++;
- if(unloadedCount==0 && !isCardDAVLoaded)
- {
- globalCardDAVInitLoad=false;
- globalAddressbookList.renderContacs();
- var rexo=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@(.*)');
- if(!globalDefaultAddressbookCollectionActiveAll)
- {
- for(var i=0;i<globalSettings.activeaddressbookcollections.value.length;i++)
- {
- if(typeof globalCrossServerSettingsURL!='undefined'&&globalCrossServerSettingsURL!=null&globalCrossServerSettingsURL)
- {
- var tmpParts2 = globalSettings.activeaddressbookcollections.value[i].match('^(.*/)([^/]+)/([^/]+)/$');
- var checkHref2=tmpParts2[2]+'/'+tmpParts2[3]+'/';
- if($('#ResourceCardDAVList input[data-id$="'+checkHref2+'"]:visible').length>0)
- $('#ResourceCardDAVList input[data-id$="'+checkHref2+'"]').trigger('click');
- }
- else
- {
- var uidPart=globalSettings.activeaddressbookcollections.value[i].match(RegExp('^(https?://)(.*)', 'i'))[1];
- var uidPart2=globalSettings.activeaddressbookcollections.value[i].match(RegExp('^(https?://)(.*)', 'i'))[2];
- var uidPart3=getAccount(inputCollection.accountUID).userAuth.userName;
- var uid = uidPart+uidPart3+'@'+uidPart2;
- if($('#ResourceCardDAVList .resourceCardDAV input[data-id="'+uid+'"]:visible').length>0)
- $('#ResourceCardDAVList .resourceCardDAV input[data-id="'+uid+'"]').trigger('click');
- }
- }
- if(globalSettings.activeaddressbookcollections.value.length>0 && $('#ResourceCardDAVList .resourceCardDAV input:checked').length==0)
- globalDefaultAddressbookCollectionActiveAll=true;
- }
- if(globalDefaultAddressbookCollectionActiveAll)
- for(var i=0;i<globalResourceCardDAVList.collections.length;i++)
- if(globalResourceCardDAVList.collections[i].uid!=undefined && $('#ResourceCardDAVList .resourceCardDAV input[data-id="'+globalResourceCardDAVList.collections[i].uid+'"]:visible').length>0)
- $('#ResourceCardDAVList input[data-id="'+globalResourceCardDAVList.collections[i].uid+'"]').trigger('click');
- selectActiveAddressbook();
- globalRefAddContact.prop('disabled', false);
- loadNextApplication(true);
- }
- }
- function applyAddrSettings(abContactRef, remValues)
- {
- var addrVals = new Array();
- if(typeof remValues!= 'undefined')
- {
- abContactRef.find('[data-type="\\%address"]').find('[data-type="country_type"]').each(function(){
- addrVals[$(this).parents('[data-type="%address"]').attr('data-id')] = $(this).val();
- });
- }
- var country_option=abContactRef.find('[data-type="\\%address"]').find('[data-type="country_type"]').find('option').last().clone();
- abContactRef.find('[data-type="\\%address"]').find('[data-type="country_type"]').html('');
- // we need a copy of the object because of the next "delete" operation
- var addressTypesTmp=jQuery.extend({}, addressTypes);
- // delete custom ordered element before the sort (then we will add them back)
- if(globalSettings.addresscountryfavorites.value.length>0)
- for(var i=globalSettings.addresscountryfavorites.value.length-1;i>=0;i--)
- delete addressTypesTmp[globalSettings.addresscountryfavorites.value[i]];
- var addressTypesArr=sortCountries(addressTypesTmp);
- // re-add custom ordered elements from the original addressTypes (where all elements are still present)
- if(globalSettings.addresscountryfavorites.value.length>0)
- for(var i=globalSettings.addresscountryfavorites.value.length-1;i>=0;i--)
- addressTypesArr.unshift({'key': globalSettings.addresscountryfavorites.value[i], 'value': addressTypes[globalSettings.addresscountryfavorites.value[i]], 'translated_value': localization[globalInterfaceLanguage]['txtAddressCountry'+globalSettings.addresscountryfavorites.value[i].toUpperCase()]});
- for(var i=0;i<addressTypesArr.length;i++)
- {
- var tmp=country_option;
- tmp.attr('data-type',addressTypesArr[i].key);
- tmp.attr('data-full-name',addressTypesArr[i].value[0]);
- tmp.text(addressTypesArr[i].translated_value); // translation
- abContactRef.find('[data-type="\\%address"]').find('[data-type="country_type"]').append(tmp.clone());
- }
- abContactRef.find('[data-type="\\%address"]').find('[data-type="country_type"]').attr('data-autoselect',globalSettings.defaultaddresscountry.value);
- for(var key in addrVals)
- abContactRef.find('[data-type="\\%address"][data-id="'+key+'"]').find('[data-type="country_type"]').val(addrVals[key]);
- }
- function localizeCardDAV()
- {
- // frequently used
- var abContactRef=$('#ABContact');
- // restore original templates
- $('#ResourceCardDAVList').empty().append(globalOrigCardDAVListTemplate.clone());
- abContactRef.empty().append(globalOrigVcardTemplate.clone());
- localizeAddressTypes();
- // interface translation
- $('[data-type="system_logo"]').attr('alt',localization[globalInterfaceLanguage].altLogo);
- $('[data-type="system_username"]').attr('placeholder',localization[globalInterfaceLanguage].pholderUsername);
- $('[data-type="system_password"]').attr('placeholder',localization[globalInterfaceLanguage].pholderPassword);
- $('[data-type="resourcesCardDAV_txt"]').text(localization[globalInterfaceLanguage].txtAddressbooks);
- $('[data-type="contact_txt"]').text(localization[globalInterfaceLanguage].txtContact);
- $('[data-type="search"]').attr('placeholder',localization[globalInterfaceLanguage].txtSearch);
- $('#AddContact').attr('alt',localization[globalInterfaceLanguage].altAddContact);
- $('#AddContact').attr('title',localization[globalInterfaceLanguage].altAddContact);
- $('#Logout').attr('alt',localization[globalInterfaceLanguage].altLogout);
- $('#Logout').attr('title',localization[globalInterfaceLanguage].altLogout);
- $('#showUnloadedAddressbooks').attr({title:capitalize(localization[globalInterfaceLanguage].txtEnabledAddressbooks),alt:capitalize(localization[globalInterfaceLanguage].txtEnabledAddressbooks)});
- $('#loadUnloadedAddressbooks').val(localization[globalInterfaceLanguage].buttonSave);
- $('#loadUnloadedAddressbooksCancel').val(localization[globalInterfaceLanguage].buttonCancel);
- abContactRef.find('#photoBox').find('h1').text(localization[globalInterfaceLanguage].txtRemoteImage);
- abContactRef.find('#photoURL').attr('placeholder',localization[globalInterfaceLanguage].pholderUrlVal);
- abContactRef.find('[data-type="photo"]').text(localization[globalInterfaceLanguage].altPhoto);
- abContactRef.find('[data-type="given"]').attr('placeholder',localization[globalInterfaceLanguage].pholderGiven);
- abContactRef.find('[data-type="family"]').attr('placeholder',localization[globalInterfaceLanguage].pholderFamily);
- abContactRef.find('[data-type="middle"]').attr('placeholder',localization[globalInterfaceLanguage].pholderMiddle);
- abContactRef.find('[data-type="nickname"]').attr('placeholder',localization[globalInterfaceLanguage].pholderNickname);
- abContactRef.find('[data-type="ph_firstname"]').attr('placeholder',localization[globalInterfaceLanguage].pholderPhGiven);
- abContactRef.find('[data-type="ph_lastname"]').attr('placeholder',localization[globalInterfaceLanguage].pholderPhFamily);
- abContactRef.find('[data-type="prefix"]').attr('placeholder',localization[globalInterfaceLanguage].pholderPrefix);
- abContactRef.find('[data-type="suffix"]').attr('placeholder',localization[globalInterfaceLanguage].pholderSuffix);
- abContactRef.find('[data-type="date_bday"]').attr('placeholder',localization[globalInterfaceLanguage].pholderBday);
- abContactRef.find('[data-type="title"]').attr('placeholder',localization[globalInterfaceLanguage].pholderTitle);
- abContactRef.find('[data-type="org"]').attr('placeholder',localization[globalInterfaceLanguage].pholderOrg);
- abContactRef.find('[data-type="department"]').attr('placeholder',localization[globalInterfaceLanguage].pholderDepartment);
- abContactRef.find('span[data-type="company_contact"]').text(localization[globalInterfaceLanguage].txtCompanyContact);
- abContactRef.find('[data-type="\\%del"]').attr('alt',localization[globalInterfaceLanguage].altDel);
- abContactRef.find('[data-type="\\%add"]').attr('alt',localization[globalInterfaceLanguage].altAdd);
- abContactRef.find('[data-type="value_handler"]').attr('alt',localization[globalInterfaceLanguage].altValueHandler);
- abContactRef.find('[data-type=":custom"]').text(localization[globalInterfaceLanguage].txtCustom);
- abContactRef.find('[data-type="custom_value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderCustomVal);
- abContactRef.find('[data-type="dates_txt"]').text(localization[globalInterfaceLanguage].txtDates);
- abContactRef.find('[data-type="\\%date"]').find('input[data-type="date_value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderDate);
- abContactRef.find('[data-type="\\%date"]').find('[data-type=":_$!<anniversary>!$_:"]').text(localization[globalInterfaceLanguage].txtDatesAnniversary);
- abContactRef.find('[data-type="\\%date"]').find('[data-type=":_$!<other>!$_:"]').text(localization[globalInterfaceLanguage].txtDatesOther);
- abContactRef.find('[data-type="phone_txt"]').text(localization[globalInterfaceLanguage].txtPhone);
- abContactRef.find('[data-type="\\%phone"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderPhoneVal);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="work"]').text(localization[globalInterfaceLanguage].txtPhoneWork);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="home"]').text(localization[globalInterfaceLanguage].txtPhoneHome);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="cell"]').text(localization[globalInterfaceLanguage].txtPhoneCell);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="cell,work"]').text(localization[globalInterfaceLanguage].txtPhoneCellWork);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="cell,home"]').text(localization[globalInterfaceLanguage].txtPhoneCellHome);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="main"]').text(localization[globalInterfaceLanguage].txtPhoneMain);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="pager"]').text(localization[globalInterfaceLanguage].txtPhonePager);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="fax"]').text(localization[globalInterfaceLanguage].txtPhoneFax);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="fax,work"]').text(localization[globalInterfaceLanguage].txtPhoneFaxWork);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="fax,home"]').text(localization[globalInterfaceLanguage].txtPhoneFaxHome);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="iphone"]').text(localization[globalInterfaceLanguage].txtPhoneIphone);
- abContactRef.find('[data-type="\\%phone"]').find('[data-type="other"]').text(localization[globalInterfaceLanguage].txtPhoneOther);
- abContactRef.find('[data-type="email_txt"]').text(localization[globalInterfaceLanguage].txtEmail);
- abContactRef.find('[data-type="\\%email"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderEmailVal);
- abContactRef.find('[data-type="\\%email"]').find('[data-type="internet,work"]').text(localization[globalInterfaceLanguage].txtEmailWork);
- abContactRef.find('[data-type="\\%email"]').find('[data-type="home,internet"]').text(localization[globalInterfaceLanguage].txtEmailHome);
- abContactRef.find('[data-type="\\%email"]').find('[data-type=":mobileme:,internet"]').text(localization[globalInterfaceLanguage].txtEmailMobileme);
- abContactRef.find('[data-type="\\%email"]').find('[data-type=":_$!<other>!$_:,internet"]').text(localization[globalInterfaceLanguage].txtEmailOther);
- abContactRef.find('[data-type="url_txt"]').text(localization[globalInterfaceLanguage].txtUrl);
- abContactRef.find('[data-type="\\%url"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderUrlVal);
- abContactRef.find('[data-type="\\%url"]').find('[data-type="work"]').text(localization[globalInterfaceLanguage].txtUrlWork);
- abContactRef.find('[data-type="\\%url"]').find('[data-type="home"]').text(localization[globalInterfaceLanguage].txtUrlHome);
- abContactRef.find('[data-type="\\%url"]').find('[data-type=":_$!<homepage>!$_:"]').text(localization[globalInterfaceLanguage].txtUrlHomepage);
- abContactRef.find('[data-type="\\%url"]').find('[data-type=":_$!<other>!$_:"]').text(localization[globalInterfaceLanguage].txtUrlOther);
- abContactRef.find('[data-type="related_txt"]').text(localization[globalInterfaceLanguage].txtRelated);
- abContactRef.find('[data-type="\\%person"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderRelatedVal);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<manager>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedManager);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<assistant>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedAssistant);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<father>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedFather);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<mother>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedMother);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<parent>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedParent);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<brother>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedBrother);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<sister>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedSister);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<child>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedChild);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<friend>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedFriend);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<spouse>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedSpouse);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<partner>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedPartner);
- abContactRef.find('[data-type="\\%person"]').find('[data-type=":_$!<other>!$_:"]').text(localization[globalInterfaceLanguage].txtRelatedOther);
- abContactRef.find('[data-type="im_txt"]').text(localization[globalInterfaceLanguage].txtIm);
- abContactRef.find('[data-type="\\%im"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderImVal);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="work"]').text(localization[globalInterfaceLanguage].txtImWork);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="home"]').text(localization[globalInterfaceLanguage].txtImHome);
- abContactRef.find('[data-type="\\%im"]').find('[data-type=":mobileme:"]').text(localization[globalInterfaceLanguage].txtImMobileme);
- abContactRef.find('[data-type="\\%im"]').find('[data-type=":_$!<other>!$_:"]').text(localization[globalInterfaceLanguage].txtImOther);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="aim"]').text(localization[globalInterfaceLanguage].txtImProtAim);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="icq"]').text(localization[globalInterfaceLanguage].txtImProtIcq);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="irc"]').text(localization[globalInterfaceLanguage].txtImProtIrc);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="jabber"]').text(localization[globalInterfaceLanguage].txtImProtJabber);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="msn"]').text(localization[globalInterfaceLanguage].txtImProtMsn);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="yahoo"]').text(localization[globalInterfaceLanguage].txtImProtYahoo);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="facebook"]').text(localization[globalInterfaceLanguage].txtImProtFacebook);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="gadugadu"]').text(localization[globalInterfaceLanguage].txtImProtGadugadu);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="googletalk"]').text(localization[globalInterfaceLanguage].txtImProtGoogletalk);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="qq"]').text(localization[globalInterfaceLanguage].txtImProtQq);
- abContactRef.find('[data-type="\\%im"]').find('[data-type="skype"]').text(localization[globalInterfaceLanguage].txtImProtSkype);
- abContactRef.find('[data-type="profile_txt"]').text(localization[globalInterfaceLanguage].txtProfile);
- abContactRef.find('[data-type="\\%profile"]').find('input[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderProfileVal);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="twitter"]').text(localization[globalInterfaceLanguage].txtProfileTwitter);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="facebook"]').text(localization[globalInterfaceLanguage].txtProfileFacebook);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="flickr"]').text(localization[globalInterfaceLanguage].txtProfileFlickr);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="linkedin"]').text(localization[globalInterfaceLanguage].txtProfileLinkedin);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="myspace"]').text(localization[globalInterfaceLanguage].txtProfileMyspace);
- abContactRef.find('[data-type="\\%profile"]').find('[data-type="sinaweibo"]').text(localization[globalInterfaceLanguage].txtProfileSinaweibo);
- abContactRef.find('[data-type="address_txt"]').text(localization[globalInterfaceLanguage].txtAddress);
- abContactRef.find('[data-type="\\%address"]').find('[data-type="work"]').text(localization[globalInterfaceLanguage].txtAddressWork);
- abContactRef.find('[data-type="\\%address"]').find('[data-type="home"]').text(localization[globalInterfaceLanguage].txtAddressHome);
- abContactRef.find('[data-type="\\%address"]').find('[data-type=":_$!<other>!$_:"]').text(localization[globalInterfaceLanguage].txtAddressOther);
- abContactRef.find('[data-type="categories_txt"]').text(localization[globalInterfaceLanguage].txtCategories);
- abContactRef.find('[data-type="note_txt"]').text(localization[globalInterfaceLanguage].txtNote);
- abContactRef.find('[data-type="\\%note"]').find('textarea[data-type="value"]').attr('placeholder',localization[globalInterfaceLanguage].pholderNoteVal);
- abContactRef.find('[data-type="edit"]').val(localization[globalInterfaceLanguage].buttonEdit);
- abContactRef.find('[data-type="add_contact"]').val(localization[globalInterfaceLanguage].altAddContact);
- abContactRef.find('[data-type="save"]').val(localization[globalInterfaceLanguage].buttonSave);
- abContactRef.find('[data-type="cancel"]').val(localization[globalInterfaceLanguage].buttonCancel);
- abContactRef.find('[data-type="delete_from_group"]').val(localization[globalInterfaceLanguage].buttonDeleteFromGroup);
- abContactRef.find('[data-type="delete"]').val(localization[globalInterfaceLanguage].buttonDelete);
- // hook for extension specific localization
- if(typeof(globalContactsExtLocalize)=='function')
- globalContactsExtLocalize(abContactRef);
- globalTranslCardDAVListTemplate=$('#ResourceCardDAVListTemplate').clone();
- globalTranslCardDAVListHeader=globalTranslCardDAVListTemplate.find('.resourceCardDAV_header').clone();
- globalTranslCardDAVListItem=globalTranslCardDAVListTemplate.find('.resourceCardDAV_item').clone();
- globalTranslVcardTemplate=$('#vCardTemplate').contents().clone();
- // CUSTOM PLACEHOLDER (initialization for the whole page)
- $('input[placeholder],textarea[placeholder]').placeholder();
- }
- function processEditorElements(inputEditorRef, processingType, inputIsReadonly, inputIsCompany)
- {
- var cssShowAsTxtClass='element_show_as_text';
- var cssGrayedTxt='element_grayed';
- var cssElementNoDisplay='element_no_display';
- var cssElementHide='element_hide';
- var tmp_ref=inputEditorRef;
- if(processingType=='hide')
- {
- tmp_ref.attr('data-editor-state', 'show');
- var disabled=true;
- var readonly=true;
- }
- else
- {
- tmp_ref.attr('data-editor-state', 'edit');
- var disabled=false;
- var readonly=false;
- }
- var inputLockedElements=[];
- if(typeof(globalContactsExtGetLockedElements)=='function')
- inputLockedElements=globalContactsExtGetLockedElements(inputIsCompany);
- var inputDisabledElements=[];
- if(typeof(globalContactsExtGetDisabledElements)=='function')
- inputDisabledElements=globalContactsExtGetDisabledElements(inputIsCompany);
- // show "drag" border on photo & delete button
- tmp_ref.find('#photo_drag').css('display', (disabled || readonly ? 'none' : 'inline'));
- // if the editor state is "edit" show the "delete" button
- if(!tmp_ref.find('#photo').hasClass('photo_blank'))
- tmp_ref.find('#reset_img').css('display', (disabled || readonly ? 'none': 'inline'));
- // checkboxes
- var tmp=tmp_ref.find('[type="checkbox"]');
- tmp.each(
- function(index,element)
- {
- var tmp=$(element);
- var tmp_data_type=tmp.attr('data-type');
- tmp.prop('disabled', disabled || inputLockedElements.indexOf('[data-type="'+tmp_data_type+'"]')!=-1);
- if(!tmp.prop('checked') && (processingType=='hide' || inputLockedElements.indexOf('[data-type="'+tmp_data_type+'"]')!=-1))
- tmp.parent().addClass(cssGrayedTxt);
- else
- tmp.parent().removeClass(cssGrayedTxt);
- }
- );
- tmp_ref.find('input[data-type^="date_"]').prop('disabled', disabled || readonly);
- // family name, given name, and organization name
- var typeList=['family', 'given', 'middle', 'nickname', 'prefix', 'suffix', 'ph_firstname', 'ph_lastname', 'date_bday', 'tags', 'title', 'department', 'org'];
- for(var i=0; i<typeList.length; i++)
- {
- var elementRef = tmp_ref.find('[data-type="'+typeList[i]+'"]');
- var elementDisabled = inputDisabledElements.indexOf('[data-type="'+typeList[i]+'"]')!=-1 && (processingType=='add' || elementRef.val()=='');
- var elementReadOnly = readonly || inputLockedElements.indexOf('[data-type="'+typeList[i]+'"]')!=-1 || elementDisabled;
- elementRef.prop({'readonly':elementReadOnly, 'disabled':elementDisabled}).toggleClass('non_editable', elementDisabled);
- }
- var tmp_tags_prefix=['#tags'];
- var typeList=new Array({sel: '[data-type="\\%address"]'}, {sel: '[data-type="\\%phone"]'}, {sel: '[data-type="\\%email"]'}, {sel: '[data-type="\\%url"]'}, {sel: '[data-type="\\%date"]'}, {sel: '[data-type="\\%person"]'}, {sel: '[data-type="\\%im"]'}, {sel: '[data-type="\\%profile"]'}, {sel: '[data-type="\\%categories"]'}, {sel: '[data-type="\\%note"]'});
- // hook for extending the list of editor elements
- if(typeof(globalContactsExtGetAdditionalElements)=='function')
- {
- tmp_tags_prefix=tmp_tags_prefix.concat(globalContactsExtGetAdditionalElements('tags'));
- typeList=typeList.concat(globalContactsExtGetAdditionalElements('common'));
- }
- tmp_ref.find('select').prop('disabled', disabled);
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$((disabled ? SVG_select_dis : SVG_select)).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': (disabled ? '-22px' : '-19px'), 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- //XXXX check this - was $('#ABContact')
- tmp_ref.find('select').parent().find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- for(var i=0; i<tmp_tags_prefix.length; i++)
- {
- var tmp=tmp_ref.find(tmp_tags_prefix[i]+'_tag');
- tmp.prop('readonly', readonly);
- if(readonly)
- tmp.closest('div.tagsinput').addClass('readonly');
- else
- tmp.closest('div.tagsinput').removeClass('readonly');
- }
- for(var i=0; i<typeList.length; i++)
- {
- var found_non_empty=0;
- var empty = false;
- tmp=tmp_ref.find(typeList[i].sel);
- tmp.each(
- function(index, element)
- {
- var tmp=$(element).find('[data-type="value"]');
- if(tmp.length==0)
- tmp=$(element).find('[data-type="date_value"]');
- var found=0;
- // check if there is any data present (if not, whe hide the element)
- if($(element).attr('data-type')=='%address') // address is handled specially
- tmp.each(
- function(index,element)
- {
- if($(element).attr('data-addr-field')!='' && $(element).attr('data-addr-field')!='country' && $(element).val()!='')
- {
- found=1;
- return false;
- }
- }
- );
- else if(tmp.val()!='') // other elements (not address)
- found=1;
- if(processingType=='hide')
- {
- if(found)
- {
- $(element).find('[data-type="\\%add"]').find('input[type="image"]').addClass(cssElementNoDisplay);
- $(element).find('[data-type="\\%del"]').find('input[type="image"]').addClass(cssElementNoDisplay);
- $(element).find('select').prop('disabled', disabled);
- $(element).find('textarea').prop('disabled', disabled);
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$((disabled ? SVG_select_dis : SVG_select)).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': (disabled ? '-22px' : '-19px'), 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- //XXXX check this - was $('#ABContact')
- $(element).find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- tmp.prop('readonly', readonly);
- found_non_empty=1;
- }
- else
- $(element).addClass(cssElementNoDisplay);
- }
- else // 'show'
- {
- empty = empty || $(element).hasClass(cssElementNoDisplay);
- $(element).removeClass(cssElementNoDisplay);
- $(element).find('[data-type="\\%add"]').find('input[type="image"]').removeClass(cssElementNoDisplay);
- $(element).find('[data-type="\\%del"]').find('input[type="image"]').removeClass(cssElementNoDisplay);
- $(element).find('select').prop('disabled', disabled);
- $(element).find('textarea').prop('disabled', disabled);
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$((disabled ? SVG_select_dis : SVG_select)).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': (disabled ? '-22px' : '-19px'), 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- //XXXX check this - was $('#ABContact')
- $(element).find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- tmp.prop('readonly', readonly);
- }
- }
- );
- if(processingType==='show' && !empty) {
- if(typeList[i].sel==='[data-type="\\%address"]') {
- tmp.each(function() {
- var street = $(this).find('[data-addr-field="street"]');
- if(street.val()) {
- street.trigger('keyup.street');
- }
- });
- }
- if(typeof globalContactAutoExpand=='undefined' || globalContactAutoExpand!=false)
- tmp.last().find('[data-type="\\%add"]').find('.op').trigger('click');
- }
- // set the visibility of the buttons
- if(processingType=='hide')
- {
- if(inputIsReadonly!=true)
- {
- if(typeof globalGroupContactsByCompanies!='undefined' && globalGroupContactsByCompanies==true && inputIsCompany)
- tmp_ref.find('[data-type="add_contact"]').removeClass(cssElementNoDisplay);
- else
- tmp_ref.find('[data-type="add_contact"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="edit"]').removeClass(cssElementNoDisplay);
- }
- else
- {
- tmp_ref.find('[data-type="add_contact"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="edit"]').addClass(cssElementNoDisplay);
- }
- tmp_ref.find('[data-type="save"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="cancel"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="delete_from_group"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="delete"]').addClass(cssElementNoDisplay);
- }
- else if(processingType=='add')
- {
- tmp_ref.find('[data-type="add_contact"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="edit"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="save"]').removeClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="cancel"]').removeClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="delete_from_group"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="delete"]').addClass(cssElementNoDisplay);
- }
- else
- {
- tmp_ref.find('[data-type="add_contact"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="edit"]').addClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="save"]').removeClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="cancel"]').removeClass(cssElementNoDisplay);
- // show "Delete from Group" only if there is an active contact group
- // XXX we need to use another identificator
- // if(globalResourceCardDAVList.getLoadedAddressbook().filterUID[globalResourceCardDAVList.getLoadedAddressbook().filterUID.length-1]!='/')
- // tmp.find('[data-type="delete_from_group"]').removeClass(cssElementNoDisplay);
- tmp_ref.find('[data-type="delete"]').removeClass(cssElementNoDisplay);
- }
- if(!found_non_empty)
- {
- if(processingType=='hide')
- tmp.prev().addClass(cssElementNoDisplay);
- else
- tmp.prev().removeClass(cssElementNoDisplay);
- }
- }
- // set editor "process" hook
- if(typeof(globalContactsExtEditorProcess)=='function')
- globalContactsExtEditorProcess(tmp_ref, 'post', processingType, inputIsCompany);
- }
- function loadImage(image)
- {
- var canvas = $('#photo');
- var canvasElement = canvas.get(0);
- var imageWidth = image.width;
- var imageHeight = image.height;
- var canvasWidth = canvas.width()*globalContactPhotoScaleFactor;
- var canvasHeight = canvas.height()*globalContactPhotoScaleFactor;
- var clipStartX = 0;
- var clipStartY = 0;
- var clipWidth = imageWidth;
- var clipHeight = imageHeight;
- canvasElement.width = canvasWidth;
- canvasElement.height = canvasHeight;
- if(imageWidth-canvasWidth < imageHeight-canvasHeight) {
- var clipLength = Math.ceil((imageHeight-imageWidth/canvasWidth*canvasHeight)/2);
- clipStartY = clipLength;
- clipHeight = imageHeight-clipLength*2;
- }
- else {
- var clipLength = Math.ceil((imageWidth-imageHeight/canvasHeight*canvasWidth)/2);
- clipStartX = clipLength;
- clipWidth = imageWidth-clipLength*2;
- }
- canvasElement.getContext('2d').drawImage(image, clipStartX, clipStartY, clipWidth, clipHeight, 0, 0, canvasWidth, canvasHeight);
- canvas.removeClass('photo_blank');
- }
- function CardDAVeditor_cleanup(inputLoadEmpty, inputIsCompany)
- {
- CardDAVcleanupRegexEnvironment();
- // Cleanup the editor and store reference to the editor object
- globalRefVcardEditor=globalTranslVcardTemplate.clone();
- // cleanup old data form address fields
- globalAddressElementOldData={};
- if(typeof(globalContactsExtEditorProcess)=='function')
- globalContactsExtEditorProcess(globalRefVcardEditor, 'pre', null, inputIsCompany);
- /*************************** BAD HACKS SECTION ***************************/
- /* IE or FF */
- if($.browser.msie || $.browser.mozilla)
- {
- // ADD empty SVG to interface (we will replace it later)
- $('<svg data-type="select_icon"></svg>').css('display', 'none').insertAfter(globalRefVcardEditor.find('select[data-type$="_type"]'));
- if($.browser.msie && parseInt($.browser.version, 10)==10) /* IE 10 (because there are no more conditional comments) */
- globalRefVcardEditor.find('[data-type="\\%note"]').find('textarea[data-type="value"]').text('').attr('placeholder',$('[data-type="\\%note"]').find('textarea[data-type="value"]').attr('placeholder'));
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- // bind events (see also add_elements())
- // hide the "-" button (we maybe change this in future)
- globalRefVcardEditor.find('[data-type="\\%del"]').css('visibility', 'hidden');
- var tmp_arr=['[data-type="\\%phone"]', '[data-type="\\%email"]', '[data-type="\\%url"]', '[data-type="\\%date"]', '[data-type="\\%person"]', '[data-type="\\%im"]', '[data-type="\\%profile"]', '[data-type="\\%address"]'];
- for(var i=0; i<tmp_arr.length; i++)
- {
- globalABEditorCounter[tmp_arr[i]]=1; // restart id counters for editor objects
- globalRefVcardEditor.find(tmp_arr[i]+' [data-type="\\%add"] input').data('customSelector', tmp_arr[i]).click(function(){add_element($(this).parent(), $(this).data('customSelector'), $(this).data('customSelector'), '[data-type="\\%add"]','[data-type="\\%del"]', globalABEditorCounter[$(this).data('customSelector')]++);checkContactFormScrollBar();});
- globalRefVcardEditor.find(tmp_arr[i]+' [data-type="\\%del"] input').data('customSelector', tmp_arr[i]).click(function(){del_element($(this).parent(), $(this).data('customSelector'), '[data-type="\\%add"]','[data-type="\\%del"]');checkContactFormScrollBar();});
- if(typeof globalContactAutoExpand=='undefined' || globalContactAutoExpand!=false)
- {
- globalRefVcardEditor.find(tmp_arr[i]+' input[type="text"]').bind('keyup', function() {
- var el = $(this);
- var row = el.closest('tr[data-type^="%"]');
- var isLast = row.attr('data-type')!==row.next().attr('data-type');
- if(isLast && el.val()) {
- row.find('[data-type="\\%add"] input').trigger('click');
- }
- });
- }
- //globalRefVcardEditor.find(tmp_arr[i]).children().filter('[data-type="\\%add"]').click();
- }
- // one special thing for address
- globalRefVcardEditor.find('[data-type="\\%address"] [data-type="country_type"]').change(function(){set_address_country(this);checkContactFormScrollBar();});
- var tmp=globalRefVcardEditor.find('[data-type="\\%address"]');
- var tmp_select=tmp.find('[data-type="country_type"]').attr('data-autoselect');
- if(tmp_select!='')
- {
- tmp.find('[data-type="country_type"]').children('[data-type="'+jqueryEscapeSelector(tmp_select)+'"]').prop('selected', true);
- tmp.find('[data-autoselect]').change();
- }
- globalRefVcardEditor.find('[data-type="custom_value"]').bind('keyup change', function(){
- $(this).parent().find('[data-type="invalid"]').css('display', (vCard.pre['custom_type'].test($(this).val()) ? 'none' : 'inline'));
- });
- // init image uploader
- globalRefVcardEditor.find('.photo_div').bind('dragover dragenter', function(event){
- event.stopPropagation();
- event.preventDefault();
- // allow image manipulation only if the editor is in "edit" state
- if($('#vCardEditor').attr('data-editor-state')!="edit")
- return false;
- event.originalEvent.dataTransfer.dropEffect='copy'; // explicitly show this is a copy
- });
- globalRefVcardEditor.find('.photo_div').bind('drop', function(event) {
- process_image(event);
- });
- globalRefVcardEditor.find('#upload_file').bind('change', function(event) {
- process_image(event);
- });
- globalRefVcardEditor.find('#photoBoxButton').bind('click', function(event) {
- var photo = $('#photoURL').val();
- var newImg = new Image();
- newImg.src = photo;
- newImg.onload = function() {
- // show the image "delete" button
- $('#reset_img').css('display', 'inline');
- // remove the template related to previous image (start with clean one)
- vCard.tplM['contentline_PHOTO'][0]=null;
- $('#photoURLHidden').val($('#photoURL').val());
- loadImage(this);
- hidePhotoBox();
- };
- newImg.onerror = function() {
- $('#photoURL').addClass('invalid');
- $('#photoBoxContent').find('[data-type="invalid"]').css('display', 'inline');
- };
- });
- // initialize tagsinput
- globalRefVcardEditor.find('#tags').tagsInput({
- 'height': null,
- 'width': '530px',
- 'color': '#2d2d2d',
- 'placeholderColor': '#e0e0e0',
- 'useNativePlaceholder': true,
- 'defaultText': localization[globalInterfaceLanguage].addCategory,
- 'delimiter': ',',
- 'allowDelimiterInValue': true, // if true delimiter is escaped with '\' ('\' is escaped as '\\')
- 'trimInput': false,
- 'autocomplete_url': globalAddressbookList.getABCategories(true),
- 'autocomplete': {
- 'autoFocus': true,
- 'minLength': 0
- },
- 'onChange' : function(tag, tagImported)
- {
- // copy the array
- var xList=globalAddressbookList.getABCategories(true);
- var currentTags=$(this).val().splitCustom(',');
- for(var i=xList.length-1; i>=0; i--)
- {
- for(var j=0; j<currentTags.length; j++)
- if(xList[i] == currentTags[j])
- xList.splice(i, 1);
- }
- $('#tags_tag').autocomplete('option', 'source', xList);
- checkContactFormScrollBar();
- }
- });
- // initialize datepicker
- globalRefVcardEditor.find('input[data-type^="date_"]').focus(function(){initDatePicker($(this));});
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie && parseInt($.browser.version, 10)==10) /* IE 10 (because there are no more conditional comments) */
- globalRefVcardEditor.find('#tags_tag').css({'padding-top': '1px', 'padding-left': '1px'});
- /*************************** END OF BAD HACKS SECTION ***************************/
- globalRefVcardEditor.find('[data-type="org"]').autocomplete({'source': function(request, response){var matcher=RegExp($.ui.autocomplete.escapeRegex(request.term), 'i'); response($.grep(globalAddressbookList.getABCompanies(true), function(value){value=value.label || value.value || value; return matcher.test(value) || matcher.test(value.multiReplace(globalSearchTransformAlphabet));}));}, 'minLength': 0, 'change': function(){$('[data-type="department"]').autocomplete({'source': function(request, response){var matcher=RegExp($.ui.autocomplete.escapeRegex(request.term), 'i'); response($.grep(globalAddressbookList.getABCompanyDepartments($('#vCardEditor').find('[data-type="org"]').val()), function(value){value=value.label || value.value || value; return matcher.test(value) || matcher.test(value.multiReplace(globalSearchTransformAlphabet));}));}, 'minLength': 0})}});
- /*
- globalABListTop=globalRefABList.offset().top;
- globalABListLeft=globalRefABList.offset().left;
- // rewrite it and use:
- // var start=document.elementFromPoint(globalABListLeft, globalABListTop);
- globalLastScrollPos=0; // move to the main.js
- globalRefABList.scroll(function(e){
- globalRefABListTable.children('.ablist_header:visible').each(function(index, element){
- var headerWidth=$(element).outerWidth();
- var headerHeight=$(element).outerHeight();
- var floating_elem=$('#SystemCardDavMATE > .ablist_header');
- if(globalLastScrollPos<=globalRefABList.scrollTop()) // scrolling DOWN
- {
- var next_h=$(element).nextAll('.ablist_header:visible').first(); // next visible header
- if(next_h!=null && next_h.offset().top>globalABListTop) // only if it is below to #ABList do action
- {
- var cloned=$(element).clone();
- // do not create the floating header with the same text twice
- if(floating_elem.filter(':contains("'+jqueryEscapeSelector(cloned.text())+'")').length==0)
- {
- // parameters for the fixed element
- cloned.css({'top': globalABListTop, 'left': globalABListLeft, 'width': headerWidth, 'position': 'fixed', 'z-index': 1});
- // remove the previous floating header
- floating_elem.remove();
- // set the opacity back to standard value (item is invisible scrolled above the ABlist top)
- globalRefABListTable.children('.ablist_header').each(function(index,element){
- if($(element).css('opacity')=='0'){$(element).css('opacity',0.85);}
- });
- // set the element opacity to 0 and "replace" it with floating element above it
- $(element).css('opacity',0);
- cloned.appendTo('#SystemCardDavMATE');
- }
- // move the previous floating header UP
- if(next_h.offset().top<globalABListTop+headerHeight) // if next header offset is immediately below to top offset
- floating_elem.css('top',globalABListTop-(globalABListTop+headerHeight-next_h.offset().top));
- return false;
- }
- }
- else // scrolling UP
- {
- if($(element).offset().top>=globalABListTop)
- {
- var prev_h=$(element).prevAll('.ablist_header').first();
- if(prev_h!=null) // if there is a previous header in #ABList do action
- {
- var cloned=$(prev_h).clone();
- // do not create the floating header with the same text twice
- if(floating_elem.filter(':contains("'+jqueryEscapeSelector(cloned.text())+'")').length==0)
- {
- // parameters for the fixed element
- // cloned.css('top',globalABListTop-headerHeight);
- cloned.css({'top': Math.min(globalABListTop,$(element).offset().top-headerHeight), 'left': globalABListLeft, 'width': headerWidth, 'position': 'fixed', 'z-index': 1});
- // remove the previous floating header
- floating_elem.remove();
- // set the opacity back to standard value (item is invisible scrolled above the ABlist top)
- globalRefABListTable.children('.ablist_header').each(function(index,element){
- if($(element).css('opacity')=='0'){$(element).css('opacity',0.85);}
- });
- // set the previous element opacity to 0 and "replace" it with floating element above it
- $(prev_h).css('opacity',0);
- cloned.appendTo('#SystemCardDavMATE');
- }
- }
- // move the next floating header DOWN
- if(floating_elem.length!=0 && floating_elem.offset().top<globalABListTop)
- floating_elem.css('top',Math.min(globalABListTop,$(element).offset().top-headerHeight));
- return false;
- }
- }
- });
- globalLastScrollPos=globalRefABList.scrollTop();
- });
- */
- // CUSTOM PLACEHOLDER (initialization for the editor)
- globalRefVcardEditor.find('input[placeholder],textarea[placeholder]').placeholder();
- // enable autosize for textarea elements
- globalRefVcardEditor.find('textarea[data-type="value"]').autosize({defaultStyles: {height: '64', overflow: '', 'overflow-y': '', 'word-wrap': '', resize: 'none'}, callback: function(){checkContactFormScrollBar();}});
- if(inputLoadEmpty==true)
- $('#EditorBox').fadeTo(0, 1); /* 0 = no animation */
- return globalRefVcardEditor;
- }
- function animate_message(messageSelector, messageTextSelector, duration, operation)
- {
- if(operation==undefined)
- operation='+=';
- var height=$(messageTextSelector).height()+14;
- var animation=400;
- $(messageSelector).animate({'max-height': height+'px', height: (operation==undefined ? '+=' : operation)+height+'px'}, animation, function(){
- if(operation=='+=')
- {
- if(messageSelector=='#ABInMessageEditBox')
- {
- $(messageTextSelector).text(localization[globalInterfaceLanguage][globalDisableAnimationMessageHiding]);
- globalObjectLoading=false
- globalDisableAnimationMessageHiding='';
- }
- else
- setTimeout(function(){
- animate_message(messageSelector, messageTextSelector, 0, '-=');
- }, duration);
- }
- });
- return duration+2*animation;
- }
- function show_editor_message(inputPosition, inputSetClass, inputMessage, inputDuration)
- {
- if(inputPosition==undefined || inputPosition=='in')
- {
- $('#ABContact').scrollTop(0);
- messageSelector='#ABInMessage';
- messageTextSelector='#ABInMessageText';
- }
- else
- {
- messageSelector='#ABMessage';
- messageTextSelector='#ABMessageText';
- }
- $(messageTextSelector).attr('class',inputSetClass);
- $(messageTextSelector).text(inputMessage);
- return animate_message(messageSelector, messageTextSelector, inputDuration);
- }
- function set_address_country(inputSelectedAddressObj)
- {
- var selectedCountry=$(inputSelectedAddressObj).find('option').filter(':selected').attr('data-type');
- var addressElement=$(inputSelectedAddressObj).closest('[data-type="\\%address"]');
- // store the previous data + cleanup the data-addr-fields, placeholders and values
- globalAddressElementOldData = {};
- addressElement.find('[data-addr-fid]').each(
- function(index, element)
- {
- var tmp=$(element).find('input');
- var tmp_field_name=tmp.attr('data-addr-field');
- if(tmp_field_name!=undefined && tmp_field_name!='') {
- if(!globalAddressElementOldData.hasOwnProperty(tmp_field_name)) {
- globalAddressElementOldData[tmp_field_name] = [];
- }
- globalAddressElementOldData[tmp_field_name].push({'value': tmp.val(), 'data-match': tmp.attr('data-match')});
- }
- if(tmp_field_name==='street') {
- tmp.unbind('keyup.street');
- }
- tmp.attr({'data-addr-field': '', 'data-match': '', 'placeholder': ''}).unplaceholder(); // REMOVE CUSTOM PLACEHOLDER
- tmp.val('');
- // set address country "cleanup" hook
- if(typeof(globalContactsExtAddrElemAfterCleanup)=='function')
- globalContactsExtAddrElemAfterCleanup(element);
- }
- );
- addressElement.find('[data-group="street"]').closest('tr[data-type="container"]').not(':first').remove();
- addressElement.find('[data-group]').removeAttr('data-group');
- if(addressTypes[selectedCountry]!=undefined)
- for(var i=1;i<addressTypes[selectedCountry].length;i++)
- {
- if(addressTypes[selectedCountry][i]['type']=='input')
- {
- var tmp=addressElement.find('[data-addr-fid="'+jqueryEscapeSelector(addressTypes[selectedCountry][i]['fid'])+'"]').find('input');
- tmp.attr('data-addr-field',addressTypes[selectedCountry][i]['data-addr-field']);
- tmp.attr('placeholder',addressTypes[selectedCountry][i]['placeholder']);
- if(addressTypes[selectedCountry][i]['data-addr-field']==='street') {
- tmp.closest('tr[data-type="container"]').attr('data-group', 'street');
- tmp.bind('keyup.street', function() {
- var el = $(this);
- var row = el.closest('tr[data-type="container"]');
- var isLast = row.attr('data-group')!==row.next().attr('data-group');
- if(isLast && el.val()) {
- row.clone(true).insertAfter(row).find('input').val('');
- }
- });
- }
- // here we restore the data from globalAddressElementOldData variable
- if(globalAddressElementOldData.hasOwnProperty(addressTypes[selectedCountry][i]['data-addr-field'])) {
- for(var j=0; j<globalAddressElementOldData[addressTypes[selectedCountry][i]['data-addr-field']].length; j++) {
- tmp = addressElement.find('[data-addr-fid="'+jqueryEscapeSelector(addressTypes[selectedCountry][i]['fid'])+'"]').find('input').last();
- tmp.val(globalAddressElementOldData[addressTypes[selectedCountry][i]['data-addr-field']][j]['value']);
- tmp.trigger('keyup.street');
- };
- }
- }
- else if(addressTypes[selectedCountry][i]['type']=='country')
- {
- var tmp=addressElement.find('[data-type="\\%country_container"]');
- tmp.find('select').find('option[data-type]').prop('selected', false);
- tmp.find('select').find('option[data-type="'+jqueryEscapeSelector(selectedCountry)+'"]').prop('selected', true);
- // the country selector is in wrong container -> we need to move it
- if(addressTypes[selectedCountry][i]['fid']!=tmp.closest('[data-addr-fid]').attr('data-addr-fid'))
- $(addressElement).find('[data-addr-fid="'+jqueryEscapeSelector(addressTypes[selectedCountry][i]['fid'])+'"]').append(tmp);
- }
- // set address country "update" hook
- if(typeof(globalContactsExtAddrElemAfterUpdate)=='function')
- globalContactsExtAddrElemAfterUpdate(addressElement, addressTypes[selectedCountry][i]);
- }
- // hide the unused fields by changing the CSS
- addressElement.find('[data-type="container"]').each(
- function(index,element)
- {
- var found=0;
- $(element).find('[data-addr-field]').each(
- function(index,element)
- {
- if($(element).attr('data-addr-field')!='')
- {
- found=1;
- return false;
- }
- }
- );
- if(found)
- $(element).removeClass('element_no_display_af');
- else
- $(element).addClass('element_no_display_af');
- }
- );
- // CUSTOM PLACEHOLDER (reinitialization due to possible placeholder value change)
- addressElement.find('input[data-type="value"][placeholder],textarea[data-type="value"][placeholder]').placeholder();
- }
- function add_element(inputElementID, inputParentSelector, newElementSelector, inputAddClassSelector, inputDelClassSelector, newElementID) // note: newElementSelector is always used with .last()
- {
- // we assume that the new element is inputElementID.parent() to minimize then number of selectors!
- var newElement=inputElementID.parent().clone().wrap('<div>'); // wrap('<div>') is used because we use .find() which not searches the "self"
- // disable the "add" button on the current element (do not move above)
- inputElementID.filter(inputAddClassSelector).css('visibility', 'hidden');
- // CUSTOM PLACEHOLDER
- // remove the "placeholder" data (custom placeholder label for IE)
- newElement.find('label').remove();
- newElement.find('[data-type="date_value"],[data-type="value"]').removeAttr('id', '').removeClass('placeholder-input');
- // unselect each selected element
- newElement.find('option').prop('selected', false);
- // remove the form values
- newElement.find('[data-type$="value"], [data-type$="date_value"]').val('');
- // hide custom types
- newElement.find('[data-type="custom_span"]').css('display', 'none');
- // get the current data-id value
- var prevID=newElement.attr("data-id");
- // add the new data-id value
- newElement.attr("data-id", newElementID);
- // add element "before insert" hook
- if(typeof(globalContactsExtAddElemBeforeInsert)=='function')
- globalContactsExtAddElemBeforeInsert(newElement);
- // add the new element (with enabled "add" button) + store the reference to the current element
- var tmpRef=inputElementID.parent().after(newElement);
- // enable the "del" button on this and the previous element
- tmpRef.next().addBack().find(inputDelClassSelector).css('visibility', '');
- // now we need a reference to the new element
- var tmpRef=tmpRef.next();
- // CUSTOM PLACEHOLDER
- // enable custom placeholder support (it is enabled only if needed)
- tmpRef.find('input[data-type="value"][placeholder], input[data-type="date_value"][placeholder],textarea[data-type="value"][placeholder]').placeholder();
- // enable autosize for textarea elements
- tmpRef.find('textarea[data-type="value"]').autosize({defaultStyles: {height: '64', overflow: '', 'overflow-y': '', 'word-wrap': '', resize: 'none'}, callback: function(){checkContactFormScrollBar();}});
- //bind datepicker
- if(tmpRef.find('input[data-type="date_value"]').hasClass('hasDatepicker'))
- tmpRef.find('input[data-type="date_value"]').removeClass('hasDatepicker');
- if(tmpRef.find('input[data-type="date_value"]').parent().find('img').css('display')!='none')
- tmpRef.find('input[data-type="date_value"]').parent().find('img').css('display','none')
- tmpRef.find('input[data-type="date_value"]').focus(function(){initDatePicker($(this));});
- // bind events
- var tmp_arr=['[data-type="\\%phone"]', '[data-type="\\%email"]', '[data-type="\\%url"]', '[data-type="\\%date"]', '[data-type="\\%person"]', '[data-type="\\%im"]', '[data-type="\\%profile"]', '[data-type="\\%address"]'];
- if(tmp_arr.indexOf(inputParentSelector)!=-1)
- {
- tmpRef.find('[data-type="\\%add"] input').data('customSelector', inputParentSelector).click(function(){add_element($(this).parent(), $(this).data('customSelector'), $(this).data('customSelector'), '[data-type="\\%add"]','[data-type="\\%del"]', globalABEditorCounter[$(this).data('customSelector')]++);checkContactFormScrollBar();});
- tmpRef.find('[data-type="\\%del"] input').data('customSelector', inputParentSelector).click(function(){del_element($(this).parent(), $(this).data('customSelector'), '[data-type="\\%add"]','[data-type="\\%del"]');checkContactFormScrollBar();});
- if(typeof globalContactAutoExpand=='undefined' || globalContactAutoExpand!=false)
- {
- tmpRef.find('input[type="text"]').bind('keyup', function() {
- var el = $(this);
- var row = el.closest('tr[data-type^="%"]');
- var isLast = row.attr('data-type')!==row.next().attr('data-type');
- if(isLast && el.val()) {
- row.find('[data-type="\\%add"] input').trigger('click');
- }
- });
- }
- // one special thing for address
- if(inputParentSelector=='[data-type="\\%address"]' && tmpRef.attr('data-type')=='%address')
- tmpRef.find('[data-type="country_type"]').change(function(){set_address_country(this);checkContactFormScrollBar();});
- }
- if(inputParentSelector=='[data-type="\\%address"]')
- {
- // execute the "autoselect"
- var tmp=inputElementID.closest(inputParentSelector).next();
- var tmp_select=tmp.find('[data-autoselect]').attr('data-autoselect');
- if(tmp_select!=null)
- {
- tmp.find('[data-type="country_type"]').children('[data-type="'+jqueryEscapeSelector(tmp_select)+'"]').prop('selected', true);
- tmp.find('[data-autoselect]').change();
- }
- }
- tmpRef.find('[data-type="custom_value"]').bind('keyup change', function(){
- $(this).parent().find('[data-type="invalid"]').css('display', (vCard.pre['custom_type'].test($(this).val()) ? 'none' : 'inline'));
- });
- if(typeof(globalContactsExtAddElemAfterInsert)=='function')
- globalContactsExtAddElemAfterInsert(tmpRef, inputDelClassSelector, prevID);
- return true;
- }
- function del_element(inputElementID, inputParentSelector, inputAddClassSelector, inputDelClassSelector)
- {
- // all elements except the last can be removed
- if(inputElementID.closest(inputParentSelector).siblings(inputParentSelector).length>0)
- {
- inputElementID.closest(inputParentSelector).remove();
- // enable the "add" button on last element
- $(inputParentSelector).last().find(inputAddClassSelector).css('visibility', '');
- // hide the "del" button if only one element is present (we maybe change this in future)
- if($(inputParentSelector).length==1)
- $(inputParentSelector).last().find(inputDelClassSelector).css('visibility', 'hidden');
- }
- else // currently not used because the "-" button is hidden on the last element (we maybe change this in future)
- inputElementID.closest(inputParentSelector).find('input[data-type="value"]').val('');
- }
- /* BEGIN image manipulation */
- function process_image(event)
- {
- event.stopPropagation();
- event.preventDefault();
- // allow image manipulation only if the editor is in "edit" state
- if($('#vCardEditor').attr('data-editor-state')!="edit")
- return false;
- if(typeof event.originalEvent.dataTransfer!='undefined')
- var files=event.originalEvent.dataTransfer.files; // fileList object from drag&drop
- else
- var files=event.originalEvent.target.files; // fileList object from input type file
- // files is a FileList of File objects. List some properties.
- for(var i=0;i<files.length;i++) // we handle only the first picture here ... (see below)
- {
- // only process image files
- if(!files[i].type.match(/image/i))
- continue;
- // do not accept images bigger than 64KiB
- // if(files[i].size>65536)
- // continue;
- // show the image "delete" button
- $('#reset_img').css('display', 'inline');
- // remove the template related to previous image (start with clean one)
- vCard.tplM['contentline_PHOTO'][0]=null;
- var reader=new FileReader();
- // closure to capture the file information.
- reader.onload=(function(theFile){
- return function(e){
- //escape(files[i].name), files[i].type, files[i].size, files[i].lastModifiedDate
- var newImg=new Image();
- newImg.src=e.target.result;
- newImg.onload=function(){
- loadImage(this);
- };
- };
- })(files[i]);
- reader.readAsDataURL(files[i]);
- break; // we handle only the first picture here ...
- }
- $('#photoURL, #photoURLHidden').val('');
- }
- /* END image manipulation */
- function hideNotVisibleMessage()
- {
- globalAddressbookList.contactToReload=null;
- animate_message('#ABInMessageEditBox', '#ABInMessageTextEditBox', 0, '-=');
- $('#ABInMessageEditBox').css('display','');
- }
- function initSearchCardDav()
- {
- if(globalQs==null)
- {
- $('#SearchBox').find('input[data-type="search"]').keyup(function(){
- globalAddressbookList.contactToReload=null
- });
- globalQs=$('#SearchBox').find('input[data-type="search"]').quicksearch(globalAddressbookList.contacts,
- {
- delay: 250,
- hide: function(){
- var tmp=$(this)[0];
- if(!tmp.headerOnly)
- tmp.search_hide=true;
- },
- show: function(){
- var tmp=$(this)[0];
- if(!tmp.headerOnly)
- tmp.search_hide=false;
- },
- prepareQuery: function (val){
- return val.multiReplace(globalSearchTransformAlphabet).toLowerCase().split(' ');
- },
- onBefore: function(){
- if($('#SearchBox').find('input[data-type="search"]').val()=='')
- $('#SearchBox').find('img[data-type="reset"]').css('display','none');
- else
- $('#SearchBox').find('img[data-type="reset"]').css('display','');
- },
- onAfter: function(){
- globalAddressbookList.applyABFilter(dataGetChecked('#ResourceCardDAVList'),false);
- // XXX maybe this was the reason for data-filter-url?
- // globalAddressbookList.applyABFilter(globalRefAddContact.attr('data-filter-url'),false);
- // maybe useful for somebody
- // if((selected_contact=globalRefABListTable.find('.ablist_item_selected')).length==1)
- // globalRefABList.scrollTop(globalRefABList.scrollTop()+selected_contact.offset().top-globalRefABList.offset().top-globalRefABList.height()*globalKBNavigationPaddingRate);
- }
- });
- }
- }
- function initKbAddrNavigation()
- {
- $(document.documentElement).keyup(function(event)
- {
- if(typeof globalActiveApp=='undefined' || globalActiveApp!='CardDavMATE')
- return true;
- if(globalActiveApp=='CardDavMATE' && globalObjectLoading==true)
- {
- event.preventDefault();
- return true;
- }
- //if($('#SystemCardDavMATE').css('display')!='none' && $('#ABListLoader').css('display')=='none' && $('#ABListOverlay').css('display')=='none' && !$('input[data-type="search"]').is(':focus'))
- /* XXX - System display:none changes */
- if($('#SystemCardDavMATE').css('visibility')!='hidden' && isCardDAVLoaded && $('#ABListOverlay').css('display')=='none' && !$('input[data-type="search"]').is(':focus'))
- {
- // 37 = left, 38 = up, 39 = right, 40 = down
- var selected_contact=null, next_contact=null;
- if((selected_contact=globalRefABListTable.find('.ablist_item_selected')).length==1)
- {
- if(event.keyCode == 38 && (next_contact=selected_contact.prevAll('.ablist_item').filter(':visible').first()).attr('data-id')!=undefined || event.keyCode == 40 && (next_contact=selected_contact.nextAll('.ablist_item').filter(':visible').first()).attr('data-id')!=undefined)
- globalAddressbookList.loadContactByUID(next_contact.attr('data-id'));
- }
- }
- });
- $(document.documentElement).keydown(function(event)
- {
- if(typeof globalActiveApp=='undefined' || globalActiveApp!='CardDavMATE')
- return true;
- if(globalActiveApp=='CardDavMATE' && globalObjectLoading==true)
- {
- event.preventDefault();
- return true;
- }
- //if($('#SystemCardDavMATE').css('display')!='none' && $('#ABListLoader').css('display')=='none' && $('#ABListOverlay').css('display')=='none' && !$('input[data-type="search"]').is(':focus'))
- /* XXX - System display:none changes */
- if($('#SystemCardDavMATE').css('visibility')!='hidden' && isCardDAVLoaded && $('#ABListOverlay').css('display')=='none' && !$('input[data-type="search"]').is(':focus'))
- {
- // 37 = left, 38 = up, 39 = right, 40 = down
- var selected_contact=null, next_contact=null;
- if((selected_contact=globalRefABListTable.find('.ablist_item_selected')).length==1)
- {
- var wrapperRef = $('.ablist_table_wrapper');
- if(event.keyCode == 38 && (next_contact=selected_contact.prevAll('.ablist_item').filter(':visible').first()).attr('data-id')!=undefined || event.keyCode == 40 && (next_contact=selected_contact.nextAll('.ablist_item').filter(':visible').first()).attr('data-id')!=undefined)
- {
- switch(event.keyCode)
- {
- case 38:
- event.preventDefault();
- if(wrapperRef.scrollTop()>wrapperRef.scrollTop()+next_contact.offset().top-wrapperRef.offset().top-wrapperRef.height()*globalKBNavigationPaddingRate)
- wrapperRef.scrollTop(wrapperRef.scrollTop()+next_contact.offset().top-wrapperRef.offset().top-wrapperRef.height()*globalKBNavigationPaddingRate);
- else if(wrapperRef.scrollTop()<wrapperRef.scrollTop()+next_contact.offset().top+next_contact.height()-wrapperRef.offset().top-wrapperRef.height()*(1-globalKBNavigationPaddingRate)) /* contact invisible (scrollbar moved) */
- wrapperRef.scrollTop(wrapperRef.scrollTop()+next_contact.offset().top+next_contact.height()-wrapperRef.offset().top-wrapperRef.height()*(1-globalKBNavigationPaddingRate));
- else
- return false;
- break;
- case 40:
- event.preventDefault();
- if(wrapperRef.scrollTop()<wrapperRef.scrollTop()+next_contact.offset().top+next_contact.height()-wrapperRef.offset().top-wrapperRef.height()*(1-globalKBNavigationPaddingRate)) /* contact invisible (scrollbar moved) */
- wrapperRef.scrollTop(wrapperRef.scrollTop()+next_contact.offset().top+next_contact.height()-wrapperRef.offset().top-wrapperRef.height()*(1-globalKBNavigationPaddingRate));
- else if(wrapperRef.scrollTop()>wrapperRef.scrollTop()+next_contact.offset().top-wrapperRef.offset().top-wrapperRef.height()*globalKBNavigationPaddingRate)
- wrapperRef.scrollTop(wrapperRef.scrollTop()+next_contact.offset().top-wrapperRef.offset().top-wrapperRef.height()*globalKBNavigationPaddingRate);
- else
- return false;
- break;
- default:
- break;
- }
- }
- else // no previous contact and up pressed || no next contact and down pressed
- {
- switch(event.keyCode)
- {
- case 38:
- wrapperRef.scrollTop(0);
- break;
- case 40:
- wrapperRef.scrollTop(wrapperRef.prop('scrollHeight'));
- break;
- default:
- break;
- }
- }
- }
- }
- });
- }
- function initDatePicker(inputObject)
- {
- if(!inputObject.hasClass('hasDatepicker'))
- {
- inputObject.datepicker({
- disabled: inputObject.prop('readonly') || inputObject.prop('disabled'),
- showMonthAfterYear: true,
- prevText: '',
- nextText: '',
- monthNamesShort: ['01','02','03','04','05','06','07','08','09','10','11','12'],
- dateFormat: globalSettings.datepickerformat.value,
- defaultDate: '-'+Math.round(30*365.25-1),
- minDate: '-120y',
- maxDate: '+0',
- yearRange: 'c-120:+0',
- firstDay: globalSettings.datepickerfirstdayofweek.value,
- weekendDays: globalSettings.weekenddays.value,
- changeMonth: true,
- changeYear: true,
- showAnim: '',
- afterUpdate: function(inst)
- {
- /*************************** BAD HACKS SECTION ***************************/
- // IE and FF datepicker selectbox problem fix
- if($.browser.msie || $.browser.mozilla)
- {
- var calendar=inst.dpDiv;
- setTimeout(function(){
- if($.browser.msie && parseInt($.browser.version, 10)==10) /* IE 10 */
- calendar.find('select').css({'padding-top': '1px', 'padding-left': '0px', 'padding-right': '0px'});
- var newSVG=$(SVG_select).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- calendar.find('select').after($($('<div>').append($(newSVG).clone()).html()));
- },1);
- }
- else if(navigator.platform.toLowerCase().indexOf('win')==0 && $.browser.webkit && !!window.chrome) /* Chrome on Windows */
- {
- var calendar=inst.dpDiv;
- setTimeout(function(){ calendar.find('select').css({'padding-left': '0px', 'padding-right': '13px'}); },1);
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- },
- beforeShow: function(input, inst) // set the datepicker value if the date is out of range (min/max)
- {
- inst.dpDiv.removeClass('ui-datepicker-simple');
- var valid=true;
- try {var currentDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, inputObject.val())}
- catch (e) {valid=false}
- if(valid==true && currentDate!=null)
- {
- var minDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'minDate');
- var maxDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'maxDate');
- var minDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, minDateText);
- var maxDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, maxDateText);
- if(currentDate<minDate)
- inputObject.val(minDateText);
- else if(currentDate>maxDate)
- inputObject.val(maxDateText);
- }
- // Timepicker hack (prevent IE to re-open the datepicker on date click + focus)
- var index=inputObject.attr("data-type");
- var d = new Date();
- if(globalTmpTimePickerHackTime[index]!=undefined && d.getTime()-globalTmpTimePickerHackTime[index]<200)
- return false;
- },
- onClose: function(dateText, inst) // set the datepicker value if the date is out of range (min/max) and reset the value to proper format (for example 'yy-mm-dd' allows '2000-1-1' -> we need to reset the value to '2000-01-01')
- {
- var valid=true;
- try {var currentDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, dateText)}
- catch (e) {valid=false}
- if(valid==true && currentDate!=null)
- {
- var minDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'minDate');
- var maxDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'maxDate');
- var minDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, minDateText);
- var maxDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, maxDateText);
- if(currentDate<minDate)
- inputObject.val(minDateText);
- else if(currentDate>maxDate)
- inputObject.val(maxDateText);
- else
- inputObject.val($.datepicker.formatDate(globalSettings.datepickerformat.value, currentDate));
- }
- // Timepicker hack (prevent IE to re-open the datepicker on date click + focus)
- var index=inputObject.attr("data-type");
- var d = new Date();
- globalTmpTimePickerHackTime[index]=d.getTime();
- inputObject.focus();
- if(inputObject.closest('tr').attr('data-attr-name')==='X-ABDATE') {
- inputObject.trigger('keyup');
- }
- }
- });
- inputObject.mousedown(function(){
- if(inputObject.datepicker('widget').css('display')=='none')
- inputObject.datepicker('show');
- else
- inputObject.datepicker('hide');
- });
- inputObject.on('keydown', function(event){
- // show datepicker on keydown (up/down/left/right) but only if it not causes cursor position move
- if(this.selectionStart!=undefined && this.selectionStart!=-1)
- if(((event.which==38 || event.which==37) && this.selectionStart==0) || ((event.which==40 || event.which==39) && this.selectionStart==$(this).val().length))
- {
- if(inputObject.datepicker('widget').css('display')=='none')
- inputObject.datepicker('show');
- else
- inputObject.datepicker('hide');
- }
- });
- inputObject.blur(function(event){
- // handle onblur event because datepicker can be already closed
- // note: because onblur is called more than once we can handle it only if there is a value change!
- var valid=true;
- try {var currentDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, inputObject.val())}
- catch (e) {valid=false}
- if(valid==true && inputObject.val()!=$.datepicker.formatDate(globalSettings.datepickerformat.value, currentDate))
- {
- var minDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'minDate');
- var maxDateText=inputObject.datepicker('option', 'dateFormat', globalSettings.datepickerformat.value).datepicker('option', 'maxDate');
- var minDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, minDateText);
- var maxDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, maxDateText);
- if(currentDate<minDate)
- inputObject.val(minDateText);
- else if(currentDate>maxDate)
- inputObject.val(maxDateText);
- else
- inputObject.val($.datepicker.formatDate(globalSettings.datepickerformat.value, currentDate));
- }
- });
- inputObject.on('keyup change', function(){
- if(!$(this).prop('readonly') && !$(this).prop('disabled'))
- {
- var valid=true;
- if($(this).val()!='')
- {
- try {$.datepicker.parseDate(globalSettings.datepickerformat.value, $(this).val())}
- catch (e) {valid=false}
- }
- if(valid)
- $(this).parent().find('img').css('display','none');
- else
- $(this).parent().find('img').css('display','inline');
- }
- });
- // show the datepicker after the initialization
- inputObject.datepicker('show');
- }
- }
- function checkForVcardGroups(contactUID)
- {
- if($('#vCardEditor').attr('data-url')==contactUID)
- {
- var collUID= contactUID.replace(RegExp('[^/]*$'),'');
- var select_elem=$('#vCardEditor').find('[data-attr-name="_DEST_"]').find('[data-type="'+jqueryEscapeSelector(collUID)+'"]');
- if(select_elem.length==1)
- {
- var vGroupC = globalAddressbookList.getMyContactGroups(contactUID).length;
- if(vGroupC>1)
- select_elem.text(localization[globalInterfaceLanguage].txtVcardGroupsTextMulti.replace('%coll%',globalResourceCardDAVList.getCollectionByUID(collUID).displayvalue).replace('%n%',vGroupC));
- else if(vGroupC==1)
- select_elem.text(localization[globalInterfaceLanguage].txtVcardGroupsTextSingle.replace('%coll%',globalResourceCardDAVList.getCollectionByUID(collUID).displayvalue));
- }
- }
- }
- function checkContactFormScrollBar()
- {
- var baseWidth = 582;
- var scrollWidth = $('#EditorBox').length ? $('#ABContact').outerWidth() - $('#EditorBox').outerWidth() : 0;
- var previousWidth = parseInt($('#ABList').css('right'), 10);
- var newWidth = baseWidth+scrollWidth;
- if(previousWidth===newWidth)
- return true;
- $('.collection_d, #SearchBox, #ABList').css('right', newWidth);
- $('#ABListOverlay').css('right', newWidth+1);
- $('.contact_d, #ABMessage, #ABContactOverlay').width(newWidth);
- $('#ABContactColor').css('right', newWidth-3);
- $('#ABContact').width(newWidth-3);
- var columnLengths = [];
- for(var i=0; i<getDataColumnCount(); i++) {
- columnLengths.push([]);
- }
- globalRefABListTable.children('.ablist_item:visible').each(function() {
- $(this).children().slice(globalFixedContactDataColumnsCount).each(function(ind) {
- columnLengths[ind].push($(this).text().length);
- });
- });
- setDataColumnsWidth(columnLengths);
- }
- function extendDestSelect(selGroup)
- {
- if($('#vCardEditor').attr('data-editor-state')=='edit')
- return false;
- var dest = $('[data-attr-name="_DEST_"]');
- $('#ExtendedDest').remove();
- var extendedDest = $('<div id="ExtendedDest">');
- var destSelected = dest.children(':selected');
- var header = null;
- var headerShown = false;
- var currentGroups = typeof $('#vCardEditor').attr('data-vcard-uid')=='undefined' ? [] : globalAddressbookList.getMyContactGroups($('#vCardEditor').attr('data-url'));
- dest.parent().after(extendedDest);
- for(var i=0; i<globalResourceCardDAVList.collections.length; i++) {
- var resource = globalResourceCardDAVList.collections[i];
- if(typeof resource.headerOnly!='undefined' && resource.headerOnly) {
- header = resource;
- headerShown = false;
- }
- else if(typeof resource.makeLoaded!='undefined' && resource.makeLoaded) {
- if(!headerShown) {
- $('<div>').addClass('extended_dest_header').text(header.displayvalue).appendTo(extendedDest);
- headerShown = true;
- }
- var itemEl = $('<div>').addClass('extended_dest_item');
- var resourceEl = $('<div>').addClass('extended_dest_resource').text(resource.displayvalue);
- var groupContEl = $('<div>').addClass('extended_dest_group_container');
- $('<input>').attr({'type':'checkbox','data-id':resource.uid})
- .prop('checked',resource.uid==destSelected.attr('data-type'))
- .change(function(){
- if($(this).prop('checked')) {
- var newCollection = globalResourceCardDAVList.getCollectionByUID($(this).attr('data-id'));
- $(this).parent().parent().siblings().find('input[type="checkbox"]').prop('checked',false);
- dest.children('[data-type="'+newCollection.uid+'"]').prop('selected',true).text(newCollection.displayvalue);
- $('#ABContactColor').css('background-color',newCollection.color);
- }
- else
- $(this).prop('checked',true);
- })
- .prependTo(resourceEl);
- $('<div>').addClass('extended_dest_resource_color').css('background-color',resource.color).prependTo(resourceEl);
- for(var j=0; j<globalAddressbookList.vcard_groups[resource.uid].length; j++) {
- var group = globalAddressbookList.vcard_groups[resource.uid][j];
- var groupEl = $('<div>').addClass('extended_dest_group').text(group.displayvalue);
- $('<input>').attr({'type':'checkbox','data-id':group.uid})
- .prop('checked',currentGroups.indexOf(group.uid)!=-1 || typeof selGroup!= 'undefined' && selGroup==group.uid)
- .change(function(){
- var groupCount = $(this).parent().parent().find('input[type="checkbox"]:checked').length;
- var newCollectionUID = $(this).parent().parent().prev().children('input[type="checkbox"]').attr('data-id');
- var newCollection = globalResourceCardDAVList.getCollectionByUID(newCollectionUID);
- if(groupCount>1)
- dest.children('[data-type="'+newCollectionUID+'"]').text(localization[globalInterfaceLanguage].txtVcardGroupsTextMulti.replace('%coll%',newCollection.displayvalue).replace('%n%',groupCount));
- else if(groupCount==1)
- dest.children('[data-type="'+newCollectionUID+'"]').text(localization[globalInterfaceLanguage].txtVcardGroupsTextSingle.replace('%coll%',newCollection.displayvalue));
- else
- dest.children('[data-type="'+newCollectionUID+'"]').text(newCollection.displayvalue);
- if($(this).prop('checked')) {
- $(this).parent().parent().prev().children('input[type="checkbox"]').prop('checked',true);
- $(this).parent().parent().parent().siblings().find('input[type="checkbox"]').prop('checked',false);
- dest.children('[data-type="'+newCollectionUID+'"]').prop('selected',true);
- $('#ABContactColor').css('background-color',newCollection.color);
- }
- })
- .prependTo(groupEl);
- $('<div>').addClass('extended_dest_group_color').css('background-color',group.color).prependTo(groupEl);
- groupEl.appendTo(groupContEl);
- }
- resourceEl.appendTo(itemEl);
- groupContEl.appendTo(itemEl);
- itemEl.appendTo(extendedDest);
- }
- }
- dest.mousedown(function(e){
- e.stopPropagation();
- e.preventDefault();
- this.blur();
- if(extendedDest.height()>0) {
- dest.removeClass('inverse_select');
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$(SVG_select).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- dest.parent().find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- extendedDest.animate({'height':0},200);
- $('html').unbind('mousedown');
- }
- else {
- dest.addClass('inverse_select');
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$(SVG_select_inv).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- dest.parent().find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- extendedDest.animate({'height':164},200);
- $('html').mousedown(function(e){
- if(e.target.id=='ExtendedDest' || $.contains(document.getElementById('ExtendedDest'),e.target))
- return true;
- dest.removeClass('inverse_select');
- /*************************** BAD HACKS SECTION ***************************/
- if($.browser.msie || $.browser.mozilla)
- {
- var newSVG=$(SVG_select).attr('data-type', 'select_icon').css({'pointer-events': 'none', 'z-index': '1', 'display': 'inline', 'margin-left': '-19px', 'vertical-align': 'top', 'background-color': '#ffffff'}); // background-color = stupid IE9 bug
- dest.parent().find('svg[data-type="select_icon"]').replaceWith($('<div>').append($(newSVG).clone()).html());
- }
- /*************************** END OF BAD HACKS SECTION ***************************/
- extendedDest.animate({'height':0},200);
- $('html').unbind('mousedown');
- });
- }
- });
- }
- /*
- $(document).on("mouseover", "#vCardEditor .ablist_item", function() {
- if(!$(this).is('.ui-draggable') && (typeof globalDisableDragAndDrop=='undefined' || globalDisableDragAndDrop!=true))
- {
- $(this).draggable({
- delay: 250,
- revert: 'invalid',
- scroll: false,
- opacity: 0.8,
- stack: '#SystemCardDavMATE',
- containment: '#SystemCardDavMATE',
- appendTo: 'body',
- start: function( event, ui ){
- // disallow on read-only collection
- if(globalResourceCardDAVList.getCollectionPrivByUID($(this).attr('data-id').replace(RegExp('[^/]*$'),''))==true)
- return false;
- },
- helper: function(){
- $('#ResourceCardDAVList').find('.resourceCardDAV.ui-droppable').droppable( 'option', 'accept', false);
- $('#ResourceCardDAVList').find('.group.ui-droppable').droppable( 'option', 'accept', false);
- $('#ResourceCardDAVList').find('.resourceCardDAV[data-id!='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').droppable( 'option', 'accept', '.ablist_item');
- var myContactGroups=globalAddressbookList.getMyContactGroups($(this).attr('data-id'));
- $('#ResourceCardDAVList').find('.group[data-id^='+jqueryEscapeSelector($(this).attr('data-id').replace(RegExp('[^/]+$'),''))+'].ui-droppable').not('.resourceCardDAV_selected').each(function(index, element){
- if(myContactGroups.indexOf($(element).attr('data-id'))==-1)
- $(element).droppable( 'option', 'accept', '.ablist_item');
- });
- var tmp=$(this).clone();
- tmp.addClass('ablist_item_dragged');
- // we cannot use .css() here, because we need to add !important (problem with Gecko based browsers)
- var tmp_style='max-width: '+$(this).outerWidth()+'px;';
- if($(this).css('background-image')!='none')
- tmp_style+='background-image: url(images/company_s_w.svg) !important;';
- tmp.attr('style', tmp_style);
- return tmp;
- }
- });
- }
- });
- */
- function setDataColumnsWidth(cache) {
- if(!globalRefABListTableCols && !globalRefABListInnerTableCols) {
- return true;
- }
- // remove gutter
- $('.ablist_table_gutter').remove();
- // clear old column widths
- globalRefABListTableCols.width('');
- globalRefABListInnerTableCols.width('');
- // use cached column values to compute new column widths
- var characterWidth = 9; // gross approximation
- var lastColumn = null;
- var lastInnerColumn = null;
- var scrollWidth = $('.ablist_table_wrapper').innerWidth() - globalRefABListTable.outerWidth();
- var reservedWidth = 0;
- globalRefABListTable.children('.ablist_item').first().children().slice(0, globalFixedContactDataColumnsCount).each(function() {
- reservedWidth += $(this).width();
- });
- var availableWidth;
- var maxWidth;
- availableWidth = maxWidth = globalRefABList.innerWidth() - reservedWidth - scrollWidth;
- cache.every(function(lengths, index) {
- // var maxLength = Math.max.apply(null, lengths);
- lengths.sort(function(a, b) {
- return a - b;
- });
- var maxLength = lengths[Math.max(Math.min(Math.ceil(lengths.length * globalContactDataMinVisiblePercentage), lengths.length) - 1, 0)];
- var column = globalRefABListTableCols.eq(index + globalFixedContactDataColumnsCount);
- var innerColumn = globalRefABListInnerTableCols.eq(index + globalFixedContactDataColumnsCount);
- var columnWidth = Math.max(maxLength * characterWidth, getDataColumnMinWidthAtIndex(index));
- // exit early if there is not enough space for the column
- if(columnWidth > availableWidth) {
- // if exiting at the very first column, mark it as the last visible one anyway
- // this will ensure that it gets to occupy what width there is available later on
- if(!lastColumn) {
- lastColumn = column;
- }
- if(!lastInnerColumn) {
- lastInnerColumn = innerColumn;
- }
- return false;
- }
- // dont show column if no data are present
- if(columnWidth && lengths[lengths.length - 1]>0) {
- lastColumn = column;
- lastInnerColumn = innerColumn;
- availableWidth -= columnWidth;
- column.width(columnWidth);
- innerColumn.width(columnWidth);
- }
- return true;
- });
- // set the last visible column to occupy the rest of the available table width
- if(lastColumn && lastInnerColumn) {
- lastColumn.width(lastColumn.width() + availableWidth);
- lastInnerColumn.width(lastInnerColumn.width() + availableWidth);
- }
- // if scrollbar present, create gutter
- if(scrollWidth) {
- $('<col class="ablist_table_gutter">').width(scrollWidth).insertAfter(lastColumn);
- $('<th class="ablist_table_gutter">').insertAfter($('.ablist_table_header').children().eq(lastColumn.index()));
- }
- }
- function getDataColumnCount() {
- return globalSettings.collectiondisplay.value.length;
- }
- function isDataColumnDefined(column) {
- var re = RegExp('(?:^|[^\\\\]){'+column+'(?:\\[.*?\\])*'+'}', 'i');
- return globalSettings.collectiondisplay.value.some(function(col) {
- if(col.hasOwnProperty('value')) {
- var values = col.value;
- if($.isPlainObject(values)) {
- return values.company.some(function(value) {
- return re.test(value)
- }) || values.personal.some(function(value) {
- return re.test(value)
- });
- }
- return values.some(function(value) {
- return re.test(value)
- });
- }
- return false;
- });
- }
- function getContactDataColumns(isCompany) {
- return $.map(globalSettings.collectiondisplay.value, function(col) {
- var value = col.value;
- if($.isPlainObject(value)) {
- if(isCompany && value.hasOwnProperty('company')) {
- return [value.company];
- }
- if(!isCompany && value.hasOwnProperty('personal')) {
- return [value.personal];
- }
- }
- return [value];
- });
- }
- function getDataColumnLabelAtIndex(index) {
- if(globalSettings.collectiondisplay.value[index].hasOwnProperty('label')) {
- var label = globalSettings.collectiondisplay.value[index].label;
- if($.isPlainObject(label)) {
- return getDataColumnLabel(label[globalInterfaceLanguage] || '');
- }
- else {
- return getDataColumnLabel(label);
- }
- }
- }
- function getDataColumnLabel(formatString) {
- var result = '';
- var variableParts = null;
- var re = RegExp('(?:^|[^\\\\])({(.*?[^\\\\])})');
- while(variableParts = formatString.match(re)) {
- var value = localization[globalInterfaceLanguage][globalContactDataColumnLabelVars[variableParts[2]]] || '';
- formatString = formatString.replace(variableParts[1], value);
- }
- return formatString;
- }
- function getDataColumnMinWidthAtIndex(index) {
- return 100;
- }
- function setContactDataColumn(contact, column, value, filterData) {
- var column = column.toUpperCase();
- if(globalContactDataColumnDefs.hasOwnProperty(column) && value) {
- var property = globalContactDataColumnDefs[column].property;
- if(!contact.hasOwnProperty(property)) {
- contact[property] = [];
- }
- var data = {};
- for(var name in filterData) {
- var filterProperty = globalContactDataColumnDefs[column].filterProperities[name];
- data[filterProperty] = filterData[name];
- }
- if($.isArray(value)) {
- value = value.join(', ');
- }
- data.value = value;
- contact[property].push(data);
- }
- }
- function getContactDataColumn(contact, variables) {
- var result = '';
- var variableParts = null;
- var re = RegExp('(?:^|[^\\\\])({(.*?[^\\\\])})');
- variables.forEach(function(formatString) {
- var matched = false;
- while(variableParts = formatString.match(re)) {
- var value = getContactDataColumnVariable(contact, variableParts[2]);
- formatString = formatString.replace(variableParts[1], value);
- matched = matched || value!=='';
- }
- if(matched) {
- result += formatString;
- }
- });
- return result;
- }
- function getContactDataColumnVariable(contact, variable) {
- var parts = variable.match(/^(.*?)(\[.*\])*$/);
- var attr = parts[1].toUpperCase();
- if(parts && attr && globalContactDataColumnDefs.hasOwnProperty(attr)) {
- var property = globalContactDataColumnDefs[attr].property;
- if(contact.hasOwnProperty(property)) {
- var re = RegExp('\\[(.*?[^\\\\])\\]');
- var numeral = 0;
- var filterStr = parts[2] ? parts[2].toUpperCase() : '';
- var filters = [];
- var matches = contact[property];
- while(filterStr) {
- var match = filterStr.match(re);
- if(match===null) {
- break;
- }
- filters.push(match[1].replaceAll('\\[', '[').replaceAll('\\]', ']'));
- filterStr = filterStr.replace(match[0], '');
- }
- filters.forEach(function(filterEl) {
- if(filterEl[0]===':') {
- numeral = parseInt(filterEl.slice(1), 10);
- }
- else {
- var filterParts = filterEl.splitCustom('=');
- var filterType = filterParts[0];
- var filterValue = filterParts[1];
- if(filterType && filterValue && globalContactDataColumnDefs[attr].hasOwnProperty('filterProperities') && globalContactDataColumnDefs[attr].filterProperities.hasOwnProperty(filterType)) {
- var filterProperty = globalContactDataColumnDefs[attr].filterProperities[filterType];
- matches = matches.filter(function(matchEl) {
- return matchEl[filterProperty].indexOf(filterValue)>-1;
- });
- }
- }
- });
- if(!isNaN(numeral) && numeral>-1 && numeral<matches.length) {
- return matches[numeral].value;
- }
- }
- }
- return '';
- }
- function getParamsFromContentlineParse(vcard, parsed, primaryParam, customParam, dataTypeRegister, preserveCase) {
- var params = [];
- if(primaryParam && parsed[3]) {
- var parsed_paramArr = vcardSplitValue(parsed[3], ';');
- parsed_paramArr.forEach(function(el) {
- if(el) {
- var elParts = el.split('=');
- if(elParts[0].toUpperCase()===primaryParam) {
- var val = elParts[1];
- if(!preserveCase) {
- val = val.toUpperCase();
- }
- params.push(humanizeVcardDataTypes(dataTypeRegister, val));
- }
- }
- });
- }
- if(customParam && parsed[1]) {
- var vcard_element_related = null;
- var re = RegExp('\r\n'+parsed[1].replace('.','\\.'+customParam+':(.*)')+'\r\n', 'im');
- while((vcard_element_related = vcard.match(re))!=null) {
- var val = vcard_element_related[1];
- if(!preserveCase) {
- val = val.toUpperCase();
- }
- params.push(humanizeVcardDataTypes(dataTypeRegister, vcardUnescapeValue(val)));
- vcard = vcard.replace(vcard_element_related[0], '\r\n');
- }
- }
- return params;
- }
- function humanizeVcardDataTypes(register, type) {
- if(register && dataTypes[register].hasOwnProperty(type.toLowerCase())) {
- matched = type.match(/^_\$!<(.*)>!\$_$/i);
- if(matched) {
- return matched[1];
- }
- }
- return type;
- }
- function showPhotoBox(e) {
- if($('#photoBox').is(':visible'))
- hidePhotoBox();
- else
- {
- e.stopPropagation();
- $('#photoArrow, #photoBox').css('display', 'block');
- $('#photoURL').focus();
- $('html').bind('click.photo', function(e) {
- if(!$.contains(document.getElementById('photoBox'), e.target)) {
- hidePhotoBox();
- }
- });
- }
- }
- function hidePhotoBox() {
- $('#photoURL').val($('#photoURLHidden').val());
- $('#photoBoxContent').find('[data-type="invalid"]').css('display', 'none');
- $('#photoURL').removeClass('invalid');
- $('#photoBox').css('display','none');
- $('#photoArrow').css('display','none');
- $('html').unbind('click.photo');
- }
|