{"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/loc.filter.js","Common/range.filter.js","Common/url.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/User.service.js","Common/sgFocus.service.js","Common/sgAvatarImage.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgGenericAvatarImage.directive.js","Common/sgPlaceholder.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","Common/sgVariableScrollShrink.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","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","backgroundPalette","DebugEnabled","debugEnabled","debugInfoEnabled","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","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","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","debug","_","map","run","decodeUri","decodeURIComponent","filter","encodeUri","encodeURIComponent","ensureTarget","$sce","element","tree","find","attr","trustAs","html","loc","range","n","res","url","indexOf","AclController","$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","error","selectedUser","$rights","this","controller","navController","$scope","$timeout","$interval","$http","$mdSidenav","$mdToast","$mdMedia","sgConstant","sgSettings","Alarm","leftIsClose","isOpen","onHttpError","event","isString","statusText","show","template","hideDelay","position","currentDay","window","get","secondsBeforeTomorrow","toggleLeft","isGtMedium","toggle","toggleRight","$watch","newVal","$on","getAlarms","Acl","folderId","Settings","Resource","extend","$$resource","$User","prototype","$users","owner","_this","deferred","defer","acls","isDefined","userResource","fetch","canSubscribeUser","isSubscribed","wasSubscribed","bind","resolve","promise","userClass","isGroup","splice","$resetRights","deferredSave","deferredSubscribe","action","$rightsAreDirty","$omit","save","$shadowRights","copy","rights","uids","all","currentAlarm","AlarmService","$toast","now","Date","browserTime","floor","getTime","alarms","sort","a","x","y","next","pop","utc","alarmTime","delay","f","showAlarm","cancel","AlarmController","scope","reminder","ok","summary","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","msg","perr","LDAPPasswordPolicyError","PolicyNoError","PolicyAccountLocked","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","options","prompt","label","PromptDialogController","o","parent","clickOutsideToClose","escapeToClose","inputType","Gravatar","size","alternate_avatar","hash","s","md5","no_404","_http","_q","_path","_activeUser","$factory","compact","escape","params","flatten","newguid","create","post","id","newValue","download","getFileNameFromHeader","header","trim","type","accept","responseType","cache","transformResponse","fileName","blob","Blob","saveAs","Error","userData","init","$gravatar","search","excludedUsers","dry","when","results","compareUids","isUndefined","$$shortFormat","$shortFormat","$$image","image","c_email","$alternateAvatar","empty","fullname","cn","no_email","$isAnonymous","$isSpecial","$confirmation","some","values","constructor","isEqual","zero","keys","$folders","$$folders","folders","sgFocus","sgAvatarImage","restrict","bindToController","src","link","controllerAs","attrs","imgElement","mdIconElement","css","img","genericImg","sgAvatarImageController","$element","Preferences","getGravatar","defaults","SOGoAlternateAvatar","urlEmail","hideGenericAvatar","showGenericAvatar","addClass","removeClass","ready","old","attributes","directive","sgCheckmarkDirective","$parse","$mdAria","$mdTheming","$mdUtil","compile","tElement","tAttrs","on","hasAttribute","stopImmediatePropagation","ngModelCtrl","parseConstantExpr","expression","fallback","parseFn","listener","ev","$apply","viewValue","$viewValue","trueValue","falseValue","$setViewValue","$render","render","CHECKED_CSS","sgTrueValue","sgFalseValue","fakeNgModel","expectWithText","transclude","require","sgColorPicker","iElement","iAttr","ngModelController","sgColor","sgIconColor","sgColorPickerController","sgColors","setColor","sgCompile","$compile","sgCompileLink","ensureCompileRunsOnce","$eval","contents","sgEnter","ENTER_KEY","which","preventDefault","sgEscape","ESCAPE_KEY","elem","keyCode","sgFocusOn","e","focus","select","sgFolderStylesheet","sgFolderStylesheetController","ngModel","sgGenericAvatarImage","off","console","insertGenericAvatar","avatar","genericAvatar","className","add","parentNode","insertBefore","sgPlaceholder","placeholder","sgSearchPreTransclude","tAttr","inputEl","selectEl","buttonEl","removeAttr","compiledButtonEl","formName","inputName","allowDot","doSearch","cancelSearch","priority","sgSearch","clone","append","sgSearchController","minLength","isNumber","minimumSearchLength","searchTextOptions","updateOn","debounce","blur","onChange","form","input","rawSearchText","$valid","$setValidity","searchField","sgSelectOnly","postLink","autoComplete","getInput","eq","selectedItem","$applyAsync","sgSubscribe","folderType","onFolderSelect","sgSubscribeDialogController","showDialog","templateUrl","sgSubscribeController","$setTouched","selectFolder","folderData","close","timePaneDirective","TimePaneCtrl","controllers","sgTimePaneCtrl","mdInputContainer","timePaneElement","configureNgModel","$attrs","$animate","$mdConstant","$$mdDateUtil","$mdDateLocale","$mdInkRipple","KEY_CODE","dateUtil","nextTimePaneUniqueId","selectedTime","displayTime","isInitialized","hours","displayName","selected","min5","min1","ii","show5min","getToggleBtnLbl","is5min","toggleManual5min","manual5min","tabindex","self","hourClickHandler","displayVal","updated","setHours","Number","setNgModelValue","minuteClickHandler","setMinutes","attachTimePaneEventListeners","SELECTED_TIME_CLASS","FOCUSED_TIME_CLASS","changeSelectedTime","date","previousSelectedTime","changeDisplayTime","prevH","getHours","prevHCell","getElementById","setAttribute","prevM","getMinutes","prevMCell","prevM5Cell","mCell","newH","hCell","newM","isValidDate","buildInitialTimePaneDisplay","today","handleKeyEvent","ESCAPE","TAB","$emit","ENTER","mode","changed","opt_date","previousFocus","timePickerDirective","TimePickerCtrl","mdTimePickerCtrl","$$rAF","dateLocale","inputElement","inputContainer","ngInputElement","timePane","timeButton","inputMask","isFocused","isDisabled","setDisabled","disabled","isTimeOpen","timePaneOpenedFrom","nextUid","bodyClickHandler","handleBodyClick","windowResizeHandler","closeTimePane","installPropertyInterceptors","attachChangeListeners","attachInteractionListeners","detachTimePane","EXTRA_INPUT_SIZE","INVALID_CLASS","DEFAULT_DEBOUNCE_INTERVAL","TIME_PANE_HEIGHT","MIN5","GTXS","XS","MIN1","TIME_PANE_WIDTH","time","formatTime","resizeInputElement","updateErrorState","handleInputEvent","keyCodes","altKey","DOWN_ARROW","openTimePane","$digest","ngDisabled","$parent","Object","defineProperty","set","clearErrorState","field","inputString","arr","h","isDate","attachTimePane","elementRect","getBoundingClientRect","bodyRect","paneTop","top","paneLeft","left","viewportTop","scrollTop","viewportLeft","scrollLeft","viewportBottom","innerHeight","viewportRight","innerWidth","paneWidth","scale","transform","min","paneHeight","width","enableScrolling","removeChild","target","disableScrollAround","nextTick","addEventListener","removeEventListener","getTimePaneCtrl","focusTime","ctrl","setFocused","isInTime","getClosest","sgToggleGrid","flattenedDays","modelDays","sgToggleGridAttr","modelAttr","tiles","tile","includes","day","findIndex","$setDirty","toggleClass","sgTransformOnBlur","mdChipsCtrl","onInputBlur","inputHasFocus","chipBuffer","getChipBuffer","hasAutocomplete","requireMatch","appendChip","resetChipBuffer","sgVariableScrollShrink","prop","String","suffix","pattern","lastIndexOf","_base64_keyStr","base64encode","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","utf8encode","charCodeAt","charAt","fromCharCode","L","k","K","G","I","F","H","q","p","u","aa","Z","D","t","Array","B","J","P","E","v","Y","X","W","V","C","S","Q","N","M","A","z","w","U","T","R","O","capitalize","toUpperCase","slice","asDate","newDate","newString","isValidEmail","emailRE","asCSSIdentifier","characters","escapeds","re","RegExp","timeInterval","interval","parseDate","localeProvider","format","string","formattingTokens","tokens","token","regexes","parsedInput","matchesCount","year","month","%d","%e","%m","%b","shortMonths","%B","months","%y","nearFuture","getFullYear","%Y","match","NaN","daysUpTo","otherDate","days","day1","day2","tmp","nbrDays","round","setTime","minutesTo","delta","dstOffset","valueOf","getTimezoneOffset","stringWithSeparator","separator","getMonth","getDate","getYear","str","addDays","initialDate","milliSeconds","addHours","nbrHours","addMinutes","nbrMinutes","beginOfDay","setSeconds","setMilliseconds","beginOfWeek","firstDayOfWeek","offset","getDay","endOfWeek","getDayString","getHourString","separators","max","validParts","%a","shortDays","%A","%H","%M","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(localeProvider.months, 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 };\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);\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\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\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 = /%[deaAmbByYHIMp]/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 '%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', 'ngOpbeat'])\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 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 })\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', '$opbeatProvider'];\n // function configure($logProvider, $compileProvider, $httpProvider, $mdThemingProvider, $opbeatProvider) {\n configure.$inject = ['$logProvider', '$compileProvider', '$httpProvider', '$mdThemingProvider'];\n function configure($logProvider, $compileProvider, $httpProvider, $mdThemingProvider) {\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\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', // background-50\n 'hue-2': '300',\n 'hue-3': 'A700'\n })\n .backgroundPalette('grey', {\n 'default': '50',\n 'hue-1': '200',\n 'hue-2': '300',\n 'hue-3': '500'\n });\n\n if (!DebugEnabled) {\n // Disable debug data\n $logProvider.debugEnabled(false);\n $compileProvider.debugInfoEnabled(false);\n }\n\n $httpProvider.interceptors.push('AuthInterceptor');\n $httpProvider.interceptors.push('ErrorInterceptor');\n\n // $opbeatProvider.config({\n // orgId: '2493668f7eb84147a18a9d7a06b712c1',\n // appId: 'b84aa21193'\n // });\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}}; }'),\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 * 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/**\n * url - A simple filter to ensure a string to be a URL.\n * @memberof SOGo.Common\n */\n(function () {\n 'use strict';\n\n /**\n * @ngInject\n */\n function url() {\n return function(url) {\n return url.indexOf('://') < 0 ? 'http://' + url : url;\n };\n }\n\n angular.module('SOGo.Common')\n .filter('url', url);\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 = ['$mdDialog', 'Dialog', 'usersWithACL', 'User', 'folder'];\n function AclController($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.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 folder.$acl.$removeUser(user.uid);\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 }, function(error) {\n Dialog.alert(l('Warning'), error);\n });\n }\n }\n\n function selectUser(user) {\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', '$mdSidenav', '$mdToast', '$mdMedia', '$log', 'sgConstant', 'sgSettings', 'Alarm'];\n function navController($rootScope, $scope, $timeout, $interval, $http, $mdSidenav, $mdToast, $mdMedia, $log, sgConstant, sgSettings, Alarm) {\n\n $scope.isPopup = sgSettings.isPopup;\n $scope.activeUser = sgSettings.activeUser();\n $scope.baseURL = sgSettings.baseURL();\n $scope.leftIsClose = !$mdMedia(sgConstant['gt-md']);\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 $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.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);\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) {\n var _this = this,\n param = {uid: uid};\n return Acl.$$resource.fetch(this.folderId, 'removeUserFromAcls', param).then(function() {\n var i = _.indexOf(_.map(_this.users, 'uid'), uid);\n if (i >= 0) {\n _this.users.splice(i, 1);\n }\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', '$mdToast', 'url'];\n function AlarmController(scope, $mdToast, url) {\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(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 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 ' ' + l('Cancel'),\n ' ',\n ' ',\n ' ' + l('OK'),\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","(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', 'Gravatar', function($q, $log, Settings, Resource, Gravatar) {\n angular.extend(User, {\n $q: $q,\n $log: $log,\n $$resource: new Resource(Settings.activeUser('folderURL'), Settings.activeUser()),\n $gravatar: Gravatar,\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 || User.$gravatar(this.c_email, 32, User.$alternateAvatar, {no_404: true});\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 $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 {\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 '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: 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).\n * Based on http://blog.lingohub.com/2014/08/better-ux-with-angularjs-directives/.\n * @memberof SOGo.Common\n * @example:\n \n */\n function sgAvatarImage() {\n return {\n restrict: 'AE',\n scope: {},\n bindToController: {\n size: '@',\n email: '=sgEmail',\n src: '=sgSrc'\n },\n template: [\n 'person', // 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;\n\n vm = this;\n\n // Wait on user's defaults\n Preferences.ready().then(function() {\n $scope.$watch('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 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('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 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\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 '