{"version":3,"sources":["Common/utils.js","Common/Common.app.js","Common/mdColors.app.js","Common/decodeUri.filter.js","Common/encodeUri.filter.js","Common/ensureTarget.filter.js","Common/ln2br.filter.js","Common/loc.filter.js","Common/range.filter.js","Common/AclController.js","Common/navController.js","Common/Acl.service.js","Common/Alarm.service.js","Common/Authentication.service.js","Common/Dialog.service.js","Common/Gravatar.service.js","Common/Resource.service.js","Common/sgFocus.service.js","Common/sgHotkeys.service.js","Common/User.service.js","Common/sgAvatarImage.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgDatepickerReadonlyInput.directive.js","Common/sgDraggable.directive.js","Common/sgDroppable.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgPlaceholder.directive.js","Common/sgResetOnDisabled.directive.js","Common/sgRippleClick.directive.js","Common/sgSearch.directive.js","Common/sgSelectOnly.directive.js","Common/sgSubscribe.directive.js","Common/sgTimepicker.directive.js","Common/sgToggleGrid.directive.js","Common/sgTransformOnBlur.directive.js"],"names":["l","i","j","key","arguments","value","args","labels","clabels","length","replace","m","val","parseFloat","isNaN","hexToRgb","hex","result","exec","r","parseInt","g","b","contrast","color","c","Math","pow","guid","S4","random","toString","substring","substr","toLowerCase","configure","$logProvider","$compileProvider","$httpProvider","$mdThemingProvider","$mdAriaProvider","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastLightColors","contrastDarkColors","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","DebugEnabled","debugEnabled","debugInfoEnabled","disableWarnings","generateThemesOnDemand","interceptors","push","AuthInterceptor","$window","$q","response","test","config","headers","Accept","data","location","reload","reject","ErrorInterceptor","$rootScope","responseError","rejection","$broadcast","angular","module","isPopup","document","body","classList","contains","baseURL","ApplicationBaseURL","resourcesURL","ResourcesURL","activeUser","param","settings","login","UserLogin","identification","UserIdentification","email","UserEmail","language","UserLanguage","folderURL","UserFolderURL","isSuperUser","IsSuperUser","path","calendar","UserCalendarPath","contacts","UserContactsPath","mail","UserMailPath","preferences","UserPreferencesPath","administration","UserAdministrationPath","help","HelpURL","logoff","UserLogoffPath","minimumSearchLength","isNumber","constant","selection","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","print","factory","$inject","_$mdThemingProvider","runBlock","$interpolate","$document","$log","buildCssSelectors","selectors","join","addRule","fgInterpolate","bgInterpolate","themeName","paletteName","colorArray","hueName","colorValue","colorContrast","context","palette","hue","customSheet","insertRule","index","addBorderRule","bdrInterpolate","getStyleSheet","style","head","querySelector","createElement","title","appendChild","createTextNode","sheet","fgDefault","bgDefault","bdrDefault","fgDefaultHue","bgDefaultHue","fgColor","bgColor","bdrColor","fgHue","bgHue","cssRules","deleteRule","forEach","_THEMES","_PALETTES","colors","primary","name","hues","run","decodeUri","decodeURIComponent","filter","encodeUri","encodeURIComponent","ensureTarget","$sce","element","tree","find","attr","trustAs","html","ln2br","text","String","undefined","loc","range","n","res","AclController","$timeout","$mdDialog","Dialog","usersWithACL","User","folder","userFilter","$query","$filter","$acl","users","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","then","status","alert","confirmChange","user","confirmation","$confirmRights","vm","showing","message","removeUser","$removeUser","uid","addUser","$addUser","userToAdd","searchText","selectedUid","selectUser","selectAllRights","$selectAllRights","$event","target","parentNode","selectedUser","$rights","this","controller","navController","$scope","$interval","$http","$mdSidenav","$mdToast","$mdMedia","sgConstant","sgSettings","Resource","Alarm","leftIsClose","isOpen","onHttpError","event","isString","statusText","show","template","hideDelay","position","debug","resource","centerIsClose","currentDay","window","get","secondsBeforeTomorrow","toggleLeft","isGtMedium","triggerHandler","toggle","toggleRight","toggleCenter","options","save","post","state","$watch","newVal","$on","getAlarms","Acl","folderId","Settings","extend","$$resource","$User","prototype","$users","owner","_this","deferred","defer","acls","isDefined","userResource","fetch","canSubscribeUser","isSubscribed","wasSubscribed","bind","resolve","promise","_","indexOf","map","userClass","isGroup","$shadowRights","splice","rights","right","$resetRights","deferredSave","deferredSubscribe","action","$rightsAreDirty","$omit","copy","uids","all","currentAlarm","AlarmService","$toast","now","Date","browserTime","floor","getTime","alarms","sort","a","x","y","next","pop","utc","url","alarmTime","delay","f","showAlarm","cancel","AlarmController","scope","$sanitize","summary","reminder","ok","locals","Authentication","redirectUrl","username","domain","userName","address","baseAddress","altBaseAddress","parts","hostpart","protocol","newAddress","href","split","startsWith","endsWith","getService","$cookies","passwordPolicyConfig","readLoginCookie","loginValues","cookie","base64decode","service","d","password","rememberLogin","loginSuffix","method","loginCookie","expire","grace","cn","msg","perr","LDAPPasswordPolicyError","PolicyNoError","PolicyAccountLocked","error","changePassword","newPassword","xsrfCookie","remove","X-XSRF-TOKEN","PolicyPasswordModNotAllowed","PolicyInsufficientPasswordQuality","PolicyPasswordTooShort","PolicyPasswordTooYoung","PolicyPasswordInHistory","formatted","PolicyPasswordUnknown","PolicyPasswordSystemUnknown","put","$get","PolicyPasswordChangeUnsupported","PolicyPasswordExpired","PolicyChangeAfterReset","PolicyMustSupplyOldPassword","provider","DialogService","$modal","content","htmlContent","confirm","prompt","label","PromptDialogController","o","id","asCSSIdentifier","parent","clickOutsideToClose","escapeToClose","inputType","Gravatar","size","alternate_avatar","hash","s","md5","no_404","_http","_q","_path","_activeUser","$factory","compact","escape","params","flatten","newguid","create","newValue","download","getFileNameFromHeader","header","trim","type","accept","responseType","cache","transformResponse","fileName","blob","Blob","saveAs","Error","sgFocus","$sgHotkeys","wrapWithApply","fn","$apply","call","HotKey","description","callback","preventInClass","onKeyUp","lkey","clone","Hotkeys","_hotkeys","_hotkeysUp","_preventIn","_preventInClass","_onKeydown","_onKeyup","_onKeypress","initialize","registerHotkey","createHotkey","_toggleCheatSheet","addEventListener","_invokeHotkeyHandlers","keyString","hotkeys","hotkey","srcElement","nodeName","toUpperCase","includes","intersection","e","console","keyStringFromEvent","charCode","keyCode","which","CHAR_CODES","KEY_CODES","fromCharCode","ctrlKey","altKey","shiftKey","metaKey","uniq","_deregisterHotkey","ret","table","callbackArray","callbackData","deregisterHotkey","_validateHotkey","isArray","TypeError","_registerKey","_registerKeys","registerHotkeyUp","match","eventHotkey","Boolean","CheatSheetController","closeDialog","_cheatSheet","finally","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","45","46","96","97","98","99","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","42","63","sgHotkeys","userData","init","search","excludedUsers","dry","when","results","compareUids","isUndefined","$$shortFormat","$shortFormat","$$image","image","$avatarIcon","$isGroup","$isSpecial","empty","fullname","c_email","no_email","$isAnonymous","$confirmation","some","values","constructor","isEqual","zero","keys","$folders","$$folders","folders","sgAvatarImage","restrict","bindToController","src","transclude","link","controllerAs","attrs","imgElement","mdIconElement","css","img","genericImg","sgAvatarImageController","$element","Preferences","getGravatar","defaults","SOGoAlternateAvatar","urlEmail","hideGenericAvatar","showGenericAvatar","addClass","removeClass","configureZoomableAvatar","toggleZoomFcn","toggleClass","on","off","ready","old","SOGoGravatarEnabled","attributes","directive","sgCheckmarkDirective","$parse","$mdAria","$mdTheming","$mdUtil","compile","tElement","tAttrs","hasAttribute","stopImmediatePropagation","ngModelCtrl","parseConstantExpr","expression","fallback","parseFn","listener","ev","viewValue","$viewValue","trueValue","falseValue","$setViewValue","$render","render","CHECKED_CSS","sgTrueValue","sgFalseValue","fakeNgModel","expectWithText","require","sgColorPicker","iElement","iAttr","ngModelController","sgColor","sgIconColor","sgColorPickerController","sgColors","setColor","currentTarget","parentElement","children","tile","add","sgCompile","$compile","sgCompileLink","ensureCompileRunsOnce","$eval","contents","sgDatepickerReadonlyInput","postLink","datepickerCtrl","getInput","eq","input","prop","sgDraggable","sgDraggableObject","dragStart","count","helper","bindedOnDragDetect","onDragDetect","bindedOnDrag","onDrag","sgDragStart","sgDragCount","$destroy","dragHasStarted","getDistanceFromStart","delta","startPosition","clientX","clientY","sqrt","stopPropagation","one","onDragEnd","counter","$emit","top","pageY","left","pageX","sgDroppable","onEnter","overElement","onLeave","dropAction","droppable","deregisterFolderDragStart","deregisterFolderDragEnd","sgDrop","dragFolder","mode","dragMode","sgEnter","ENTER_KEY","preventDefault","sgEscape","ESCAPE_KEY","elem","sgFocusOn","focus","select","sgFolderStylesheet","sgFolderStylesheetController","transparent","ratio","ngModel","sgPlaceholder","placeholder","sgResetOnDisabled","isDisabled","$invalid","date","sgRippleClick","coordinates","getBoundingClientRect","container","overflow","scrollTop","ripple","offsetTop","offsetLeft","height","width","containerId","sgSearchPreTransclude","tAttr","inputEl","selectEl","buttonEl","removeAttr","compiledButtonEl","formName","inputName","allowDot","doSearch","cancelSearch","priority","sgSearch","append","sgSearchController","searchTextOptions","updateOn","debounce","blur","onChange","form","rawSearchText","$valid","$setValidity","searchField","sgSelectOnly","autoComplete","selectedItem","$applyAsync","sgSubscribe","folderType","onFolderSelect","sgSubscribeDialogController","showDialog","templateUrl","sgSubscribeController","$setTouched","selectFolder","folderData","close","timePaneDirective","TimePaneCtrl","controllers","sgTimePaneCtrl","mdInputContainer","configureNgModel","$$mdDateUtil","$mdConstant","$$rAF","$attrs","$mdDateLocale","dateUtil","KEY_CODE","timePaneElement","SELECTED_TIME_CLASS","FOCUSED_TIME_CLASS","nextUniqueId","displayTime","selectedTime","isInitialized","hours","displayName","selected","min5","min1","ii","show5min","getToggleBtnLbl","is5min","toggleManual5min","manual5min","tabindex","self","hourClickHandler","displayVal","updated","setHours","Number","setNgModelValue","minuteClickHandler","setMinutes","boundKeyHandler","handleKeyEvent","nextTick","changeSelectedTime","previousSelectedTime","prevH","getHours","prevHCell","getElementById","setAttribute","prevM","getMinutes","prevMCell","prevM5Cell","mCell","newH","hCell","newM","changed","ESCAPE","TAB","ENTER","opt_date","today","previousFocus","timePickerDirective","ariaLabelValue","ariaLabel","mdPlaceholder","TimePickerCtrl","mdTimePickerCtrl","parentForm","parseAttributeBoolean","mdNoAsterisk","parentSubmittedWatcher","$submitted","isSubmitted","updateErrorState","dateLocale","documentElement","inputElement","ngInputElement","inputContainer","timePane","timeButton","inputMask","isFocused","setDisabled","disabled","isTimeOpen","timePaneOpenedFrom","timePaneId","nextUid","bodyClickHandler","handleBodyClick","windowEventName","IS_MOBILE_REGEX","navigator","userAgent","vendor","opera","windowEventHandler","closeTimePane","windowBlurHandler","handleWindowBlur","leftMargin","topMargin","$set","installPropertyInterceptors","attachChangeListeners","attachInteractionListeners","detachTimePane","EXTRA_INPUT_SIZE","INVALID_CLASS","OPEN_CLASS","DEFAULT_DEBOUNCE_INTERVAL","TIME_PANE_HEIGHT","MIN5","GTXS","XS","MIN1","TIME_PANE_WIDTH","$formatters","time","formatTime","resizeInputElement","$viewChangeListeners","unshift","debounceInterval","handleInputEvent","keyCodes","DOWN_ARROW","openTimePane","$digest","ngDisabled","$parent","Object","defineProperty","set","clearErrorState","isValidDate","field","inputString","parsedTime","parseTime","isValidInput","attachTimePane","transform","elementRect","bodyRect","paneTop","paneLeft","viewportTop","viewportLeft","scrollLeft","viewportBottom","innerHeight","viewportRight","innerWidth","paneWidth","scale","min","paneHeight","enableScrolling","removeChild","disableScrollAround","evalAttr","removeEventListener","getTimePaneCtrl","focusTime","ctrl","setFocused","isInTime","getClosest","inputFocusedOnWindowBlur","activeElement","sgToggleGrid","flattenedDays","modelDays","sgToggleGridAttr","modelAttr","tiles","day","findIndex","$setDirty","sgTransformOnBlur","mdChipsCtrl","mouseUpActions","onInputBlur","appendFcn","inputHasFocus","chipBuffer","getChipBuffer","validateModel","isModelValid","userInputNgModelCtrl","appendChip","resetChipBuffer","autocompleteCtrl","suffix","pattern","lastIndexOf","_base64_keyStr","base64encode","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","utf8encode","charCodeAt","charAt","L","k","K","G","I","F","H","q","p","u","aa","Z","D","t","Array","B","J","P","h","E","v","Y","X","W","V","C","S","Q","N","M","A","z","w","U","T","R","O","capitalize","slice","asDate","newDate","newString","isValidEmail","emailRE","characters","escapeds","re","RegExp","timeInterval","interval","parseDate","localeProvider","format","string","formattingTokens","tokens","token","regexes","parsedInput","matchesCount","year","getYear","month","getMonth","getDate","hour","minute","%d","%e","%m","%b","shortMonths","toLower","%B","months","%y","nearFuture","getFullYear","%Y","%H","%I","%M","%p","linput","am","pm","NaN","daysUpTo","otherDate","days","day1","day2","tmp","nbrDays","round","setTime","minutesTo","dstOffset","valueOf","getTimezoneOffset","stringWithSeparator","separator","str","addDays","initialDate","milliSeconds","addHours","nbrHours","addMinutes","nbrMinutes","beginOfDay","setSeconds","setMilliseconds","firstWeekOfYearForDate","firstWeekRule","dayOfWeek","januaryFirst","firstWeek","firstWeekOfYear","setMonth","setDate","getDay","firstDayOfWeek","beginOfWeek","getWeek","previousWeek","weekNumber","offset","endOfWeek","getDayString","getHourString","separators","max","validParts","%a","shortDays","%A","%U","shift"],"mappings":"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","file":"Common.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\nString.prototype.endsWith = function(suffix) {\n return this.indexOf(suffix, this.length - suffix.length) !== -1;\n};\n\nString.prototype.startsWith = function(pattern, position) {\n position = angular.isNumber(position) ? position : 0;\n return this.lastIndexOf(pattern, position) === position;\n};\n\nString.prototype._base64_keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nString.prototype.base64encode = function () {\n var output = \"\";\n var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n var i = 0;\n \n var input = this.utf8encode();\n\n while (i < input.length) {\n chr1 = input.charCodeAt(i++);\n chr2 = input.charCodeAt(i++);\n chr3 = input.charCodeAt(i++);\n \n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n \n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n \n output = output +\n this._base64_keyStr.charAt(enc1) + this._base64_keyStr.charAt(enc2) +\n this._base64_keyStr.charAt(enc3) + this._base64_keyStr.charAt(enc4);\n }\n \n return output;\n};\n\nString.prototype.base64decode = function() { \n var output = \"\";\n var chr1, chr2, chr3;\n var enc1, enc2, enc3, enc4;\n var i = 0;\n \n var input = \"\" + this; // .replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\")\n while (i < input.length) {\n enc1 = this._base64_keyStr.indexOf(input.charAt(i++));\n enc2 = this._base64_keyStr.indexOf(input.charAt(i++));\n enc3 = this._base64_keyStr.indexOf(input.charAt(i++));\n enc4 = this._base64_keyStr.indexOf(input.charAt(i++));\n\n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n \n output = output + String.fromCharCode(chr1);\n \n if (enc3 != 64) {\n output = output + String.fromCharCode(chr2);\n }\n if (enc4 != 64) {\n output = output + String.fromCharCode(chr3);\n }\n }\n\n return output;\n};\n\nString.prototype.md5 = function() {\n if (!this.length) { return; }\n // MD5 (Message-Digest Algorithm) by WebToolkit\n var md5 = function(s){function L(k,d){return(k<>>(32-d));}function K(G,k){var I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H);}if(I|d){if(x&1073741824){return(x^3221225472^F^H);}else{return(x^1073741824^F^H);}}else{return(x^F^H);}}function r(d,F,k){return(d&F)|((~d)&k);}function q(d,F,k){return(d&k)|(F&(~k));}function p(d,F,k){return(d^F^k);}function n(d,F,k){return(F^(d|(~k)));}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F);}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F);}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F);}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F);}function e(G){var Z;var F=G.length;var x=F+8;var k=(x-(x%64))/64;var I=(k+1)*16;var aa=Array(I-1);var d=0;var H=0;while(H>>29;return aa;}function B(x){var k=\"\",F=\"\",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F=\"0\"+G.toString(16);k=k+F.substr(F.length-2,2);}return k;}function J(k){k=k.replace(/rn/g,\"n\");var d=\"\";for(var F=0;F127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128);}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128);}}}return d;}var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P= 0)\n date.month = i;\n return (i >= 0);\n }],\n '%B': [/[^\\d\\s\\.\\/\\-]{2,}/, function(input) {\n var i = _.indexOf(_.map(localeProvider.months, _.toLower), _.toLower(input));\n if (i >= 0)\n date.month = i;\n return (i >= 0);\n }],\n '%y': [/\\d\\d/, function(input) {\n var nearFuture = parseInt(now.getFullYear().toString().substring(2)) + 5;\n date.year = parseInt(input);\n if (date.year < nearFuture) date.year += 2000;\n else date.year += 1900;\n return true;\n }],\n '%Y': [/[12]\\d\\d\\d/, function(input) {\n date.year = parseInt(input);\n return true;\n }],\n '%H': [/\\d{1,2}/, function(input) {\n date.hour = parseInt(input);\n return (date.hour < 24);\n }],\n '%I': [/\\d{1,2}/, function(input) {\n date.hour = parseInt(input);\n return (date.hour <= 12);\n }],\n '%M': [/[0-5]\\d/, function(input) {\n date.minute = parseInt(input);\n return (date.minute < 60 );\n }],\n '%p': [/[^\\d\\s\\/\\-]+/, function(input) {\n var linput = _.toLower(input), am = _.toLower(l('AM')), pm = _.toLower(l('PM'));\n if (linput == pm)\n date.hour += 12;\n return (linput == am || linput == pm);\n }],\n };\n tokens = format.match(formattingTokens) || [];\n matchesCount = 0;\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(regexes[token][0]) || [])[0];\n if (parsedInput) {\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n if (regexes[token][1](parsedInput))\n matchesCount++;\n }\n }\n\n if (tokens.length === matchesCount) {\n // console.debug(this + ' + ' + format + ' = ' + JSON.stringify(date));\n return new Date(date.year, date.month, date.day, date.hour, date.minute);\n }\n else\n return new Date(NaN);\n};\n\nDate.prototype.daysUpTo = function(otherDate) {\n var days = [];\n\n var day1 = this.getTime();\n var day2 = otherDate.getTime();\n if (day1 > day2) {\n var tmp = day1;\n day1 = day2;\n day2 = tmp;\n }\n\n var nbrDays = Math.round((day2 - day1) / 86400000) + 1;\n for (var i = 0; i < nbrDays; i++) {\n var newDate = new Date();\n newDate.setTime(day1 + (i * 86400000));\n days.push(newDate);\n }\n\n return days;\n};\n\nDate.prototype.minutesTo = function(otherDate) {\n var delta, dstOffset;\n\n delta = Math.floor(otherDate.valueOf() - this.valueOf())/1000/60;\n dstOffset = otherDate.getTimezoneOffset() - this.getTimezoneOffset();\n\n return delta - dstOffset;\n};\n\nDate.prototype.stringWithSeparator = function(separator) {\n var month = '' + (this.getMonth() + 1);\n var day = '' + this.getDate();\n var year = this.getYear();\n if (year < 1000)\n year = '' + (year + 1900);\n if (month.length == 1)\n month = '0' + month;\n if (day.length == 1)\n day = '0' + day;\n\n if (separator == '-')\n str = year + '-' + month + '-' + day;\n else\n str = day + '/' + month + '/' + year;\n\n return str;\n};\n\nDate.prototype.addDays = function(nbrDays) {\n var initialDate, milliSeconds, dstOffset;\n\n milliSeconds = this.getTime();\n initialDate = new Date(milliSeconds);\n milliSeconds += 86400000 * nbrDays;\n this.setTime(milliSeconds);\n\n dstOffset = this.getTimezoneOffset() - initialDate.getTimezoneOffset();\n if (dstOffset !== 0) {\n milliSeconds = this.getTime() + dstOffset*60*1000;\n this.setTime(milliSeconds);\n }\n\n return this;\n};\n\nDate.prototype.addHours = function(nbrHours) {\n var milliSeconds = this.getTime();\n milliSeconds += 3600000 * nbrHours;\n this.setTime(milliSeconds);\n};\n\nDate.prototype.addMinutes = function(nbrMinutes) {\n var milliSeconds = this.getTime();\n milliSeconds += 60000 * nbrMinutes;\n this.setTime(milliSeconds);\n};\n\nDate.prototype.beginOfDay = function() {\n var beginOfDay = new Date(this.getTime());\n beginOfDay.setHours(0);\n beginOfDay.setMinutes(0);\n beginOfDay.setSeconds(0);\n beginOfDay.setMilliseconds(0);\n\n return beginOfDay;\n};\n\n/**\n * See [SOGoUser firstWeekOfYearForDate:]\n */\nDate.prototype.firstWeekOfYearForDate = function(localeProvider) {\n var firstWeekRule, dayOfWeek, januaryFirst, firstWeek;\n\n firstWeekRule = localeProvider.firstWeekOfYear;\n\n januaryFirst = new Date(this.getTime());\n januaryFirst.setMonth(0);\n januaryFirst.setDate(1);\n dayOfWeek = januaryFirst.getDay();\n\n if (firstWeekRule == 'First4DayWeek') {\n if ((dayOfWeek + localeProvider.firstDayOfWeek) % 7 < 4)\n firstWeek = januaryFirst.beginOfWeek(localeProvider.firstDayOfWeek);\n else\n firstWeek = januaryFirst.addDays(7).beginOfWeek(localeProvider.firstDayOfWeek);\n }\n else if (firstWeekRule == 'FirstFullWeek') {\n if (dayOfWeek === 0)\n firstWeek = januaryFirst.beginOfWeek(localeProvider.firstDayOfWeek);\n else\n firstWeek = januaryFirst.addDays(7).beginOfWeek(localeProvider.firstDayOfWeek);\n }\n else {\n firstWeek = januaryFirst.beginOfWeek(localeProvider.firstDayOfWeek);\n }\n\n return firstWeek;\n};\n\n/**\n * See [SOGoUser weekNumberForDate:]\n */\nDate.prototype.getWeek = function(localeProvider) {\n var firstWeek, previousWeek, weekNumber, clone;\n\n clone = new Date(this.getTime());\n clone.addDays(6);\n firstWeek = clone.firstWeekOfYearForDate(localeProvider);\n if (firstWeek.getTime() < clone.getTime()) {\n weekNumber = 1 + Math.floor((clone.getTime() - firstWeek.getTime()) / (86400000 * 7));\n }\n else\n {\n // Date is within the last week of the previous year;\n // Compute the previous week number to find the week number of the requested date.\n // The number will either be 52 or 53.\n previousWeek = new Date(clone.getTime());\n previousWeek.addDays(-7);\n firstWeek = previousWeek.firstWeekOfYearForDate(localeProvider);\n weekNumber = 2 + Math.floor((previousWeek.getTime() - firstWeek.getTime()) / (86400000 * 7));\n }\n\n return weekNumber;\n};\n\nDate.prototype.beginOfWeek = function(firstDayOfWeek) {\n var offset = firstDayOfWeek - this.getDay();\n if (offset > 0)\n offset -= 7;\n\n var beginOfWeek = this.beginOfDay();\n beginOfWeek.setHours(12);\n beginOfWeek.addDays(offset);\n\n return beginOfWeek;\n};\n\nDate.prototype.endOfWeek = function(firstDayOfWeek) {\n var endOfWeek = this.beginOfWeek(firstDayOfWeek);\n endOfWeek.addDays(6);\n\n endOfWeek.setHours(23);\n endOfWeek.setMinutes(59);\n endOfWeek.setSeconds(59);\n endOfWeek.setMilliseconds(999);\n\n return endOfWeek;\n};\n\n// YYYYMMDD\nDate.prototype.getDayString = function() {\n var newString = this.getYear();\n if (newString < 1000) newString += 1900;\n var month = '' + (this.getMonth() + 1);\n if (month.length == 1)\n month = '0' + month;\n newString += month;\n var day = '' + this.getDate();\n if (day.length == 1)\n day = '0' + day;\n newString += day;\n\n return newString;\n};\n\n// MMHH\nDate.prototype.getHourString = function() {\n var newString = this.getHours() + '00';\n if (newString.length == 3)\n newString = '0' + newString;\n\n return newString;\n};\n\nDate.prototype.format = function(localeProvider, format) {\n var separators, parts, i, max,\n date = [],\n validParts = /%[deaAmbByYUHIMp]/g,\n val = {\n '%d': this.getDate(), // day of month (e.g., 01)\n '%e': this.getDate(), // day of month, space padded\n '%a': localeProvider.shortDays[this.getDay()], // locale's abbreviated weekday name (e.g., Sun)\n '%A': localeProvider.days[this.getDay()], // locale's full weekday name (e.g., Sunday)\n '%m': this.getMonth() + 1, // month (01..12)\n '%b': localeProvider.shortMonths[this.getMonth()], // locale's abbreviated month name (e.g., Jan)\n '%B': localeProvider.months[this.getMonth()], // locale's full month name (e.g., January)\n '%y': this.getFullYear().toString().substring(2), // last two digits of year (00..99)\n '%Y': this.getFullYear(), // year\n '%U': this.getWeek(localeProvider), // week of the year\n '%H': this.getHours(), // hour (00..23)\n '%M': this.getMinutes() }; // minute (00..59)\n val['%I'] = val['%H'] > 12 ? val['%H'] % 12 : val['%H']; // hour (01..12)\n val['%p'] = val['%H'] < 12 ? l('AM') : l('PM'); // locale's equivalent of either AM or PM\n\n val['%d'] = (val['%d'] < 10 ? '0' : '') + val['%d'];\n val['%e'] = (val['%e'] < 10 ? ' ' : '') + val['%e'];\n val['%m'] = (val['%m'] < 10 ? '0' : '') + val['%m'];\n val['%H'] = (val['%H'] < 10 ? '0' : '') + val['%H'];\n val['%I'] = (val['%I'] < 10 ? '0' : '') + val['%I'];\n val['%M'] = (val['%M'] < 10 ? '0' : '') + val['%M'];\n\n separators = format.replace(validParts, '\\0').split('\\0');\n parts = format.match(validParts);\n for (i = 0, max = parts.length; i <= max; i++){\n if (separators.length)\n date.push(separators.shift());\n date.push(val[parts[i]]);\n }\n\n return date.join('');\n};\n\n/* Functions */\n\nfunction l() {\n var key = arguments[0], value = key, args = arguments, i, j;\n\n // Retrieve translation\n if (labels[key]) {\n value = labels[key];\n }\n else if (clabels[key]) {\n value = clabels[key];\n }\n\n // Format placeholders %{0}, %{1], %{2}, ...\n for (i = 1, j = 0; i < args.length; i++, j++) {\n value = value.replace('%{' + j + '}', args[i]);\n }\n\n // Format placeholders %d and %s\n i = 1;\n if (args.length > 1) {\n value = value.replace(/%((%)|s|d)/g, function(m) {\n // m is the matched format, e.g. %s, %d\n var val = null;\n if (m[2]) {\n val = m[2];\n }\n else {\n val = args[i];\n // A switch statement so that the formatter can be extended. Default is %s\n switch (m) {\n case '%d':\n val = parseFloat(val);\n if (isNaN(val))\n val = 0;\n break;\n }\n i++;\n }\n return val;\n });\n }\n\n return value;\n}\n\nfunction hexToRgb(hex) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n\n// Respect contrast ratio recommendation from W3C:\n// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\nfunction contrast(hex) {\n var color, c, l = 1;\n\n color = hexToRgb(hex);\n if (color) {\n c = [color.r / 255, color.g / 255, color.b / 255];\n\n for (var i = 0; i < c.length; ++i) {\n if (c[i] <= 0.03928) {\n\tc[i] = c[i] / 12.92;\n }\n else {\n\tc[i] = Math.pow((c[i] + 0.055) / 1.055, 2.4);\n }\n }\n\n l = 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n }\n\n if (l > 0.179) {\n return 'black';\n }\n else {\n return 'white';\n }\n}\n\nfunction guid() {\n function S4() {\n return (((1+Math.random())*0x10000)|0).toString(16).substring(1); \n }\n \n return (S4() + S4() + \"-\" + S4() + \"-4\" + S4().substr(0,3) + \"-\" + S4() + \"-\" + S4() + S4() + S4()).toLowerCase();\n}\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.Common', ['ngAnimate', 'ngMessages', 'ngSanitize', 'ngMaterial', 'mdColors'])\n .value('sgSettings', {\n isPopup: document.body.classList.contains('popup'),\n baseURL: function() {\n return ApplicationBaseURL || null;\n },\n resourcesURL: function() {\n return ResourcesURL || null;\n },\n activeUser: function(param) {\n var settings = {\n login: UserLogin || null,\n identification: UserIdentification || null,\n email: UserEmail || null,\n language: UserLanguage || null,\n folderURL: UserFolderURL || null,\n isSuperUser: IsSuperUser || null,\n path: {\n calendar: UserCalendarPath || null,\n contacts: UserContactsPath || null,\n mail: UserMailPath || null,\n preferences: UserPreferencesPath || null,\n administration: (IsSuperUser ? UserAdministrationPath : null),\n help: HelpURL || null,\n logoff: UserLogoffPath || null\n }\n };\n if (param)\n return settings[param];\n else\n return settings;\n },\n minimumSearchLength: function() {\n return angular.isNumber(minimumSearchLength)? minimumSearchLength : 2;\n }\n })\n\n .constant('sgColors', {\n selection: [\n '#FFFFFF',\n '#330033',\n '#C0C0C0',\n '#999999',\n '#666666',\n '#333333',\n '#000000',\n '#FFCCCC',\n '#FF6666',\n '#FF0000',\n '#CC0000',\n '#990000',\n '#660000',\n '#330000',\n '#FFCC99',\n '#FF9966',\n '#FF9900',\n '#FF6600',\n '#CC6600',\n '#993300',\n '#663300',\n '#FFFF99',\n '#FFFF66',\n '#FFCC66',\n '#FFCC33',\n '#CC9933',\n '#996633',\n '#663333',\n '#FFFFCC',\n '#FFFF33',\n '#FFFF00',\n '#FFCC00',\n '#999900',\n '#666600',\n '#333300',\n '#CCCCCC',\n '#66FF99',\n '#33FF33',\n '#33CC00',\n '#009900',\n '#006600',\n '#003300',\n '#99FFFF',\n '#33FFFF',\n '#66CCCC',\n '#00CCCC',\n '#339999',\n '#336666',\n '#003333',\n '#CCFFFF',\n '#66FFFF',\n '#33CCFF',\n '#3366FF',\n '#3333FF',\n '#000099',\n '#000066',\n '#CCCCFF',\n '#9999FF',\n '#6666CC',\n '#6633FF',\n '#6600CC',\n '#333399',\n '#330099',\n '#FFCCFF',\n '#FF99FF',\n '#CC66CC',\n '#CC33CC',\n '#993399',\n '#663366',\n '#99FF99'\n ]\n })\n\n // md break-points values are hard-coded in angular-material/src/core/util/constant.js\n // $mdMedia has a built-in support for those values but can also evaluate others.\n // The following breakpoints match our CSS breakpoints in scss/core/variables.scss\n .constant('sgConstant', {\n 'xs' : '(max-width: 599px)' ,\n 'gt-xs' : '(min-width: 600px)' ,\n 'sm' : '(min-width: 600px) and (max-width: 959px)' ,\n 'gt-sm' : '(min-width: 960px)' ,\n 'md' : '(min-width: 960px) and (max-width: 1023px)' ,\n 'gt-md' : '(min-width: 1024px)' ,\n 'lg' : '(min-width: 1024px) and (max-width: 1279px)',\n 'gt-lg' : '(min-width: 1280px)' ,\n 'xl' : '(min-width: 1920px)' ,\n 'print' : 'print'\n })\n\n .config(configure)\n\n .factory('AuthInterceptor', AuthInterceptor)\n .factory('ErrorInterceptor', ErrorInterceptor);\n\n /**\n * @ngInject\n */\n configure.$inject = ['$logProvider', '$compileProvider', '$httpProvider', '$mdThemingProvider', '$mdAriaProvider'];\n function configure($logProvider, $compileProvider, $httpProvider, $mdThemingProvider, $mdAriaProvider) {\n // Accent palette\n $mdThemingProvider.definePalette('sogo-green', {\n '50': 'eaf5e9',\n '100': 'cbe5c8',\n '200': 'aad6a5',\n '300': '88c781',\n '400': '66b86a',\n '500': '56b04c',\n '600': '4da143',\n '700': '388e3c',\n '800': '367d2e',\n '900': '225e1b',\n // 'A100': 'b9f6ca',\n 'A100': 'fafafa', // assigned to md-hue-1, equivalent to grey-50 (default background palette)\n 'A200': '69f0ae',\n 'A400': '00e676',\n 'A700': '00c853',\n 'contrastDefaultColor': 'dark',\n // 'contrastDarkColors': ['50', '100', '200', 'A100'],\n 'contrastLightColors': ['300', '400', '500', '600', '700', '800', '900']\n });\n // Primary palette\n $mdThemingProvider.definePalette('sogo-blue', {\n '50': 'f0faf9',\n '100': 'e1f5f3',\n '200': 'ceebe8',\n '300': 'bfe0dd',\n '400': 'b2d6d3',\n '500': 'a1ccc8',\n '600': '8ebfbb',\n '700': '7db3b0',\n '800': '639997',\n '900': '4d8080',\n 'A100': 'd4f7fa',\n 'A200': 'c3f5fa',\n 'A400': '53e3f0',\n 'A700': '00b0c0',\n 'contrastDefaultColor': 'light',\n 'contrastDarkColors': ['50', '100', '200'],\n // 'contrastLightColors': ['300', '400', '500', '600', '700', '800', '900', 'A100', 'A200', 'A400', 'A700']\n });\n // Background palette\n $mdThemingProvider.definePalette('sogo-paper', {\n '50': 'fcf7f8',\n '100': 'f7f1dc',\n '200': 'ede5ca',\n '300': 'e6d8ba',\n '400': 'e2d2a3',\n '500': 'd6c48d',\n '600': 'baa870',\n '700': '857545',\n '800': '524517',\n '900': '433809',\n '1000': '000000',\n 'A100': 'ffffff',\n 'A200': 'eeeeee',\n 'A400': 'bdbdbd',\n 'A700': '616161',\n 'contrastDefaultColor': 'dark',\n 'contrastLightColors': ['800', '900']\n });\n // Default theme definition\n $mdThemingProvider.theme('default')\n .primaryPalette('sogo-blue', {\n 'default': '900',\n 'hue-1': '400',\n 'hue-2': '800',\n 'hue-3': 'A700'\n })\n .accentPalette('sogo-green', {\n 'default': '500',\n // 'hue-1': '200',\n 'hue-1': 'A100', // grey-50\n 'hue-2': '300',\n 'hue-3': 'A700'\n });\n\n if (!DebugEnabled) {\n // Disable debugging information\n $logProvider.debugEnabled(false);\n $compileProvider.debugInfoEnabled(false);\n // Disable warnings\n $mdAriaProvider.disableWarnings();\n // Disable theme generation but keep definition in config (required by mdColors)\n $mdThemingProvider.generateThemesOnDemand(true);\n // Disable theming completely\n //$mdThemingProvider.disableTheming();\n }\n\n $httpProvider.interceptors.push('AuthInterceptor');\n $httpProvider.interceptors.push('ErrorInterceptor');\n }\n\n /**\n * @ngInject\n */\n AuthInterceptor.$inject = ['$window', '$q'];\n function AuthInterceptor($window, $q) {\n return {\n response: function(response) {\n // When expecting JSON but receiving HTML, assume session has expired and reload page\n if (response && /^application\\/json/.test(response.config.headers.Accept) &&\n /^/.test(response.data)) {\n $window.location.reload(true);\n return $q.reject();\n }\n return response;\n }\n };\n }\n\n /**\n * @ngInject\n */\n ErrorInterceptor.$inject = ['$rootScope', '$q'];\n function ErrorInterceptor($rootScope, $q) {\n return {\n responseError: function(rejection) {\n if (/^application\\/json/.test(rejection.config.headers.Accept)) {\n // Broadcast the response error\n $rootScope.$broadcast('http:Error', rejection);\n }\n return $q.reject(rejection);\n }\n };\n }\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/*\n * https://github.com/angular/material/issues/1269\n * https://gist.github.com/senthilprabhut/dd2147ebabc89bf223e7\n */\n\n(function() {\n 'use strict';\n\n var _$mdThemingProvider;\n\n angular\n .module('mdColors', ['ngMaterial'])\n .config(configure)\n .run(runBlock);\n\n /**\n * @ngInject\n */\n configure.$inject = ['$mdThemingProvider'];\n function configure($mdThemingProvider) {\n _$mdThemingProvider = $mdThemingProvider;\n }\n \n /**\n * @ngInject\n */\n runBlock.$inject = ['$interpolate', '$document', '$log'];\n function runBlock($interpolate, $document, $log) {\n\n function buildCssSelectors(selectors) {\n var result = selectors.join('');\n return result;\n }\n\n var fgDefault = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-fg']) + ' { color:{{value}};}'),\n bgDefault = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-bg']) + ' { background-color:{{value}};}'),\n bdrDefault = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-bdr']) + ' { border-color:{{value}};}'),\n fgDefaultHue = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{hue}}','.md-fg']) + ' { color:{{value}};}'),\n bgDefaultHue = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{hue}}','.md-bg']) + ' { background-color:{{value}};}'),\n fgColor = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{palette}}','.md-fg']) + ' { color:{{value}};}'),\n bgColor = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{palette}}','.md-bg']) + ' { background-color:{{value}}; color:{{contrast}} !important; }'),\n bdrColor = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{palette}}','.md-bdr']) + ' { border-color:{{value}};}'),\n fgHue = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{palette}}.md-{{hue}}','.md-fg']) + ' { color:{{value}};}'),\n bgHue = $interpolate(buildCssSelectors(['.md-{{theme}}-theme','.md-{{palette}}.md-{{hue}}','.md-bg']) + ' { background-color:{{value}};}'),\n customSheet = getStyleSheet(),\n index = 0;\n\n // Clear out old rules from stylesheet\n while (customSheet.cssRules.length > 0 ) {\n customSheet.deleteRule(0);\n }\n angular.forEach(_$mdThemingProvider._THEMES, function(theme, themeName){\n // Add default selectors - primary is the default palette\n addRule(fgDefault, bgDefault, themeName, 'primary',\n _$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues.default]);\n addRule(fgDefaultHue, bgDefaultHue, themeName, 'primary',\n _$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues['hue-2'] ], 'hue-2');\n addRule(fgDefaultHue, bgDefaultHue, themeName, 'primary',\n _$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues['hue-3'] ], 'hue-3');\n addRule(fgDefaultHue, bgDefaultHue, themeName, 'primary',\n _$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues['hue-1'] ], 'hue-1');\n addBorderRule(bdrDefault, themeName, 'primary',\n _$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues.default]);\n\n // Add selectors for palettes - accent, background, primary and warn\n angular.forEach(theme.colors, function(color, paletteName){\n addRule(fgColor, bgColor, themeName, paletteName, _$mdThemingProvider._PALETTES[color.name][color.hues.default]);\n addBorderRule(bdrColor, themeName, paletteName, _$mdThemingProvider._PALETTES[color.name][color.hues.default]);\n addRule(fgHue, bgHue, themeName, paletteName, _$mdThemingProvider._PALETTES[color.name][color.hues['hue-2'] ], 'hue-2');\n addRule(fgHue, bgHue, themeName, paletteName, _$mdThemingProvider._PALETTES[color.name][color.hues['hue-3'] ], 'hue-3');\n addRule(fgHue, bgHue, themeName, paletteName, _$mdThemingProvider._PALETTES[color.name][color.hues['hue-1'] ], 'hue-1');\n });\n\n //$log.debug(_.map(customSheet.cssRules, 'cssText').join(\"\\n\"));\n });\n\n function addRule(fgInterpolate, bgInterpolate, themeName, paletteName, colorArray, hueName){\n // Set up interpolation functions to build css rules.\n if (!colorArray) return;\n var colorValue = 'rgb(' + colorArray.value[0] + ',' + colorArray.value[1] + ',' + colorArray.value[2] + ')',\n colorContrast = 'rgb(' + colorArray.contrast[0] + ',' + colorArray.contrast[1] + ',' + colorArray.contrast[2] + ')',\n context = {\n theme: themeName,\n palette: paletteName,\n value: colorValue,\n contrast: colorContrast,\n hue: hueName\n };\n\n // Insert foreground color rule\n customSheet.insertRule(fgInterpolate(context), index);\n index += 1;\n\n // Insert background color rule\n customSheet.insertRule(bgInterpolate(context), index);\n index += 1;\n }\n\n function addBorderRule(bdrInterpolate, themeName, paletteName, colorArray, hueName){\n // Set up interpolation functions to build css rule for border color.\n if (!colorArray) return;\n var colorValue = 'rgb(' + colorArray.value[0] + ',' + colorArray.value[1] + ',' + colorArray.value[2] + ')';\n\n customSheet.insertRule(bdrInterpolate({\n theme: themeName,\n palette: paletteName,\n value: colorValue,\n hue: hueName\n }), index);\n index += 1;\n }\n\n function getStyleSheet() {\n // function to add a dynamic style-sheet to the document\n var style = $document[0].head.querySelector('style[title=\"Dynamic-Generated-by-mdColors\"]');\n if (style === null) {\n style = $document[0].createElement('style');\n style.title = 'Dynamic-Generated-by-mdColors';\n // WebKit hack... (not sure if still needed)\n style.appendChild($document[0].createTextNode(''));\n $document[0].head.appendChild(style);\n }\n return style.sheet;\n }\n }\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * @type {angular.Module}\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n decodeUri.$inject = ['$window'];\n function decodeUri($window) {\n return $window.decodeURIComponent;\n }\n\n angular.module('SOGo.Common')\n .filter('decodeUri', decodeUri);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * @type {angular.Module}\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n encodeUri.$inject = ['$window'];\n function encodeUri($window) {\n return $window.encodeURIComponent;\n }\n\n angular.module('SOGo.Common')\n .filter('encodeUri', encodeUri);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function () {\n 'use strict';\n\n /**\n * ensureTarget - A filter to set a blank target to all links.\n * @memberof SOGo.Common\n * @ngInject\n * @example:\n\n
\n */\n ensureTarget.$inject = ['$sce'];\n function ensureTarget($sce) {\n return function(element) {\n var tree = angular.element('
' + element + '
');\n tree.find('a').attr('target', '_blank');\n return $sce.trustAs('html', tree.html());\n };\n }\n\n angular.module('SOGo.Common')\n .filter('ensureTarget', ensureTarget);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * ln2br - A filter to convert line feeds and carriage returns to html line breaks\n * @memberof SOGo.Common\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n function ln2br() {\n return function(text) {\n return text ? String(text).replace(/\\r?\\n/gm, '
') : undefined;\n };\n }\n\n angular.module('SOGo.Common')\n .filter('ln2br', ln2br);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * loc - A simple filter to return the localized version of a string.\n * @memberof SOGo.Common\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n function loc() {\n return l;\n }\n\n angular.module('SOGo.Common')\n .filter('loc', loc);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * range - A simple filter that will return an array of the size of its argument.\n * @memberof SOGo.Common\n */\n(function () {\n 'use strict';\n\n function range() {\n return function(n) {\n var res = [];\n for (var i = 0; i < parseInt(n); i++) {\n res.push(i);\n }\n return res;\n };\n }\n\n angular.module('SOGo.Common')\n .filter('range', range);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n AclController.$inject = ['$timeout', '$mdDialog', 'Dialog', 'usersWithACL', 'User', 'folder'];\n function AclController($timeout, $mdDialog, Dialog, usersWithACL, User, folder) {\n var vm = this;\n\n vm.users = usersWithACL; // ACL users\n vm.folder = folder;\n vm.selectedUser = null;\n vm.selectedUid = null;\n vm.userToAdd = '';\n vm.searchText = '';\n vm.userFilter = userFilter;\n vm.closeModal = closeModal;\n vm.saveModal = saveModal;\n vm.confirmChange = confirmChange;\n vm.removeUser = removeUser;\n vm.addUser = addUser;\n vm.selectAllRights = selectAllRights;\n vm.selectUser = selectUser;\n vm.confirmation = { showing: false,\n message: ''};\n\n function userFilter($query) {\n return User.$filter($query, folder.$acl.users);\n }\n\n function closeModal() {\n folder.$acl.$resetUsersRights(); // cancel changes\n $mdDialog.hide();\n }\n\n function saveModal() {\n folder.$acl.$saveUsersRights().then(function() {\n $mdDialog.hide();\n }, function(data, status) {\n Dialog.alert(l('Warning'), l('An error occured please try again.'));\n });\n }\n\n function confirmChange(user) {\n var confirmation = user.$confirmRights(vm.folder);\n if (confirmation) {\n vm.confirmation.showing = true;\n vm.confirmation.message = confirmation;\n }\n }\n\n function removeUser(user) {\n $timeout(function() {\n folder.$acl.$removeUser(user.uid);\n }, 500); // wait for CSS transition to complete (see card.scss)\n }\n\n function addUser(data) {\n if (data) {\n folder.$acl.$addUser(data).then(function(user) {\n vm.userToAdd = '';\n vm.searchText = '';\n vm.selectedUid = null;\n if (user)\n selectUser(user);\n });\n }\n }\n\n function selectAllRights(user) {\n folder.$acl.$selectAllRights(user);\n }\n\n function selectUser(user, $event) {\n if ($event && $event.target.parentNode.classList.contains('md-secondary'))\n return false;\n if (vm.selectedUid == user.uid) {\n vm.selectedUid = null;\n }\n else {\n vm.selectedUid = user.uid;\n vm.selectedUser = user;\n vm.selectedUser.$rights();\n }\n }\n }\n\n angular\n .module('SOGo.Common')\n .controller('AclController', AclController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n/**\n * @type {angular.Module}\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n navController.$inject = ['$rootScope', '$scope', '$timeout', '$interval', '$http', '$window', '$mdSidenav', '$mdToast', '$mdMedia', '$log', 'sgConstant', 'sgSettings', 'Resource', 'Alarm'];\n function navController($rootScope, $scope, $timeout, $interval, $http, $window, $mdSidenav, $mdToast, $mdMedia, $log, sgConstant, sgSettings, Resource, Alarm) {\n var resource = new Resource(sgSettings.baseURL(), sgSettings.activeUser());\n\n $scope.isPopup = sgSettings.isPopup;\n $scope.activeUser = sgSettings.activeUser();\n $scope.baseURL = sgSettings.baseURL();\n $scope.leftIsClose = !$mdMedia(sgConstant['gt-md']);\n $scope.centerIsClose = !!$window.centerIsClose;\n\n // Show current day in top bar\n $scope.currentDay = window.currentDay;\n $timeout(function() {\n // Update date when day ends\n $interval(function() {\n $http.get('../date').then(function(data) {\n $scope.currentDay = data;\n });\n }, 24 * 3600 * 1000);\n }, window.currentDay.secondsBeforeTomorrow * 1000);\n\n $scope.toggleLeft = function() {\n if ($scope.isGtMedium) {\n // Left sidenav is toggled while sidenav is locked open; bypass $mdSidenav\n $scope.leftIsClose = !$scope.leftIsClose;\n }\n else {\n $scope.leftIsClose = leftIsClose();\n // Fire a window resize when opening the sidenav on a small device.\n // This is a fix until the following issue is officially resolved:\n // https://github.com/angular/material/issues/7309\n if ($scope.leftIsClose)\n angular.element($window).triggerHandler('resize');\n $mdSidenav('left').toggle()\n .then(function () {\n $log.debug(\"toggle left is done\");\n });\n }\n };\n $scope.toggleRight = function() {\n $mdSidenav('right').toggle()\n .then(function () {\n $log.debug(\"toggle right is done\");\n });\n };\n $scope.toggleCenter = function(options) {\n $scope.centerIsClose = !$scope.centerIsClose;\n if (options && options.save)\n resource.post(null, 'saveListState', { state: $scope.centerIsClose? 'collapse' : 'rise' });\n };\n // $scope.openBottomSheet = function() {\n // $mdBottomSheet.show({\n // parent: angular.element(document.getElementById('left-sidenav')),\n // templateUrl: 'bottomSheetTemplate.html'\n // });\n // };\n // $scope.toggleDetailView = function() {\n // var detail = angular.element(document.getElementById('detailView'));\n // detail.toggleClass('sg-close');\n // };\n $scope.$watch(function() {\n return $mdMedia(sgConstant['gt-md']);\n }, function(newVal) {\n $scope.isGtMedium = newVal;\n if (newVal) {\n $scope.leftIsClose = false;\n }\n });\n\n function leftIsClose() {\n return !$mdSidenav('left').isOpen();\n }\n\n function onHttpError(event, response) {\n var message;\n if (response.data && response.data.message && angular.isString(response.data.message))\n message = response.data.message;\n else if (response.status)\n message = response.statusText;\n\n if (message)\n $mdToast.show({\n template: [\n '',\n '
',\n ' error_outline',\n ' ' + l(message) + '',\n '
',\n '
'\n ].join(''),\n hideDelay: 5000,\n position: 'top right'\n });\n else\n $log.debug('untrap error');\n }\n\n // Listen to HTTP errors broadcasted from HTTP interceptor\n $rootScope.$on('http:Error', onHttpError);\n\n Alarm.getAlarms();\n }\n\n angular.module('SOGo.Common')\n .controller('navController', navController);\n})();\n","(function() {\n 'use strict';\n\n /**\n * @name Acl\n * @constructor\n * @param {String} folderId - the folder ID associated to the ACLs\n */\n function Acl(folderId) {\n this.folderId = folderId;\n }\n\n /**\n * @memberof Acl\n * @desc The factory we'll use to register with Angular.\n * @return the Acl constructor\n */\n Acl.factory = ['$q', '$timeout', 'sgSettings', 'Resource', 'User', function($q, $timeout, Settings, Resource, User) {\n angular.extend(Acl, {\n $q: $q,\n $timeout: $timeout,\n $$resource: new Resource(Settings.activeUser('folderURL'), Settings.activeUser()),\n $User: User\n });\n\n return Acl;\n }];\n\n /**\n * @module SOGo.Common\n * @desc Factory registration of User in Angular module.\n */\n angular.module('SOGo.Common').factory('Acl', Acl.factory);\n\n /**\n * @function $users\n * @memberof Acl.prototype\n * @param {Object} owner - the owner to use when fetching the ACL as it might not be the Settings.activeUser\n * @desc Fetch the list of users that have specific rights for the current folder.\n * @return a promise of an array of User objects\n */\n Acl.prototype.$users = function(owner) {\n var _this = this,\n deferred = Acl.$q.defer(),\n user;\n if (this.users) {\n deferred.resolve(this.users);\n }\n else {\n var acls;\n if (angular.isDefined(owner))\n acls = Acl.$$resource.userResource(owner).fetch(this.folderId, 'acls');\n else\n acls = Acl.$$resource.fetch(this.folderId, 'acls');\n\n return acls.then(function(response) {\n _this.users = [];\n //console.debug(JSON.stringify(users, undefined, 2));\n angular.forEach(response.users, function(data) {\n user = new Acl.$User(data);\n user.canSubscribeUser = user.isSubscribed;\n user.wasSubscribed = user.isSubscribed;\n user.$rights = angular.bind(user, user.$acl, _this.folderId, owner);\n _this.users.push(user);\n });\n deferred.resolve(_this.users);\n return _this.users;\n });\n }\n return deferred.promise;\n };\n\n /**\n * @function $addUser\n * @memberof Acl.prototype\n * @param {Object} user - a User object with minimal set of attributes (uid, isGroup, cn, c_email)\n * @param {Object} owner - the owner to use when fetching the ACL as it might not be the Settings.activeUser\n * @see {@link User.$filter}\n */\n Acl.prototype.$addUser = function(user, owner) {\n var _this = this,\n deferred = Acl.$q.defer(),\n param = {uid: user.uid};\n if (!user.uid || _.indexOf(_.map(this.users, 'uid'), user.uid) > -1) {\n // No UID specified or user already in ACLs\n deferred.resolve();\n }\n else {\n var acls;\n\n if (angular.isDefined(owner))\n acls = Acl.$$resource.userResource(owner).fetch(this.folderId, 'addUserInAcls', param);\n else\n acls = Acl.$$resource.fetch(this.folderId, 'addUserInAcls', param);\n\n acls.then(function() {\n user.wasSubscribed = false;\n user.userClass = user.isGroup ? 'normal-group' : 'normal-user';\n user.$rights = angular.bind(user, user.$acl, _this.folderId, owner);\n _this.users.push(user);\n deferred.resolve(user);\n }, function(data, status) {\n deferred.reject(l('An error occured please try again.'));\n });\n }\n return deferred.promise;\n };\n\n /**\n * @function $removeUser\n * @memberof Acl.prototype\n * @desc Remove a user from the folder's ACL\n * @return a promise of the server call to remove the user from the folder's ACL\n */\n Acl.prototype.$removeUser = function(uid, owner) {\n var _this = this,\n param = {uid: uid},\n acls;\n\n if (angular.isDefined(owner))\n acls = Acl.$$resource.userResource(owner).fetch(this.folderId, 'removeUserFromAcls', param);\n else\n acls = Acl.$$resource.fetch(this.folderId, 'removeUserFromAcls', param);\n\n return acls.then(function() {\n var i = _.indexOf(_.map(_this.users, 'uid'), uid);\n if (i >= 0) {\n _this.users[i].$shadowRights = null;\n _this.users.splice(i, 1);\n }\n });\n };\n\n /**\n * @function $selectAllRights\n * @memberof Acl.prototype\n * @desc Select all rights of an user\n */\n Acl.prototype.$selectAllRights = function(user) {\n _.forEach(user.rights, function(value, right) {\n if (angular.isNumber(user.rights[right]))\n user.rights[right] = 1;\n });\n };\n\n /**\n * @function $resetUsersRights\n * @memberof Acl.prototype\n * @desc Restore initial rights of all users.\n */\n Acl.prototype.$resetUsersRights = function() {\n angular.forEach(this.users, function(user) {\n user.$resetRights();\n });\n };\n\n /**\n * @function $saveUsersRights\n * @memberof Acl.prototype\n * @desc Save user rights that have changed and subscribe users that have been selected.\n * @param {Object} owner - the owner to use when fetching the ACL as it might not be the Settings.activeUser\n * @return a promise that resolved only if the modifications and subscriptions were successful\n */\n Acl.prototype.$saveUsersRights = function(owner) {\n var _this = this,\n deferredSave = Acl.$q.defer(),\n deferredSubscribe = Acl.$q.defer(),\n param = {action: 'saveUserRights'},\n users = [];\n\n // Save user rights\n angular.forEach(this.users, function(user) {\n if (user.$rightsAreDirty()) {\n users.push(user.$omit());\n // console.debug('save ' + JSON.stringify(user.$omit(), undefined, 2));\n }\n });\n if (users.length) {\n var acls;\n\n if (angular.isDefined(owner))\n acls = Acl.$$resource.userResource(owner).save(this.folderId, users, param);\n else\n acls = Acl.$$resource.save(this.folderId, users, param);\n\n acls.then(function() {\n // Save was successful; copy rights to shadow rights\n angular.forEach(_this.users, function(user) {\n if (user.$rightsAreDirty()) {\n user.$shadowRights = angular.copy(user.rights);\n }\n });\n deferredSave.resolve();\n }, deferredSave.reject);\n }\n else {\n deferredSave.resolve();\n }\n\n // Subscribe users\n users = [];\n angular.forEach(this.users, function(user) {\n if (!user.wasSubscribed && user.isSubscribed) {\n users.push(user.uid);\n // console.debug('subscribe ' + user.uid);\n }\n });\n if (users.length) {\n param = {uids: users.join(',')};\n Acl.$$resource.fetch(this.folderId, 'subscribeUsers', param)\n .then(function() {\n // Subscribe was successful; reset \"wasSubscribed\" attribute\n angular.forEach(_this.users, function(user) {\n user.wasSubscribed = user.isSubscribed;\n });\n deferredSubscribe.resolve();\n }, deferredSubscribe.reject);\n }\n else {\n deferredSubscribe.resolve();\n }\n return Acl.$q.all([deferredSave.promise, deferredSubscribe.promise]);\n };\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @name Alarm\n * @constructor\n */\n function Alarm() {\n this.currentAlarm = null;\n }\n\n /**\n * @name getAlarms\n * @desc Fetch the list of alarms from the server and use the last one\n */\n Alarm.getAlarms = function() {\n var _this = this;\n var now = new Date();\n var browserTime = Math.floor(now.getTime()/1000);\n\n this.$$resource.fetch('', 'alarmslist?browserTime=' + browserTime).then(function(data) {\n \n var alarms = data.alarms.sort(function reverseSortByAlarmTime(a, b) {\n var x = parseInt(a[2]);\n var y = parseInt(b[2]);\n return (y - x);\n });\n\n if (alarms.length > 0) {\n var next = alarms.pop();\n var now = new Date();\n var utc = Math.floor(now.getTime()/1000);\n var url = next[0] + '/' + next[1];\n var alarmTime = parseInt(next[2]);\n var delay = alarmTime;\n if (alarmTime > 0) delay -= utc;\n var d = new Date(alarmTime*1000);\n //console.log (\"now = \" + now.toUTCString());\n //console.log (\"next event \" + url + \" in \" + delay + \" seconds (on \" + d.toUTCString() + \")\");\n\n var f = angular.bind(_this, Alarm.showAlarm, url);\n\n if (_this.currentAlarm)\n _this.$timeout.cancel(_this.currentAlarm);\n\n _this.currentAlarm = _this.$timeout(f, delay*1000);\n }\n });\n };\n \n /**\n * @name showAlarm\n * @desc Show the latest alarm using a toast\n * @param url The URL of the calendar component for snoozing\n */\n Alarm.showAlarm = function(url) {\n var _this = this;\n\n this.$$resource.fetch(url, '?resetAlarm=yes').then(function(data) {\n _this.$toast.show({\n position: 'top right',\n hideDelay: 0,\n template: [\n '',\n '
',\n ' ',\n ' ',\n ' ',\n ' ',\n l('5 minutes'),\n ' ',\n ' ',\n l('10 minutes'),\n ' ',\n ' ',\n l('15 minutes'),\n ' ',\n ' ',\n l('30 minutes'),\n ' ',\n ' ',\n l('45 minutes'),\n ' ',\n ' ',\n l('1 hour'),\n ' ',\n ' ',\n l('1 day'),\n ' ',\n ' ',\n ' ',\n ' ',\n l('Cancel'),\n ' ',\n ' ',\n l('Ok'),\n ' ',\n '
',\n '
'\n ].join(''),\n locals: {\n url: url\n },\n controller: AlarmController\n });\n\n /**\n * @ngInject\n */\n AlarmController.$inject = ['scope', '$sanitize', '$mdToast', 'url'];\n function AlarmController(scope, $sanitize, $mdToast, url) {\n scope.summary = $sanitize(data.summary);\n scope.reminder = '10';\n scope.cancel = function() {\n $mdToast.hide();\n };\n scope.ok = function() {\n _this.$$resource.fetch(url, 'view?snoozeAlarm=' + scope.reminder);\n $mdToast.hide();\n };\n }\n });\n };\n\n /**\n * @memberof Alarm\n * @desc The factory we'll register as Alarm in the Angular module SOGo.Common\n * @ngInject\n */\n AlarmService.$inject = ['$timeout', 'sgSettings', 'Resource', '$mdToast'];\n function AlarmService($timeout, Settings, Resource, $mdToast) {\n angular.extend(Alarm, {\n $timeout: $timeout,\n $$resource: new Resource(Settings.activeUser('folderURL') + 'Calendar', Settings.activeUser()),\n $toast: $mdToast\n });\n\n return Alarm; // return constructor\n }\n\n /* Factory registration in Angular module */\n angular\n .module('SOGo.Common')\n .factory('Alarm', AlarmService);\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for Authentication */\n\n(function() {\n /* jshint validthis: true */\n 'use strict';\n\n angular.module('SOGo.Authentication', ['ngCookies'])\n\n .constant('passwordPolicyConfig', {\n PolicyPasswordChangeUnsupported: -3,\n PolicyPasswordSystemUnknown: -2,\n PolicyPasswordUnknown: -1,\n PolicyPasswordExpired: 0,\n PolicyAccountLocked: 1,\n PolicyChangeAfterReset: 2,\n PolicyPasswordModNotAllowed: 3,\n PolicyMustSupplyOldPassword: 4,\n PolicyInsufficientPasswordQuality: 5,\n PolicyPasswordTooShort: 6,\n PolicyPasswordTooYoung: 7,\n PolicyPasswordInHistory: 8,\n PolicyNoError: 65535\n })\n\n .provider('Authentication', Authentication);\n\n function Authentication() {\n function redirectUrl(username, domain) {\n var userName, address, baseAddress, altBaseAddress, parts, hostpart, protocol, newAddress;\n\n userName = username;\n if (domain)\n userName += '@' + domain.value;\n address = '' + window.location.href;\n baseAddress = ApplicationBaseURL + '/' + encodeURIComponent(userName);\n if (baseAddress[0] == '/') {\n parts = address.split('/');\n hostpart = parts[2];\n protocol = parts[0];\n baseAddress = protocol + '//' + hostpart + baseAddress;\n }\n parts = baseAddress.split('/');\n parts.splice(0, 3);\n altBaseAddress = parts.join('/');\n if ((address.startsWith(baseAddress) || address.startsWith(altBaseAddress)) &&\n !address.endsWith('/logoff')) {\n newAddress = address;\n }\n else {\n newAddress = baseAddress;\n }\n\n return newAddress;\n }\n\n this.$get = getService;\n\n /**\n * @ngInject\n */\n getService.$inject = ['$q', '$http', '$cookies', 'passwordPolicyConfig'];\n function getService($q, $http, $cookies, passwordPolicyConfig) {\n var service;\n\n function readLoginCookie() {\n var loginValues = null,\n cookie = $cookies.get('0xHIGHFLYxSOGo'),\n value;\n if (cookie && cookie.length > 8) {\n value = decodeURIComponent(cookie.substr(8));\n loginValues = value.base64decode().split(':');\n }\n\n return loginValues;\n }\n\n service = {\n login: function(data) {\n var d = $q.defer(),\n username = data.username,\n password = data.password,\n domain = data.domain,\n language,\n rememberLogin = data.rememberLogin ? 1 : 0;\n\n if (data.loginSuffix && !username.endsWith(data.loginSuffix)) {\n username += loginSuffix;\n domain = false;\n }\n if (data.language && data.language != 'WONoSelectionString') {\n language = data.language;\n }\n\n $http({\n method: 'POST',\n url: '/SOGo/connect',\n data: {\n userName: username,\n password: password,\n domain: domain,\n language: language,\n rememberLogin: rememberLogin\n }\n }).then(function(response) {\n var data = response.data;\n // Make sure browser's cookies are enabled\n var loginCookie = readLoginCookie();\n if (!loginCookie) {\n d.reject(l('cookiesNotEnabled'));\n }\n else {\n // Check password policy\n if (typeof data.expire != 'undefined' && typeof data.grace != 'undefined') {\n if (data.expire < 0 && data.grace > 0) {\n d.reject({grace: data.grace});\n //showPasswordDialog('grace', createPasswordGraceDialog, data['grace']);\n } else if (data.expire > 0 && data.grace == -1) {\n d.reject({expire: data.expire});\n //showPasswordDialog('expiration', createPasswordExpirationDialog, data['expire']);\n }\n else {\n d.resolve({ cn: data.cn, url: redirectUrl(username, domain) });\n }\n }\n else {\n d.resolve(redirectUrl(username, domain));\n }\n }\n }, function(response) {\n var msg, perr, data = response.data;\n if (data && data.LDAPPasswordPolicyError) {\n perr = data.LDAPPasswordPolicyError;\n if (perr == passwordPolicyConfig.PolicyNoError) {\n msg = l('Wrong username or password.');\n }\n else if (perr == passwordPolicyConfig.PolicyAccountLocked) {\n msg = l('Your account was locked due to too many failed attempts.');\n }\n else {\n msg = l('Login failed due to unhandled error case: ') + perr;\n }\n }\n else {\n msg = l('Unhandled error response');\n }\n d.reject({error: msg});\n });\n return d.promise;\n }, // login: function(data) { ...\n\n changePassword: function(newPassword) {\n var d = $q.defer(),\n loginCookie = readLoginCookie(),\n xsrfCookie = $cookies.get('XSRF-TOKEN');\n\n $cookies.remove('XSRF-TOKEN', {path: '/SOGo/'});\n\n $http({\n method: 'POST',\n url: '/SOGo/so/changePassword',\n headers: {\n 'X-XSRF-TOKEN' : xsrfCookie\n },\n data: {\n userName: loginCookie[0],\n password: loginCookie[1],\n newPassword: newPassword }\n }).then(d.resolve, function(response) {\n var error,\n data = response.data,\n perr = data.LDAPPasswordPolicyError;\n\n if (!perr) {\n perr = passwordPolicyConfig.PolicyPasswordSystemUnknown;\n error = _(\"Unhandled error response\");\n }\n else if (perr == passwordPolicyConfig.PolicyNoError) {\n error = l(\"Password change failed\");\n } else if (perr == passwordPolicyConfig.PolicyPasswordModNotAllowed) {\n error = l(\"Password change failed - Permission denied\");\n } else if (perr == passwordPolicyConfig.PolicyInsufficientPasswordQuality) {\n error = l(\"Password change failed - Insufficient password quality\");\n } else if (perr == passwordPolicyConfig.PolicyPasswordTooShort) {\n error = l(\"Password change failed - Password is too short\");\n } else if (perr == passwordPolicyConfig.PolicyPasswordTooYoung) {\n error = l(\"Password change failed - Password is too young\");\n } else if (perr == passwordPolicyConfig.PolicyPasswordInHistory) {\n error = l(\"Password change failed - Password is in history\");\n } else {\n error = l(\"Unhandled policy error: %{0}\").formatted(perr);\n perr = passwordPolicyConfig.PolicyPasswordUnknown;\n }\n\n // Restore the cookie\n $cookies.put('XSRF-TOKEN', xsrfCookie, {path: '/SOGo/'});\n d.reject(error);\n });\n return d.promise;\n }\n };\n return service;\n }\n }\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @name Dialog\n * @constructor\n */\n function Dialog() {\n }\n\n /**\n * @name alert\n * @desc Show an alert dialog box with a single \"OK\" button\n * @param {string} title\n * @param {string} content\n */\n Dialog.alert = function(title, content) {\n var alert = this.$modal.alert()\n .title(title)\n .htmlContent(content)\n .ok(l('OK'));\n this.$modal.show(alert);\n };\n\n /**\n * @name confirm\n * @desc Show a confirmation dialog box with buttons 'Cancel' and 'OK'\n * @param {string} title\n * @param {string} content\n * @returns a promise that resolves if the user has clicked on the 'OK' button\n */\n Dialog.confirm = function(title, content, options) {\n var confirm = this.$modal.confirm()\n .title(title)\n .htmlContent(content)\n .ok((options && options.ok)? options.ok : l('OK'))\n .cancel((options && options.cancel)? options.cancel : l('Cancel'));\n return this.$modal.show(confirm);\n };\n\n /**\n * @name prompt\n * @desc Show a primpt dialog box with a input text field and the 'Cancel' and 'OK' buttons\n * @param {string} title\n * @param {string} label\n * @param {object} [options] - use a different input type by setting 'inputType'\n * @returns a promise that resolves with the input field value\n */\n Dialog.prompt = function(title, label, options) {\n var o = options || {},\n id = title.asCSSIdentifier(),\n d = this.$q.defer();\n\n this.$modal.show({\n parent: angular.element(document.body),\n clickOutsideToClose: true,\n escapeToClose: true,\n template: [\n '',\n '
',\n ' ',\n '

',\n ' ',\n ' ',\n ' ',\n ' ',\n '
',\n ' ',\n ' ',\n ' ' + l('Cancel'),\n ' ',\n ' ',\n ' ' + l('OK'),\n ' ',\n ' ',\n '
',\n '
'\n ].join(''),\n controller: PromptDialogController\n });\n\n /**\n * @ngInject\n */\n PromptDialogController.$inject = ['scope', '$mdDialog'];\n function PromptDialogController(scope, $mdDialog) {\n scope.title = title;\n scope.name = \"\";\n scope.cancel = function() {\n d.reject();\n $mdDialog.hide();\n };\n scope.ok = function() {\n d.resolve(scope.name);\n $mdDialog.hide();\n };\n }\n\n return d.promise;\n };\n\n /**\n * @memberof Dialog\n * @desc The factory we'll register as Dialog in the Angular module SOGo.Common\n * @ngInject\n */\n DialogService.$inject = ['$q', '$mdDialog'];\n function DialogService($q, $mdDialog) {\n angular.extend(Dialog, { $q: $q , $modal: $mdDialog });\n\n return Dialog; // return constructor\n }\n\n /* Factory registration in Angular module */\n angular\n .module('SOGo.Common')\n .factory('Dialog', DialogService);\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * Gravatar - A service to build the Gravatar URL for an email address\n * @memberof SOGo.Common\n * @param {string} email\n * @param {number} [size] - the size of the image\n * @param {string} alternate avatar to use (none, identicon, monsterid, wavatar, retro)\n * @ngInject\n */\n function Gravatar() {\n return function(email, size, alternate_avatar, options) {\n var x, y, hash, s = size, a = alternate_avatar;\n if (!email) {\n return '';\n }\n x = email.indexOf('<');\n if (x >= 0) {\n y = email.indexOf('>', x);\n if (y > x)\n email = email.substring(x+1,y);\n }\n if (!size) {\n s = 48; // default to 48 pixels\n }\n hash = email.md5();\n\n if (!a || a == \"none\") {\n if (options && options.no_404)\n alternate_avatar = \"mm\"; // mystery man alternative\n else\n alternate_avatar = \"404\";\n }\n\n return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=' + alternate_avatar;\n };\n }\n\n angular\n .module('SOGo.Common')\n .factory('Gravatar', Gravatar);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @name Resource\n * @constructor\n * @param {Object} $http - the Angular HTTP service\n * @param {Object} $q - the Angular promise/deferred service\n * @param {String} path - the base path of the external resource\n * @param {Object} options - extra attributes to be associated to the object\n */\n function Resource($http, $q, path, activeUser, options) {\n angular.extend(this, {\n _http: $http,\n _q: $q,\n _path: path,\n _activeUser: activeUser\n });\n angular.extend(this, options);\n // Trim trailing slash\n this._path = this._path.replace(/\\/$/, '');\n }\n\n /**\n * @memberof Resource\n * @desc The factory we'll use to register with Angular.\n * @return a new Resource object\n */\n Resource.$factory = ['$http', '$q', function($http, $q) {\n return function(path, activeUser, options) {\n return new Resource($http, $q, path, activeUser, options);\n };\n }];\n\n /**\n * @module SOGo.Common\n * @desc Factory registration of Resource in Angular module.\n */\n angular.module('SOGo.Common').factory('Resource', Resource.$factory);\n\n /**\n * @function userResource\n * @memberof Resource.prototype\n * @desc Create a new Resource object associated to a username different than the active user.\n * @param {String} uid - the user UID\n * @return a new Resource object\n */\n Resource.prototype.userResource = function(uid) {\n var path = _.compact(this._activeUser.folderURL.split('/'));\n path.splice(path.length - 1, 1, escape(uid));\n\n return new Resource(this._http, this._q, '/' + path.join('/'), this._activeUser);\n };\n\n /**\n * @function fetch\n * @memberof Resource.prototype\n * @desc Fetch resource using a specific folder, action and/or parameters.\n * @param {string} folderId - the folder on which the action will be applied (ex: addressbook, calendar)\n * @param {string} action - the action to be used in the URL\n * @param {Object} params - Object parameters injected through the $http service\n * @return a promise\n */\n Resource.prototype.fetch = function(folderId, action, params) {\n var deferred = this._q.defer(),\n path = [this._path];\n if (folderId) path.push(folderId.split('/'));\n if (action) path.push(action);\n path = _.compact(_.flatten(path)).join('/');\n\n this._http({\n method: 'GET',\n url: path,\n params: params\n })\n .then(function(response) {\n return deferred.resolve(response.data);\n }, deferred.reject);\n\n return deferred.promise;\n };\n\n /**\n * @function newguid\n * @memberof Resource.prototype\n * @desc Fetch a new GUID on the specified folder ID.\n * @return a promise of the new data structure\n */\n Resource.prototype.newguid = function(folderId) {\n var deferred = this._q.defer(),\n path = this._path + '/' + folderId + '/newguid';\n\n this._http\n .get(path)\n .then(function(response) {\n return deferred.resolve(response.data);\n }, deferred.reject);\n\n return deferred.promise;\n };\n\n /**\n * @function create\n * @memberof Resource.prototype\n * @desc Create a new resource using a specific action (post).\n * @param {string} action - the action to be used in the URL\n * @param {string} name - the new resource's name\n * @return a promise\n */\n Resource.prototype.create = function(action, name) {\n var deferred = this._q.defer(),\n path = this._path + '/' + action;\n\n this._http\n .post(path, { name: name })\n .then(function(response) {\n return deferred.resolve(response.data);\n }, deferred.reject);\n\n return deferred.promise;\n };\n\n /**\n * @function post\n * @memberof Resource.prototype\n * @desc Post a resource attributes on the server.\n * @return a promise\n */\n Resource.prototype.post = function(id, action, data) {\n var deferred = this._q.defer(),\n path = [this._path];\n if (id) path.push(id);\n if (action) path.push(action);\n path = _.compact(_.flatten(path)).join('/');\n\n this._http\n .post(path, data)\n .then(function(response) {\n return deferred.resolve(response.data);\n }, deferred.reject);\n\n return deferred.promise;\n };\n\n /**\n * @function save\n * @memberof Resource.prototype\n * @desc Save a resource attributes on the server (post /save).\n * @return a promise\n */\n Resource.prototype.save = function(id, newValue, options) {\n var action = (options && options.action)? options.action : 'save';\n\n return this.post(id, action, newValue);\n };\n\n /**\n * @function download\n * @memberof Resource.prototype\n * @desc Download a file from the server. Requires FileSaver.js.\n * @see {@link http://blog.davidjs.com/2015/07/download-files-via-post-request-in-angularjs/|Download files via POST request in AngularJs}\n * @see {@link https://github.com/eligrey/FileSaver.js|FileSaver.js}\n * @return a promise\n */\n Resource.prototype.download = function(id, action, data, options) {\n var deferred = this._q.defer(),\n type = (options && options.type)? options.type : 'application/zip',\n path = [this._path];\n if (id) path.push(id);\n if (action) path.push(action);\n path = _.compact(_.flatten(path)).join('/');\n\n function getFileNameFromHeader(header) {\n var result;\n\n if (!header) return null;\n result = header.split(\";\")[1].trim().split(\"=\")[1];\n\n return result.replace(/\"/g, '');\n }\n\n return this._http({\n method: 'POST',\n url: path,\n data: data,\n headers: {\n accept: type\n },\n responseType: 'arraybuffer',\n cache: false,\n transformResponse: function (data, headers) {\n var fileName, result, blob = null;\n\n if (data) {\n blob = new Blob([data], { type: type });\n }\n fileName = getFileNameFromHeader(headers('content-disposition'));\n\n if (!saveAs) {\n throw new Error('To use Resource.download, FileSaver.js must be loaded.');\n }\n else {\n saveAs(blob, fileName);\n }\n }\n });\n };\n\n /**\n * @function remove\n * @memberof Resource.prototype\n * @desc Delete a resource (get /delete).\n * @return a promise\n */\n Resource.prototype.remove = function(uid) {\n var deferred = this._q.defer(),\n path = this._path + '/' + uid + '/delete';\n\n this._http\n .get(path)\n .then(function(response) {\n return deferred.resolve(response.data);\n }, deferred.reject);\n\n return deferred.promise;\n };\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n \n /**\n * sgFocus - A service to set the focus on the element associated to a specific string\n * @memberof SOGo.Common\n * @param {string} name - the string identifier of the element\n * @see {@link SOGo.Common.sgFocusOn}\n * @ngInject\n */\n sgFocus.$inject = ['$rootScope', '$timeout'];\n function sgFocus($rootScope, $timeout) {\n return function(name) {\n $timeout(function() {\n $rootScope.$broadcast('sgFocusOn', name);\n });\n };\n }\n\n angular\n .module('SOGo.Common')\n .factory('sgFocus', sgFocus);\n})();\n","/* -*- Mode: js; indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n(function() {\n /* jshint validthis: true */\n 'use strict';\n\n /**\n * $sgHotkeys - A service to associate keyboard shortcuts to actions.\n * @memberof SOGo.Common\n *\n * @description\n * This service is a modified version of angular-hotkeys-light by Eugene Brodsky:\n * https://github.com/fupslot/angular-hotkeys-light\n */\n function $sgHotkeys() {\n\n // Key-code values for various meta-keys.\n // Source : http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes\n // http://unixpapa.com/js/key.html\n // Date: Oct 02, 2015.\n var KEY_CODES = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 19: 'pause',\n 20: 'caps',\n 27: 'escape',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'insert',\n 46: 'delete',\n // Numpad\n 96: '0',\n 97: '1',\n 98: '2',\n 99: '3',\n 100: '4',\n 101: '5',\n 102: '6',\n 103: '7',\n 104: '8',\n 105: '9',\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111: '/',\n // Function keys\n 112: 'f1',\n 113: 'f2',\n 114: 'f3',\n 115: 'f4',\n 116: 'f5',\n 117: 'f6',\n 118: 'f7',\n 119: 'f8',\n 120: 'f9',\n 121: 'f10',\n 122: 'f11',\n 123: 'f12'\n };\n // Char-code values for characters that require a key combinations\n var CHAR_CODES = {\n 42: '*',\n 63: '?'\n };\n\n this.$get = getService;\n\n getService.$inject = ['$rootScope', '$window'];\n function getService($rootScope, $window) {\n\n var wrapWithApply = function (fn) {\n return function(event, args) {\n $rootScope.$apply(function() {\n fn.call(this, event, args);\n }.bind(this));\n };\n };\n\n var HotKey = function(params) {\n this.id = params.id || guid();\n this.key = params.key;\n this.description = params.description || null;\n this.context = params.context || null;\n this.callback = params.callback;\n this.preventInClass = params.preventInClass;\n this.args = params.args;\n this.onKeyUp = false;\n\n if (this.key.length > 1)\n // Automatically translate common hotkeys\n this.lkey = l('key_' + this.key);\n };\n\n HotKey.prototype.clone = function() {\n return new HotKey(this);\n };\n\n var Hotkeys = function() {\n /**\n * Sometimes a UI wants keybindings which are global, so called hotkeys.\n * Keys are keystrings (identify key combinations) and values are objects\n * with keys callback, context.\n */\n this._hotkeys = {};\n\n /**\n * Sometimes a UI wants keybindings for keyup behaviour.\n */\n this._hotkeysUp = {};\n\n /**\n * Keybindings are ignored by default when coming from a form input field.\n */\n this._preventIn = ['INPUT', 'SELECT', 'TEXTAREA', 'MD-OPTION'];\n\n /**\n * Keybindings are ignored by default when coming from special elements\n */\n this._preventInClass = ['md-chip-content'];\n\n this._onKeydown = this._onKeydown.bind(this);\n this._onKeyup = this._onKeyup.bind(this);\n this._onKeypress = this._onKeypress.bind(this);\n\n this.initialize();\n };\n\n /**\n * Binds Keydown, Keyup with the window object\n */\n Hotkeys.prototype.initialize = function() {\n this.registerHotkey(\n this.createHotkey({\n key: '?',\n description: l('Show or hide this help'),\n callback: this._toggleCheatSheet.bind(this)\n })\n );\n\n $window.addEventListener('keydown', this._onKeydown, true);\n $window.addEventListener('keyup', this._onKeyup, true);\n $window.addEventListener('keypress', this._onKeypress, true);\n };\n\n /**\n * Invokes callback functions assosiated with the given hotkey\n * @param {Event} event\n * @param {String} keyString hotkey\n * @param {Array.} hotkeys List of registered callbacks for\n * the given hotkey\n * @private\n */\n Hotkeys.prototype._invokeHotkeyHandlers = function(event, keyString, hotkeys) {\n for (var i = 0, l = hotkeys.length; i < l; i++) {\n var hotkey = hotkeys[i],\n target = event.target || event.srcElement,\n nodeName = target.nodeName.toUpperCase();\n if (!_.includes(this._preventIn, nodeName) &&\n _.intersection(target.classList, this._preventInClass).length === 0 &&\n _.intersection(target.classList, hotkey.preventInClass).length === 0) {\n try {\n hotkey.callback.call(hotkey.context, event, hotkey.args);\n } catch(e) {\n console.error('HotKeys: ', hotkey.key, e.message);\n }\n }\n }\n };\n\n /**\n * Keydown Event Handler\n * @private\n */\n Hotkeys.prototype._onKeydown = function(event) {\n var keyString = this.keyStringFromEvent(event);\n if (this._hotkeys[keyString]) {\n this._invokeHotkeyHandlers(event, keyString, this._hotkeys[keyString]);\n }\n };\n\n /**\n * Keyup Event Handler\n * @private\n */\n Hotkeys.prototype._onKeyup = function(event) {\n var keyString = this.keyStringFromEvent(event);\n if (this._hotkeysUp[keyString]) {\n this._invokeHotkeyHandlers(this._hotkeysUp[keyString], keyString);\n }\n };\n\n /**\n * Keypress Event Handler\n * @private\n */\n Hotkeys.prototype._onKeypress = function(event) {\n var charCode, keyString;\n\n charCode = event.keyCode || event.which;\n keyString = CHAR_CODES[charCode];\n if (keyString && this._hotkeys[keyString]) {\n this._invokeHotkeyHandlers(event, keyString, this._hotkeys[keyString]);\n }\n };\n\n /**\n * Cross-browser method which can extract a key string from an event.\n * Key strings are of the form\n *\n * ctrl+alt+shift+meta+character\n *\n * where each of the 4 modifiers may or may not appear, but always appear\n * in that order if they do appear.\n *\n * TODO : this is not yet implemented fully. The trouble is, the keyCode,\n * charCode, and which properties of the DOM standard KeyboardEvent are\n * discouraged in favour of the use of key and char, but key and char are\n * not yet implemented in Gecko nor in Blink/Webkit. We need to leverage\n * keyCode/charCode so that current browser versions are supported, but also\n * look to key and char because they're apparently more useful and are the\n * future.\n */\n Hotkeys.prototype.keyStringFromEvent = function(event) {\n var result = [];\n var key = event.which;\n\n if (KEY_CODES[key]) {\n key = KEY_CODES[key];\n } else {\n key = String.fromCharCode(key).toLowerCase();\n }\n\n if (event.ctrlKey) { result.push('ctrl'); }\n if (event.altKey) { result.push('alt'); }\n if (event.shiftKey) { result.push('shift'); }\n if (event.metaKey) { result.push('meta'); }\n result.push(key);\n return _.uniq(result).join('+');\n };\n\n /**\n * Unregister a hotkey (shortcut) helper for (keyUp/keyDown).\n *\n * @param {String} params.key - valid key string.\n */\n Hotkeys.prototype._deregisterHotkey = function(hotkey) {\n var ret;\n var table = this._hotkeys;\n\n if (hotkey.onKeyUp) {\n table = this._hotkeysUp;\n }\n\n if (table[hotkey.key]) {\n var callbackArray = table[hotkey.key];\n for (var i = 0; i < callbackArray.length; ++i) {\n var callbackData = callbackArray[i];\n if ((hotkey.callback === callbackData.callback &&\n callbackData.context === hotkey.context) ||\n (hotkey.id === callbackData.id)) {\n ret = callbackArray.splice(i, 1);\n }\n }\n if (callbackArray.length === 0)\n delete this._hotkeys[hotkey.key];\n }\n return ret;\n };\n\n /**\n * Unregister hotkeys\n * @param {Hotkey} hotkey A hotkey object\n * @return {Array}\n */\n Hotkeys.prototype.deregisterHotkey = function(hotkey) {\n var result = [];\n\n this._validateHotkey(hotkey);\n\n if (angular.isArray(hotkey.key)) {\n for (var i = hotkey.key.length - 1; i >= 0; i--) {\n var clone = hotkey.clone();\n clone.key = hotkey.key[i];\n var ret = this._deregisterHotkey(clone);\n if (ret !== void 0) {\n result.push(ret[0]);\n }\n }\n } else {\n result.push(this._deregisterHotkey(hotkey));\n }\n return result;\n };\n\n /**\n * Validate HotKey type\n */\n Hotkeys.prototype._validateHotkey = function(hotkey) {\n if (!(hotkey instanceof HotKey)) {\n throw new TypeError('Hotkeys: Expected a hotkey object be instance of HotKey');\n }\n };\n\n /**\n * Register a hotkey (shortcut) helper for (keyUp/keyDown).\n * @param {Object} params Parameters object\n * @param {String} params.key - valid key string.\n * @param {Function} params.callback - routine to run when key is pressed.\n * @param {Object} params.context - @this value in the callback.\n * @param [Boolean] params.onKeyUp - if this is intended for a keyup.\n * @param [String] params.id - the identifier for this registration.\n */\n Hotkeys.prototype._registerKey = function(hotkey) {\n var table = this._hotkeys;\n\n if (hotkey.onKeyUp) {\n table = this._hotkeysUp;\n }\n\n table[hotkey.key] = table[hotkey.key] || [];\n table[hotkey.key].push(hotkey);\n return hotkey;\n };\n\n Hotkeys.prototype._registerKeys = function(hotkey) {\n var result = [];\n\n if (angular.isArray(hotkey.key)) {\n for (var i = hotkey.key.length - 1; i >= 0; i--) {\n var clone = hotkey.clone();\n clone.id = guid();\n clone.key = hotkey.key[i];\n result.push(this._registerKey(clone));\n }\n } else {\n result.push(this._registerKey(hotkey));\n }\n return result;\n };\n\n /**\n * Register a hotkey (shortcut). see _registerHotKey\n */\n Hotkeys.prototype.registerHotkey = function(hotkey) {\n this._validateHotkey(hotkey);\n return this._registerKeys(hotkey);\n };\n\n /**\n * Register a hotkey (shortcut) keyup behavior.\n * see _registerHotKey\n */\n Hotkeys.prototype.registerHotkeyUp = function(hotkey) {\n this._validateHotkey(hotkey);\n hotkey.onKeyUp = true;\n this._registerKeys(hotkey);\n };\n\n /**\n * Creates new hotkey object.\n * @param {Object} args\n * @return {HotKey}\n */\n Hotkeys.prototype.createHotkey = function(args) {\n if (args.key === null || args.key === void 0) {\n throw new TypeError('HotKeys: Argument \"key\" is required');\n }\n\n if (args.callback === null || args.callback === void 0) {\n throw new TypeError('HotKeys: Argument \"callback\" is required');\n }\n\n args.callback = wrapWithApply(args.callback);\n return new HotKey(args);\n };\n\n /**\n * Checks if given shortcut match the event\n * @param {Event} event An event\n * @param {String|Array} key A shortcut\n * @return {Boolean}\n */\n Hotkeys.prototype.match = function(event, key) {\n if (!angular.isArray(key)) {\n key = [key];\n }\n\n var eventHotkey = this.keyStringFromEvent(event);\n return Boolean(~key.indexOf(eventHotkey));\n };\n\n /**\n * Build and display (or hide) the hotkeys cheat sheet\n *\n * If a hotkey is registered multiple times, only the description of the first registered\n * hotkey is displayed.\n */\n Hotkeys.prototype._toggleCheatSheet = function() {\n var _this = this;\n\n if (this._cheatSheet) {\n Hotkeys.$modal.hide();\n this._cheatSheet = null;\n }\n else {\n this._cheatSheet = Hotkeys.$modal\n .show({\n clickOutsideToClose: true,\n escapeToClose: true,\n template: [\n '',\n ' ',\n ' ',\n ' ',\n '
',\n ' {{keys[0].lkey || hotkey}}',\n '
',\n ' {{keys[0].description}}',\n '
',\n '
',\n '
',\n '
'\n ].join(''),\n controller: CheatSheetController,\n locals: {\n hotkeys: _this._hotkeys\n }\n })\n .finally(function() {\n _this._cheatSheet = null;\n });\n }\n\n CheatSheetController.$inject = ['$scope', 'hotkeys'];\n function CheatSheetController($scope, hotkeys) {\n $scope.hotkeys = hotkeys;\n $scope.closeDialog = function() {\n Hotkeys.$modal.hide();\n };\n }\n };\n\n return Hotkeys;\n }\n }\n\n sgHotkeys.$inject = ['$mdDialog', '$sgHotkeys'];\n function sgHotkeys($mdDialog, $sgHotkeys) {\n angular.extend($sgHotkeys, { $modal: $mdDialog });\n\n return new $sgHotkeys();\n }\n\n angular\n .module('SOGo.Common')\n .service('sgHotkeys', sgHotkeys)\n .provider('$sgHotkeys', $sgHotkeys);\n})();\n","(function() {\n 'use strict';\n\n /**\n * @name User\n * @constructor\n * @param {object} [userData] - some default values for the user\n */\n function User(userData) {\n if (userData) {\n this.init(userData);\n }\n }\n\n /**\n * @memberof User\n * @desc The factory we'll use to register with Angular.\n * @return the User constructor\n */\n User.factory = ['$q', '$log', 'sgSettings', 'Resource', function($q, $log, Settings, Resource) {\n angular.extend(User, {\n $q: $q,\n $log: $log,\n $$resource: new Resource(Settings.activeUser('folderURL'), Settings.activeUser()),\n $query: '',\n $users: []\n });\n\n return User;\n }];\n\n /**\n * @module SOGo.Common\n * @desc Factory registration of User in Angular module.\n */\n angular.module('SOGo.Common').factory('User', User.factory);\n\n /**\n * @memberof User\n * @desc Search for users that match a string.\n * @param {string} search - a string used to performed the search\n * @param {object[]} excludedUsers - a list of User objects that must be excluded from the results\n * @return a promise of an array of matching User objects\n */\n User.$filter = function(search, excludedUsers, options) {\n var _this = this, param = {search: search};\n\n if (!options || !options.dry) {\n if (!search) {\n // No query specified\n User.$users.splice(0, User.$users.length);\n return User.$q.when(User.$users);\n }\n if (User.$query == search) {\n // Query hasn't changed\n return User.$q.when(User.$users);\n }\n User.$query = search;\n }\n\n return User.$$resource.fetch(null, 'usersSearch', param).then(function(response) {\n var results, index, user, users,\n compareUids = function(data) {\n return this.uid == data.uid;\n };\n\n if (options) {\n if (options.dry)\n users = [];\n else if (options.results)\n users = options.results;\n }\n else\n users = User.$users;\n\n if (excludedUsers) {\n // Remove excluded users from response\n results = _.filter(response.users, function(user) {\n return !_.find(excludedUsers, _.bind(compareUids, user));\n });\n }\n else {\n results = response.users;\n }\n\n // Remove users that no longer match the search query\n for (index = users.length - 1; index >= 0; index--) {\n user = users[index];\n if (!_.find(results, _.bind(compareUids, user))) {\n users.splice(index, 1);\n }\n }\n // Add new users matching the search query\n _.forEach(results, function(data, index) {\n if (_.isUndefined(_.find(users, _.bind(compareUids, data)))) {\n var user = new User(data);\n users.splice(index, 0, user);\n }\n });\n User.$log.debug(users);\n return users;\n });\n };\n\n /**\n * @function init\n * @memberof User.prototype\n * @desc Extend instance with required attributes and new data.\n * @param {object} data - attributes of user\n */\n User.prototype.init = function(data) {\n angular.extend(this, data);\n if (!this.$$shortFormat)\n this.$$shortFormat = this.$shortFormat();\n if (!this.$$image)\n this.$$image = this.image;\n this.$avatarIcon = (this.$isGroup() || this.$isSpecial()) ? 'group' : 'person';\n // NOTE: We can't assign a Gravatar at this stage since we would need the Preferences module\n // which already depend on the User module.\n\n // An empty attribute to trick md-autocomplete when adding users from the ACLs editor\n this.empty = ' ';\n };\n\n /**\n * @function $shortFormat\n * @memberof User.prototype\n * @return the fullname along with the email address\n */\n User.prototype.$shortFormat = function(options) {\n var fullname = this.cn || this.c_email;\n var email = this.c_email;\n var no_email = options && options.email === false;\n if (!no_email && email && fullname != email) {\n fullname += ' <' + email + '>';\n }\n return fullname;\n };\n\n /**\n * @function $acl\n * @memberof User.prototype\n * @desc Fetch the user rights associated to a specific folder and populate the 'rights' attribute.\n * @param {string} the folder ID\n * @param {Object} owner - the owner to use when fetching the ACL as it might not be the Settings.activeUser\n * @return a promise\n */\n User.prototype.$acl = function(folderId, owner) {\n var _this = this,\n deferred = User.$q.defer(),\n param = {uid: this.uid};\n if (this.$shadowRights) {\n deferred.resolve(this.rights);\n }\n else {\n var rights;\n\n if (angular.isDefined(owner))\n rights = User.$$resource.userResource(owner).fetch(folderId, 'userRights', param);\n else\n rights = User.$$resource.fetch(folderId, 'userRights', param);\n\n rights.then(function(data) {\n _this.rights = data;\n // Convert numbers (0|1) to boolean values\n //angular.forEach(_.keys(_this.rights), function(key) {\n // _this.rights[key] = _this.rights[key] ? true : false;\n //});\n // console.debug('rights ' + _this.uid + ' => ' + JSON.stringify(data, undefined, 2));\n // Keep a copy of the server's version\n _this.$shadowRights = angular.copy(data);\n deferred.resolve(data);\n return data;\n });\n }\n return deferred.promise;\n };\n\n /**\n * @function $isGroup\n * @memberof User.prototype\n * @return true if the user actually represents a group of users\n */\n User.prototype.$isGroup = function() {\n return this.isGroup || this.userClass && this.userClass == 'normal-group';\n };\n\n /**\n * @function $isAnonymous\n * @memberof User.prototype\n * @return true if it's the special anonymous user\n */\n User.prototype.$isAnonymous = function() {\n return this.uid == 'anonymous';\n };\n\n /**\n * @function $isSpecial\n * @memberof User.prototype\n * @desc Only accurate from the ACL editor.\n * @return true if the user is not a regular system user\n */\n User.prototype.$isSpecial = function() {\n return this.userClass && this.userClass == 'public-user';\n };\n\n /**\n * @function $confirmRights\n * @memberof User.prototype\n * @desc Check if a confirmation is required before giving some rights.\n * @return the confirmation message or false if no confirmation is required\n */\n User.prototype.$confirmRights = function(folder) {\n var confirmation = false;\n\n if (this.$confirmation) {\n // Don't bother the user more than once\n return false;\n }\n\n if (_.some(_.values(this.rights))) {\n if (this.uid == 'anonymous') {\n if (folder.constructor.name == 'AddressBook')\n confirmation = l('Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?', folder.name);\n else if (folder.constructor.name == 'Calendar')\n confirmation = l('Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?', folder.name);\n }\n else if (this.uid == 'anyone' || this.uid == '') {\n if (folder.constructor.name == 'AddressBook')\n confirmation = l('Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?', folder.name);\n else if (folder.constructor.name == 'Calendar')\n confirmation = l('Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?', folder.name);\n else if (folder.constructor.name == 'Mailbox')\n confirmation = l('Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?', folder.name);\n }\n }\n\n this.$confirmation = confirmation;\n\n return confirmation;\n };\n\n /**\n * @function $rightsAreDirty\n * @memberof User.prototype\n * @return whether or not the rights have changed from their initial values\n */\n User.prototype.$rightsAreDirty = function() {\n return this.rights && !_.isEqual(this.rights, this.$shadowRights);\n };\n\n /**\n * @function $resetRights\n * @memberof User.prototype\n * @desc Restore initial rights or disable all rights\n * @param {boolean} [zero] - reset all rights to zero when true\n */\n User.prototype.$resetRights = function(zero) {\n var _this = this;\n if (zero) {\n // Disable all rights\n _.map(_.keys(this.rights), function(key) {\n if (angular.isString(_this.rights[key]))\n _this.rights[key] = 'None';\n else\n _this.rights[key] = 0;\n });\n }\n else if (this.$shadowRights) {\n // Restore initial rights\n this.rights = angular.copy(this.$shadowRights);\n }\n };\n\n /**\n * @function $folders\n * @memberof User.prototype\n * @desc Retrieve the list of folders of a specific type\n * @param {string} type - either 'contact' or 'calendar'\n * @return a promise of the HTTP query result or the cached result\n */\n User.prototype.$folders = function(type) {\n var _this = this,\n deferred = User.$q.defer(),\n param = {type: type};\n if (this.$$folders) {\n deferred.resolve(this.$$folders);\n }\n else {\n User.$$resource.userResource(this.uid).fetch(null, 'foldersSearch', param).then(function(response) {\n _this.$$folders = response.folders;\n deferred.resolve(response.folders);\n });\n }\n return deferred.promise;\n };\n\n /**\n * @function $omit\n * @memberof User.prototype\n * @desc Return a sanitized object used to send to the server.\n * @return an object literal copy of the User instance\n */\n User.prototype.$omit = function() {\n var user = {};\n angular.forEach(this, function(value, key) {\n if (key != 'constructor' && key[0] != '$') {\n user[key] = value;\n }\n });\n return user;\n };\n\n User.prototype.toString = function() {\n return '[User ' + this.c_email + ']';\n };\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n /* jshint validthis: true, newcap: false */\n 'use strict';\n\n /**\n * sgAvatarImage - An avatar directive that returns un img element with either a local URL (if sg-src is specified)\n * or a Gravatar URL built from the Gravatar factory (using sg-email). The element's content must return the name of the generic icon to be used (usually 'person' or 'group').\n * Based on http://blog.lingohub.com/2014/08/better-ux-with-angularjs-directives/.\n * @memberof SOGo.Common\n * @example:\n person\n */\n function sgAvatarImage() {\n return {\n restrict: 'AE',\n scope: {},\n bindToController: {\n size: '@',\n email: '=sgEmail',\n src: '=sgSrc'\n },\n transclude: true,\n template: [\n '', // the generic icon\n '' // the gravatar or local image\n ].join(''),\n link: link,\n controller: 'sgAvatarImageController',\n controllerAs: 'vm'\n };\n }\n\n function link(scope, element, attrs, controller) {\n var imgElement = element.find('img'),\n mdIconElement = element.find('md-icon');\n\n if (attrs.size) {\n imgElement.attr('width', attrs.size);\n imgElement.attr('height', attrs.size);\n mdIconElement.css('font-size', attrs.size + 'px');\n }\n\n controller.img = imgElement;\n controller.genericImg = mdIconElement;\n }\n\n /**\n * @ngInject\n */\n sgAvatarImageController.$inject = ['$scope', '$element', '$http', '$q', 'Preferences', 'Gravatar'];\n function sgAvatarImageController($scope, $element, $http, $q, Preferences, Gravatar) {\n var vm, toggleZoomFcn;\n\n vm = this;\n\n $scope.$on('$destroy', function() {\n if (toggleZoomFcn)\n $element.off('click', toggleZoomFcn);\n });\n\n // Wait on user's defaults\n Preferences.ready().then(function() {\n $scope.$watch(function() { return vm.email; }, function(email, old) {\n if (email && vm.urlEmail != email) {\n // Email has changed or doesn't match the current URL (this happens when using md-virtual-repeat)\n showGenericAvatar();\n if (Preferences.defaults.SOGoGravatarEnabled)\n getGravatar(email);\n }\n else if (!email)\n showGenericAvatar();\n });\n });\n\n // If sg-src is defined, watch the expression for the URL of a local image\n if ('sg-src' in $element[0].attributes) {\n $scope.$watch(function() { return vm.src; }, function(src) {\n if (src) {\n // Set image URL and save the associated email address\n vm.url = src;\n vm.urlEmail = '' + vm.email;\n configureZoomableAvatar();\n hideGenericAvatar();\n }\n });\n }\n\n function getGravatar(email) {\n var url = Gravatar(email, vm.size, Preferences.defaults.SOGoAlternateAvatar);\n $http({\n method: 'GET',\n url: url,\n cache: true,\n headers: { Accept: 'image/*' }\n }).then(function successCallback() {\n if (!vm.url) {\n // Set image URL and save the associated email address\n vm.url = url;\n vm.urlEmail = email;\n hideGenericAvatar();\n }\n }, function errorCallback() {\n showGenericAvatar();\n });\n }\n\n function showGenericAvatar() {\n vm.url = null;\n vm.urlEmail = null;\n vm.img.addClass('ng-hide');\n vm.genericImg.removeClass('ng-hide');\n }\n\n function hideGenericAvatar() {\n vm.genericImg.addClass('ng-hide');\n vm.img.removeClass('ng-hide');\n }\n\n function configureZoomableAvatar() {\n $element.addClass('sg-avatar-image--zoomable');\n toggleZoomFcn = function() {\n $element.toggleClass('sg-avatar-image--zoom');\n };\n $element.on('click', toggleZoomFcn);\n }\n\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgAvatarImage', sgAvatarImage)\n .controller('sgAvatarImageController', sgAvatarImageController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n angular\n .module('SOGo.Common')\n .directive('sgCheckmark', sgCheckmarkDirective);\n\n /*\n * sgCheckmark - A checkmark to be used in a mdMenuItem\n * @memberof SOGo.Common\n * @restrict element\n *\n * @example:\n\n \n \n sort\n \n \n \n Descending Order\n \n \n \n */\n sgCheckmarkDirective.$inject = ['$parse', '$mdAria', '$mdTheming', '$mdUtil'];\n function sgCheckmarkDirective($parse, $mdAria, $mdTheming, $mdUtil) {\n var CHECKED_CSS = 'sg-checked';\n\n return {\n restrict: 'E',\n replace: true,\n transclude: true,\n require: '?ngModel',\n //priority: 210, // Run before ngAria\n template: [\n '