diff options
Diffstat (limited to 'radicale_web')
-rw-r--r-- | radicale_web/web/infcloud/cache.manifest | 4 | ||||
-rw-r--r-- | radicale_web/web/infcloud/changelog.txt | 4 | ||||
-rw-r--r-- | radicale_web/web/infcloud/changelog_caldavzap.txt | 9 | ||||
-rw-r--r-- | radicale_web/web/infcloud/changelog_carddavmate.txt | 10 | ||||
-rw-r--r-- | radicale_web/web/infcloud/config.js | 37 | ||||
-rw-r--r-- | radicale_web/web/infcloud/data_process.js | 35 | ||||
-rw-r--r-- | radicale_web/web/infcloud/forms.js | 4 | ||||
-rw-r--r-- | radicale_web/web/infcloud/index.html | 4 | ||||
-rw-r--r-- | radicale_web/web/infcloud/interface.js | 46 | ||||
-rw-r--r-- | radicale_web/web/infcloud/lib/jshash-2.2_sha256.js | 337 | ||||
-rw-r--r-- | radicale_web/web/infcloud/lib/sha256.js | 16 | ||||
-rw-r--r-- | radicale_web/web/infcloud/localization.js | 709 | ||||
-rw-r--r-- | radicale_web/web/infcloud/main.js | 14 | ||||
-rw-r--r-- | radicale_web/web/infcloud/resource.js | 2 | ||||
-rw-r--r-- | radicale_web/web/infcloud/timezones.js | 115 | ||||
-rw-r--r-- | radicale_web/web/infcloud/vtodo.js | 24 | ||||
-rw-r--r-- | radicale_web/web/infcloud/webdav_protocol.js | 83 |
17 files changed, 1008 insertions, 445 deletions
diff --git a/radicale_web/web/infcloud/cache.manifest b/radicale_web/web/infcloud/cache.manifest index bba99ff..b139826 100644 --- a/radicale_web/web/infcloud/cache.manifest +++ b/radicale_web/web/infcloud/cache.manifest @@ -1,5 +1,5 @@ CACHE MANIFEST -#V 1 +#V 20151122135011 CACHE: addressbook.js @@ -159,8 +159,8 @@ lib/jquery.placeholder-1.1.9.js lib/jquery.quicksearch.js lib/jquery.tagsinput.js lib/jquery-ui-1.11.4.custom.js -lib/jshash-2.2_sha256.js lib/rrule.js +lib/sha256.js lib/spectrum.js NETWORK: diff --git a/radicale_web/web/infcloud/changelog.txt b/radicale_web/web/infcloud/changelog.txt index 386820f..e0bd4f1 100644 --- a/radicale_web/web/infcloud/changelog.txt +++ b/radicale_web/web/infcloud/changelog.txt @@ -1,5 +1,9 @@ InfCloud Changelog +version 0.13.2 [2015-xx-xx]: + - includes CalDavZAP 0.13.2 (see changelog_caldavzap.txt) + - includes CardDavMATE 0.13.2 (see changelog_carddavmate.txt) + version 0.13.1 [2015-09-22]: - includes CalDavZAP 0.13.1 (see changelog_caldavzap.txt) - includes CardDavMATE 0.13.1 (see changelog_carddavmate.txt) diff --git a/radicale_web/web/infcloud/changelog_caldavzap.txt b/radicale_web/web/infcloud/changelog_caldavzap.txt index 18ccfab..83f9892 100644 --- a/radicale_web/web/infcloud/changelog_caldavzap.txt +++ b/radicale_web/web/infcloud/changelog_caldavzap.txt @@ -3,6 +3,15 @@ CalDavZAP Changelog NOTE: if you are interested in integrated version of CalDavZAP and CardDavMATE (our CardDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/ +version 0.1x.x [2015-xx-xx]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- added Norwegian localization (nb_NO) - thanks Tore Ørpetveit +- added fallback to PROPFIND after 415 error response to REPORT request (SabreDAV) +- replaced jsSHA2 by CryptoJS (which provides additional functionality) +- fixed "Unsupported recurrence rule" problem for certain valid RRULEs +- fixed loading of collections in certain (very specific) cases +- updated timezone.js to latest IANA timezone database + version 0.13.1 [2015-09-22]: - note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) - changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore diff --git a/radicale_web/web/infcloud/changelog_carddavmate.txt b/radicale_web/web/infcloud/changelog_carddavmate.txt index 3059ad9..b1dd652 100644 --- a/radicale_web/web/infcloud/changelog_carddavmate.txt +++ b/radicale_web/web/infcloud/changelog_carddavmate.txt @@ -3,6 +3,16 @@ CardDavMATE Changelog NOTE: if you are interested in integrated version of CardDavMATE and CalDavZAP (our CalDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/ +version 0.13.2 [2015-xx-xx]: +- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) +- configuration - added globalContactPhotoType option which allows to specify the contact photo image type stored on the server (supported formats: 'jpeg' and 'png') +- configuration - added globalContactPhotoScaleFactor option which allows to specify the scale factor of contact photo stored on the server (relative to the editor photo box size) or completely disable the image resize functionality (not recommended) +- added Norwegian localization (nb_NO) - thanks Tore Ørpetveit +- added fallback to PROPFIND after 415 error response to REPORT request (SabreDAV) +- changed default contact photo image type stored on the server from 'png' to 'jpeg' (see also the new globalContactPhotoType configuration option) +- replaced jsSHA2 by CryptoJS (which provides additional functionality) +- workaround for a mysterious textarea bug which occurs randomly (even if empty data is inserted into DOM chrome based browsers show data from random calendar entry) + version 0.13.1 [2015-09-22]: - note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change) - changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore diff --git a/radicale_web/web/infcloud/config.js b/radicale_web/web/infcloud/config.js index 0fc340a..d203444 100644 --- a/radicale_web/web/infcloud/config.js +++ b/radicale_web/web/infcloud/config.js @@ -23,6 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // NOTE: see readme.txt before you start to configure this client! +// NOTE: if this option is enabled you will get notifications for devel builds! +var globalEnableDevelBuilds=true; + + + // NOTE: do not forget to execute the cache_update.sh script every time you // update this configuration file or any other files (otherwise your browser // will use the previous version of files stored in HTML5 cache). Alternatively @@ -334,7 +339,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. var globalNetworkCheckSettings={ href: location.protocol+'//'+location.hostname+ (location.port ? ':'+location.port: '')+ - location.pathname.replace(RegExp('(/+[^/]+/*){2}(index\.html)?$'),'')+'/', + location.pathname.replace(RegExp('/+[^/]+/*(index\.html)?$'),'')+ + '/caldav.php/', timeOut: 90000, lockTimeOut: 10000, checkContentType: true, @@ -415,7 +421,7 @@ var globalSyncResourcesInterval=120000; // If undefined or false, the synchronization button is disabled. // NOTE: enable this option only if you really know what are you doing! // Example: -var globalEnableRefresh=true; +var globalEnableRefresh=false; // globalEnableKbNavigation @@ -463,6 +469,7 @@ var globalEnableKbNavigation=true; // it_IT (Italiano [Italian]; thanks Luca Ferrario) // ja_JP (日本語 [Japan]; thanks Muimu Nakayama) // hu_HU (Magyar [Hungarian]) +// nb_NO (Norsk (bokmål) [Norwegian]; thanks Tore Ørpetveit) // nl_NL (Nederlands [Dutch]; thanks Johan Vromans) // sk_SK (Slovenčina [Slovak]) // tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar) @@ -524,7 +531,7 @@ var globalResourceAlphabetSorting=true; // If undefined (or empty), update notifications will be shown to all users. // Example: // globalNewVersionNotifyUsers=['admin', 'peter']; -var globalNewVersionNotifyUsers=null; +var globalNewVersionNotifyUsers=[]; // globalDatepickerFormat @@ -1098,6 +1105,30 @@ var globalAddressCountryFavorites=[]; var globalContactStoreFN=['prefix',' last',' middle',' first',' suffix']; +// globalContactPhotoType +// This option specifies the type of the image which will be stored to the +// server if you add a contact photo. +// Supported values are: +// jpeg +// png +// If undefined or invalid value is specified then 'jpeg' is used. +// Examples: +// var globalContactPhotoType='jpeg'; +// var globalContactPhotoType='png'; + + +// globalContactPhotoScaleFactor +// This options specifies the scale factor of the contact photo relative to +// the photo box size in the contact editor interface. +// For example if this options is set to 1.5 and the photo box size in the +// interface is 164x183px, the resulting image size will be 246x274px. +// If undefined then 1.5 is used, if set to null (not recommended) then the +// original size of the image is retained (resize functionality is disabled). +// Examples: +// var globalContactPhotoScaleFactor=1.5; +// var globalContactPhotoScaleFactor=null; + + // globalGroupContactsByCompanies // This options specifies how contacts are grouped in the interface. // By default the interface looks like (very simple example): diff --git a/radicale_web/web/infcloud/data_process.js b/radicale_web/web/infcloud/data_process.js index d52f7dc..bdbf711 100644 --- a/radicale_web/web/infcloud/data_process.js +++ b/radicale_web/web/infcloud/data_process.js @@ -1155,10 +1155,10 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo { if(tzArray.indexOf(inputEvents[iE].timeZone)==-1) { - if(inputEvents[iE].allDay ||(deleteMode && ($('#vcalendarHash').val()==hex_sha256(inputEvents[iE].vcalendar)))) + if(inputEvents[iE].allDay ||(deleteMode && ($('#vcalendarHash').val()==String(CryptoJS.SHA256(inputEvents[iE].vcalendar))))) continue; var component=buildTimezoneComponent(inputEvents[iE].timeZone); - if(component!='' && ($('#vcalendarHash').val()!=hex_sha256(inputEvents[iE].vcalendar))) + if(component!='' && ($('#vcalendarHash').val()!=String(CryptoJS.SHA256(inputEvents[iE].vcalendar)))) { tzArray[tzArray.length]=inputEvents[iE].timeZone; tzString+=component; @@ -1166,7 +1166,7 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo tzString+='\r\n'; isTimeZone=true; } - else if(component!='' && $('#vcalendarHash').val()==hex_sha256(inputEvents[iE].vcalendar)) + else if(component!='' && $('#vcalendarHash').val()==String(CryptoJS.SHA256(inputEvents[iE].vcalendar))) origTimezone+=component; } } @@ -1182,13 +1182,13 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo for(var j=0;j<inputEvents.length;j++) { eventStringArray.splice(eventStringArray.indexOf(inputEvents[j].vcalendar),1); - if(($('#futureStart').val()== '' && $('#vcalendarHash').val()!=hex_sha256(inputEvents[j].vcalendar)) || inputEvents[j].rec_id!=$('#recurrenceID').val()) + if(($('#futureStart').val()== '' && $('#vcalendarHash').val()!=String(CryptoJS.SHA256(inputEvents[j].vcalendar))) || inputEvents[j].rec_id!=$('#recurrenceID').val()) { var stringUIDcurrent=inputEvents[j].vcalendar.match(vCalendar.pre['contentline_UID']); if(stringUIDcurrent!=null) stringUIDcurrent=stringUIDcurrent[0].match(vCalendar.pre['contentline_parse'])[4]; - if((deleteMode && $('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) || (deleteMode && !inputEvents[j].rec_id && $('#vcalendarUID').val()==stringUIDcurrent)) + if((deleteMode && $('#vcalendarHash').val()==String(CryptoJS.SHA256(inputEvents[j].vcalendar))) || (deleteMode && !inputEvents[j].rec_id && $('#vcalendarUID').val()==stringUIDcurrent)) { var ruleString=inputEvents[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']); var origRuleString=ruleString; @@ -1235,7 +1235,7 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo } else if($('#futureStart').val().split(';')[0]!='' && $('#futureStart').val().split(';')[1]!=inputEvents[j].start) { - if($('#futureStart').val().split(';')[0]>1 && $('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) + if($('#futureStart').val().split(';')[0]>1 && $('#vcalendarHash').val()==String(CryptoJS.SHA256(inputEvents[j].vcalendar))) inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], $('#futureStart').val().split(';')[0]); if(inputEvents[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) @@ -1248,7 +1248,7 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo } else if(deleteMode && $('#futureStart').val().split(';')[0]!='' && $('#futureStart').val().split(';')[1]==inputEvents[j].start) { - if($('#vcalendarHash').val()==hex_sha256(inputEvents[j].vcalendar)) + if($('#vcalendarHash').val()==String(CryptoJS.SHA256(inputEvents[j].vcalendar))) { inputEvents[j].vcalendar=changeRuleForFuture(inputEvents[j], 2); } @@ -3674,11 +3674,11 @@ function getDateFromDay(objComponent, t, disableRecursion,uid) { byDay=pars[i].split('=')[1]; byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(','); - if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) - { - console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in event:"+vcalendar); - return false; - } +// if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) +// { +// console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in event:"+vcalendar); +// return false; +// } } } if(!returnForValue) @@ -4733,7 +4733,7 @@ function dataToVcard(accountUID, inputUID, inputFilterUID, inputEtag) // PHOTO if(globalDisabledContactAttributes.indexOf('PHOTO')==-1 && !tmpvCardEditorRef.find('#photo').hasClass('photo_blank')) { - var value = $('#photoURLHidden').val() || tmpvCardEditorRef.find('#photo').get(0).toDataURL('image/png'); + var value=$('#photoURLHidden').val() || tmpvCardEditorRef.find('#photo').get(0).toDataURL('image/'+globalContactPhotoType).replace(RegExp('^data:(?:image/.*?;)?(?:base64,)?', 'i'), ''); if(vCard.tplM['contentline_PHOTO']!=null && (process_elem=vCard.tplM['contentline_PHOTO'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) @@ -4752,7 +4752,7 @@ function dataToVcard(accountUID, inputUID, inputFilterUID, inputEtag) // Data URL (non-remote) will always be a binary encoded png image if($('#photoURLHidden').val()==='') { - process_elem=process_elem.replace('##:::##params_wsc##:::##', ';ENCODING=b;TYPE=png'); + process_elem=process_elem.replace('##:::##params_wsc##:::##', ';ENCODING=b;TYPE='+globalContactPhotoType); } // For remote URL, we can't reliably determine its type, so we just append the VALUE=URI param else { @@ -5800,7 +5800,7 @@ function vcardToData(inputContact, inputIsReadonly, inputIsCompany, inputEditorM // parsed (contentline_parse) = [1]->"group.", [2]->"name", [3]->";param;param", [4]->"value" parsed=vcard_element[0].match(vCard.pre['contentline_parse']); - tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').text(vcardUnescapeValue(parsed[4])).trigger('autosize.resize'); + tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').val(vcardUnescapeValue(parsed[4])).trigger('autosize.resize'); // values not directly supported by the editor (old values are kept intact) vCard.tplM['contentline_NOTE'][0]=vCard.tplC['contentline_NOTE']; @@ -5829,6 +5829,8 @@ function vcardToData(inputContact, inputIsReadonly, inputIsCompany, inputEditorM return false; // vcard NOTE present more than once } } + else // force set the textarea value to empty string (workaround for a specific bug of webkit based browsers /memory overflow?/) + tmpvCardEditorRef.find('[data-type="\\%note"]').find('textarea').val('').trigger('autosize.resize'); } //console.timeEnd('NOTE timer'); @@ -7305,7 +7307,8 @@ function vcardToData(inputContact, inputIsReadonly, inputIsCompany, inputEditorM //clean error message $('#ABMessage').height('0'); - $('#ABContact').empty().append(tmpvCardEditorRef); + $('#ABContact').children().remove(); + $('#ABContact').append(tmpvCardEditorRef); var foundGroup=0; for(var adr in globalAddressbookList.vcard_groups) diff --git a/radicale_web/web/infcloud/forms.js b/radicale_web/web/infcloud/forms.js index b169df3..0e4c816 100644 --- a/radicale_web/web/infcloud/forms.js +++ b/radicale_web/web/infcloud/forms.js @@ -899,7 +899,7 @@ function showTodoForm(todo, mod, repeatOne, confirmRepeat) $('#url_TODO').val(todo.url); $('#location_TODO').val(todo.location); $('#etagTODO').val(todo.etag); - $('#vcalendarHashTODO').val(hex_sha256(todo.vcalendar)); + $('#vcalendarHashTODO').val(String(CryptoJS.SHA256(todo.vcalendar))); var stringUIDcurrent=todo.vcalendar.match(vCalendar.pre['contentline_UID']); if(stringUIDcurrent!=null) @@ -1808,7 +1808,7 @@ function showEventForm(date, allDay, calEvent, jsEvent, mod, repeatOne, confirmR $('#uid').val(calEvent.id); $('#url_EVENT').val(calEvent.hrefUrl+''); - $('#vcalendarHash').val(hex_sha256(calEvent.vcalendar)); + $('#vcalendarHash').val(String(CryptoJS.SHA256(calEvent.vcalendar))); $('#etag').val(calEvent.etag); var stringUIDcurrent=calEvent.vcalendar.match(vCalendar.pre['contentline_UID']); diff --git a/radicale_web/web/infcloud/index.html b/radicale_web/web/infcloud/index.html index fd516c2..a62ccb8 100644 --- a/radicale_web/web/infcloud/index.html +++ b/radicale_web/web/infcloud/index.html @@ -39,7 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. <script src="lib/jquery-ui-1.11.4.custom.js" type="text/javascript"></script> <script src="lib/jquery.quicksearch.js" type="text/javascript"></script> <script src="lib/jquery.placeholder-1.1.9.js" type="text/javascript"></script> - <script src="lib/jshash-2.2_sha256.js" type="text/javascript"></script> + <script src="lib/sha256.js" type="text/javascript"></script> <script src="lib/jquery.tagsinput.js" type="text/javascript"></script> <script src="lib/spectrum.js" type="text/javascript"></script> <script src="lib/fullcalendar.js" type="text/javascript"></script> @@ -1564,7 +1564,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. <td></td> <td></td> <td colspan="3"> - <input data-type="value" class="fs" name="tags" id="tags" value="" /> + <input data-type="value" type="text" class="fs" name="tags" id="tags" value="" /> </td> </tr> <tr data-attr-name="NOTE"> diff --git a/radicale_web/web/infcloud/interface.js b/radicale_web/web/infcloud/interface.js index db635e8..e5afb8d 100644 --- a/radicale_web/web/infcloud/interface.js +++ b/radicale_web/web/infcloud/interface.js @@ -2803,7 +2803,7 @@ function todoCheckClick(status, percent, calTodo) var resultTodoObj = getRepeatTodoObject({ rid:calTodo.res_id, uidTodo:calTodo.id, - vcalendarHash: hex_sha256(calTodo.vcalendar), + vcalendarHash: String(CryptoJS.SHA256(calTodo.vcalendar)), vcalendarUID: stringUIDcurrent, recurrenceId: rec_id, timezoneTODO: calTodo.timeZone, @@ -5729,29 +5729,29 @@ function processEditorElements(inputEditorRef, processingType, inputIsReadonly, 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; + var canvas=$('#photo'); + var canvasElement=canvas.get(0); + var imageWidth=image.width; + var imageHeight=image.height; + var canvasWidth=(globalContactPhotoScaleFactor===null ? image.width : canvas.width()*globalContactPhotoScaleFactor); + var canvasHeight=(globalContactPhotoScaleFactor===null ? image.height : 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; + 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); @@ -5778,7 +5778,7 @@ function CardDAVeditor_cleanup(inputLoadEmpty, inputIsCompany) $('<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')); + globalRefVcardEditor.find('[data-type="\\%note"]').find('textarea[data-type="value"]').val('').attr('placeholder',$('[data-type="\\%note"]').find('textarea[data-type="value"]').attr('placeholder')); } /*************************** END OF BAD HACKS SECTION ***************************/ diff --git a/radicale_web/web/infcloud/lib/jshash-2.2_sha256.js b/radicale_web/web/infcloud/lib/jshash-2.2_sha256.js deleted file mode 100644 index b767a6e..0000000 --- a/radicale_web/web/infcloud/lib/jshash-2.2_sha256.js +++ /dev/null @@ -1,337 +0,0 @@ -/* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined - * in FIPS 180-2 - * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for details. - * Also http://anmar.eu.org/projects/jssha2/ - */ - -/* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ -var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ -var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ - -/* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ -function hex_sha256(s) { return rstr2hex(rstr_sha256(str2rstr_utf8(s))); } -function b64_sha256(s) { return rstr2b64(rstr_sha256(str2rstr_utf8(s))); } -function any_sha256(s, e) { return rstr2any(rstr_sha256(str2rstr_utf8(s)), e); } -function hex_hmac_sha256(k, d) - { return rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); } -function b64_hmac_sha256(k, d) - { return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); } -function any_hmac_sha256(k, d, e) - { return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e); } - -/* - * Perform a simple self-test to see if the VM is working - */ -function sha256_vm_test() -{ - return hex_sha256("abc").toLowerCase() == - "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; -} - -/* - * Calculate the sha256 of a raw string - */ -function rstr_sha256(s) -{ - return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8)); -} - -/* - * Calculate the HMAC-sha256 of a key and some data (raw strings) - */ -function rstr_hmac_sha256(key, data) -{ - var bkey = rstr2binb(key); - if(bkey.length > 16) bkey = binb_sha256(bkey, key.length * 8); - - var ipad = Array(16), opad = Array(16); - for(var i = 0; i < 16; i++) - { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8); - return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256)); -} - -/* - * Convert a raw string to a hex string - */ -function rstr2hex(input) -{ - try { hexcase } catch(e) { hexcase=0; } - var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var output = ""; - var x; - for(var i = 0; i < input.length; i++) - { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) - + hex_tab.charAt( x & 0x0F); - } - return output; -} - -/* - * Convert a raw string to a base-64 string - */ -function rstr2b64(input) -{ - try { b64pad } catch(e) { b64pad=''; } - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var output = ""; - var len = input.length; - for(var i = 0; i < len; i += 3) - { - var triplet = (input.charCodeAt(i) << 16) - | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) - | (i + 2 < len ? input.charCodeAt(i+2) : 0); - for(var j = 0; j < 4; j++) - { - if(i * 8 + j * 6 > input.length * 8) output += b64pad; - else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); - } - } - return output; -} - -/* - * Convert a raw string to an arbitrary string encoding - */ -function rstr2any(input, encoding) -{ - var divisor = encoding.length; - var remainders = Array(); - var i, q, x, quotient; - - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - var dividend = Array(Math.ceil(input.length / 2)); - for(i = 0; i < dividend.length; i++) - { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } - - /* - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. We stop when the dividend is zero. - * All remainders are stored for later use. - */ - while(dividend.length > 0) - { - quotient = Array(); - x = 0; - for(i = 0; i < dividend.length; i++) - { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if(quotient.length > 0 || q > 0) - quotient[quotient.length] = q; - } - remainders[remainders.length] = x; - dividend = quotient; - } - - /* Convert the remainders to the output string */ - var output = ""; - for(i = remainders.length - 1; i >= 0; i--) - output += encoding.charAt(remainders[i]); - - /* Append leading zero equivalents */ - var full_length = Math.ceil(input.length * 8 / - (Math.log(encoding.length) / Math.log(2))) - for(i = output.length; i < full_length; i++) - output = encoding[0] + output; - - return output; -} - -/* - * Encode a string as utf-8. - * For efficiency, this assumes the input is valid utf-16. - */ -function str2rstr_utf8(input) -{ - var output = ""; - var i = -1; - var x, y; - - while(++i < input.length) - { - /* Decode utf-16 surrogate pairs */ - x = input.charCodeAt(i); - y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; - if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) - { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i++; - } - - /* Encode output as utf-8 */ - if(x <= 0x7F) - output += String.fromCharCode(x); - else if(x <= 0x7FF) - output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), - 0x80 | ( x & 0x3F)); - else if(x <= 0xFFFF) - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - else if(x <= 0x1FFFFF) - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - } - return output; -} - -/* - * Encode a string as utf-16 - */ -function str2rstr_utf16le(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode( input.charCodeAt(i) & 0xFF, - (input.charCodeAt(i) >>> 8) & 0xFF); - return output; -} - -function str2rstr_utf16be(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, - input.charCodeAt(i) & 0xFF); - return output; -} - -/* - * Convert a raw string to an array of big-endian words - * Characters >255 have their high-byte silently ignored. - */ -function rstr2binb(input) -{ - var output = Array(input.length >> 2); - for(var i = 0; i < output.length; i++) - output[i] = 0; - for(var i = 0; i < input.length * 8; i += 8) - output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32); - return output; -} - -/* - * Convert an array of big-endian words to a string - */ -function binb2rstr(input) -{ - var output = ""; - for(var i = 0; i < input.length * 32; i += 8) - output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF); - return output; -} - -/* - * Main sha256 function, with its support functions - */ -function sha256_S (X, n) {return ( X >>> n ) | (X << (32 - n));} -function sha256_R (X, n) {return ( X >>> n );} -function sha256_Ch(x, y, z) {return ((x & y) ^ ((~x) & z));} -function sha256_Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));} -function sha256_Sigma0256(x) {return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));} -function sha256_Sigma1256(x) {return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));} -function sha256_Gamma0256(x) {return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));} -function sha256_Gamma1256(x) {return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));} -function sha256_Sigma0512(x) {return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));} -function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));} -function sha256_Gamma0512(x) {return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7));} -function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));} - -var sha256_K = new Array -( - 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, - -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, - 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, - 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, - -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, - 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, - 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, - -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, - 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, - 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, - -1866530822, -1538233109, -1090935817, -965641998 -); - -function binb_sha256(m, l) -{ - var HASH = new Array(1779033703, -1150833019, 1013904242, -1521486534, - 1359893119, -1694144372, 528734635, 1541459225); - var W = new Array(64); - var a, b, c, d, e, f, g, h; - var i, j, T1, T2; - - /* append padding */ - m[l >> 5] |= 0x80 << (24 - l % 32); - m[((l + 64 >> 9) << 4) + 15] = l; - - for(i = 0; i < m.length; i += 16) - { - a = HASH[0]; - b = HASH[1]; - c = HASH[2]; - d = HASH[3]; - e = HASH[4]; - f = HASH[5]; - g = HASH[6]; - h = HASH[7]; - - for(j = 0; j < 64; j++) - { - if (j < 16) W[j] = m[j + i]; - else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), - sha256_Gamma0256(W[j - 15])), W[j - 16]); - - T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), - sha256_K[j]), W[j]); - T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c)); - h = g; - g = f; - f = e; - e = safe_add(d, T1); - d = c; - c = b; - b = a; - a = safe_add(T1, T2); - } - - HASH[0] = safe_add(a, HASH[0]); - HASH[1] = safe_add(b, HASH[1]); - HASH[2] = safe_add(c, HASH[2]); - HASH[3] = safe_add(d, HASH[3]); - HASH[4] = safe_add(e, HASH[4]); - HASH[5] = safe_add(f, HASH[5]); - HASH[6] = safe_add(g, HASH[6]); - HASH[7] = safe_add(h, HASH[7]); - } - return HASH; -} - -function safe_add (x, y) -{ - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); -} diff --git a/radicale_web/web/infcloud/lib/sha256.js b/radicale_web/web/infcloud/lib/sha256.js new file mode 100644 index 0000000..529db30 --- /dev/null +++ b/radicale_web/web/infcloud/lib/sha256.js @@ -0,0 +1,16 @@ +/* +CryptoJS v3.1.2 +code.google.com/p/crypto-js +(c) 2009-2013 by Jeff Mott. All rights reserved. +code.google.com/p/crypto-js/wiki/License +*/ +var CryptoJS=CryptoJS||function(h,s){var f={},t=f.lib={},g=function(){},j=t.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, +q=t.WordArray=j.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||u).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< +32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=j.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new q.init(c,a)}}),v=f.enc={},u=v.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b, +2),16)<<24-4*(b%8);return new q.init(d,c/2)}},k=v.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},l=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}}, +x=t.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=l.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var m=0;m<a;m+=e)this._doProcessBlock(d,m);m=d.splice(0,a);c.sigBytes-=b}return new q.init(m,b)},clone:function(){var a=j.clone.call(this); +a._data=this._data.clone();return a},_minBufferSize:0});t.Hasher=x.extend({cfg:j.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new w.HMAC.init(a, +d)).finalize(c)}}});var w=f.algo={};return f}(Math); +(function(h){for(var s=CryptoJS,f=s.lib,t=f.WordArray,g=f.Hasher,f=s.algo,j=[],q=[],v=function(a){return 4294967296*(a-(a|0))|0},u=2,k=0;64>k;){var l;a:{l=u;for(var x=h.sqrt(l),w=2;w<=x;w++)if(!(l%w)){l=!1;break a}l=!0}l&&(8>k&&(j[k]=v(h.pow(u,0.5))),q[k]=v(h.pow(u,1/3)),k++);u++}var a=[],f=f.SHA256=g.extend({_doReset:function(){this._hash=new t.init(j.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],m=b[2],h=b[3],p=b[4],j=b[5],k=b[6],l=b[7],n=0;64>n;n++){if(16>n)a[n]= +c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes; +d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math); diff --git a/radicale_web/web/infcloud/localization.js b/radicale_web/web/infcloud/localization.js index 2dbdd58..c6ca781 100644 --- a/radicale_web/web/infcloud/localization.js +++ b/radicale_web/web/infcloud/localization.js @@ -148,6 +148,20 @@ localization['ja_JP']= /* Muimu Nakayama */ txtCacheButton: '再読み込み' }; +localization['nb_NO']= /* thanks Tore Ørpetveit */ +{ + txtResources: 'Ressurser', + txtNote: 'Notat', + + errUnableSync: 'Feil: \'kunne ikke synkronisere ressurs\': prøv igjen senere!', + + loadingResources: 'Henter ressurser (%act% av %total%) ...', + loadingCollectionList: 'Leser inn ressursliste', + + txtCacheText: 'En oppdatering er klar på serveren. Last inn siden på ny!', + txtCacheButton: 'Last inn på ny' +}; + localization['nl_NL']= /* thanks Johan Vromans */ { txtResources: 'Bronnen', @@ -548,6 +562,41 @@ localizationShared['ja_JP']= /* Muimu Nakayama */ updateNotification: '%name% %new_ver% が利用できます (現在は %curr_ver%) - %url%' }; +localizationShared['nb_NO']= /* thanks Tore Ørpetveit */ +{ + _name_: 'Norsk (bokmål)', + _default_datepicker_format_: 'dd-mm-yy', + _default_AMPM_format_: false, + + altLogo: 'Logo', + altLogout: 'Logg ut', + buttonLogin: 'Logg inn', + pholderUsername: 'Brukernavn', + pholderPassword: 'Passord', + txtSearch: 'Søk', + txtError: 'Feil', + txtRefresh: 'Oppdater', + + buttonEdit: 'Rediger', + buttonSave: 'Lagre', + buttonReset: 'Nullstill', + buttonCancel: 'Avbryt', + buttonDelete: 'Slett', + + errCollectionLoad: 'Feil: \'kunne ikke lagre innstillinger\'!', + errHttpCommon: 'feilkode %%', + errHttp401: 'uautorisert', + errHttp403: 'ikke tillatt', + errHttp405: 'metode ikke tillatt', + errHttp408: 'timeout forespørsel', + errHttp412: 'emnet er endret av en annen på serveren', + errHttp500: 'intern serverfeil', + errHttp501: 'ikke implementert', + + unsupportedBrowser: 'Merk: Nettleseren din er ikke støttet!', + updateNotification: '%name% %new_ver% er lansert (du har %curr_ver%) - %url%' +}; + localizationShared['nl_NL']= /* thanks Johan Vromans */ { _name_: 'Nederlands', @@ -932,6 +981,25 @@ localizationSharedCalDAV['ja_JP']= /* Muimu Nakayama */ dayNamesMin: ['日','月','火','水','木','金','土'] }; +localizationSharedCalDAV['nb_NO']= /* thanks Tore Ørpetveit */ +{ + txtCalendars: 'Kalendere', + txtTodos: 'Oppgaver', + localTime: 'Lokal tid', + fullCalendarMonth: 'måned', + fullCalendarMultiWeek: 'uker', + fullCalendarAgendaWeek: 'uke', + fullCalendarAgendaDay: 'dag', + + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'], + dayNamesShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'] +}; + localizationSharedCalDAV['nl_NL']= /* thanks Johan Vromans */ { txtCalendars: 'Agenda’s', @@ -3085,6 +3153,232 @@ localizationSharedCardDAV['ja_JP']= /* Muimu Nakayama */ txtAddressCountryZW: 'ジンバブエ' }; +localizationSharedCardDAV['nb_NO']= /* thanks Tore Ørpetveit */ +{ + txtContacts: 'Kontakter', + + pholderGiven: 'Fornavn', + pholderFamily: 'Etternavn', + pholderMiddle: 'Mellomnavn', + pholderPrefix: 'Prefiks', + pholderSuffix: 'Suffiks', + + txtAddressCountryAF: 'Afghanistan', + txtAddressCountryAL: 'Albania', + txtAddressCountryDZ: 'Algerie', + txtAddressCountryAD: 'Andorra', + txtAddressCountryAO: 'Angola', + txtAddressCountryAG: 'Antigua og Barbuda', + txtAddressCountryAR: 'Argentina', + txtAddressCountryAM: 'Armenia', + txtAddressCountryAU: 'Australia', + txtAddressCountryAT: 'Østerrike', + txtAddressCountryAZ: 'Aserbajdsjan', + txtAddressCountryBS: 'Bahamas', + txtAddressCountryBH: 'Bahrain', + txtAddressCountryBD: 'Bangladesh', + txtAddressCountryBB: 'Barbados', + txtAddressCountryBY: 'Belarus', + txtAddressCountryBE: 'Belgia', + txtAddressCountryBZ: 'Belize', + txtAddressCountryBJ: 'Benin', + txtAddressCountryBM: 'Bermuda', + txtAddressCountryBT: 'Bhutan', + txtAddressCountryBO: 'Bolivia', + txtAddressCountryBA: 'Bosnia og Hercegovina', + txtAddressCountryBW: 'Botswana', + txtAddressCountryBR: 'Brasilia', + txtAddressCountryBN: 'Brunei', + txtAddressCountryBG: 'Bulgaria', + txtAddressCountryBF: 'Burkina Faso', + txtAddressCountryBI: 'Burundi', + txtAddressCountryKH: 'Cambodja', + txtAddressCountryCM: 'Camerun', + txtAddressCountryCA: 'Canada', + txtAddressCountryCV: 'Kapp Verde', + txtAddressCountryKY: 'Cayman Islands', + txtAddressCountryCF: 'Den Sentralafrikanske Republikk', + txtAddressCountryTD: 'Tsjad', + txtAddressCountryCL: 'Chile', + txtAddressCountryCN: 'Kina', + txtAddressCountryCO: 'Colombia', + txtAddressCountryKM: 'Komorene', + txtAddressCountryCD: 'Den Demokratiske Republikk Kongo', + txtAddressCountryCG: 'Republikk Kongo', + txtAddressCountryCR: 'Costa Rica', + txtAddressCountryCI: 'Elfenbenskysten', + txtAddressCountryHR: 'Kroatia', + txtAddressCountryCU: 'Cuba', + txtAddressCountryCY: 'Kypros', + txtAddressCountryCZ: 'Tsjekkia', + txtAddressCountryDK: 'Danmark', + txtAddressCountryDJ: 'Djibouti', + txtAddressCountryDM: 'Dominica', + txtAddressCountryDO: 'Den Dominikanske Republikk', + txtAddressCountryEC: 'Ecuador', + txtAddressCountryEG: 'Egypt', + txtAddressCountrySV: 'El Salvador', + txtAddressCountryGQ: 'Ekvatorial-Guinea', + txtAddressCountryER: 'Eritrea', + txtAddressCountryEE: 'Estland', + txtAddressCountryET: 'Etiopi', + txtAddressCountryFK: 'Falklandsøyene', + txtAddressCountryFO: 'Færøyene', + txtAddressCountryFJ: 'Fiji', + txtAddressCountryFI: 'Finland', + txtAddressCountryFR: 'Frankrike', + txtAddressCountryPF: 'Fransk Polynesia', + txtAddressCountryGA: 'Gabon', + txtAddressCountryGM: 'Gambia', + txtAddressCountryGE: 'Georgia', + txtAddressCountryDE: 'Tyskland', + txtAddressCountryGH: 'Ghana', + txtAddressCountryGR: 'Hellas', + txtAddressCountryGL: 'Grønland', + txtAddressCountryGD: 'Grenada', + txtAddressCountryGP: 'Guadeloupe', + txtAddressCountryGT: 'Guatemala', + txtAddressCountryGN: 'Guinea', + txtAddressCountryGW: 'Guinea-Bissau', + txtAddressCountryGY: 'Guyana', + txtAddressCountryHT: 'Haiti', + txtAddressCountryHN: 'Honduras', + txtAddressCountryHK: 'Hong Kong', + txtAddressCountryHU: 'Ungarn', + txtAddressCountryIS: 'Island', + txtAddressCountryIN: 'India', + txtAddressCountryID: 'Indonesia', + txtAddressCountryIR: 'Iran', + txtAddressCountryIQ: 'Irak', + txtAddressCountryIE: 'Irland', + txtAddressCountryIM: 'Isle of Man', + txtAddressCountryIL: 'Israel', + txtAddressCountryIT: 'Italia', + txtAddressCountryJM: 'Jamaica', + txtAddressCountryJP: 'Japan', + txtAddressCountryJO: 'Jordan', + txtAddressCountryKZ: 'Kasakhstan', + txtAddressCountryKE: 'Kenya', + txtAddressCountryKI: 'Kiribati', + txtAddressCountryKP: 'Nordkorea', + txtAddressCountryKR: 'Sydkorea', + txtAddressCountryKW: 'Kuwait', + txtAddressCountryKG: 'Kirgisistan', + txtAddressCountryLA: 'Laos', + txtAddressCountryLV: 'Letland', + txtAddressCountryLB: 'Libanon', + txtAddressCountryLS: 'Lesotho', + txtAddressCountryLR: 'Liberia', + txtAddressCountryLY: 'Libya', + txtAddressCountryLI: 'Liechtenstein', + txtAddressCountryLT: 'Litauen', + txtAddressCountryLU: 'Luxembourg', + txtAddressCountryMO: 'Macao', + txtAddressCountryMK: 'Makedonia', + txtAddressCountryMG: 'Madagaskar', + txtAddressCountryMW: 'Malawi', + txtAddressCountryMY: 'Malaysia', + txtAddressCountryMV: 'Maldivene', + txtAddressCountryML: 'Mali', + txtAddressCountryMT: 'Malta', + txtAddressCountryMH: 'Marshalløyene', + txtAddressCountryMQ: 'Martinique', + txtAddressCountryMR: 'Mauretania', + txtAddressCountryMU: 'Mauritius', + txtAddressCountryMX: 'Mexico', + txtAddressCountryFM: 'Mikronesiaføderasjonen', + txtAddressCountryMD: 'Moldova', + txtAddressCountryMC: 'Monaco', + txtAddressCountryMN: 'Mongolia', + txtAddressCountryME: 'Montenegro', + txtAddressCountryMA: 'Marokko', + txtAddressCountryMZ: 'Mozambik', + txtAddressCountryMM: 'Myanmar', + txtAddressCountryNA: 'Namibia', + txtAddressCountryNR: 'Nauru', + txtAddressCountryNP: 'Nepal', + txtAddressCountryNL: 'Holland', + txtAddressCountryNC: 'Ny-Kaledonia', + txtAddressCountryNZ: 'New Zealand', + txtAddressCountryNI: 'Nicaragua', + txtAddressCountryNE: 'Niger', + txtAddressCountryNG: 'Nigeria', + txtAddressCountryNO: 'Norge', + txtAddressCountryOM: 'Oman', + txtAddressCountryPK: 'Pakistan', + txtAddressCountryPW: 'Palau', + txtAddressCountryPS: 'Palestina', + txtAddressCountryPA: 'Panama', + txtAddressCountryPG: 'Papua Ny Guinea', + txtAddressCountryPY: 'Paraguay', + txtAddressCountryPE: 'Peru', + txtAddressCountryPH: 'Filippinene', + txtAddressCountryPL: 'Polen', + txtAddressCountryPT: 'Portugal', + txtAddressCountryPR: 'Puerto Rico', + txtAddressCountryQA: 'Qatar', + txtAddressCountryRE: 'Reunion', + txtAddressCountryRO: 'Romania', + txtAddressCountryRU: 'Russland', + txtAddressCountryRW: 'Rwanda', + txtAddressCountryBL: 'Saint-Barthelemy', + txtAddressCountrySH: 'Saint Helena', + txtAddressCountryKN: 'Saint Kitts og Nevis', + txtAddressCountryLC: 'Saint Lucia', + txtAddressCountryMF: 'Saint Martin', + txtAddressCountryVC: 'Saint Vincent og Grenadinene', + txtAddressCountryWS: 'Samoa', + txtAddressCountrySM: 'San Marino', + txtAddressCountryST: 'Sao Tome og Principe', + txtAddressCountrySA: 'Saudi-Arabia', + txtAddressCountrySN: 'Senegal', + txtAddressCountryRS: 'Serbia', + txtAddressCountrySC: 'Seychellene', + txtAddressCountrySL: 'Sierra Leone', + txtAddressCountrySG: 'Singapore', + txtAddressCountrySK: 'Slovakia', + txtAddressCountrySI: 'Slovenia', + txtAddressCountrySB: 'Salomonøyene', + txtAddressCountrySO: 'Somalia', + txtAddressCountryZA: 'Sørafrika', + txtAddressCountryGS: 'Sør-Georgia og Sør-Sandwichøyene', + txtAddressCountryES: 'Spania', + txtAddressCountryLK: 'Sri Lanka', + txtAddressCountrySD: 'Sudan', + txtAddressCountrySR: 'Surinam', + txtAddressCountrySZ: 'Swaziland', + txtAddressCountrySE: 'Sverige', + txtAddressCountryCH: 'Sveits', + txtAddressCountrySY: 'Syria', + txtAddressCountryTW: 'Taiwan', + txtAddressCountryTJ: 'Tadsjikistan', + txtAddressCountryTZ: 'Tanzania', + txtAddressCountryTH: 'Thailand', + txtAddressCountryTL: 'Timor-Leste', + txtAddressCountryTG: 'Togo', + txtAddressCountryTO: 'Tonga', + txtAddressCountryTT: 'Trinidad og Tobago', + txtAddressCountryTN: 'Tunesia', + txtAddressCountryTR: 'Tyrkia', + txtAddressCountryTM: 'Turkmenistan', + txtAddressCountryTV: 'Tuvalu', + txtAddressCountryVI: 'Jomfruøyene', + txtAddressCountryUG: 'Uganda', + txtAddressCountryUA: 'Ukraina', + txtAddressCountryAE: 'De Forente Arabiske Emirater', + txtAddressCountryGB: 'Storbritannia', + txtAddressCountryUS: 'USA', + txtAddressCountryUY: 'Uruguay', + txtAddressCountryUZ: 'Usbekistan', + txtAddressCountryVU: 'Vanuatu', + txtAddressCountryVA: 'Vatikanet', + txtAddressCountryVE: 'Venezuela', + txtAddressCountryVN: 'Vietnam', + txtAddressCountryYE: 'Yemen', + txtAddressCountryZM: 'Zambia', + txtAddressCountryZW: 'Zimbabwe' +}; + localizationSharedCardDAV['nl_NL']= /* thanks Johan Vromans */ { txtContacts: 'Contacten', @@ -6659,6 +6953,252 @@ localizationCalDAV['ja_JP']= /* Muimu Nakayama */ CalDAVerrTodoHttp410: 'ToDoは既にサーバ上にありません' }; +localizationCalDAV['nb_NO']= /* thanks Tore Ørpetveit */ +{ + _default_title_format_month_: 'MMM yyyy', + _default_title_format_week_: 'd[ MMM][ yyyy]{ \'–\' d MMM yyyy}', + _default_title_format_day_: 'ddd, d MMM yyyy', + _default_title_format_table_: 'ddd, MMM yyyy', + _default_column_format_agenda_: 'ddd, d MMM', + + txtCalendar: 'Kalender', + txtEnabledCalendars: 'Aktive kalendere', + txtTodo: 'Oppgave', + txtTodoList: 'Oppgaveliste', + txtTodoLists: 'Oppgavelister', + txtEnabledTodoLists: 'Aktive opgavelister', + txtSubscribed: 'Abonnementer', + fullCalendarTable: 'tabell', + fullCalendarTodayButton: 'i dag', + fullCalendarAllDay: 'hele dagen', + CalDAVsearch: 'Søk', + resourceEnable: 'Aktivèr alle kalendere i denne ressursen', + resourceDisable: 'Deaktivèr alle kalendere i denne ressursen', + allEnable: 'Aktivèr alle kalendere', + allDisable: 'Deaktivèr alle kalendere', + timezone: 'Tidssone', + txtTimezonePicker: 'Tidssone:', + loadingRList: 'Henter ressursliste ...', + renderingE: 'Klargjør kalendere ...', + timezoneChange: 'Skifter tidssone ...', + customTimezone: 'Brukerdefinert (Lokal tid)', + customRepeat: 'Annet (kan ikke redigeres)', + loadPrevMonth: 'Hent forrige måned', + loadNextMonth: 'Hent neste måned', + repeatBoxButton: 'Gjentakelse', + repeatBoxContent: 'er en begivenhet som gjentas.', + repeatBoxQuestion: 'Hvilke forekomster vil du åpne?', + allEvsButton: 'Alle forekomster', + allFutureButton: 'Denne og alle framtidige forekomster', + eventOnlyButton: 'Kun denne forekomsten', + repeatBoxContentTODO: 'er en gjentakende todo.', + repeatBoxQuestionTODO: 'Hvilke todos vil du behandle', + allEvsButtonTODO: 'Alle todos', + allFutureButtonTODO: 'Denne og alle framtidige todos', + eventOnlyButtonTODO: 'Kun denne todo', + txtStatus: 'Status', + eventAvailability : 'Vis som', + eventAvailabilityBusy : 'Opptatt', + eventAvailabilityFree : 'Ledig', + eventType: 'Fortrolighet', + eventTypePublic: 'Offentlig', + eventTypePrivate: 'Privat', + eventTypeConfidential: 'Fortrolig', + txtPriority: 'Prioritet', + txtPriorityNone: 'Ingen', + txtPriorityLow: 'Lav', + txtPriorityMedium: 'Medium', + txtPriorityHigh: 'Høy', + eventURL : 'URL', + repeatInterval: 'Hver', + repeatDays: 'dag(er)', + repeatWeeks: 'uke(r)', + repeatMonths: 'måned(er)', + repeatYears: 'år', + repeatChangeTxt: 'ble endret på serveren!', + repeatChangeTxtClose: 'Lukk skjemaet og åpne begivenheten på nytt', + repeatTodoChangeTxtClose: 'Lukk skjemaet og åpne todoen på nytt', + calendarLoader: 'Leser inn på nytt ...', + resizeLoader: 'Tilpasser størrelse ...', + + // TODOS + pholderNameTODO: 'Emne', + pholderNewTODO: 'Ny oppgave', + txtTypeTODO: 'Type', + txtTypeTODONone: 'Enkel', + txtTypeTODOStart: 'Med startdato', + txtTypeTODODue: 'Med forfallsdato', + txtTypeTODOBoth: 'Med både startdato og forfallsdato', + txtDateFromTODO: 'Fra', + txtDateToTODO: 'Til', + txtCompletedOn: 'Ferdig den', + + pholderDateFromTODO: 'Fra dato', + pholderTimeFromTODO: 'Fra kl.', + pholderDateToTODO: 'Til dato', + pholderTimeToTODO: 'Til kl.', + pholderCompletedOnDate: 'Dato', + pholderCompletedOnTime: 'Tid', + + txtStatusFiltersHeaderTODO: 'Filtre', + txtStatusFiltersFooterTODO: '* avsluttet %date% eller senere', + txtStatusNeedsActionTODO: 'Krever oppfølging', + txtStatusCompletedTODO: 'Fullført', + txtStatusInProcessTODO: 'Under utførelse', + txtStatusCancelledTODO: 'Annullert', + txtPercentCompletedTODO: 'Fullført', + + txtCalendarTODO: 'Kalender', + txtSelectCalendarTODO: 'Velg kalender', + txtAlertTODO: 'Påminnelse', + txtAlertNoneTODO: 'Ingen', + txtAlertMessageTODO: 'Beskjed', + txtAlertOnDateTODO: 'På dagen', + txtAlertWeeksBeforeTODO: 'Uker før', + txtAlertDaysBeforeTODO: 'Dager før', + txtAlertHoursBeforeTODO: 'Timer før', + txtAlertMinutesBeforeTODO: 'Minutter før', + txtAlertSecondsBeforeTODO: 'Sekunder før', + txtAlertWeeksAfterTODO: 'Uker etter', + txtAlertDaysAfterTODO: 'Dager etter', + txtAlertHoursAfterTODO: 'Timer etter', + txtAlertMinutesAfterTODO: 'Minutter etter', + txtAlertSecondsAfterTODO: 'Sekunder etter', + + pholderAfterBeforeValTODO: 'Verdi', + pholderAlarmDateTODO: 'Alarmdato', + pholderAlarmTimeTODO: 'Alarmtid', + + pholderNoteTODO: 'Notat', + txtNoteTODO: 'Notat', + + todoPrevNav: 'Vis forrige', + todoNextNav: 'Vis neste', + todoUncompletedPrevNav: 'Vis forrige ikke avsluttet', + todoUncompletedNextNav: 'Vis neste ikke avsluttet', + + buttonSaveTODO: 'Lagre', + buttonEditTODO: 'Rediger', + buttonDuplicateTODO: 'Kopier', + buttonResetTODO: 'Nullstill', + buttonCloseTODO: 'Lukk', + buttonDeleteTODO: 'Slett', + + // EVENTS + pholderName: 'Emne', + pholderNewEvent: 'Ny begivenhet', + txtLocation: 'Sted', + pholderLocation: 'Sted', + + txtAllDay: 'Hele dagen', + from: 'Fra', + to: 'Til', + + pholderDateFrom: 'Fra dato', + pholderTimeFrom: 'Fra kl.', + pholderDateTo: 'Til dato', + pholderTimeTo: 'Til kl.', + + txtStatusNone: 'Uspesifisert', + txtStatusTentative: 'Usikker', + txtStatusConfirmed: 'Bekreftet', + txtStatusCancelled: 'Annullert', + + txtRepeat: 'Gjentakelse', + txtNoRepeat: 'Ingen gjentakelse', + txtRepeatDay: 'Daglig', + txtRepeatWeek: 'Ugentlig', + txtRepeatWeekend: 'Hver helg', + txtRepeatMonth: 'Månedlig', + txtRepeatTwoWeek: 'Hver annen uke', + txtRepeatYear: 'Årlig', + txtRepeatCustomWeek: 'Ukentlig (avansert)', + txtRepeatCustomMonth: 'Månedlig (avansert)', + txtRepeatCustomYear: 'Årlig (avansert)', + txtRepeatWork: 'På virkedager', + txtRepeatOnDate: 'På dato', + txtRepeatAfter: 'Forekomster', + txtRepeatNever: 'Aldri', + pholderUntilDate: 'Til dato', + pholderRepeatCount: 'Antall gjentakelser', + txtRepeatCustomWeekLabel: 'På', + txtRepeatCustomMonthLabel: 'På dager', + txtRepeatCustomMonthEvery: 'Hver', + txtRepeatCustomMonthFirst: 'Første', + txtRepeatCustomMonthSecond: 'Andre', + txtRepeatCustomMonthThird: 'Tredje', + txtRepeatCustomMonthFourth: 'Fjerde', + txtRepeatCustomMonthFifth: 'Femte', + txtRepeatCustomMonthLast: 'Siste', + txtRepeatCustomMonthCustom: 'Valgfri', + txtRepeatCustomMonthMonth: 'Dag i måneden', + txtRepeatCustomYearLabel1: 'Hver', + txtRepeatCustomYearLabel2: 'i', + + txtRepeatEnd: 'Slutt', + txtEventCalendar: 'Kalender', + txtSelectCalendar: 'Velg kalender', + txtAlert: 'Påminnelse', + txtAlertNone: 'Ingen', + txtAlertMessage: 'Beskjed', + txtAlertOnDate: 'På dato', + txtAlertWeeksBefore: 'Uker før', + txtAlertDaysBefore: 'Dager før', + txtAlertHoursBefore: 'Timer før', + txtAlertMinutesBefore: 'Minutter før', + txtAlertSecondsBefore: 'Sekunder før', + txtAlertWeeksAfter: 'Uker etter', + txtAlertDaysAfter: 'Dager etter', + txtAlertHoursAfter: 'Timer efter', + txtAlertMinutesAfter: 'Minutter etter', + txtAlertSecondsAfter: 'Sekunder etter', + + pholderAfterBeforeVal: 'Verdi', + pholderAlarmDate: 'Alarmdato', + pholderAlarmTime: 'Alarmtid', + + pholderNote: 'Notat', + + eventPrevNav: 'Vis forrige', + eventNextNav: 'Vis neste', + + buttonClose: 'Lukk', + buttonDuplicate: 'Kopier', + + txtAllSavedTodo: 'Oppgave lagret!', + txtAllSaved: 'Begivenhet lagret!', + + txtAllDeletedTodo: 'Oppgave slettet!', + txtAllDeleted: 'Begivenhet slettet!', + + txtNotChooseTodo: 'Feil: Velg en kalender!', + txtNotChoose: 'Feil: Velg en kalender!', + + txtErrorDates: 'Feil: Startdatoen skal komme før sluttdatoen!', + txtErrorDatesTodo: 'Feil: Startdatoen skal komme før forfallsdatoen!', + + txtErorInputTodo: 'Kunne ikke lagre: korrigèr ugyldige felt!', + txtDateTimeErrorTodo: 'Dato og tid må velges!', + + txtErorInput: 'Feil: \'kunne ikke lagre\': korrigèr markerede ugyldige felt!', + + txtAlertsH: 'Påminnelser', + buttonAlert: 'Fjern påminnelser', + + altAddEvent: 'Legg til begivenhet', + altAddTodo: 'Legg til oppgave', + + loadingCalendars: 'leser inn kalendere (%act% av %total%) ...', + unloadingCalendars: 'Lagrer kalendere ...', + + errUnableSaveBeginCalDAV: 'Feil: \'kunne ikke lagre begivenheten\': %%!', + errUnableDeleteBeginCalDAV: 'Feil: \'kunne ikke slette begivenheten\': %%!', + CalDAVerrHttp410: 'Begivenheten er ikke lenger tilgjengelig på serveren', + errUnableSaveTodoBeginCalDAV: 'Feil: \'Kunne ikke lagre todo\': %%!', + errUnableDeleteTodoBeginCalDAV: 'Feil: \'Kunne ikke slette todo\': %%!', + CalDAVerrTodoHttp410: 'Todo er ikke lenger tilgjengelig på serveren' +}; + localizationCalDAV['nl_NL']= /* thanks Johan Vromans */ { _default_title_format_month_: 'MMM yyyy', @@ -9658,6 +10198,175 @@ localizationCardDAV['ja_JP']= /* Muimu Nakayama */ errContactHidden: '注意: 現在この連絡先は連絡先一覧で非表示です!' }; +localizationCardDAV['nb_NO']= /* thanks Tore Ørpetveit */ +{ + /* index.html */ + altAddContact: 'Legg til kontaktperson', + altPhoto: 'Foto', + txtAddressbook: 'Adressebok', + txtAddressbooks: 'Adressebøker', + txtVcardGroupsTextSingle: '%coll% [+ 1 gruppe]', + txtVcardGroupsTextMulti: '%coll% [+ %n% grupper]', + txtEnabledAddressbooks: 'Aktive adressebøker', + txtCompanies: 'Virksomheter', + txtContact: 'Kontaktperson', + pholderNickname: 'Kallenavn', + pholderPhGiven: 'Fornavn (lydskrift)', + pholderPhFamily: 'Etternavn (lydskrift)', + pholderBday: 'Fødselsdag', + pholderDate: 'Dato', + pholderTitle: 'Jobbtittel', + pholderOrg: 'Firma', + pholderDepartment: 'Avdeling', + txtCompanyContact: 'Firmakontakt', + txtRemoteImage: 'Link til bilde', + txtName: 'Navn', + + altDel: '-', + altAdd: '+', + altValueHandler: '>', /* opening URL, calling phone number, ... */ + + txtCustom: '» brukerdefinert', + pholderCustomVal: 'brukerdefinert', + + txtDates: 'Datoer', + txtDatesAnniversary: 'Jubileum', + txtDatesOther: 'annet', + + txtPhone: 'Telefon', + txtPhoneWork: 'arbeid', + txtPhoneHome: 'privat', + txtPhoneCell: 'mobil', + txtPhoneCellWork: 'mobil, arbeid', + txtPhoneCellHome: 'mobil, privat', + txtPhoneMain: 'primær', + txtPhonePager: 'personsøker', + txtPhoneFax: 'fax', + txtPhoneFaxWork: 'fax, arbeid', + txtPhoneFaxHome: 'fax, privat', + txtPhoneIphone: 'iPhone', + txtPhoneOther: 'annet', + pholderPhoneVal: 'Telefon', + + txtEmail: 'E-post', + txtEmailWork: 'arbeid', + txtEmailHome: 'privat', + txtEmailMobileme: 'mobileMe', + txtEmailOther: 'annet', + pholderEmailVal: 'E-post', + + txtUrl: 'Web', + txtUrlWork: 'arbeid', + txtUrlHome: 'privat', + txtUrlHomepage: 'hjemmeside', + txtUrlOther: 'annet', + pholderUrlVal: 'URL', + + txtRelated: 'Relasjoner', + txtRelatedFather: 'far', + txtRelatedMother: 'mor', + txtRelatedParent: 'forelder', + txtRelatedBrother: 'bror', + txtRelatedSister: 'søster', + txtRelatedChild: 'barn', + txtRelatedFriend: 'venn', + txtRelatedSpouse: 'samboer', + txtRelatedPartner: 'partner', + txtRelatedAssistant: 'assistent', + txtRelatedManager: 'overordnet', + txtRelatedOther: 'annet', + pholderRelatedVal: 'Navn', + + txtIm: 'IM', + txtImWork: 'arbeid', + txtImHome: 'privat', + txtImMobileme: 'mobileMe', + txtImOther: 'annet', + txtImProtAim: 'AIM', + txtImProtIcq: 'ICQ', + txtImProtIrc: 'IRC', + txtImProtJabber: 'Jabber', + txtImProtMsn: 'MSN', + txtImProtYahoo: 'Yahoo', + txtImProtFacebook: 'Facebook', + txtImProtGadugadu: 'GaduGadu', + txtImProtGoogletalk: 'GoogleTalk', + txtImProtQq: 'QQ', + txtImProtSkype: 'Skype', + pholderImVal: 'BrukerID', + + txtProfile: 'Profil', + txtProfileTwitter: 'twitter', + txtProfileFacebook: 'facebook', + txtProfileFlickr: 'flickr', + txtProfileLinkedin: 'linkedin', + txtProfileMyspace: 'myspace', + txtProfileSinaweibo: 'sina weibo', + pholderProfileVal: 'Brukernavn', + + txtAddress: 'Adresse', + txtAddressWork: 'arbeid', + txtAddressHome: 'privat', + txtAddressOther: 'annet', + // address fields are handled specially + + txtCategories: 'Kategorier', + // categories' values are handled specially + + pholderNoteVal: 'Tekst', + + buttonDeleteFromGroup: 'Fjern fra gruppe', + + /* common.js - address field names */ + pholderAddressCity: 'By', + pholderAddressCityRegion: 'By/Region', + pholderAddressCounty: 'Område', + pholderAddressCountyCity: 'Område/By', + pholderAddressDepartment: 'Avdeling', + pholderAddressDistrict: 'Distrikt', + pholderAddressDistrictSubdivision: 'Distrikt/Underavdeling', + pholderAddressFurtherDivisions: 'Flere avdelinger', + pholderAddressGovernorate: 'Governorat', + pholderAddressIslandName: 'Øynavn', + pholderAddressPinCode: 'PIN-Kode', + pholderAddressPostCode: 'Postnummer', + pholderAddressPostal: 'By', + pholderAddressPostalCode: 'Postnummer', + pholderAddressPostalDistrict: 'Postdistrikt', + pholderAddressPrefecture: 'Prefektur', + pholderAddressProvince: 'Provins', + pholderAddressRegion: 'Region', + pholderAddressState: 'Stat', + pholderAddressStreet: 'Gate', + pholderAddressSuburb: 'Forstad', + pholderAddressTownshipDistrict: 'Bydistrikt', + pholderAddressZip: 'Postnummer', + + /* data_process.js */ + addCategory: 'Legg til kategori', + + /* addressbook.js */ + contactConcurrentChange: 'Kontaktpersonen ble endret på serveren, og er lest inn på ny!', + contactRfcNotCompliant: 'Feil: denne kontakten (vCard) overholder ikke RFC 2426!', + + /* interface.js */ + loadingAddressbooks: 'Leser inn adressebøker (%act% av %total%) ...', + unloadingAddressbooks: 'Lukker adressebøker ...', + + /* webdav_protocol.js */ + succContactSaved: 'Kontaktpersonen ble lagret!', + succContactDeleted: 'Kontaktpersonen ble slettet!', + succContactDeletedFromGroup: 'Kontaktpersonen ble slettet fra den aktive kontaktgruppen!', + errUnableLockBegin: 'Feil: \'kunne ikke låse ressurs\': %%!', + errUnableUnlockBegin: 'Feil: \'kunne ikke frigi ressurs\': %%!', + errUnableSaveBegin: 'Feil: \'kunne ikke lagre kontaktpersonen\': %%!', + errUnableSaveInvalidData: 'Feil: \'kunne ikke lagre\': korriger uthevede ugyldige felt!', + errUnableDeleteBegin: 'Feil: \'kunne ikke slette kontaktpersonen\': %%!', + errResourceLocked: 'ressurs allerede låst', + errHttp410: 'kontaktpersonen er ikke lenger tilgjengelig på serveren', + errContactHidden: 'NB: Denne kontakten er ikke synlig i kontaktlisten på nåværende tidspunkt!' +}; + localizationCardDAV['nl_NL']= /* thanks Johan Vromans */ { /* index.html */ diff --git a/radicale_web/web/infcloud/main.js b/radicale_web/web/infcloud/main.js index 6a9f248..06ac773 100644 --- a/radicale_web/web/infcloud/main.js +++ b/radicale_web/web/infcloud/main.js @@ -179,8 +179,8 @@ var globalActiveApp=''; var globalAvailableAppsArray=new Array(); var globalEnableAppSwitch=true; var globalAppName='InfCloud'; -var globalVersion='0.13.1'; -var globalBuildNo=1442928610; +var globalVersion='0.13.2rc1'; +var globalBuildNo=1448196611; var globalXMLCache=null; var globalVersionCheckURL=(location.protocol=='file:' ? 'http:' : location.protocol)+'//www.inf-it.com/versioncheck/'+globalAppName+'/?v='+globalVersion; var globalXClientHeader=globalAppName+' '+globalVersion+' (Inf-IT CalDAV/CardDAV Web Client)'; @@ -788,7 +788,7 @@ function loadConfig() // check username and password against the server and create config from globalNetworkCheckSettings if(typeof globalNetworkCheckSettings!='undefined' && globalNetworkCheckSettings!=null) { - if(globalLoginUsername=='') + if(globalLoginUsername=='' || globalLoginPassword=='') { $('#LoginPage').fadeTo(500, 1, function(){if(typeof globalDemoMode=='undefined') $('[data-type="system_username"]').focus()}); $('#LoginLoader').fadeOut(1200); @@ -824,7 +824,7 @@ function loadConfig() // load the configuration XML(s) from the network if(typeof globalNetworkAccountSettings!='undefined' && globalNetworkAccountSettings!=null) { - if(globalLoginUsername=='') + if(globalLoginUsername=='' || globalLoginPassword=='') { $('#LoginPage').fadeTo(500, 1, function(){if(typeof globalDemoMode=='undefined') $('[data-type="system_username"]').focus()}); $('#LoginLoader').fadeOut(1200); @@ -1977,6 +1977,9 @@ var globalDisableAnimationMessageHiding=''; if(typeof globalContactPhotoScaleFactor==='undefined') var globalContactPhotoScaleFactor=1.5; +if(typeof globalContactPhotoType==='undefined' || globalContactPhotoType.match(RegExp('^(?:png|jpeg)$'))===null) + var globalContactPhotoType='jpeg'; + var globalFixedContactDataColumnsCount = 1; var globalContactDataColumnDefs = { 'CATEGORIES': { @@ -2237,7 +2240,8 @@ function globalMainCardDAV() // clone + cleanup the editor (autocomplete bug in some browsers) + store the reference in globalOrigVcardTemplate var tmp=$('#vCardTemplate').clone(); tmp.find('input[type="text"]').val(''); - tmp.find('textarea').text(''); + tmp.find('[data-type="isorg"]').prop('checked', false); + tmp.find('textarea').val(''); globalOrigVcardTemplate=tmp; } diff --git a/radicale_web/web/infcloud/resource.js b/radicale_web/web/infcloud/resource.js index f0fb104..9456173 100644 --- a/radicale_web/web/infcloud/resource.js +++ b/radicale_web/web/infcloud/resource.js @@ -1202,7 +1202,7 @@ function ResourceCardDAVList() { var tmp2=globalAddressbookList.getContactByUID(ui.draggable.attr('data-id')); // here we generate the destination for MOVE (we don't use the old vCard file name to minimalize the possible conflict situations) - var tmp3=($(this).attr('data-id')+hex_sha256(tmp2.vcard+(new Date().getTime()))+'.vcf').match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]*)','i')); + var tmp3=($(this).attr('data-id')+String(CryptoJS.SHA256(tmp2.vcard+(new Date().getTime())))+'.vcf').match(RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]*)','i')); tmp2.moveDestUID=$(this).attr('data-id'); tmp2.moveDest=tmp3[1]+tmp3[3]+tmp3[4]+tmp3[5]+tmp3[6]; // we need to store the ui object references for error handling in the GUI diff --git a/radicale_web/web/infcloud/timezones.js b/radicale_web/web/infcloud/timezones.js index 7020281..39b7525 100644 --- a/radicale_web/web/infcloud/timezones.js +++ b/radicale_web/web/infcloud/timezones.js @@ -2479,6 +2479,77 @@ var timezones = { } ] }, + 'America/Fort_Nelson': { + daylightComponents: + [ + { + dtStart: '19450814T160000', + tzName: 'PPT', + tzOffsetFROM: '-0700', + tzOffsetTO: '-0700', + startMinutes: 0, + startHours: 16, + rDates: ['19450814T160000'] + }, + { + dtStart: '19420209T020000', + tzName: 'PWT', + tzOffsetFROM: '-0800', + tzOffsetTO: '-0700', + startMinutes: 0, + startHours: 2, + rDates: ['19420209T020000'] + }, + { + dtStart: '19180414T020000', + tzName: 'PDT', + tzOffsetFROM: '-0800', + tzOffsetTO: '-0700', + startMinutes: 0, + startHours: 2, + rDates: ['20140309T020000','20130310T020000','20120311T020000','20110313T020000','20100314T020000','20090308T020000','20080309T020000','20070311T020000','20060402T020000','20050403T020000','20040404T020000','20030406T020000','20020407T020000','20010401T020000','20000402T020000','19990404T020000','19980405T020000','19970406T020000','19960407T020000','19950402T020000','19940403T020000','19930404T020000','19920405T020000','19910407T020000','19900401T020000','19890402T020000','19880403T020000','19870405T020000','19860427T020000','19850428T020000','19840429T020000','19830424T020000','19820425T020000','19810426T020000','19800427T020000','19790429T020000','19780430T020000','19770424T020000','19760425T020000','19750427T020000','19740428T020000','19730429T020000','19720430T020000','19710425T020000','19700426T020000','19690427T020000','19680428T020000','19670430T020000','19660424T020000','19650425T020000','19640426T020000','19630428T020000','19620429T020000','19610430T020000','19600424T020000','19590426T020000','19580427T020000','19570428T020000','19560429T020000','19550424T020000','19540425T020000','19530426T020000','19520427T020000','19510429T020000','19500430T020000','19490424T020000','19480425T020000','19470427T020000','19180414T020000'] + } + ], + standardComponents: + [ + { + dtStart: '20150308T020000', + tzName: 'MST', + tzOffsetFROM: '-0800', + tzOffsetTO: '-0700', + startMinutes: 0, + startHours: 2, + rDates: ['20150308T020000'] + }, + { + dtStart: '19460101T000000', + tzName: 'PST', + tzOffsetFROM: '-0800', + tzOffsetTO: '-0800', + startMinutes: 0, + startHours: 0, + rDates: ['19870101T000000','19470101T000000','19460101T000000'] + }, + { + dtStart: '19181027T020000', + tzName: 'PST', + tzOffsetFROM: '-0700', + tzOffsetTO: '-0800', + startMinutes: 0, + startHours: 2, + rDates: ['20141102T020000','20131103T020000','20121104T020000','20111106T020000','20101107T020000','20091101T020000','20081102T020000','20071104T020000','20061029T020000','20051030T020000','20041031T020000','20031026T020000','20021027T020000','20011028T020000','20001029T020000','19991031T020000','19981025T020000','19971026T020000','19961027T020000','19951029T020000','19941030T020000','19931031T020000','19921025T020000','19911027T020000','19901028T020000','19891029T020000','19881030T020000','19871025T020000','19861026T020000','19851027T020000','19841028T020000','19831030T020000','19821031T020000','19811025T020000','19801026T020000','19791028T020000','19781029T020000','19771030T020000','19761031T020000','19751026T020000','19741027T020000','19731028T020000','19721029T020000','19711031T020000','19701025T020000','19691026T020000','19681027T020000','19671029T020000','19661030T020000','19651031T020000','19641025T020000','19631027T020000','19621028T020000','19610924T020000','19600925T020000','19590927T020000','19580928T020000','19570929T020000','19560930T020000','19550925T020000','19540926T020000','19530927T020000','19520928T020000','19510930T020000','19500924T020000','19490925T020000','19480926T020000','19470928T020000','19450930T020000','19181027T020000'] + }, + { + dtStart: '18840101T000000', + tzName: 'PST', + tzOffsetFROM: '-081047', + tzOffsetTO: '-0800', + startMinutes: 0, + startHours: 0, + rDates: ['18840101T000000'] + } + ] + }, 'America/Resolute': { daylightComponents: [ @@ -17875,7 +17946,7 @@ var timezones = { tzOffsetTO: '+0300', startMinutes: 0, startHours: 0, - rDates: ['19850420T000000'] + rDates: ['20151025T040000','19850420T000000'] }, { dtStart: '19790401T030000', @@ -17908,7 +17979,7 @@ var timezones = { standardComponents: [ { - dtStart: '20071028T040000', + dtStart: '20161030T040000', tzName: 'EET', tzOffsetFROM: '+0300', tzOffsetTO: '+0200', @@ -17943,7 +18014,7 @@ var timezones = { tzOffsetTO: '+0200', startMinutes: 0, startHours: 0, - rDates: ['20061029T020000','20051030T020000','20041031T020000','20031026T020000','20021027T020000','20011028T020000','20001029T020000','19991031T020000','19981025T020000','19971026T020000','19961027T020000','19950924T020000','19940925T020000','19930926T020000','19920927T020000','19910929T020000','19900930T030000','19890924T030000','19880925T030000','19870927T030000','19860928T030000','19850928T000000','19771016T000000','19761031T000000','19751026T000000','19741103T050000','19731104T030000','19721008T000000','19711003T000000','19701004T000000','19641001T000000','19621008T000000','19511008T000000','19501008T000000','19491002T000000','19481003T000000','19471005T000000','19461001T000000','19451008T000000','19421101T000000','19410921T000000','19401005T000000','19251001T000000','19241001T000000','19221008T000000','19211003T000000','19201025T000000','19161001T000000'] + rDates: ['20151108T040000','20141026T040000','20131027T040000','20121028T040000','20111030T040000','20101031T040000','20091025T040000','20081026T040000','20071028T040000','20061029T020000','20051030T020000','20041031T020000','20031026T020000','20021027T020000','20011028T020000','20001029T020000','19991031T020000','19981025T020000','19971026T020000','19961027T020000','19950924T020000','19940925T020000','19930926T020000','19920927T020000','19910929T020000','19900930T030000','19890924T030000','19880925T030000','19870927T030000','19860928T030000','19850928T000000','19771016T000000','19761031T000000','19751026T000000','19741103T050000','19731104T030000','19721008T000000','19711003T000000','19701004T000000','19641001T000000','19621008T000000','19511008T000000','19501008T000000','19491002T000000','19481003T000000','19471005T000000','19461001T000000','19451008T000000','19421101T000000','19410921T000000','19401005T000000','19251001T000000','19241001T000000','19221008T000000','19211003T000000','19201025T000000','19161001T000000'] }, { dtStart: '19101001T000000', @@ -18759,7 +18830,7 @@ var timezones = { startHours: 3, startMonth: 1, startDay: 0, - startCount: 0 + startCount: 3 }, { dtStart: '19990228T030000', @@ -19390,9 +19461,39 @@ var timezones = { ] }, 'Pacific/Norfolk': { + daylightComponents: + [ + { + dtStart: '19741027T020000', + tzName: 'NFST', + tzOffsetFROM: '+1130', + tzOffsetTO: '+1230', + startMinutes: 0, + startHours: 2, + rDates: ['19741027T020000'] + } + ], standardComponents: [ { + dtStart: '20151004T020000', + tzName: 'NFT', + tzOffsetFROM: '+1130', + tzOffsetTO: '+1100', + startMinutes: 0, + startHours: 2, + rDates: ['20151004T020000'] + }, + { + dtStart: '19750302T020000', + tzName: 'NFT', + tzOffsetFROM: '+1230', + tzOffsetTO: '+1130', + startMinutes: 0, + startHours: 2, + rDates: ['19750302T020000'] + }, + { dtStart: '19510101T000000', tzName: 'NFT', tzOffsetFROM: '+1112', @@ -25028,7 +25129,7 @@ var timezones = { tzOffsetTO: '+0300', startMinutes: 0, startHours: 0, - rDates: ['19850420T000000'] + rDates: ['20151025T040000','19850420T000000'] }, { dtStart: '19790401T030000', @@ -25061,7 +25162,7 @@ var timezones = { standardComponents: [ { - dtStart: '20071028T040000', + dtStart: '20161030T040000', tzName: 'EET', tzOffsetFROM: '+0300', tzOffsetTO: '+0200', @@ -25096,7 +25197,7 @@ var timezones = { tzOffsetTO: '+0200', startMinutes: 0, startHours: 0, - rDates: ['20061029T020000','20051030T020000','20041031T020000','20031026T020000','20021027T020000','20011028T020000','20001029T020000','19991031T020000','19981025T020000','19971026T020000','19961027T020000','19950924T020000','19940925T020000','19930926T020000','19920927T020000','19910929T020000','19900930T030000','19890924T030000','19880925T030000','19870927T030000','19860928T030000','19850928T000000','19771016T000000','19761031T000000','19751026T000000','19741103T050000','19731104T030000','19721008T000000','19711003T000000','19701004T000000','19641001T000000','19621008T000000','19511008T000000','19501008T000000','19491002T000000','19481003T000000','19471005T000000','19461001T000000','19451008T000000','19421101T000000','19410921T000000','19401005T000000','19251001T000000','19241001T000000','19221008T000000','19211003T000000','19201025T000000','19161001T000000'] + rDates: ['20151108T040000','20141026T040000','20131027T040000','20121028T040000','20111030T040000','20101031T040000','20091025T040000','20081026T040000','20071028T040000','20061029T020000','20051030T020000','20041031T020000','20031026T020000','20021027T020000','20011028T020000','20001029T020000','19991031T020000','19981025T020000','19971026T020000','19961027T020000','19950924T020000','19940925T020000','19930926T020000','19920927T020000','19910929T020000','19900930T030000','19890924T030000','19880925T030000','19870927T030000','19860928T030000','19850928T000000','19771016T000000','19761031T000000','19751026T000000','19741103T050000','19731104T030000','19721008T000000','19711003T000000','19701004T000000','19641001T000000','19621008T000000','19511008T000000','19501008T000000','19491002T000000','19481003T000000','19471005T000000','19461001T000000','19451008T000000','19421101T000000','19410921T000000','19401005T000000','19251001T000000','19241001T000000','19221008T000000','19211003T000000','19201025T000000','19161001T000000'] }, { dtStart: '19101001T000000', diff --git a/radicale_web/web/infcloud/vtodo.js b/radicale_web/web/infcloud/vtodo.js index c86e35e..b110975 100644 --- a/radicale_web/web/infcloud/vtodo.js +++ b/radicale_web/web/infcloud/vtodo.js @@ -173,10 +173,10 @@ function getRepeatTodoObject(inputRepeatObj) { if(tzArray.indexOf(inputTodos[iE].timeZone)==-1) { - if(!appleTodoMode && inputRepeatObj.deleteMode && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar))) + if(!appleTodoMode && inputRepeatObj.deleteMode && (inputRepeatObj.vcalendarHash==String(CryptoJS.SHA256(inputTodos[iE].vcalendar)))) continue; var component=buildTimezoneComponent(inputTodos[iE].timeZone); - if(component!='' && (inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[iE].vcalendar))) + if(component!='' && (inputRepeatObj.vcalendarHash!=String(CryptoJS.SHA256(inputTodos[iE].vcalendar)))) { tzArray[tzArray.length]=inputTodos[iE].timeZone; tzString+=component; @@ -184,7 +184,7 @@ function getRepeatTodoObject(inputRepeatObj) tzString+='\r\n'; isTimeZone=true; } - else if(component!='' && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar))) + else if(component!='' && (inputRepeatObj.vcalendarHash==String(CryptoJS.SHA256(inputTodos[iE].vcalendar)))) origTimezone+=component; } } @@ -226,12 +226,12 @@ function getRepeatTodoObject(inputRepeatObj) for(var j=0;j<inputTodos.length;j++) { todoStringArray.splice(todoStringArray.indexOf(inputTodos[j].vcalendar),1); - if((inputRepeatObj.futureStart== '' && inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[j].vcalendar)) || inputTodos[j].rec_id!=inputRepeatObj.recurrenceId) + if((inputRepeatObj.futureStart== '' && inputRepeatObj.vcalendarHash!=String(CryptoJS.SHA256(inputTodos[j].vcalendar))) || inputTodos[j].rec_id!=inputRepeatObj.recurrenceId) { var stringUIDcurrent=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_UID']); if(stringUIDcurrent!=null) stringUIDcurrent=stringUIDcurrent[0].match(vCalendar.pre['contentline_parse'])[4]; - if((inputRepeatObj.deleteMode && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar)) || (inputRepeatObj.deleteMode && !inputTodos[j].rec_id && inputRepeatObj.vcalendarUID==stringUIDcurrent) || appleTodoMode) + if((inputRepeatObj.deleteMode && inputRepeatObj.vcalendarHash==String(CryptoJS.SHA256(inputTodos[j].vcalendar))) || (inputRepeatObj.deleteMode && !inputTodos[j].rec_id && inputRepeatObj.vcalendarUID==stringUIDcurrent) || appleTodoMode) { var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']); var origRuleString=ruleString; @@ -322,7 +322,7 @@ function getRepeatTodoObject(inputRepeatObj) var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']); if(inputTodos[j].finalString.length>2); inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length))); - if(inputRepeatObj.futureStart.split(';')[0]>1 && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar)) + if(inputRepeatObj.futureStart.split(';')[0]>1 && inputRepeatObj.vcalendarHash==String(CryptoJS.SHA256(inputTodos[j].vcalendar))) inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], inputRepeatObj.futureStart.split(';')[0]); if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length); @@ -338,7 +338,7 @@ function getRepeatTodoObject(inputRepeatObj) if(inputTodos[j].finalString.length>2); inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length))); - if(inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar)) + if(inputRepeatObj.vcalendarHash==String(CryptoJS.SHA256(inputTodos[j].vcalendar))) inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], 2); if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length); @@ -2830,11 +2830,11 @@ function vcalendarTodoData(inputCollection, inputEvent, isNew) { byDay=pars[i].split('=')[1]; byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(','); - if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) - { - console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar); - return false; - } +// if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY')) +// { +// console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar); +// return false; +// } } } if(!returnForValue) diff --git a/radicale_web/web/infcloud/webdav_protocol.js b/radicale_web/web/infcloud/webdav_protocol.js index a6df7c7..9b8a595 100644 --- a/radicale_web/web/infcloud/webdav_protocol.js +++ b/radicale_web/web/infcloud/webdav_protocol.js @@ -105,7 +105,7 @@ function netCheckAndCreateConfiguration(configurationURL) }, timeout: configurationURL.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && globalLoginUsername!='') + if(globalSettings.usejqueryauth.value!=true && globalLoginUsername!='' && globalLoginPassword!='') req.setRequestHeader('Authorization', basicAuth(globalLoginUsername,globalLoginPassword)); req.setRequestHeader('X-client', globalXClientHeader); req.setRequestHeader('Depth', '0'); @@ -193,7 +193,7 @@ function netLoadConfiguration(configurationURL) }, timeout: configurationURL.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && globalLoginUsername!='') + if(globalSettings.usejqueryauth.value!=true && globalLoginUsername!='' && globalLoginPassword!='') req.setRequestHeader('Authorization', basicAuth(globalLoginUsername,globalLoginPassword)); req.setRequestHeader('X-client', globalXClientHeader); }, @@ -380,7 +380,7 @@ function netSaveProperty(inputCollection, hrefProperty, inputProperty, inputValu }, timeout: inputCollection.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='' && inputCollection.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputCollection.userAuth.userName, inputCollection.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -658,7 +658,7 @@ function DAVresourceDelegation(inputResource, index, lastIndex) timeout: inputResource.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='' && inputResource.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputResource.userAuth.userName, inputResource.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -1074,7 +1074,7 @@ function netFindResource(inputResource, inputResourceIndex, forceLoad, indexR, l }, timeout: inputResource.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='' && inputResource.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputResource.userAuth.userName,inputResource.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -1248,10 +1248,10 @@ function netLoadResource(inputResource, inputHref, hrefMode, inputResourceIndex, if(color=='') { var par=(uidBase+globalSubscribedCalendars.calendars[k].href).split('/'); - var hash=hex_sha256(hex_sha256(par[par.length-3]+'/'+par[par.length-2]+'/')); + var hash=String(CryptoJS.SHA256(String(CryptoJS.SHA256(par[par.length-3]+'/'+par[par.length-2]+'/')))); var hex=hash.substring(0,6); while(checkColorBrightness(hex)>=252) - hex=hex_sha256(hex_sha256(hash)).substring(0,6); + hex=String(CryptoJS.SHA256(String(CryptoJS.SHA256(hash)))).substring(0,6); color='#'+hex; } var syncRequired=true; @@ -1522,10 +1522,10 @@ function netLoadResource(inputResource, inputHref, hrefMode, inputResourceIndex, if(color=='') { var par=(uidBase+href).split('/'); - var hash=hex_sha256(hex_sha256(par[par.length-3]+'/'+par[par.length-2]+'/')); + var hash=String(CryptoJS.SHA256(String(CryptoJS.SHA256(par[par.length-3]+'/'+par[par.length-2]+'/')))); var hex=hash.substring(0,6); while(checkColorBrightness(hex)>=252) - hex=hex_sha256(hex_sha256(hash)).substring(0,6); + hex=String(CryptoJS.SHA256(String(CryptoJS.SHA256(hash)))).substring(0,6); color='#'+hex; } var ignoreAlarms=false; @@ -1730,10 +1730,10 @@ function netLoadResource(inputResource, inputHref, hrefMode, inputResourceIndex, if(color=='') { var par=(uidBase+href).split('/'); - var hash=hex_sha256(hex_sha256(par[par.length-3]+'/'+par[par.length-2]+'/')); + var hash=String(CryptoJS.SHA256(String(CryptoJS.SHA256(par[par.length-3]+'/'+par[par.length-2]+'/')))); var hex=hash.substring(0,6); while(checkColorBrightness(hex)>=252) - hex=hex_sha256(hex_sha256(hash)).substring(0,6); + hex=String(CryptoJS.SHA256(String(CryptoJS.SHA256(hash)))).substring(0,6); color='#'+hex; } @@ -1840,7 +1840,7 @@ function netLoadResource(inputResource, inputHref, hrefMode, inputResourceIndex, }, timeout: inputResource.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='' && inputResource.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputResource.userAuth.userName, inputResource.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -1925,7 +1925,7 @@ function netSaveSettings(inputResource, inputSettings, isFormSave, collectionLoa }, timeout: inputResource.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='' && inputResource.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputResource.userAuth.userName, inputResource.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -2063,7 +2063,7 @@ function deleteVcalendarFromCollection(inputUID,inputForm, putMode) timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName, resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -2152,7 +2152,7 @@ function moveVcalendarToCollection(accountUID, inputUID, inputEtag, inputVcalend var resultTimestamp=new Date().getTime(); if(inputForm=='vtodo') globalTodoLoaderHide = localization[globalInterfaceLanguage].txtAllSavedTodo; - var hex=hex_sha256(inputVcalendar+(new Date().getTime())); + var hex=String(CryptoJS.SHA256(inputVcalendar+(new Date().getTime()))); var tmp=delUID.match(vCalendar.pre['uidParts']); var tmpDest=inputUID.match(vCalendar.pre['uidParts']); @@ -2200,7 +2200,7 @@ function moveVcalendarToCollection(accountUID, inputUID, inputEtag, inputVcalend timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName, resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -2303,7 +2303,7 @@ function putVcalendarToCollection(accountUID, inputUID, inputEtag, inputVcalenda // multi-octet UTF8-characters) allowed on one line, excluding a line break (CRLF) inputVcalendar=vObjectLineFolding(inputVcalendar); - var hex=hex_sha256(inputVcalendar+(new Date().getTime())); + var hex=String(CryptoJS.SHA256(inputVcalendar+(new Date().getTime()))); var tmp=inputUID.match(vCalendar.pre['uidParts']); var collection_uid=tmp[1]+tmp[2]+'@'+tmp[3]+tmp[4]+tmp[5]; @@ -2365,7 +2365,7 @@ function putVcalendarToCollection(accountUID, inputUID, inputEtag, inputVcalenda beforeSend: function(req) { req.setRequestHeader('Prefer', 'return=representation'); - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName, resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -3018,7 +3018,7 @@ function CalDAVnetLoadCollection(inputCollection, forceLoad, allSyncMode, recurs }, timeout: inputCollection.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='' && inputCollection.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputCollection.userAuth.userName, inputCollection.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -3058,12 +3058,19 @@ function CalDAVnetLoadCollection(inputCollection, forceLoad, allSyncMode, recurs } else globalSettings.todopastlimit.value = null; - globalCalendarNumberCount--; + + if(globalSettingsSaving!='' && globalFirstHideLoader) + globalLoadedCollectionsCount--; + else + globalCalendarNumberCount--; + CalDAVnetLoadCollection(collections[recursiveIterator], forceLoad, allSyncMode, recursiveIterator, collections); } - if((objAJAXRequest.status==400 /* bad request */ || objAJAXRequest.status==403 /* forbidden (for stupid servers) */ || objAJAXRequest.status==501 /* unimplemented */) && inputCollection.forceSyncPROPFIND!=true /* prevent recursion */) + if((objAJAXRequest.status==400 /* bad request */ || objAJAXRequest.status==403 /* forbidden (for stupid servers) */ || objAJAXRequest.status==415 /* unsupported media type (SabreDAV) */ || objAJAXRequest.status==501 /* unimplemented */) && inputCollection.forceSyncPROPFIND!=true /* prevent recursion */) { collections[recursiveIterator].forceSyncPROPFIND=true; + collections[recursiveIterator].syncRequired=true; + if(inputCollection.listType=='vevent') { globalSettings.eventstartfuturelimit.value = null; @@ -3071,7 +3078,12 @@ function CalDAVnetLoadCollection(inputCollection, forceLoad, allSyncMode, recurs } else globalSettings.todopastlimit.value = null; - globalCalendarNumberCount--; + + if(globalSettingsSaving!='' && globalFirstHideLoader) + globalLoadedCollectionsCount--; + else + globalCalendarNumberCount--; + CalDAVnetLoadCollection(collections[recursiveIterator], forceLoad, allSyncMode, recursiveIterator, collections); return true; } @@ -3079,6 +3091,7 @@ function CalDAVnetLoadCollection(inputCollection, forceLoad, allSyncMode, recurs { if(collections.length>0) { + collections[recursiveIterator].newlyAdded=false; recursiveIterator++; if(recursiveIterator>=collections.length && inputCollection.uid!='undefined' && inputCollection.listType=='vevent') { @@ -3305,7 +3318,7 @@ function netLoadCalendar(inputCollection, vcalendarList, syncReportSupport, rem }, timeout: inputCollection.timeOut, beforeSend: function(req){ - if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='' && inputCollection.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputCollection.userAuth.userName, inputCollection.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); @@ -3512,7 +3525,7 @@ function netLoadCalendarSubscription(inputResource, inputCollection, recursiveIt crossDomain: false, timeout: 30000, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputResource.userAuth.userName!='' && inputResource.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputResource.userAuth.userName, inputResource.userAuth.userPassword)); }, username: (globalSettings.usejqueryauth.value==true ? inputResource.userAuth.userName : null), @@ -3571,7 +3584,7 @@ function netLoadCalendarSubscription(inputResource, inputCollection, recursiveIt realEventUID=realEventUID.replace('/',''); } - var hex = hex_sha256(partEvent); + var hex=String(CryptoJS.SHA256(partEvent)); if(inputCollection.urlArray != null) { if(inputCollection.urlArray[inputCollection.uid+realEventUID+'.ics']!=null && inputCollection.urlArray[inputCollection.uid+realEventUID+'.ics']!=undefined) @@ -3607,7 +3620,7 @@ function netLoadCalendarSubscription(inputResource, inputCollection, recursiveIt realEventUID=realEventUID.replace('/',''); } - var hex = hex_sha256(partEvent); + var hex=String(CryptoJS.SHA256(partEvent)); if(inputCollection.urlArray != null) { if(inputCollection.urlArray[inputCollection.uid+realEventUID+'.ics']!=null && inputCollection.urlArray[inputCollection.uid+realEventUID+'.ics']!=undefined) @@ -3686,7 +3699,7 @@ function unlockCollection(inputContactObj) }, timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName,resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); // req.setRequestHeader('Depth', '0'); @@ -3934,7 +3947,7 @@ function lockAndPerformToCollection(inputContactObj, inputFilterUID, inputPerfor timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName,resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); req.setRequestHeader('Depth', '0'); @@ -4088,7 +4101,7 @@ function putVcardToCollection(inputContactObjArr, inputFilterUID, recursiveMode, } else // new contact { - var vcardFile=hex_sha256(inputContactObj.vcard+(new Date().getTime()))+'.vcf'; + var vcardFile=String(CryptoJS.SHA256(inputContactObj.vcard+(new Date().getTime())))+'.vcf'; var put_href=tmp[1]+tmp[3]+tmp[4]+tmp[5]+vcardFile; var put_href_part=tmp[4]+tmp[5]+vcardFile; inputContactObj.uid+=vcardFile; @@ -4127,7 +4140,7 @@ function putVcardToCollection(inputContactObjArr, inputFilterUID, recursiveMode, beforeSend: function(req) { req.setRequestHeader('Prefer', 'return=representation'); - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName,resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); if(lockToken!=null && inputContactObj.withoutLockTocken!=true) @@ -4304,7 +4317,7 @@ function moveVcardToCollection(inputContactObj, inputFilterUID) timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName,resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); if(lockToken!=null) @@ -4400,7 +4413,7 @@ function deleteVcardFromCollection(inputContactObj, inputFilterUID, recursiveMod }, timeout: resourceSettings.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && resourceSettings.userAuth.userName!='' && resourceSettings.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(resourceSettings.userAuth.userName,resourceSettings.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); if(lockToken!=null) @@ -4692,7 +4705,7 @@ function CardDAVnetLoadCollection(inputCollection, forceLoad, forceLoadNextConta }, timeout: inputCollection.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='' && inputCollection.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputCollection.userAuth.userName,inputCollection.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); req.setRequestHeader('Depth', '1'); @@ -4716,7 +4729,7 @@ function CardDAVnetLoadCollection(inputCollection, forceLoad, forceLoadNextConta error: function(objAJAXRequest, strError){ // POROVNAT S TYM AKO JE TO V CALDAVZAP $('#intCarddav').find('.int_error').css('display','block'); - if((objAJAXRequest.status==400 /* bad request */ || objAJAXRequest.status==403 /* forbidden (for stupid servers) */ || objAJAXRequest.status==501 /* unimplemented */) && inputCollection.forceSyncPROPFIND!=true /* prevent recursion */) + if((objAJAXRequest.status==400 /* bad request */ || objAJAXRequest.status==403 /* forbidden (for stupid servers) */ || objAJAXRequest.status==415 /* unsupported media type (SabreDAV) */ || objAJAXRequest.status==501 /* unimplemented */) && inputCollection.forceSyncPROPFIND!=true /* prevent recursion */) { collections[recursiveIterator].forceSyncPROPFIND=true; CardDAVnetLoadCollection(collections[recursiveIterator], forceLoad, forceLoadNextContact, innerOperationData, recursiveIterator, collections, recursiveMode); @@ -4894,7 +4907,7 @@ function netLoadAddressbook(inputCollection, vcardList, syncReportSupport, force }, timeout: inputCollection.timeOut, beforeSend: function(req) { - if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='') + if(globalSettings.usejqueryauth.value!=true && inputCollection.userAuth.userName!='' && inputCollection.userAuth.userPassword!='') req.setRequestHeader('Authorization', basicAuth(inputCollection.userAuth.userName,inputCollection.userAuth.userPassword)); req.setRequestHeader('X-client', globalXClientHeader); req.setRequestHeader('Depth', '0'); |