sogo/UI/WebServerResources/js/Common.js.map
2015-08-25 11:46:14 -04:00

1 line
122 KiB
Plaintext

{"version":3,"file":"Common.js","sources":["Common/utils.js","Common/Common.app.js","Common/decodeUri.filter.js","Common/encodeUri.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/User.service.js","Common/sgFocus.service.js","Common/sgAvatarImage.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/sgSearch.directive.js","Common/sgSubscribe.directive.js","Common/sgTarget.directive.js","Common/sgToggleGrid.directive.js"],"names":["l","key","arguments","value","labels","clabels","i","j","length","replace","configure","$mdThemingProvider","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastLightColors","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","backgroundPalette","angular","module","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","logoff","UserLogoffPath","constant","selection","sm","gt-sm","md","gt-md","lg","gt-lg","config","$inject","decodeUri","$window","decodeURIComponent","filter","encodeUri","encodeURIComponent","loc","range","n","res","parseInt","push","AclController","$mdDialog","Dialog","usersWithACL","User","folder","userFilter","$query","$filter","$acl","users","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","then","data","status","alert","confirmChange","user","confirmation","$confirmRights","vm","showing","message","removeUser","$removeUser","uid","addUser","$addUser","userToAdd","searchText","error","selectUser","selectedUser","$rights","this","controller","navController","$scope","$timeout","$interval","$http","$mdSidenav","$mdBottomSheet","$mdMedia","$log","sgConstant","sgSettings","Alarm","currentDay","window","get","success","secondsBeforeTomorrow","toggleLeft","toggle","debug","toggleRight","openBottomSheet","show","parent","element","document","getElementById","templateUrl","toggleDetailView","detail","toggleClass","$watch","newVal","isGtMedium","getAlarms","Acl","folderId","factory","$q","Settings","Resource","extend","$$resource","$User","prototype","$users","_this","deferred","defer","resolve","promise","fetch","response","forEach","canSubscribeUser","isSubscribed","wasSubscribed","bind","_","indexOf","pluck","userClass","isGroup","reject","splice","$resetRights","deferredSave","deferredSubscribe","action","$rightsAreDirty","$omit","save","$shadowRights","copy","rights","uids","join","all","currentAlarm","AlarmService","$mdToast","$toast","now","Date","browserTime","Math","floor","getTime","alarms","sort","a","b","x","y","next","pop","utc","url","alarmTime","delay","f","showAlarm","cancel","AlarmController","scope","reminder","ok","position","hideDelay","template","summary","locals","Authentication","readCookie","name","foundCookie","prefix","pairs","currentPair","start","cookie","split","charAt","substr","readLoginCookie","loginValues","base64decode","redirectUrl","username","domain","userName","address","baseAddress","altBaseAddress","parts","hostpart","protocol","newAddress","location","href","startsWith","endsWith","getService","passwordPolicyConfig","service","d","password","rememberLogin","loginSuffix","method","loginCookie","expire","grace","msg","perr","LDAPPasswordPolicyError","PolicyNoError","PolicyAccountLocked","changePassword","newPassword","PolicyPasswordModNotAllowed","PolicyInsufficientPasswordQuality","PolicyPasswordTooShort","PolicyPasswordTooYoung","PolicyPasswordInHistory","formatted","PolicyPasswordUnknown","PolicyPasswordSystemUnknown","$get","PolicyPasswordChangeUnsupported","PolicyPasswordExpired","PolicyChangeAfterReset","PolicyMustSupplyOldPassword","provider","DialogService","$modal","title","content","confirm","options","prompt","label","PromptDialogController","o","body","clickOutsideToClose","escapeToClose","inputType","Gravatar","size","hash","s","substring","md5","_http","_q","_path","_activeUser","$factory","userResource","compact","escape","params","flatten","newguid","create","post","id","newValue","remove","userData","init","$gravatar","search","excludedUsers","when","results","index","compareUids","find","each","isUndefined","$$shortFormat","$shortFormat","$$image","image","c_email","empty","fullname","cn","no_email","$isAnonymous","$isSpecial","$confirmation","some","values","isEqual","zero","map","keys","isString","$folders","type","$$folders","folders","toString","sgFocus","$rootScope","$broadcast","sgAvatarImage","restrict","src","bindToController","controllerAs","sgAvatarImageController","$element","attributes","directive","sgColorPicker","$parse","link","iElement","iAttr","doSelect","attr","sgColorPickerController","sgColors","colors","select","color","sgCompile","$compile","sgCompileLink","attrs","ensureCompileRunsOnce","$eval","html","contents","sgEnter","ENTER_KEY","event","which","$apply","preventDefault","sgEscape","ESCAPE_KEY","elem","keyCode","sgFocusOn","$on","e","focus","sgFolderStylesheet","require","ngModel","sgSearchPreTransclude","compile","tElement","tAttr","inputEl","selectEl","buttonEl","removeAttr","compiledButtonEl","doSearch","on","cancelSearch","priority","sgSearch","transclude","clone","append","sgSearchController","previous","searchField","searchTextOptions","updateOn","debounce","blur","onChange","sgSubscribe","folderType","onFolderSelect","sgSubscribeDialogController","showDialog","sgSubscribeController","selectFolder","folderData","sgTarget","sgTargetLink","console","log","ensureTargetRunsOnce","sgToggleGrid","ctrl","day","findIndex","modelDays","modelAttr","tile","ensureInitRunsOnce","tiles","days","isDefined","flattenedDays","sgToggleGridAttr","contains","addClass","String","suffix","pattern","isNumber","lastIndexOf","_base64_keyStr","base64encode","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","input","utf8encode","charCodeAt","isNaN","fromCharCode","L","k","K","G","I","F","H","r","q","p","u","aa","Z","D","t","Array","B","J","P","h","E","v","g","Y","X","W","V","C","S","Q","N","M","A","z","w","m","U","T","R","O","toLowerCase","capitalize","toUpperCase","slice","asDate","newDate","date","formatTime","hours","minutes","newString","daysUpTo","otherDate","day1","day2","tmp","nbrDays","round","setTime","isValidEmail","emailRE","test","asCSSIdentifier","characters","escapeds","re","RegExp","timeInterval","interval","stringWithSeparator","separator","month","getMonth","getDate","year","getYear","str","addDays","milliSeconds","addHours","nbrHours","addMinutes","nbrMinutes","beginOfDay","setHours","setMinutes","setSeconds","setMilliseconds","beginOfWeek","offset","firstDayOfWeek","getDay","endOfWeek","getDayString","getHourString","getHours"],"mappings":"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","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<<d)|(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<F){Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=(aa[Z]|(G.charCodeAt(H)<<d));H++;}Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=aa[Z]|(128<<d);aa[I-2]=F<<3;aa[I-1]=F>>>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;F<k.length;F++){var x=k.charCodeAt(F);if(x<128){d+=String.fromCharCode(x);}else{if((x>127)&&(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<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g);}var i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase();};\n return md5(this.toLowerCase());\n};\n\nString.prototype.capitalize = function() {\n return this.charAt(0).toUpperCase() + this.slice(1);\n};\n\nString.prototype.asDate = function () {\n var newDate;\n var date = this.split(\"/\");\n if (date.length == 3)\n newDate = new Date(date[2], date[1] - 1, date[0]); // dd/mm/yyyy\n else {\n date = this.split(\"-\");\n if (date.length == 3)\n newDate = new Date(date[0], date[1] - 1, date[2]); // yyyy-mm-dd\n else {\n if (this.length == 8) {\n newDate = new Date(this.substring(0, 4),\n this.substring(4, 6) - 1,\n this.substring(6, 8)); // yyyymmdd\n }\n }\n }\n\n return newDate;\n};\n\nString.prototype.formatTime = function(hours, minutes) {\n var newString = this;\n\n // See http://www.gnustep.org/resources/documentation/Developer/Base/Reference/NSCalendarDate.html#method$NSCalendarDate-descriptionWithCalendarFormat$\n var p = 'am', i = hours, m = minutes;\n if (hours > 12) {\n p = 'pm';\n i = hours % 12;\n }\n if (minutes < 10) {\n m = '0' + minutes;\n }\n\n // %H : hour as a decimal number using 24-hour clock\n newString = newString.replace(\"%H\", hours < 10 ? '0' + hours : hours);\n // %I : hour as a decimal number using 12-hour clock\n newString = newString.replace(\"%I\", i < 10 ? '0' + i : i);\n // %M : minute as decimal number\n newString = newString.replace(\"%M\", m);\n // %p : 'am' or 'pm'\n newString = newString.replace(\"%p\", p);\n\n return newString;\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\nString.prototype.isValidEmail = function() {\n var emailRE = /^([\\w\\!\\#$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`{\\|\\}\\~]+\\.)*[\\w\\!\\#$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`{\\|\\}\\~]+@((((([a-z0-9]{1}[a-z0-9\\-]{0,62}[a-z0-9]{1})|[a-z])\\.)+[a-z]{2,})|(\\d{1,3}\\.){3}\\d{1,3}(\\:\\d{1,5})?)$/i;\n return emailRE.test(this);\n};\n\nString.prototype.asCSSIdentifier = function() {\n var characters = [ '_' , '\\\\.', '#' , '@' , '\\\\*', ':' , ',' , ' ', \"'\", '&', '\\\\+' ];\n var escapeds = [ '_U_', '_D_', '_H_', '_A_', '_S_', '_C_', '_CO_', '_SP_', '_SQ_', '_AM_', '_P_' ];\n\n var newString = this;\n for (var i = 0; i < characters.length; i++) {\n var re = new RegExp(characters[i], 'g');\n newString = newString.replace(re, escapeds[i]);\n }\n\n if (/^\\d+/.test(newString)) {\n newString = '_' + newString;\n }\n\n return newString;\n};\n\nString.prototype.timeInterval = function () {\n var interval;\n if (this == \"once_per_hour\")\n interval = 3600;\n else if (this == \"every_minute\")\n interval = 60;\n else {\n interval = parseInt(this.substr(6)) * 60;\n }\n\n return interval;\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 milliSeconds = this.getTime();\n milliSeconds += 86400000 * nbrDays;\n this.setTime(milliSeconds);\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() {\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() {\n var endOfWeek = this.beginOfWeek();\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\nfunction l() {\n var key = arguments[0];\n var value = key;\n if (labels[key]) {\n value = labels[key];\n }\n else if (clabels[key]) {\n value = clabels[key];\n }\n for (var i = 1, j = 0; i < arguments.length; i++, j++) {\n value = value.replace('%{' + j + '}', arguments[i]);\n }\n\n return value;\n}\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.Common', ['ngMaterial'])\n .value('sgSettings', {\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 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 // For some reasons, angular-material's break-points don't match the specs\n // Here we define values according to specs\n .constant('sgConstant', {\n 'sm': '(max-width: 600px)',\n 'gt-sm': '(min-width: 600px)',\n 'md': '(min-width: 600px) and (max-width: 1024px)',\n 'gt-md': '(min-width: 1025px)',\n 'lg': '(min-width: 1024px) and (max-width: 1280px)',\n 'gt-lg': '(min-width: 1280px)'\n })\n\n .config(configure);\n\n configure.$inject = ['$mdThemingProvider'];\n function configure($mdThemingProvider) {\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 'A200': '69f0ae',\n 'A400': '00e676',\n 'A700': '00c853',\n 'contrastDefaultColor': 'dark',\n 'contrastDarkColors': '50 100 200',\n 'contrastLightColors': '300 400 500 600 700 800 900'\n });\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 $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 // .primaryColor will soon be deprecated in favor of primaryPalette (already on dev builds https://groups.google.com/forum/m/#!topic/ngmaterial/-sXR8CYBMPg)\n $mdThemingProvider.theme('default')\n .primaryPalette('sogo-blue', {\n 'default': '300',\n 'hue-1': '100',\n 'hue-2': '400',\n 'hue-3': 'A700'\n })\n .accentPalette('sogo-green', {\n 'default': '500',\n 'hue-1': '200',\n 'hue-2': '300',\n 'hue-3': 'A700'\n })\n .backgroundPalette('sogo-paper', {\n 'default': '100',\n 'hue-1': '200',\n 'hue-2': '50',\n 'hue-3': '500'\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/**\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 = ['$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.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();\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).catch(function(data, status) {\n Dialog.alert(l('Warning'), l('An error occured please try again.'));\n });\n }\n\n function addUser(data) {\n if (data) {\n folder.$acl.$addUser(data).then(function() {\n vm.userToAdd = '';\n vm.searchText = '';\n }, function(error) {\n Dialog.alert(l('Warning'), error);\n });\n }\n }\n\n function selectUser(user) {\n if (vm.selectedUser == user) {\n vm.selectedUser = null;\n }\n else {\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 = ['$scope', '$timeout', '$interval', '$http', '$mdSidenav', '$mdBottomSheet', '$mdMedia', '$log', 'sgConstant', 'sgSettings', 'Alarm'];\n function navController($scope, $timeout, $interval, $http, $mdSidenav, $mdBottomSheet, $mdMedia, $log, sgConstant, sgSettings, Alarm) {\n\n $scope.activeUser = sgSettings.activeUser();\n $scope.baseURL = sgSettings.baseURL();\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').success(function(data) {\n $scope.currentDay = data;\n });\n }, 24 * 3600 * 1000);\n }, window.currentDay.secondsBeforeTomorrow * 1000);\n\n $scope.toggleLeft = function () {\n $mdSidenav('left').toggle()\n .then(function () {\n $log.debug(\"toggle left is done\");\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 });\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 * @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() {\n var _this = this,\n deferred = Acl.$q.defer(),\n user;\n if (this.users) {\n deferred.resolve(this.users);\n }\n else {\n return Acl.$$resource.fetch(this.folderId, '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);\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 * @see {@link User.$filter}\n */\n Acl.prototype.$addUser = function(user) {\n var _this = this,\n deferred = Acl.$q.defer(),\n param = {uid: user.uid};\n if (!user.uid || _.indexOf(_.pluck(this.users, 'uid'), user.uid) > -1) {\n // No UID specified or user already in ACLs\n deferred.resolve();\n }\n else {\n Acl.$$resource.fetch(this.folderId, 'addUserInAcls', param).then(function() {\n user.wasSubscribed = false;\n user.userClass = user.isGroup ? 'group-user' : 'normal-user';\n user.$rights = angular.bind(user, user.$acl, _this.folderId);\n _this.users.push(user);\n deferred.resolve(_this.users);\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(_.pluck(_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 * @return a promise that resolved only if the modifications and subscriptions were successful\n */\n Acl.prototype.$saveUsersRights = function() {\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 Acl.$$resource.save(this.folderId, users, param)\n .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 '<md-toast>',\n ' <md-input-container>',\n ' <label style=\"color: white;\">' + data.summary + '</label>',\n ' <md-select ng-model=\"reminder\">',\n ' <md-option value=5>',\n l('5 minutes'),\n ' </md-option>',\n ' <md-option value=10>',\n l('10 minutes'),\n ' </md-option>',\n ' <md-option value=15>',\n l('15 minutes'),\n ' </md-option>',\n ' <md-option value=30>',\n l('30 minutes'),\n ' </md-option>',\n ' <md-option value=45>',\n l('45 minutes'),\n ' </md-option>',\n ' <md-option value=60>',\n l('1 hour'),\n ' </md-option>',\n ' <md-option value=1440>',\n l('1 day'),\n ' </md-option>',\n ' </md-select>',\n ' </md-input-container>',\n ' <md-button ng-click=\"cancel()\">',\n l('Cancel'),\n ' </md-button>',\n ' <md-button ng-click=\"ok()\">',\n l('Ok'),\n ' </md-button>',\n '</md-toast>'\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', [])\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 // TODO: convert to a Factory recipe?\n .provider('Authentication', Authentication);\n\n function Authentication() {\n function readCookie(name) {\n var foundCookie, prefix, pairs, i, currentPair, start;\n foundCookie = null;\n prefix = name + '=';\n pairs = document.cookie.split(';');\n for (i = 0; !foundCookie && i < pairs.length; i++) {\n currentPair = pairs[i];\n start = 0;\n while (currentPair.charAt(start) == ' ')\n start++;\n if (start > 0)\n currentPair = currentPair.substr(start);\n if (currentPair.indexOf(prefix) === 0)\n foundCookie = currentPair.substr(prefix.length);\n }\n\n return foundCookie;\n }\n\n function readLoginCookie() {\n var loginValues = null,\n cookie = readCookie('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 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', 'passwordPolicyConfig'];\n function getService($q, $http, passwordPolicyConfig) {\n var _this = this, service;\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 }).success(function(data, status) {\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 }).error(function(data, status) {\n var msg, perr;\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 = _this.readLoginCookie();\n\n $http({\n method: 'POST',\n url: '/SOGo/so/changePassword',\n data: {\n userName: loginCookie[0],\n password: loginCookie[1],\n newPassword: newPassword }\n }).success(function(data, status) {\n d.resolve();\n }).error(function(data, status) {\n var error,\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 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 .content(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 .content(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 '<md-dialog flex=\"50\" flex-sm=\"100\">',\n ' <md-dialog-content layout=\"column\">',\n ' <h2 class=\"md-title\" ng-bind=\"title\"></h2>',\n ' <md-input-container>',\n ' <label>' + label + '</label>',\n ' <input type=\"' + (o.inputType || 'text') + '\"',\n ' aria-label=\"' + title + '\"',\n ' ng-model=\"name\" required=\"required\"/>',\n ' </md-input-container>',\n ' </md-dialog-content>',\n ' <div class=\"md-actions\">',\n ' <md-button ng-click=\"cancel()\">',\n ' ' + l('Cancel'),\n ' </md-button>',\n ' <md-button class=\"md-primary\" ng-click=\"ok()\" ng-disabled=\"!name.length\">',\n ' ' + l('OK'),\n ' </md-button>',\n ' </div>',\n '</md-dialog>'\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 * @ngInject\n */\n function Gravatar() {\n return function(email, size) {\n var x, y, hash, s = size;\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 // return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=identicon';\n return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=wavatar';\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 .success(deferred.resolve)\n .error(function(data, status) {\n if (status == 404)\n return deferred.reject();\n });\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 .success(deferred.resolve)\n .error(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 .success(deferred.resolve)\n .error(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 .success(deferred.resolve)\n .error(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 deferred = this._q.defer(),\n action = (options && options.action)? options.action : 'save';\n\n return this.post(id, action, newValue);\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 .success(deferred.resolve)\n .error(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) {\n var param = {search: search};\n var _this = this;\n\n if (!search) {\n // No query specified\n User.$users = [];\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 return User.$$resource.fetch(null, 'usersSearch', param).then(function(response) {\n var results, index, user,\n compareUids = function(data) {\n return _this.uid == data.uid;\n };\n if (excludedUsers) {\n // Remove excluded users from response\n results = _.filter(response.users, function(data) {\n return !_.find(excludedUsers, compareUids, user);\n });\n }\n else {\n results = response.users;\n }\n // Remove users that no longer match the search query\n for (index = User.$users.length - 1; index >= 0; index--) {\n user = User.$users[index];\n if (!_.find(results, compareUids, user)) {\n User.$users.splice(index, 1);\n }\n }\n // Add new users matching the search query\n _.each(results, function(data, index) {\n if (_.isUndefined(_.find(User.$users, compareUids, data))) {\n var user = new User(data);\n User.$users.splice(index, 0, user);\n }\n });\n User.$log.debug(User.$users);\n return User.$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);\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 * @return a promise\n */\n User.prototype.$acl = function(folderId) {\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 User.$$resource.fetch(folderId, 'userRights', param).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() {\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 confirmation = l('Potentially anyone on the Internet will be able to access your folder, even if they do not have an account on this system. Is this information suitable for the public Internet?');\n }\n else if (this.uid == '<default>') {\n confirmation = l('Any user with an account on this system will be able to access your folder. Are you certain you trust them all?');\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.\n * Based on http://blog.lingohub.com/2014/08/better-ux-with-angularjs-directives/.\n * @memberof SOGo.Common\n * @example:\n <sg-avatar-image sg-email=\"test@email.com\" size=\"50\"></sg-avatar-image>\n */\n function sgAvatarImage() {\n return {\n restrict: 'AE',\n replace: true,\n scope: {\n size: '@',\n email: '=sgEmail',\n src: '=sgSrc'\n },\n template: '<img ng-src=\"{{vm.url}}\"/>',\n bindToController: true,\n controller: 'sgAvatarImageController',\n controllerAs: 'vm'\n };\n }\n\n /**\n * @ngInject\n */\n sgAvatarImageController.$inject = ['$scope', '$element', 'Gravatar'];\n function sgAvatarImageController($scope, $element, Gravatar) {\n var vm = this;\n\n $scope.$watch('vm.email', function(email) {\n if (email && !vm.url) {\n vm.url = Gravatar(email, vm.size);\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 vm.url = src;\n }\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 /* jshint validthis: true */\n 'use strict';\n\n /*\n * sgColorPicker - Color picker widget\n * @restrict element\n * @param {function} sgOnSelect - the function to call when clicking on a color.\n * One variable is available: color.\n * @ngInject\n * @example:\n\n <sg-color-picker sg-on-select=\"properties.calendar.color = color\"></sg-color-picker>\n */\n sgColorPicker.$inject = ['$parse'];\n function sgColorPicker($parse) {\n return {\n restrict: 'E',\n template: [\n '<md-menu>',\n ' <md-button class=\"sg-icon-button\"',\n ' label:aria-label=\"Options\"',\n ' ng-click=\"$mdOpenMenu()\"',\n ' md-menu-origin=\"md-menu-origin\">',\n ' <md-icon>color_lens</md-icon>',\n ' </md-button>',\n ' <md-menu-content class=\"md-padding\" width=\"3\">',\n ' <md-grid-list class=\"sg-color-picker\" md-cols=\"7\" md-row-height=\"1:1\" md-gutter=\"0.5em\">',\n ' <md-grid-tile ng-repeat=\"color in $sgColorPickerController.colors\"',\n ' ng-style=\"{ \\'background-color\\': color }\"',\n ' ng-click=\"$sgColorPickerController.select(color)\"></md-grid-tile>',\n ' </md-grid-list>',\n ' </md-menu-content>',\n '</md-menu>'\n ].join(''),\n replace: true,\n bindToController: true,\n controller: sgColorPickerController,\n controllerAs: '$sgColorPickerController',\n link: link\n };\n\n function link(scope, iElement, iAttr, controller) {\n // Associate callback to controller\n controller.doSelect = $parse(iElement.attr('sg-on-select'));\n }\n }\n \n /**\n * @ngInject\n */\n sgColorPickerController.$inject = ['$scope', 'sgColors'];\n function sgColorPickerController($scope, sgColors) {\n var vm = this;\n\n vm.colors = sgColors.selection;\n vm.select = function(color) {\n vm.doSelect($scope, { color: color });\n };\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgColorPicker', sgColorPicker);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCompile - Assign an expression to a DOM element and compile it.\n * @memberof SOGo.Common\n * @restrict attribute\n * @param {object} sgCompile - the expression to compile\n * @ngInject\n * @example:\n\n <div sg-compile=\"part.content\"><!-- msg --></div>\n */\n sgCompile.$inject = ['$compile'];\n function sgCompile($compile) {\n return {\n restrict: 'A',\n link: sgCompileLink\n };\n\n function sgCompileLink(scope, element, attrs) {\n var ensureCompileRunsOnce = scope.$watch(\n function(scope) {\n // Watch the sg-compile expression for changes\n return scope.$eval(attrs.sgCompile);\n },\n function(value) {\n // When the sg-compile expression changes, assign it into the current DOM\n element.html(value);\n \n // Compile the new DOM and link it to the current scope.\n // NOTE: we only compile .childNodes so that we don't get into infinite loop compiling ourselves\n $compile(element.contents())(scope);\n \n // Use un-watch feature to ensure compilation happens only once.\n ensureCompileRunsOnce();\n }\n );\n }\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgCompile', sgCompile);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * sgEnter - A directive evaluated when the enter key is pressed\n * @memberof SOGo.Common\n * @ngInject\n * @example:\n\n <input type=\"text\"\n sg-enter=\"save($index)\" />\n */\n function sgEnter() {\n var ENTER_KEY = 13;\n return function(scope, element, attrs) {\n element.bind(\"keydown keypress\", function(event) {\n if (event.which === ENTER_KEY) {\n scope.$apply(function() {\n scope.$eval(attrs.sgEnter);\n });\n event.preventDefault();\n }\n });\n };\n }\n \n angular\n .module('SOGo.Common')\n .directive('sgEnter', sgEnter);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * sgEscape - A directive evaluated when the escape key is pressed\n * @memberof SOGo.Common\n * @ngInject\n * @example:\n\n <input type=\"text\"\n sg-escape=\"revertEditing($index)\" />\n */\n function sgEscape() {\n var ESCAPE_KEY = 27;\n return function(scope, elem, attrs) {\n elem.bind('keydown', function(event) {\n if (event.keyCode === ESCAPE_KEY) {\n scope.$apply(attrs.sgEscape);\n }\n });\n };\n }\n \n angular\n .module('SOGo.Common')\n .directive('sgEscape', sgEscape);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * sgFocusOn - A directive that sets the focus on its element when the specified string is broadcasted\n * @memberof SOGo.Common\n * @see {@link SOGo.Common.sgFocus}\n * @ngInject\n * @example:\n\n <input type=\"text\"\n sg-focus-on=\"username\" />\n */\n function sgFocusOn() {\n return function(scope, elem, attr) {\n scope.$on('sgFocusOn', function(e, name) {\n if (name === attr.sgFocusOn) {\n elem[0].focus();\n elem[0].select();\n }\n });\n };\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgFocusOn', sgFocusOn);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgFolderStylesheet - Add CSS stylesheet for folder (addressbook or calendar)\n * @memberof SOGo.Common\n * @restrict attribute\n * @param {object} ngModel - the object literal describing the folder (an Addressbook or Calendar instance)\n * @example:\n\n <div sg-folder-stylesheet=\"true\"\n ng-repeat=\"calendar in calendars.list\"\n ng-model=\"calendar\" />\n </div>\n */\n function sgFolderStylesheet() {\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n ngModel: '='\n },\n template: [\n '<style type=\"text/css\">',\n ' .bg-folder{{ ngModel.id }} {',\n ' background-color: {{ ngModel.color }} !important;',\n ' }',\n ' .fg-folder{{ ngModel.id }} {',\n ' color: {{ ngModel.color }} !important;',\n ' }',\n ' .checkbox-folder{{ ngModel.id }} .md-icon {',\n ' background-color: {{ ngModel.color }} !important;',\n ' }',\n '</style>'\n ].join('')\n };\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgFolderStylesheet', sgFolderStylesheet);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n /* jshint validthis: true */\n 'use strict';\n\n /*\n * sgSearch - Search within a list of items\n * @memberof SOGo.Common\n * @restrict attribute\n * @param {function} sgSearch - the function to call when performing a search.\n * Two variables are available: searchField and searchText.\n * @example:\n\n <div sg-search=\"mailbox.$filter({ sort: 'date', asc: false }, [{ searchBy: searchField, searchInput: searchText }])\">\n <md-button class=\"sg-icon-button\"\n sg-search-cancel=\"ctrl.cancelSearch()\">\n <md-icon>arrow_back</md-icon>\n </md-button>\n <md-input-container>\n <input name=\"search\" type=\"search\"/>\n </md-input-container>\n <md-select class=\"sg-toolbar-sort md-contrast-light\">\n <md-option value=\"subject\">Subject</md-option>\n <md-option value=\"sender\">sender</md-option>\n </md-select>\n </div>\n */\n sgSearchPreTransclude.$inject = ['$parse'];\n function sgSearchPreTransclude($parse) {\n return {\n restrict: 'A',\n controller: 'sgSearchController',\n controllerAs: '$sgSearchController',\n priority: 1001,\n compile: compile\n };\n\n function compile(tElement, tAttr) {\n var mdInputEl = tElement.find('md-input-container'),\n inputEl = tElement.find('input'),\n selectEl = tElement.find('md-select'),\n buttonEl = tElement.find('md-button');\n\n inputEl.attr('ng-model', '$sgSearchController.searchText');\n inputEl.attr('ng-model-options', '$sgSearchController.searchTextOptions');\n inputEl.attr('ng-change', '$sgSearchController.onChange()');\n if (selectEl) {\n selectEl.attr('ng-model', '$sgSearchController.searchField');\n selectEl.attr('ng-change', '$sgSearchController.onChange()');\n }\n if (buttonEl && buttonEl.attr('sg-search-cancel')) {\n buttonEl.attr('ng-click', buttonEl.attr('sg-search-cancel'));\n buttonEl.removeAttr('sg-search-cancel');\n }\n else {\n buttonEl = null;\n }\n\n return function postLink(scope, iElement, iAttr, controller) {\n var compiledButtonEl = iElement.find('button');\n\n // Associate callback to controller\n controller.doSearch = $parse(iElement.attr('sg-search'));\n\n // Reset the input field when cancelling the search\n if (buttonEl && compiledButtonEl) {\n compiledButtonEl.on('click', controller.cancelSearch);\n }\n };\n }\n }\n\n function sgSearch() {\n return {\n restrict: 'A',\n priority: 1000,\n transclude: true,\n compile: compile\n };\n\n function compile(tElement, tAttr) {\n return function postLink(scope, iElement, iAttr, controller, transclude) {\n transclude(function(clone) {\n iElement.append(clone);\n });\n };\n }\n }\n\n /**\n * @ngInject\n */\n sgSearchController.$inject = ['$scope', '$element'];\n function sgSearchController($scope, $element) {\n var vm = this;\n\n // Controller variables\n vm.previous = { searchText: '', searchField: '' };\n vm.searchText = null;\n\n // Model options\n vm.searchTextOptions = {\n updateOn: 'default blur',\n debounce: {\n default: 300,\n blur: 0\n }\n };\n\n // Method to call on data changes\n vm.onChange = function() {\n if (vm.searchText !== null) {\n if (vm.searchText != vm.previous.searchText || vm.searchField != vm.previous.searchField) {\n if (vm.searchText.length > 2 || vm.searchText.length === 0) {\n // doSearch is the compiled expression of the sg-search attribute\n vm.doSearch($scope, { searchText: vm.searchText, searchField: vm.searchField });\n }\n vm.previous = { searchText: vm.searchText, searchField: vm.searchField };\n }\n }\n };\n\n // Reset input field when cancelling the search\n vm.cancelSearch = function() {\n vm.searchText = \"\";\n };\n }\n\n angular\n .module('SOGo.Common')\n .controller('sgSearchController', sgSearchController)\n .directive('sgSearch', sgSearchPreTransclude)\n .directive('sgSearch', sgSearch);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n /* jshint validthis: true */\n 'use strict';\n\n /*\n * sgSubscribe - Common subscription widget\n * @restrict attribute\n * @param {string} sgSubscribe - the folder type\n * @param {function} sgSubscribeOnSelect - the function to call when subscribing to a folder.\n * One variable is available: folderData.\n * @ngInject\n * @example:\n\n <md-button sg-subscribe=\"contact\" sg-subscribe-on-select=\"subscribeToFolder\">Subscribe ..</md-button>\n */\n sgSubscribe.$inject = ['User'];\n function sgSubscribe(User) {\n return {\n restrict: 'A',\n scope: {\n folderType: '@sgSubscribe',\n onFolderSelect: '&sgSubscribeOnSelect'\n },\n replace: false,\n bindToController: true,\n controller: sgSubscribeDialogController,\n controllerAs: '$sgSubscribeDialogController',\n link: link\n };\n }\n\n function link(scope, element, attrs, controller) {\n var inputEl = element.find('input');\n element.on('click', controller.showDialog);\n }\n\n /**\n * @ngInject\n */\n sgSubscribeDialogController.$inject = ['$mdDialog'];\n function sgSubscribeDialogController($mdDialog) {\n var vm = this;\n vm.showDialog = function() {\n $mdDialog.show({\n templateUrl: '../Contacts/UIxContactsUserFolders',\n clickOutsideToClose: true,\n locals: {\n folderType: vm.folderType,\n onFolderSelect: vm.onFolderSelect\n },\n controller: sgSubscribeController,\n controllerAs: 'subscribe'\n });\n };\n }\n\n /**\n * @ngInject\n */\n sgSubscribeController.$inject = ['folderType', 'onFolderSelect', 'User'];\n function sgSubscribeController(folderType, onFolderSelect, User) {\n var vm = this;\n\n vm.selectedUser = null;\n vm.users = User.$users;\n\n vm.searchTextOptions = {\n updateOn: 'default blur',\n debounce: {\n default: 300,\n blur: 0\n }\n };\n\n vm.onChange = function() {\n User.$filter(vm.searchText).then(function() {\n if (vm.selectedUser) {\n // If selected user is no longer part of the matching users, unselect it\n if (_.isUndefined(_.find(User.$users, function(user) {\n return user.uid == vm.selectedUser.uid;\n }))) {\n vm.selectedUser = null;\n }\n }\n });\n };\n\n vm.selectUser = function(i) {\n if (vm.selectedUser == vm.users[i]) {\n vm.selectedUser = null;\n }\n else {\n // Fetch folders of specific type for selected user\n vm.users[i].$folders(folderType).then(function() {\n vm.selectedUser = vm.users[i];\n });\n }\n };\n\n // Callback upon subscription to a folder\n vm.selectFolder = function(folder) {\n onFolderSelect({folderData: folder});\n };\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgSubscribe', sgSubscribe);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgTarget - Replace target for <a href> in DOM.\n * @memberof SOGo.Common\n * @restrict attribute\n * @param {object} sgTarget - the expression to process\n * @ngInject\n * @example:\n\n <div sg-target=\"part.content\"><!-- msg --></div>\n */\n function sgTarget() {\n return {\n priority: 1,\n restrict: 'A',\n link: sgTargetLink\n };\n\n function sgTargetLink(scope, element, attrs) {\n console.log(\"sgTargetLink...\");\n\n var ensureTargetRunsOnce = scope.$watch(\n function(scope) {\n // Watch the sg-target expression for changes\n return scope.$eval(attrs.sgTarget);\n },\n function(value) {\n \n var onAnchorClick = function (event) {\n if (this.href)\n window.open(this.href);\n if (event) {\n if (event.preventDefault)\n event.preventDefault(); // W3C DOM\n else\n event.returnValue = false; // IE\n }\n };\n //var anchors = angular.element(value)[0].getElementsByTagName('a');\n //for (var i = 0; i < anchors.length; i++) {\n //var anchor = angular.element(anchors[i]);\n // if (!anchor.href && anchor.readAttribute(\"moz-do-not-send\")) {\n // anchor.writeAttribute(\"moz-do-not-send\", false);\n // anchor.removeClassName(\"moz-txt-link-abbreviated\");\n // anchor.href = \"mailto:\" + anchors[i].innerHTML;\n // }\n // if (anchor.href.substring(0,7) == \"mailto:\") {\n // anchor.observe(\"click\", onEmailTo);\n // if (typeof onEmailAddressClick == 'function')\n // anchor.observe(\"contextmenu\", onEmailAddressClick);\n // anchor.writeAttribute(\"moz-do-not-send\", false);\n // }\n // els\n //if (!anchor.id)\n // anchor.observe(\"click\", onAnchorClick);\n //}\n\n element.html(value);\n ensureTargetRunsOnce();\n }\n );\n }\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgTarget', sgTarget);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgToggleGrid - Convert the tiles of a grid to toggle buttons\n * @memberof SOGo.Common\n * @restrict attribute\n * @param {object} sgToggleGrid - the model of the source objects\n * @param {string} [sgToggleGridAttr] - the attribute that specifies if an object is enabled (toggled)\n * @ngInject\n * @example:\n\n <md-grid-list md-cols=\"7\" md-row-height=\"1:1\"\n sg-toggle-grid=\"editor.event.repeat.days\"\n sg-toggle-grid-attr=\"day\">..</md-grid-list>\n */\n sgToggleGrid.$inject = ['$parse'];\n function sgToggleGrid($parse) {\n return {\n restrict: 'A',\n link: link\n };\n\n function link(scope, iElement, attrs, ctrl) {\n var tiles = iElement.find('md-grid-tile'),\n tile,\n i,\n modelDays,\n modelAttr,\n ensureInitRunsOnce,\n toggleClass;\n\n ensureInitRunsOnce = scope.$watch(function() {\n // Parse attribute until it returns a valid object\n return $parse(attrs.sgToggleGrid)(scope);\n }, function(days) {\n if (angular.isDefined(days)) {\n var flattenedDays = days;\n modelDays = days;\n if (attrs.sgToggleGridAttr) {\n modelAttr = attrs.sgToggleGridAttr;\n flattenedDays = _.pluck(days, attrs.sgToggleGridAttr);\n }\n _.each(tiles, function(o) {\n var tile = angular.element(o);\n if (_.contains(flattenedDays, tile.attr('value'))) {\n tile.addClass('sg-active');\n }\n });\n ensureInitRunsOnce();\n }\n });\n\n toggleClass = function() {\n // Toggle class on click event and call toggle function\n var tile = angular.element(this),\n day = tile.attr('value');\n tile.toggleClass('sg-active');\n toggle(day);\n };\n\n for (i = 0; i < tiles.length; i++) {\n tile = angular.element(tiles[i]);\n tile.addClass('iconButton');\n tile.find('figure').addClass('md-icon');\n tile.on('click', toggleClass);\n }\n\n function toggle(day) {\n var i = _.findIndex(modelDays, function(o) {\n if (modelAttr)\n return o[modelAttr] == day;\n else\n return o == day;\n });\n if (i < 0) {\n if (modelAttr) {\n var o = {};\n o[modelAttr] = day;\n modelDays.push(o);\n }\n else\n modelDays.push(day);\n }\n else\n modelDays.splice(i, 1);\n }\n }\n }\n\n angular\n .module('SOGo.Common')\n .directive('sgToggleGrid', sgToggleGrid);\n})();\n"]}