sogo/UI/WebServerResources/js/Common.js
Francis Lachapelle 369060a52f (js/css) Update generated files
With Angular Material 0.11.3
2015-10-13 16:05:39 -04:00

4 lines
64 KiB
JavaScript

function l(){var key=arguments[0],value=key;labels[key]?value=labels[key]:clabels[key]&&(value=clabels[key]);for(var i=1,j=0;i<arguments.length;i++,j++)value=value.replace("%{"+j+"}",arguments[i]);return value}!function(){"use strict";function configure($logProvider,$compileProvider,$mdThemingProvider){$mdThemingProvider.definePalette("sogo-green",{50:"eaf5e9",100:"cbe5c8",200:"aad6a5",300:"88c781",400:"66b86a",500:"56b04c",600:"4da143",700:"388e3c",800:"367d2e",900:"225e1b",A100:"b9f6ca",A200:"69f0ae",A400:"00e676",A700:"00c853",contrastDefaultColor:"dark",contrastDarkColors:["50","100","200"],contrastLightColors:["300","400","500","600","700","800","900"]}),$mdThemingProvider.definePalette("sogo-blue",{50:"f0faf9",100:"e1f5f3",200:"ceebe8",300:"bfe0dd",400:"b2d6d3",500:"a1ccc8",600:"8ebfbb",700:"7db3b0",800:"639997",900:"4d8080",A100:"d4f7fa",A200:"c3f5fa",A400:"53e3f0",A700:"00b0c0",contrastDefaultColor:"dark",contrastDarkColors:["50","100","200"],contrastLightColors:["300","400","500","600","700","800","900","A100","A200","A400","A700"]}),$mdThemingProvider.definePalette("sogo-paper",{50:"fcf7f8",100:"f7f1dc",200:"ede5ca",300:"e6d8ba",400:"e2d2a3",500:"d6c48d",600:"baa870",700:"857545",800:"524517",900:"433809",1000:"000000",A100:"ffffff",A200:"eeeeee",A400:"bdbdbd",A700:"616161",contrastDefaultColor:"dark",contrastLightColors:["800","900"]}),$mdThemingProvider.theme("default").primaryPalette("sogo-blue",{"default":"500","hue-1":"100","hue-2":"400","hue-3":"A700"}).accentPalette("sogo-green",{"default":"500","hue-1":"200","hue-2":"300","hue-3":"A700"}).backgroundPalette("grey",{"default":"A100","hue-1":"200","hue-2":"300","hue-3":"500"}),DebugEnabled||($logProvider.debugEnabled(!1),$compileProvider.debugInfoEnabled(!1))}angular.module("SOGo.Common",["ngAnimate","ngMaterial","mdColors"]).value("sgSettings",{isPopup:document.body.classList.contains("popup"),baseURL:function(){return ApplicationBaseURL||null},activeUser:function(param){var settings={login:UserLogin||null,identification:UserIdentification||null,email:UserEmail||null,language:UserLanguage||null,folderURL:UserFolderURL||null,isSuperUser:IsSuperUser||null,path:{calendar:UserCalendarPath||null,contacts:UserContactsPath||null,mail:UserMailPath||null,preferences:UserPreferencesPath||null,administration:IsSuperUser?UserAdministrationPath:null,logoff:UserLogoffPath||null}};return param?settings[param]:settings}}).constant("sgColors",{selection:["#FFFFFF","#330033","#C0C0C0","#999999","#666666","#333333","#000000","#FFCCCC","#FF6666","#FF0000","#CC0000","#990000","#660000","#330000","#FFCC99","#FF9966","#FF9900","#FF6600","#CC6600","#993300","#663300","#FFFF99","#FFFF66","#FFCC66","#FFCC33","#CC9933","#996633","#663333","#FFFFCC","#FFFF33","#FFFF00","#FFCC00","#999900","#666600","#333300","#CCCCCC","#66FF99","#33FF33","#33CC00","#009900","#006600","#003300","#99FFFF","#33FFFF","#66CCCC","#00CCCC","#339999","#336666","#003333","#CCFFFF","#66FFFF","#33CCFF","#3366FF","#3333FF","#000099","#000066","#CCCCFF","#9999FF","#6666CC","#6633FF","#6600CC","#333399","#330099","#FFCCFF","#FF99FF","#CC66CC","#CC33CC","#993399","#663366","#99FF99"]}).constant("sgConstant",{sm:"(max-width: 600px)","gt-sm":"(min-width: 600px)",md:"(min-width: 600px) and (max-width: 1024px)","gt-md":"(min-width: 1025px)",lg:"(min-width: 1024px) and (max-width: 1280px)","gt-lg":"(min-width: 1280px)"}).config(configure),configure.$inject=["$logProvider","$compileProvider","$mdThemingProvider"]}(),function(){"use strict";function configure($mdThemingProvider){_$mdThemingProvider=$mdThemingProvider}function runBlock($interpolate,$document,$log){function buildCssSelectors(selectors){var result=selectors.join("");return result}function addRule(fgInterpolate,bgInterpolate,themeName,paletteName,colorArray,hueName){if(colorArray){var colorValue="rgb("+colorArray.value[0]+","+colorArray.value[1]+","+colorArray.value[2]+")";customSheet.insertRule(fgInterpolate({theme:themeName,palette:paletteName,value:colorValue,hue:hueName}),index),index+=1,customSheet.insertRule(bgInterpolate({theme:themeName,palette:paletteName,value:colorValue,hue:hueName}),index),index+=1}}function addBorderRule(bdrInterpolate,themeName,paletteName,colorArray,hueName){if(colorArray){var colorValue="rgb("+colorArray.value[0]+","+colorArray.value[1]+","+colorArray.value[2]+")";customSheet.insertRule(bdrInterpolate({theme:themeName,palette:paletteName,value:colorValue,hue:hueName}),index),index+=1}}function getStyleSheet(){var style=$document[0].head.querySelector('style[title="Dynamic-Generated-by-mdColors"]');return null===style&&(style=$document[0].createElement("style"),style.title="Dynamic-Generated-by-mdColors",style.appendChild($document[0].createTextNode("")),$document[0].head.appendChild(style)),style.sheet}for(var fgDefault=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-fg"])+" { color:{{value}};}"),bgDefault=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-bg"])+" { background-color:{{value}};}"),bdrDefault=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-bdr"])+" { border-color:{{value}};}"),fgDefaultHue=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{hue}}",".md-fg"])+" { color:{{value}};}"),bgDefaultHue=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{hue}}",".md-bg"])+" { background-color:{{value}};}"),fgColor=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{palette}}",".md-fg"])+" { color:{{value}};}"),bgColor=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{palette}}",".md-bg"])+" { background-color:{{value}};}"),bdrColor=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{palette}}",".md-bdr"])+" { border-color:{{value}};}"),fgHue=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{palette}}.md-{{hue}}",".md-fg"])+" { color:{{value}};}"),bgHue=$interpolate(buildCssSelectors([".md-{{theme}}-theme",".md-{{palette}}.md-{{hue}}",".md-bg"])+" { background-color:{{value}};}"),customSheet=getStyleSheet(),index=0;customSheet.cssRules.length>0;)customSheet.deleteRule(0);angular.forEach(_$mdThemingProvider._THEMES,function(theme,themeName){addRule(fgDefault,bgDefault,themeName,"primary",_$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues["default"]]),addRule(fgDefaultHue,bgDefaultHue,themeName,"primary",_$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues["hue-2"]],"hue-2"),addRule(fgDefaultHue,bgDefaultHue,themeName,"primary",_$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues["hue-3"]],"hue-3"),addRule(fgDefaultHue,bgDefaultHue,themeName,"primary",_$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues["hue-1"]],"hue-1"),addBorderRule(bdrDefault,themeName,"primary",_$mdThemingProvider._PALETTES[theme.colors.primary.name][theme.colors.primary.hues["default"]]),angular.forEach(theme.colors,function(color,paletteName){addRule(fgColor,bgColor,themeName,paletteName,_$mdThemingProvider._PALETTES[color.name][color.hues["default"]]),addBorderRule(bdrColor,themeName,paletteName,_$mdThemingProvider._PALETTES[color.name][color.hues["default"]]),addRule(fgHue,bgHue,themeName,paletteName,_$mdThemingProvider._PALETTES[color.name][color.hues["hue-2"]],"hue-2"),addRule(fgHue,bgHue,themeName,paletteName,_$mdThemingProvider._PALETTES[color.name][color.hues["hue-3"]],"hue-3"),addRule(fgHue,bgHue,themeName,paletteName,_$mdThemingProvider._PALETTES[color.name][color.hues["hue-1"]],"hue-1")})})}var _$mdThemingProvider;angular.module("mdColors",["ngMaterial"]).config(configure).run(runBlock),configure.$inject=["$mdThemingProvider"],runBlock.$inject=["$interpolate","$document","$log"]}(),function(){"use strict";function decodeUri($window){return $window.decodeURIComponent}decodeUri.$inject=["$window"],angular.module("SOGo.Common").filter("decodeUri",decodeUri)}(),function(){"use strict";function encodeUri($window){return $window.encodeURIComponent}encodeUri.$inject=["$window"],angular.module("SOGo.Common").filter("encodeUri",encodeUri)}(),function(){"use strict";function ensureTarget($sce){return function(element){var tree=angular.element("<div>"+element+"</div>");return tree.find("a").attr("target","_blank"),$sce.trustAs("html",tree.html())}}ensureTarget.$inject=["$sce"],angular.module("SOGo.Common").filter("ensureTarget",ensureTarget)}(),function(){"use strict";function loc(){return l}angular.module("SOGo.Common").filter("loc",loc)}(),function(){"use strict";function range(){return function(n){for(var res=[],i=0;i<parseInt(n);i++)res.push(i);return res}}angular.module("SOGo.Common").filter("range",range)}(),function(){"use strict";function AclController($mdDialog,Dialog,usersWithACL,User,folder){function userFilter($query){return User.$filter($query,folder.$acl.users)}function closeModal(){folder.$acl.$resetUsersRights(),$mdDialog.hide()}function saveModal(){folder.$acl.$saveUsersRights().then(function(){$mdDialog.hide()},function(data,status){Dialog.alert(l("Warning"),l("An error occured please try again."))})}function confirmChange(user){var confirmation=user.$confirmRights();confirmation&&(vm.confirmation.showing=!0,vm.confirmation.message=confirmation)}function removeUser(user){folder.$acl.$removeUser(user.uid)["catch"](function(data,status){Dialog.alert(l("Warning"),l("An error occured please try again."))})}function addUser(data){data&&folder.$acl.$addUser(data).then(function(){vm.userToAdd="",vm.searchText=""},function(error){Dialog.alert(l("Warning"),error)})}function selectUser(user){vm.selectedUid==user.uid?vm.selectedUid=null:(vm.selectedUid=user.uid,vm.selectedUser=user,vm.selectedUser.$rights())}var vm=this;vm.users=usersWithACL,vm.folder=folder,vm.selectedUser=null,vm.selectedUid=null,vm.userToAdd="",vm.searchText="",vm.userFilter=userFilter,vm.closeModal=closeModal,vm.saveModal=saveModal,vm.confirmChange=confirmChange,vm.removeUser=removeUser,vm.addUser=addUser,vm.selectUser=selectUser,vm.confirmation={showing:!1,message:""}}AclController.$inject=["$mdDialog","Dialog","usersWithACL","User","folder"],angular.module("SOGo.Common").controller("AclController",AclController)}(),function(){"use strict";function navController($scope,$timeout,$interval,$http,$mdSidenav,$mdBottomSheet,$mdMedia,$log,sgConstant,sgSettings,Alarm){$scope.isPopup=sgSettings.isPopup,$scope.activeUser=sgSettings.activeUser(),$scope.baseURL=sgSettings.baseURL(),$scope.currentDay=window.currentDay,$timeout(function(){$interval(function(){$http.get("../date").success(function(data){$scope.currentDay=data})},864e5)},1e3*window.currentDay.secondsBeforeTomorrow),$scope.toggleLeft=function(){$mdSidenav("left").toggle().then(function(){$log.debug("toggle left is done")})},$scope.toggleRight=function(){$mdSidenav("right").toggle().then(function(){$log.debug("toggle RIGHT is done")})},$scope.toggleDetailView=function(){var detail=angular.element(document.getElementById("detailView"));detail.toggleClass("sg-close")},$scope.$watch(function(){return $mdMedia(sgConstant["gt-md"])},function(newVal){$scope.isGtMedium=newVal}),Alarm.getAlarms()}navController.$inject=["$scope","$timeout","$interval","$http","$mdSidenav","$mdBottomSheet","$mdMedia","$log","sgConstant","sgSettings","Alarm"],angular.module("SOGo.Common").controller("navController",navController)}(),function(){"use strict";function Acl(folderId){this.folderId=folderId}Acl.factory=["$q","$timeout","sgSettings","Resource","User",function($q,$timeout,Settings,Resource,User){return angular.extend(Acl,{$q:$q,$timeout:$timeout,$$resource:new Resource(Settings.activeUser("folderURL"),Settings.activeUser()),$User:User}),Acl}],angular.module("SOGo.Common").factory("Acl",Acl.factory),Acl.prototype.$users=function(owner){var user,_this=this,deferred=Acl.$q.defer();if(!this.users){var acls;return acls=angular.isDefined(owner)?Acl.$$resource.userResource(owner).fetch(this.folderId,"acls"):Acl.$$resource.fetch(this.folderId,"acls"),acls.then(function(response){return _this.users=[],angular.forEach(response.users,function(data){user=new Acl.$User(data),user.canSubscribeUser=user.isSubscribed,user.wasSubscribed=user.isSubscribed,user.$rights=angular.bind(user,user.$acl,_this.folderId,owner),_this.users.push(user)}),deferred.resolve(_this.users),_this.users})}return deferred.resolve(this.users),deferred.promise},Acl.prototype.$addUser=function(user,owner){var _this=this,deferred=Acl.$q.defer(),param={uid:user.uid};if(!user.uid||_.indexOf(_.pluck(this.users,"uid"),user.uid)>-1)deferred.resolve();else{var acls;acls=angular.isDefined(owner)?Acl.$$resource.userResource(owner).fetch(this.folderId,"addUserInAcls",param):Acl.$$resource.fetch(this.folderId,"addUserInAcls",param),acls.then(function(){user.wasSubscribed=!1,user.userClass=user.isGroup?"normal-group":"normal-user",user.$rights=angular.bind(user,user.$acl,_this.folderId),_this.users.push(user),deferred.resolve(_this.users)},function(data,status){deferred.reject(l("An error occured please try again."))})}return deferred.promise},Acl.prototype.$removeUser=function(uid){var _this=this,param={uid:uid};return Acl.$$resource.fetch(this.folderId,"removeUserFromAcls",param).then(function(){var i=_.indexOf(_.pluck(_this.users,"uid"),uid);i>=0&&_this.users.splice(i,1)})},Acl.prototype.$resetUsersRights=function(){angular.forEach(this.users,function(user){user.$resetRights()})},Acl.prototype.$saveUsersRights=function(owner){var _this=this,deferredSave=Acl.$q.defer(),deferredSubscribe=Acl.$q.defer(),param={action:"saveUserRights"},users=[];if(angular.forEach(this.users,function(user){user.$rightsAreDirty()&&users.push(user.$omit())}),users.length){var acls;acls=angular.isDefined(owner)?Acl.$$resource.userResource(owner).save(this.folderId,users,param):Acl.$$resource.save(this.folderId,users,param),acls.then(function(){angular.forEach(_this.users,function(user){user.$rightsAreDirty()&&(user.$shadowRights=angular.copy(user.rights))}),deferredSave.resolve()},deferredSave.reject)}else deferredSave.resolve();return users=[],angular.forEach(this.users,function(user){!user.wasSubscribed&&user.isSubscribed&&users.push(user.uid)}),users.length?(param={uids:users.join(",")},Acl.$$resource.fetch(this.folderId,"subscribeUsers",param).then(function(){angular.forEach(_this.users,function(user){user.wasSubscribed=user.isSubscribed}),deferredSubscribe.resolve()},deferredSubscribe.reject)):deferredSubscribe.resolve(),Acl.$q.all([deferredSave.promise,deferredSubscribe.promise])}}(),function(){"use strict";function Alarm(){this.currentAlarm=null}function AlarmService($timeout,Settings,Resource,$mdToast){return angular.extend(Alarm,{$timeout:$timeout,$$resource:new Resource(Settings.activeUser("folderURL")+"Calendar",Settings.activeUser()),$toast:$mdToast}),Alarm}Alarm.getAlarms=function(){var _this=this,now=new Date,browserTime=Math.floor(now.getTime()/1e3);this.$$resource.fetch("","alarmslist?browserTime="+browserTime).then(function(data){var alarms=data.alarms.sort(function(a,b){var x=parseInt(a[2]),y=parseInt(b[2]);return y-x});if(alarms.length>0){var next=alarms.pop(),now=new Date,utc=Math.floor(now.getTime()/1e3),url=next[0]+"/"+next[1],alarmTime=parseInt(next[2]),delay=alarmTime;alarmTime>0&&(delay-=utc);var f=(new Date(1e3*alarmTime),angular.bind(_this,Alarm.showAlarm,url));_this.currentAlarm&&_this.$timeout.cancel(_this.currentAlarm),_this.currentAlarm=_this.$timeout(f,1e3*delay)}})},Alarm.showAlarm=function(url){var _this=this;this.$$resource.fetch(url,"?resetAlarm=yes").then(function(data){function AlarmController(scope,$mdToast,url){scope.reminder="10",scope.cancel=function(){$mdToast.hide()},scope.ok=function(){_this.$$resource.fetch(url,"view?snoozeAlarm="+scope.reminder),$mdToast.hide()}}_this.$toast.show({position:"top right",hideDelay:0,template:["<md-toast>"," <md-input-container>",' <label style="color: white;">'+data.summary+"</label>",' <md-select ng-model="reminder">'," <md-option value=5>",l("5 minutes")," </md-option>"," <md-option value=10>",l("10 minutes")," </md-option>"," <md-option value=15>",l("15 minutes")," </md-option>"," <md-option value=30>",l("30 minutes")," </md-option>"," <md-option value=45>",l("45 minutes")," </md-option>"," <md-option value=60>",l("1 hour")," </md-option>"," <md-option value=1440>",l("1 day")," </md-option>"," </md-select>"," </md-input-container>",' <md-button ng-click="cancel()">',l("Cancel")," </md-button>",' <md-button ng-click="ok()">',l("Ok")," </md-button>","</md-toast>"].join(""),locals:{url:url},controller:AlarmController}),AlarmController.$inject=["scope","$mdToast","url"]})},AlarmService.$inject=["$timeout","sgSettings","Resource","$mdToast"],angular.module("SOGo.Common").factory("Alarm",AlarmService)}(),function(){"use strict";function Authentication(){function readCookie(name){var foundCookie,prefix,pairs,i,currentPair,start;for(foundCookie=null,prefix=name+"=",pairs=document.cookie.split(";"),i=0;!foundCookie&&i<pairs.length;i++){for(currentPair=pairs[i],start=0;" "==currentPair.charAt(start);)start++;start>0&&(currentPair=currentPair.substr(start)),0===currentPair.indexOf(prefix)&&(foundCookie=currentPair.substr(prefix.length))}return foundCookie}function readLoginCookie(){var value,loginValues=null,cookie=readCookie("0xHIGHFLYxSOGo");return cookie&&cookie.length>8&&(value=decodeURIComponent(cookie.substr(8)),loginValues=value.base64decode().split(":")),loginValues}function redirectUrl(username,domain){var userName,address,baseAddress,altBaseAddress,parts,hostpart,protocol,newAddress;return userName=username,domain&&(userName+="@"+domain.value),address=""+window.location.href,baseAddress=ApplicationBaseURL+"/"+encodeURIComponent(userName),"/"==baseAddress[0]&&(parts=address.split("/"),hostpart=parts[2],protocol=parts[0],baseAddress=protocol+"//"+hostpart+baseAddress),parts=baseAddress.split("/"),parts.splice(0,3),altBaseAddress=parts.join("/"),newAddress=!address.startsWith(baseAddress)&&!address.startsWith(altBaseAddress)||address.endsWith("/logoff")?baseAddress:address}function getService($q,$http,passwordPolicyConfig){var service,_this=this;return service={login:function(data){var language,d=$q.defer(),username=data.username,password=data.password,domain=data.domain,rememberLogin=data.rememberLogin?1:0;return data.loginSuffix&&!username.endsWith(data.loginSuffix)&&(username+=loginSuffix,domain=!1),data.language&&"WONoSelectionString"!=data.language&&(language=data.language),$http({method:"POST",url:"/SOGo/connect",data:{userName:username,password:password,domain:domain,language:language,rememberLogin:rememberLogin}}).success(function(data,status){var loginCookie=readLoginCookie();loginCookie?"undefined"!=typeof data.expire&&"undefined"!=typeof data.grace?data.expire<0&&data.grace>0?d.reject({grace:data.grace}):data.expire>0&&-1==data.grace?d.reject({expire:data.expire}):d.resolve(redirectUrl(username,domain)):d.resolve(redirectUrl(username,domain)):d.reject(l("cookiesNotEnabled"))}).error(function(data,status){var msg,perr;data&&data.LDAPPasswordPolicyError?(perr=data.LDAPPasswordPolicyError,msg=perr==passwordPolicyConfig.PolicyNoError?l("Wrong username or password."):perr==passwordPolicyConfig.PolicyAccountLocked?l("Your account was locked due to too many failed attempts."):l("Login failed due to unhandled error case: ")+perr):msg=l("Unhandled error response"),d.reject({error:msg})}),d.promise},changePassword:function(newPassword){var d=$q.defer(),loginCookie=_this.readLoginCookie();return $http({method:"POST",url:"/SOGo/so/changePassword",data:{userName:loginCookie[0],password:loginCookie[1],newPassword:newPassword}}).success(function(data,status){d.resolve()}).error(function(data,status){var error,perr=data.LDAPPasswordPolicyError;perr?perr==passwordPolicyConfig.PolicyNoError?error=l("Password change failed"):perr==passwordPolicyConfig.PolicyPasswordModNotAllowed?error=l("Password change failed - Permission denied"):perr==passwordPolicyConfig.PolicyInsufficientPasswordQuality?error=l("Password change failed - Insufficient password quality"):perr==passwordPolicyConfig.PolicyPasswordTooShort?error=l("Password change failed - Password is too short"):perr==passwordPolicyConfig.PolicyPasswordTooYoung?error=l("Password change failed - Password is too young"):perr==passwordPolicyConfig.PolicyPasswordInHistory?error=l("Password change failed - Password is in history"):(error=l("Unhandled policy error: %{0}").formatted(perr),perr=passwordPolicyConfig.PolicyPasswordUnknown):(perr=passwordPolicyConfig.PolicyPasswordSystemUnknown,error=_("Unhandled error response")),d.reject(error)}),d.promise}}}this.$get=getService,getService.$inject=["$q","$http","passwordPolicyConfig"]}angular.module("SOGo.Authentication",[]).constant("passwordPolicyConfig",{PolicyPasswordChangeUnsupported:-3,PolicyPasswordSystemUnknown:-2,PolicyPasswordUnknown:-1,PolicyPasswordExpired:0,PolicyAccountLocked:1,PolicyChangeAfterReset:2,PolicyPasswordModNotAllowed:3,PolicyMustSupplyOldPassword:4,PolicyInsufficientPasswordQuality:5,PolicyPasswordTooShort:6,PolicyPasswordTooYoung:7,PolicyPasswordInHistory:8,PolicyNoError:65535}).provider("Authentication",Authentication)}(),function(){"use strict";function Dialog(){}function DialogService($q,$mdDialog){return angular.extend(Dialog,{$q:$q,$modal:$mdDialog}),Dialog}Dialog.alert=function(title,content){var alert=this.$modal.alert().title(title).content(content).ok(l("OK"));this.$modal.show(alert)},Dialog.confirm=function(title,content,options){var confirm=this.$modal.confirm().title(title).content(content).ok(options&&options.ok?options.ok:l("OK")).cancel(options&&options.cancel?options.cancel:l("Cancel"));return this.$modal.show(confirm)},Dialog.prompt=function(title,label,options){function PromptDialogController(scope,$mdDialog){scope.title=title,scope.name="",scope.cancel=function(){d.reject(),$mdDialog.hide()},scope.ok=function(){d.resolve(scope.name),$mdDialog.hide()}}var o=options||{},d=this.$q.defer();return this.$modal.show({parent:angular.element(document.body),clickOutsideToClose:!0,escapeToClose:!0,template:['<md-dialog flex="50" flex-sm="100">',' <md-dialog-content layout="column">',' <h2 class="md-title" ng-bind="title"></h2>'," <md-input-container>"," <label>"+label+"</label>",' <input type="'+(o.inputType||"text")+'"',' aria-label="'+title+'"',' ng-model="name" required="required"/>'," </md-input-container>"," </md-dialog-content>",' <div class="md-actions">',' <md-button ng-click="cancel()">'," "+l("Cancel")," </md-button>",' <md-button class="md-primary" ng-click="ok()" ng-disabled="!name.length">'," "+l("OK")," </md-button>"," </div>","</md-dialog>"].join(""),controller:PromptDialogController}),PromptDialogController.$inject=["scope","$mdDialog"],d.promise},DialogService.$inject=["$q","$mdDialog"],angular.module("SOGo.Common").factory("Dialog",DialogService)}(),function(){"use strict";function Gravatar(){return function(email,size){var x,y,hash,s=size;return email?(x=email.indexOf("<"),x>=0&&(y=email.indexOf(">",x),y>x&&(email=email.substring(x+1,y))),size||(s=48),hash=email.md5(),"https://www.gravatar.com/avatar/"+hash+"?s="+s+"&d=404"):""}}angular.module("SOGo.Common").factory("Gravatar",Gravatar)}(),function(){"use strict";function Resource($http,$q,path,activeUser,options){angular.extend(this,{_http:$http,_q:$q,_path:path,_activeUser:activeUser}),angular.extend(this,options),this._path=this._path.replace(/\/$/,"")}Resource.$factory=["$http","$q",function($http,$q){return function(path,activeUser,options){return new Resource($http,$q,path,activeUser,options)}}],angular.module("SOGo.Common").factory("Resource",Resource.$factory),Resource.prototype.userResource=function(uid){var path=_.compact(this._activeUser.folderURL.split("/"));return path.splice(path.length-1,1,escape(uid)),new Resource(this._http,this._q,"/"+path.join("/"),this._activeUser)},Resource.prototype.fetch=function(folderId,action,params){var deferred=this._q.defer(),path=[this._path];return folderId&&path.push(folderId.split("/")),action&&path.push(action),path=_.compact(_.flatten(path)).join("/"),this._http({method:"GET",url:path,params:params}).success(deferred.resolve).error(function(data,status){return 404==status?deferred.reject():void 0}),deferred.promise},Resource.prototype.newguid=function(folderId){var deferred=this._q.defer(),path=this._path+"/"+folderId+"/newguid";return this._http.get(path).success(deferred.resolve).error(deferred.reject),deferred.promise},Resource.prototype.create=function(action,name){var deferred=this._q.defer(),path=this._path+"/"+action;return this._http.post(path,{name:name}).success(deferred.resolve).error(deferred.reject),deferred.promise},Resource.prototype.post=function(id,action,data){var deferred=this._q.defer(),path=[this._path];return id&&path.push(id),action&&path.push(action),path=_.compact(_.flatten(path)).join("/"),this._http.post(path,data).success(deferred.resolve).error(deferred.reject),deferred.promise},Resource.prototype.save=function(id,newValue,options){var action=(this._q.defer(),options&&options.action?options.action:"save");return this.post(id,action,newValue)},Resource.prototype.remove=function(uid){var deferred=this._q.defer(),path=this._path+"/"+uid+"/delete";return this._http.get(path).success(deferred.resolve).error(deferred.reject),deferred.promise}}(),function(){"use strict";function User(userData){userData&&this.init(userData)}User.factory=["$q","$log","sgSettings","Resource","Gravatar",function($q,$log,Settings,Resource,Gravatar){return angular.extend(User,{$q:$q,$log:$log,$$resource:new Resource(Settings.activeUser("folderURL"),Settings.activeUser()),$gravatar:Gravatar,$query:"",$users:[]}),User}],angular.module("SOGo.Common").factory("User",User.factory),User.$filter=function(search,excludedUsers,options){var param={search:search};if(!options||!options.dry){if(!search)return User.$users.splice(0,User.$users.length),User.$q.when(User.$users);if(User.$query==search)return User.$q.when(User.$users);User.$query=search}return User.$$resource.fetch(null,"usersSearch",param).then(function(response){var results,index,user,users,compareUids=function(data){return this.uid==data.uid};for(users=options&&options.dry?[]:User.$users,results=excludedUsers?_.filter(response.users,function(user){return!_.find(excludedUsers,compareUids,user)}):response.users,index=users.length-1;index>=0;index--)user=users[index],_.find(results,compareUids,user)||users.splice(index,1);return _.each(results,function(data,index){if(_.isUndefined(_.find(users,compareUids,data))){var user=new User(data);users.splice(index,0,user)}}),User.$log.debug(users),users})},User.prototype.init=function(data){angular.extend(this,data),this.$$shortFormat||(this.$$shortFormat=this.$shortFormat()),this.$$image||(this.$$image=this.image||User.$gravatar(this.c_email)),this.empty=" "},User.prototype.$shortFormat=function(options){var fullname=this.cn||this.c_email,email=this.c_email,no_email=options&&options.email===!1;return!no_email&&email&&fullname!=email&&(fullname+=" <"+email+">"),fullname},User.prototype.$acl=function(folderId,owner){var _this=this,deferred=User.$q.defer(),param={uid:this.uid};if(this.$shadowRights)deferred.resolve(this.rights);else{var rights;rights=angular.isDefined(owner)?User.$$resource.userResource(owner).fetch(folderId,"userRights",param):User.$$resource.fetch(folderId,"userRights",param),rights.then(function(data){return _this.rights=data,_this.$shadowRights=angular.copy(data),deferred.resolve(data),data})}return deferred.promise},User.prototype.$isAnonymous=function(){return"anonymous"==this.uid},User.prototype.$isSpecial=function(){return this.userClass&&"public-user"==this.userClass},User.prototype.$confirmRights=function(){var confirmation=!1;return this.$confirmation?!1:(_.some(_.values(this.rights))&&("anonymous"==this.uid?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?"):"<default>"==this.uid&&(confirmation=l("Any user with an account on this system will be able to access your folder. Are you certain you trust them all?"))),this.$confirmation=confirmation,confirmation)},User.prototype.$rightsAreDirty=function(){return this.rights&&!_.isEqual(this.rights,this.$shadowRights)},User.prototype.$resetRights=function(zero){var _this=this;zero?_.map(_.keys(this.rights),function(key){angular.isString(_this.rights[key])?_this.rights[key]="None":_this.rights[key]=0}):this.rights=angular.copy(this.$shadowRights)},User.prototype.$folders=function(type){var _this=this,deferred=User.$q.defer(),param={type:type};return this.$$folders?deferred.resolve(this.$$folders):User.$$resource.userResource(this.uid).fetch(null,"foldersSearch",param).then(function(response){_this.$$folders=response.folders,deferred.resolve(response.folders)}),deferred.promise},User.prototype.$omit=function(){var user={};return angular.forEach(this,function(value,key){"constructor"!=key&&"$"!=key[0]&&(user[key]=value)}),user},User.prototype.toString=function(){return"[User "+this.c_email+"]"}}(),function(){"use strict";function sgFocus($rootScope,$timeout){return function(name){$timeout(function(){$rootScope.$broadcast("sgFocusOn",name)})}}sgFocus.$inject=["$rootScope","$timeout"],angular.module("SOGo.Common").factory("sgFocus",sgFocus)}(),function(){"use strict";function sgAvatarImage(){return{restrict:"AE",scope:{size:"@",email:"=sgEmail",src:"=sgSrc"},template:'<img ng-src="{{vm.url}}"/>',link:link,bindToController:!0,controller:"sgAvatarImageController",controllerAs:"vm"}}function link(scope,element,attrs,controller){var el=element[0],imgElement=(el.className,element.find("img")),img=imgElement[0];attrs.size&&(imgElement.attr("width",attrs.size),imgElement.attr("height",attrs.size)),imgElement.bind("error",function(){controller.insertGenericAvatar(img)})}function sgAvatarImageController($scope,$element,Gravatar){var vm=this;$scope.$watch("vm.email",function(email){var img=$element.find("img")[0];email||vm.genericAvatar?email&&!vm.url&&(vm.genericAvatar&&(vm.genericAvatar.parentNode.removeChild(vm.genericAvatar),delete vm.genericAvatar,img.classList.remove("ng-hide")),vm.url=Gravatar(email,vm.size)):vm.insertGenericAvatar(img)}),"sg-src"in $element[0].attributes&&$scope.$watch("vm.src",function(src){src&&(vm.url=src)}),vm.insertGenericAvatar=function(img){var avatar;vm.genericAvatar||(avatar=document.createElement("md-icon"),avatar.className="material-icons icon-person",img.classList.add("ng-hide"),vm.genericAvatar=img.parentNode.insertBefore(avatar,img))}}sgAvatarImageController.$inject=["$scope","$element","Gravatar"],angular.module("SOGo.Common").directive("sgAvatarImage",sgAvatarImage).controller("sgAvatarImageController",sgAvatarImageController)}(),function(){"use strict";function sgColorPicker($parse){function link(scope,iElement,iAttr,controller){controller.doSelect=$parse(iElement.attr("sg-on-select"))}return{restrict:"E",template:["<md-menu>",' <md-button class="sg-icon-button"',' label:aria-label="Options"',' ng-click="$mdOpenMenu()"',' md-menu-origin="md-menu-origin">'," <md-icon>color_lens</md-icon>"," </md-button>",' <md-menu-content class="md-padding" width="3">',' <md-grid-list class="sg-color-picker" md-cols="7" md-row-height="1:1" md-gutter="0.5em">',' <md-grid-tile ng-repeat="color in $sgColorPickerController.colors"'," ng-style=\"{ 'background-color': color }\"",' ng-click="$sgColorPickerController.select(color)"></md-grid-tile>'," </md-grid-list>"," </md-menu-content>","</md-menu>"].join(""),replace:!0,bindToController:!0,controller:sgColorPickerController,controllerAs:"$sgColorPickerController",link:link}}function sgColorPickerController($scope,sgColors){var vm=this;vm.colors=sgColors.selection,vm.select=function(color){
vm.doSelect($scope,{color:color})}}sgColorPicker.$inject=["$parse"],sgColorPickerController.$inject=["$scope","sgColors"],angular.module("SOGo.Common").directive("sgColorPicker",sgColorPicker)}(),function(){"use strict";function sgCompile($compile){function sgCompileLink(scope,element,attrs){var ensureCompileRunsOnce=scope.$watch(function(scope){return scope.$eval(attrs.sgCompile)},function(value){element.html(value),$compile(element.contents())(scope),ensureCompileRunsOnce()})}return{restrict:"A",link:sgCompileLink}}sgCompile.$inject=["$compile"],angular.module("SOGo.Common").directive("sgCompile",sgCompile)}(),function(){"use strict";function sgEnter(){var ENTER_KEY=13;return function(scope,element,attrs){element.bind("keydown keypress",function(event){event.which===ENTER_KEY&&(scope.$apply(attrs.sgEnter),event.preventDefault())})}}angular.module("SOGo.Common").directive("sgEnter",sgEnter)}(),function(){"use strict";function sgEscape(){var ESCAPE_KEY=27;return function(scope,elem,attrs){elem.bind("keydown",function(event){event.keyCode===ESCAPE_KEY&&scope.$apply(attrs.sgEscape)})}}angular.module("SOGo.Common").directive("sgEscape",sgEscape)}(),function(){"use strict";function sgFocusOn(){return function(scope,elem,attr){scope.$on("sgFocusOn",function(e,name){name===attr.sgFocusOn&&(elem[0].focus(),elem[0].select())})}}angular.module("SOGo.Common").directive("sgFocusOn",sgFocusOn)}(),function(){"use strict";function sgFolderStylesheet(){return{restrict:"A",require:"ngModel",scope:{ngModel:"="},template:['<style type="text/css">'," .bg-folder{{ ngModel.id }} {"," background-color: {{ ngModel.color }} !important;"," }"," .fg-folder{{ ngModel.id }} {"," color: {{ ngModel.color }} !important;"," }"," .bdr-folder{{ ngModel.id }} {"," border-color: {{ ngModel.color }} !important;"," }"," .checkbox-folder{{ ngModel.id }} .md-icon {"," background-color: {{ ngModel.color }} !important;"," }","</style>"].join("")}}angular.module("SOGo.Common").directive("sgFolderStylesheet",sgFolderStylesheet)}(),function(){"use strict";function sgPlaceholder(){return{restrict:"A",scope:{placeholder:"=sgPlaceholder"},link:function(scope,elem,attr){scope.$watch("placeholder",function(){elem[0].placeholder=scope.placeholder})}}}angular.module("SOGo.Common").directive("sgPlaceholder",sgPlaceholder)}(),function(){"use strict";function sgSearchPreTransclude($parse){function compile(tElement,tAttr){var inputEl=(tElement.find("md-input-container"),tElement.find("input")),selectEl=tElement.find("md-select"),buttonEl=tElement.find("md-button");return inputEl.attr("ng-model","$sgSearchController.searchText"),inputEl.attr("ng-model-options","$sgSearchController.searchTextOptions"),inputEl.attr("ng-change","$sgSearchController.onChange()"),selectEl&&(selectEl.attr("ng-model","$sgSearchController.searchField"),selectEl.attr("ng-change","$sgSearchController.onChange()")),buttonEl&&buttonEl.attr("sg-search-cancel")?(buttonEl.attr("ng-click",buttonEl.attr("sg-search-cancel")),buttonEl.removeAttr("sg-search-cancel")):buttonEl=null,function(scope,iElement,iAttr,controller){var compiledButtonEl=iElement.find("button");controller.doSearch=$parse(iElement.attr("sg-search")),buttonEl&&compiledButtonEl&&compiledButtonEl.on("click",controller.cancelSearch)}}return{restrict:"A",controller:"sgSearchController",controllerAs:"$sgSearchController",priority:1001,compile:compile}}function sgSearch(){function compile(tElement,tAttr){return function(scope,iElement,iAttr,controller,transclude){transclude(function(clone){iElement.append(clone)})}}return{restrict:"A",priority:1e3,transclude:!0,compile:compile}}function sgSearchController($scope,$element){var vm=this;vm.previous={searchText:"",searchField:""},vm.searchText=null,vm.searchTextOptions={updateOn:"default blur",debounce:{"default":300,blur:0}},vm.onChange=function(){"undefined"!=typeof vm.searchText&&null!==vm.searchText&&(vm.searchText!=vm.previous.searchText||vm.searchField!=vm.previous.searchField)&&((vm.searchText.length>2||0===vm.searchText.length)&&vm.doSearch($scope,{searchText:vm.searchText,searchField:vm.searchField}),vm.previous={searchText:vm.searchText,searchField:vm.searchField})},vm.cancelSearch=function(){vm.searchText=""}}sgSearchPreTransclude.$inject=["$parse"],sgSearchController.$inject=["$scope","$element"],angular.module("SOGo.Common").controller("sgSearchController",sgSearchController).directive("sgSearch",sgSearchPreTransclude).directive("sgSearch",sgSearch)}(),function(){"use strict";function sgSubscribe(User){return{restrict:"A",scope:{folderType:"@sgSubscribe",onFolderSelect:"&sgSubscribeOnSelect"},replace:!1,bindToController:!0,controller:sgSubscribeDialogController,controllerAs:"$sgSubscribeDialogController",link:link}}function link(scope,element,attrs,controller){element.find("input");element.on("click",controller.showDialog)}function sgSubscribeDialogController($mdDialog){var vm=this;vm.showDialog=function(){$mdDialog.show({templateUrl:"../Contacts/UIxContactsUserFolders",clickOutsideToClose:!0,locals:{folderType:vm.folderType,onFolderSelect:vm.onFolderSelect},controller:sgSubscribeController,controllerAs:"subscribe"})}}function sgSubscribeController($mdDialog,folderType,onFolderSelect,User){var vm=this;vm.selectedUser=null,vm.users=User.$users,vm.searchTextOptions={updateOn:"default blur",debounce:{"default":300,blur:0}},vm.onChange=function(){User.$filter(vm.searchText).then(function(){vm.selectedUser&&_.isUndefined(_.find(User.$users,function(user){return user.uid==vm.selectedUser.uid}))&&(vm.selectedUser=null)})},vm.selectUser=function(i){vm.selectedUser==vm.users[i]?vm.selectedUser=null:vm.users[i].$folders(folderType).then(function(){vm.selectedUser=vm.users[i]})},vm.selectFolder=function(folder){onFolderSelect({folderData:folder})},vm.close=function(){$mdDialog.hide()}}sgSubscribe.$inject=["User"],sgSubscribeDialogController.$inject=["$mdDialog"],sgSubscribeController.$inject=["$mdDialog","folderType","onFolderSelect","User"],angular.module("SOGo.Common").directive("sgSubscribe",sgSubscribe)}(),function(){"use strict";function timePaneDirective(){return{template:['<div class="sg-time-pane">',' <div class="hours-pane">',' <div ng-repeat="hoursBigLine in hours" layout="row" layout-sm="column">',' <div ng-repeat="hoursLine in hoursBigLine" layout="row" class="hours">',' <md-button class="hourBtn md-fab md-mini" ng-repeat="hour in hoursLine" id="{{hour.id}}"',' ng-click="hourClickHandler(hour.displayName)">{{hour.displayName}}</md-button>'," </div>"," </div>"," </div>",' <div class="min5" ng-show="is5min()">',' <div layout="row" layout-sm="column">',' <div ng-repeat="minutesLine in min5" layout="row">',' <md-button class="minuteBtn md-fab md-mini" ng-repeat="minute in minutesLine" id="{{minute.id}}"',' ng-click="minuteClickHandler(minute.displayName)">{{minute.displayName}}</md-button>'," </div>"," </div>"," </div>",' <div class="sg-time-scroll-mask" ng-hide="is5min()">',' <div class="min1" layout="row" layout-sm="column" layout-wrap>',' <div ng-repeat="minutesLine in min1" layout="row" layout-align="space-around center" flex="50">',' <md-button class="minuteBtn md-fab md-mini" ng-repeat="minute in minutesLine" id="{{minute.id}}"',' ng-click="minuteClickHandler(minute.displayName)">{{minute.displayName}}</md-button>'," </div>"," </div>"," </div>",' <div flex layout="row" layout-align="center center" class="toggle-pane">',' <md-button class="toggleBtn md-fab md-mini" ng-bind="getToggleBtnLbl()" ng-click="toggleManual5min()"></md-button>'," </div>","</div>"].join(""),scope:{},require:["ngModel","sgTimePane"],controller:TimePaneCtrl,controllerAs:"ctrl",bindToController:!0,link:function(scope,element,attrs,controllers){var ngModelCtrl=controllers[0],sgTimePaneCtrl=controllers[1],timePaneElement=element;sgTimePaneCtrl.configureNgModel(ngModelCtrl,sgTimePaneCtrl,timePaneElement)}}}function TimePaneCtrl($element,$attrs,$scope,$animate,$q,$mdConstant,$mdTheming,$$mdDateUtil,$mdDateLocale,$mdInkRipple,$mdUtil){var m;this.$scope=$scope,this.$element=$element,this.timePaneElement=$element[0].querySelector(".sg-time-pane"),this.$animate=$animate,this.$q=$q,this.$mdInkRipple=$mdInkRipple,this.$mdUtil=$mdUtil,this.keyCode=$mdConstant.KEY_CODE,this.dateUtil=$$mdDateUtil,this.id=nextTimePaneUniqueId++,this.ngModelCtrl=null,this.selectedTime=null,this.displayTime=null,this.isInitialized=!1,$scope.hours=[],$scope.hours[0]=[],$scope.hours[0][0]=[],$scope.hours[0][1]=[],$scope.hours[1]=[],$scope.hours[1][0]=[],$scope.hours[1][1]=[];for(var i=0;6>i;i++)$scope.hours[0][0][i]={id:"tp-"+this.id+"-hour-"+i,displayName:10>i?"0"+i:""+i,selected:!1},$scope.hours[0][1][i]={id:"tp-"+this.id+"-hour-"+(i+6),displayName:10>i+6?"0"+(i+6):""+(i+6),selected:!1},$scope.hours[1][0][i]={id:"tp-"+this.id+"-hour-"+(i+12),displayName:""+(i+12),selected:!1},$scope.hours[1][1][i]={id:"tp-"+this.id+"-hour-"+(i+18),displayName:""+(i+18),selected:!1};for($scope.min5=[],$scope.min5[0]=[],$scope.min5[1]=[],i=0;6>i;i++)m=5*i,$scope.min5[0][i]={id:"tp-"+this.id+"-minute5-"+m,displayName:10>m?":0"+m:":"+m,selected:!0},$scope.min5[1][i]={id:"tp-"+this.id+"-minute5-"+(m+30),displayName:":"+(m+30),selected:!1};for($scope.min1=[],i=0;12>i;i++){$scope.min1[i]=[];for(var ii=0;5>ii;ii++)m=5*i+ii,$scope.min1[i][ii]={id:"tp-"+this.id+"-minute-"+m,displayName:10>m?":0"+m:":"+m,selected:!0}}$scope.show5min=!0,$scope.getToggleBtnLbl=function(){return $scope.is5min()?">>":"<<"},$scope.toggleManual5min=function(){$scope.manual5min=!$scope.is5min()},$scope.is5min=function(){return $scope.manual5min===!0||$scope.manual5min===!1?$scope.manual5min:$scope.show5min},$attrs.tabindex||$element.attr("tabindex","-1");var self=this;this.hourClickHandler=function(displayVal){var updated=new Date(self.displayTime);updated.setHours(Number(displayVal)),self.setNgModelValue(updated,"hours")},$scope.hourClickHandler=this.hourClickHandler,this.minuteClickHandler=function(displayVal){var val=displayVal.substr(1),updated=new Date(self.displayTime);updated.setMinutes(Number(val)),self.setNgModelValue(updated,"minutes")},$scope.minuteClickHandler=this.minuteClickHandler,this.attachTimePaneEventListeners()}angular.module("SOGo.Common").directive("sgTimePane",timePaneDirective);var SELECTED_TIME_CLASS="md-bg",FOCUSED_TIME_CLASS="md-focus",nextTimePaneUniqueId=0;TimePaneCtrl.$inject=["$element","$attrs","$scope","$animate","$q","$mdConstant","$mdTheming","$$mdDateUtil","$mdDateLocale","$mdInkRipple","$mdUtil"],TimePaneCtrl.prototype.configureNgModel=function(ngModelCtrl,sgTimePaneCtrl,timePaneElement){this.ngModelCtrl=ngModelCtrl;var self=this;ngModelCtrl.$render=function(){self.changeSelectedTime(self.ngModelCtrl.$viewValue,sgTimePaneCtrl,timePaneElement)}},TimePaneCtrl.prototype.changeSelectedTime=function(date,sgTimePaneCtrl,timePaneElement){var previousSelectedTime=this.selectedTime;this.selectedTime=date,this.changeDisplayTime(date).then(function(){if(previousSelectedTime){var prevH=previousSelectedTime.getHours(),prevHCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-hour-"+prevH);prevHCell&&(prevHCell.classList.remove(SELECTED_TIME_CLASS),prevHCell.setAttribute("aria-selected","false"));var prevM=previousSelectedTime.getMinutes(),prevMCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-minute-"+prevM);prevMCell&&(prevMCell.classList.remove(SELECTED_TIME_CLASS),prevMCell.setAttribute("aria-selected","false"));var prevM5Cell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-minute5-"+prevM);prevM5Cell&&(prevM5Cell.classList.remove(SELECTED_TIME_CLASS),prevM5Cell.setAttribute("aria-selected","false"))}if(date){var mCell,newH=date.getHours(),hCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-hour-"+newH);hCell&&(hCell.classList.add(SELECTED_TIME_CLASS),hCell.setAttribute("aria-selected","true"));var newM=date.getMinutes();newM%5===0?(sgTimePaneCtrl.$scope.show5min=!0,mCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-minute5-"+newM),mCell&&(mCell.classList.add(SELECTED_TIME_CLASS),mCell.setAttribute("aria-selected","true"))):sgTimePaneCtrl.$scope.show5min=!1,mCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-minute-"+newM),mCell&&(mCell.classList.add(SELECTED_TIME_CLASS),mCell.setAttribute("aria-selected","true"))}})},TimePaneCtrl.prototype.changeDisplayTime=function(date){var d=new Date(date);return this.isInitialized?this.dateUtil.isValidDate(d)?(this.displayTime=d,this.$q.when()):this.$q.when():(this.buildInitialTimePaneDisplay(),this.$q.when())},TimePaneCtrl.prototype.buildInitialTimePaneDisplay=function(){this.displayTime=this.selectedTime||this.today,this.isInitialized=!0},TimePaneCtrl.prototype.attachTimePaneEventListeners=function(){this.$element.on("keydown",angular.bind(this,this.handleKeyEvent))},TimePaneCtrl.prototype.handleKeyEvent=function(event){var self=this;this.$scope.$apply(function(){return event.which==self.keyCode.ESCAPE||event.which==self.keyCode.TAB?(self.$scope.$emit("md-time-pane-close"),void(event.which==self.keyCode.TAB&&event.preventDefault())):event.which===self.keyCode.ENTER?(self.setNgModelValue(self.displayTime,"enter"),void event.preventDefault()):void 0})},TimePaneCtrl.prototype.setNgModelValue=function(date,mode){this.$scope.$emit("sg-time-pane-change",{date:date,changed:mode}),this.ngModelCtrl.$setViewValue(date),this.ngModelCtrl.$render()},TimePaneCtrl.prototype.focus=function(opt_date,sgTimePaneCtrl){var date=opt_date||this.selectedTime||this.today,previousFocus=this.timePaneElement.querySelector(".md-focus");if(previousFocus&&previousFocus.classList.remove(FOCUSED_TIME_CLASS),date){var newH=date.getHours(),hCell=document.getElementById("tp-"+sgTimePaneCtrl.id+"-hour-"+newH);hCell&&(hCell.classList.add(FOCUSED_TIME_CLASS),hCell.focus())}}}(),function(){"use strict";function timePickerDirective(){return{template:['<md-button class="sg-timepicker-button md-icon-button" type="button" ',' tabindex="-1" aria-hidden="true" ',' ng-click="ctrl.openTimePane($event)">'," <md-icon>access_time</md-icon>","</md-button>",'<div class="md-default-theme sg-timepicker-input-container" '," ng-class=\"{'sg-timepicker-focused': ctrl.isFocused,"," 'md-bdr': ctrl.isFocused}\">",' <input class="sg-timepicker-input" aria-haspopup="true" ',' ng-focus="ctrl.setFocused(true)" ng-blur="ctrl.setFocused(false)">',' <md-button type="button" md-no-ink ',' class="sg-timepicker-triangle-button md-icon-button" ',' ng-click="ctrl.openTimePane($event)" ',' aria-label="{{::ctrl.dateLocale.msgOpenCalendar}}">',' <div class="sg-timepicker-expand-triangle"></div>'," </md-button>","</div>",'<div class="sg-timepicker-time-pane md-whiteframe-z1">',' <div class="sg-timepicker-input-mask">',' <div class="sg-timepicker-input-mask-opaque',' md-default-theme md-background md-bg"></div>'," </div>",' <div class="sg-timepicker-time md-default-theme md-bg md-background">',' <sg-time-pane role="dialog" aria-label="{{::ctrl.dateLocale.msgCalendar}}" ',' ng-model="ctrl.time" ng-if="ctrl.isTimeOpen"></sg-time-pane>'," </div>","</div>"].join(""),require:["ngModel","sgTimepicker"],scope:{placeholder:"@mdPlaceholder"},controller:TimePickerCtrl,controllerAs:"ctrl",bindToController:!0,link:function(scope,element,attr,controllers){var ngModelCtrl=controllers[0],mdTimePickerCtrl=controllers[1];mdTimePickerCtrl.configureNgModel(ngModelCtrl)}}}function TimePickerCtrl($scope,$element,$attrs,$compile,$timeout,$mdConstant,$mdMedia,$mdTheming,$mdUtil,$mdDateLocale,$$mdDateUtil,$$rAF){this.$compile=$compile,this.$timeout=$timeout,this.dateLocale=$mdDateLocale,this.dateUtil=$$mdDateUtil,this.$mdConstant=$mdConstant,this.$mdMedia=$mdMedia,this.$mdUtil=$mdUtil,this.$$rAF=$$rAF,this.ngModelCtrl=null,this.inputElement=$element[0].querySelector("input"),this.inputContainer=$element[0].querySelector(".sg-timepicker-input-container"),this.ngInputElement=angular.element(this.inputElement),this.timePane=$element[0].querySelector(".sg-timepicker-time-pane"),this.timeButton=$element[0].querySelector(".sg-timepicker-button"),this.inputMask=$element[0].querySelector(".sg-timepicker-input-mask-opaque"),this.$element=$element,this.$attrs=$attrs,this.$scope=$scope,this.date=null,this.isFocused=!1,this.isDisabled=!1,this.setDisabled($element[0].disabled||angular.isString($attrs.disabled)),this.isTimeOpen=!1,this.timePaneOpenedFrom=null,this.timePane.id="sg-time-pane"+$mdUtil.nextUid(),$mdTheming($element),this.bodyClickHandler=angular.bind(this,this.handleBodyClick),this.windowResizeHandler=$mdUtil.debounce(angular.bind(this,this.closeTimePane),100),$attrs.tabindex||$element.attr("tabindex","-1"),this.installPropertyInterceptors(),this.attachChangeListeners(),this.attachInteractionListeners();var self=this;$scope.$on("$destroy",function(){self.detachTimePane()})}angular.module("SOGo.Common").directive("sgTimepicker",timePickerDirective);var EXTRA_INPUT_SIZE=3,INVALID_CLASS="sg-timepicker-invalid",DEFAULT_DEBOUNCE_INTERVAL=500,TIME_PANE_HEIGHT={MIN5:{GTSM:192,SM:312},MIN1:{GTSM:384,SM:474}},TIME_PANE_WIDTH={GTSM:530,SM:292};TimePickerCtrl.$inject=["$scope","$element","$attrs","$compile","$timeout","$mdConstant","$mdMedia","$mdTheming","$mdUtil","$mdDateLocale","$$mdDateUtil","$$rAF"],TimePickerCtrl.prototype.configureNgModel=function(ngModelCtrl){this.ngModelCtrl=ngModelCtrl;var self=this;ngModelCtrl.$render=function(){self.time=self.ngModelCtrl.$viewValue,self.inputElement.value=self.formatTime(self.time),self.resizeInputElement()}},TimePickerCtrl.prototype.formatTime=function(time){var t=new Date(time);if(t){var h=t.getHours(),m=t.getMinutes();return(10>h?"0"+h:h)+":"+(10>m?"0"+m:m)}return""},TimePickerCtrl.prototype.attachChangeListeners=function(){var self=this;self.$scope.$on("sg-time-pane-change",function(event,data){var time=new Date(data.date);self.ngModelCtrl.$setViewValue(time),self.time=time,self.inputElement.value=self.formatTime(self.time),"minutes"==data.changed&&self.closeTimePane(),self.resizeInputElement(),self.inputContainer.classList.remove(INVALID_CLASS)}),self.ngInputElement.on("input",angular.bind(self,self.resizeInputElement)),self.ngInputElement.on("input",self.$mdUtil.debounce(self.handleInputEvent,DEFAULT_DEBOUNCE_INTERVAL,self))},TimePickerCtrl.prototype.attachInteractionListeners=function(){var self=this,$scope=this.$scope,keyCodes=this.$mdConstant.KEY_CODE;self.ngInputElement.on("keydown",function(event){event.altKey&&event.keyCode==keyCodes.DOWN_ARROW&&(self.openTimePane(event),$scope.$digest())}),$scope.$on("md-time-close",function(){self.closeTimePane()})},TimePickerCtrl.prototype.installPropertyInterceptors=function(){var self=this;if(this.$attrs.ngDisabled){var scope=this.$mdUtil.validateScope(this.$element)?this.$element.scope():null;scope&&scope.$watch(this.$attrs.ngDisabled,function(isDisabled){self.setDisabled(isDisabled)})}Object.defineProperty(this,"placeholder",{get:function(){return self.inputElement.placeholder},set:function(value){self.inputElement.placeholder=value||""}})},TimePickerCtrl.prototype.setDisabled=function(isDisabled){this.isDisabled=isDisabled,this.inputElement.disabled=isDisabled,this.timeButton.disabled=isDisabled},TimePickerCtrl.prototype.resizeInputElement=function(){this.inputElement.size=this.inputElement.value.length+EXTRA_INPUT_SIZE},TimePickerCtrl.prototype.handleInputEvent=function(self){var inputString=this.inputElement.value,arr=inputString.split(":");if(""===inputString)this.ngModelCtrl.$setViewValue(null),this.time=null,this.inputContainer.classList.remove(INVALID_CLASS);else if(arr.length<2)this.inputContainer.classList.toggle(INVALID_CLASS,inputString);else{var h=Number(arr[0]),m=Number(arr[1]),newVal=new Date(this.time);h&&h>=0&&23>=h&&m&&m>=0&&59>=m&&angular.isDate(newVal)?(newVal.setHours(h),newVal.setMinutes(m),this.ngModelCtrl.$setViewValue(newVal),this.time=newVal,this.inputContainer.classList.remove(INVALID_CLASS)):this.inputContainer.classList.toggle(INVALID_CLASS,inputString)}},TimePickerCtrl.prototype.attachTimePane=function(){var timePane=this.timePane;this.$element.addClass("sg-timepicker-open"),this.$element.find("button").addClass("md-primary");var elementRect=this.inputContainer.getBoundingClientRect(),bodyRect=document.body.getBoundingClientRect(),paneTop=elementRect.top-bodyRect.top,paneLeft=elementRect.left-bodyRect.left,paneWidth=this.$mdMedia("sm")?TIME_PANE_WIDTH.SM:TIME_PANE_WIDTH.GTSM;paneLeft+paneWidth>bodyRect.right&&bodyRect.right-paneWidth>0&&(paneLeft=bodyRect.right-paneWidth,timePane.classList.add("sg-timepicker-pos-adjusted")),timePane.style.left=paneLeft+"px";var min="object"==typeof this.time&&this.time.getMinutes()%5===0?"MIN5":"MIN1",paneHeight=this.$mdMedia("sm")?TIME_PANE_HEIGHT[min].SM:TIME_PANE_HEIGHT[min].GTSM;paneTop+paneHeight>bodyRect.bottom&&bodyRect.bottom-paneHeight>0&&(paneTop=bodyRect.bottom-paneHeight,timePane.classList.add("sg-timepicker-pos-adjusted")),timePane.style.top=paneTop+"px",document.body.appendChild(this.timePane),this.inputMask.style.left=elementRect.width+"px",this.$$rAF(function(){timePane.classList.add("md-pane-open")})},TimePickerCtrl.prototype.detachTimePane=function(){this.$element.removeClass("sg-timepicker-open"),this.$element.find("button").removeClass("md-primary"),this.timePane.classList.remove("md-pane-open"),this.timePane.classList.remove("md-timepicker-pos-adjusted"),this.timePane.parentNode&&this.timePane.parentNode.removeChild(this.timePane)},TimePickerCtrl.prototype.openTimePane=function(event){if(!this.isTimeOpen&&!this.isDisabled){this.isTimeOpen=!0,this.timePaneOpenedFrom=event.target,this.attachTimePane(),this.$mdUtil.disableScrollAround(this.timePane);var self=this;this.$mdUtil.nextTick(function(){document.body.addEventListener("click",self.bodyClickHandler)},!1),window.addEventListener("resize",this.windowResizeHandler)}},TimePickerCtrl.prototype.closeTimePane=function(){this.isTimeOpen=!1,this.detachTimePane(),this.timePaneOpenedFrom.focus(),this.timePaneOpenedFrom=null,this.$mdUtil.enableScrolling(),document.body.removeEventListener("click",this.bodyClickHandler),window.removeEventListener("resize",this.windowResizeHandler)},TimePickerCtrl.prototype.getTimePaneCtrl=function(){return angular.element(this.timePane.querySelector("sg-time-pane")).controller("sgTimePane")},TimePickerCtrl.prototype.focusTime=function(){var self=this;this.$mdUtil.nextTick(function(){var ctrl=self.getTimePaneCtrl();self.getTimePaneCtrl().focus(null,ctrl)},!1)},TimePickerCtrl.prototype.setFocused=function(isFocused){this.isFocused=isFocused},TimePickerCtrl.prototype.handleBodyClick=function(event){if(this.isTimeOpen){var isInTime=this.$mdUtil.getClosest(event.target,"sg-time-pane");isInTime||this.closeTimePane(),this.$scope.$digest()}}}(),function(){"use strict";function sgToggleGrid($parse){function link(scope,iElement,attrs,ctrl){function toggle(day){var i=_.findIndex(modelDays,function(o){return modelAttr?o[modelAttr]==day:o==day});if(0>i)if(modelAttr){var o={};o[modelAttr]=day,modelDays.push(o)}else modelDays.push(day);else modelDays.splice(i,1)}var tile,i,modelDays,modelAttr,ensureInitRunsOnce,toggleClass,tiles=iElement.find("md-grid-tile");for(ensureInitRunsOnce=scope.$watch(function(){return $parse(attrs.sgToggleGrid)(scope)},function(days){if(angular.isDefined(days)){var flattenedDays=days;modelDays=days,attrs.sgToggleGridAttr&&(modelAttr=attrs.sgToggleGridAttr,flattenedDays=_.pluck(days,attrs.sgToggleGridAttr)),_.each(tiles,function(o){var tile=angular.element(o);_.contains(flattenedDays,tile.attr("value"))&&tile.addClass("sg-active")}),ensureInitRunsOnce()}}),toggleClass=function(){var tile=angular.element(this),day=tile.attr("value");tile.toggleClass("sg-active"),toggle(day)},i=0;i<tiles.length;i++)tile=angular.element(tiles[i]),tile.addClass("iconButton"),tile.find("figure").addClass("md-icon"),tile.on("click",toggleClass)}return{restrict:"A",link:link}}sgToggleGrid.$inject=["$parse"],angular.module("SOGo.Common").directive("sgToggleGrid",sgToggleGrid)}(),function(){"use strict";function sgVariableScrollShrink(){function link(scope,element,attrs,ctrl){console.debug("scroll shrink height = "+element.prop("offsetHeight"))}return{restrict:"C",link:link}}angular.module("SOGo.Common").directive("sgVariableScrollShrink",sgVariableScrollShrink)}(),String.prototype.endsWith=function(suffix){return-1!==this.indexOf(suffix,this.length-suffix.length)},String.prototype.startsWith=function(pattern,position){return position=angular.isNumber(position)?position:0,this.lastIndexOf(pattern,position)===position},String.prototype._base64_keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",String.prototype.base64encode=function(){for(var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0,input=this.utf8encode();i<input.length;)chr1=input.charCodeAt(i++),chr2=input.charCodeAt(i++),chr3=input.charCodeAt(i++),enc1=chr1>>2,enc2=(3&chr1)<<4|chr2>>4,enc3=(15&chr2)<<2|chr3>>6,enc4=63&chr3,isNaN(chr2)?enc3=enc4=64:isNaN(chr3)&&(enc4=64),output=output+this._base64_keyStr.charAt(enc1)+this._base64_keyStr.charAt(enc2)+this._base64_keyStr.charAt(enc3)+this._base64_keyStr.charAt(enc4);return output},String.prototype.base64decode=function(){for(var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0,input=""+this;i<input.length;)enc1=this._base64_keyStr.indexOf(input.charAt(i++)),enc2=this._base64_keyStr.indexOf(input.charAt(i++)),enc3=this._base64_keyStr.indexOf(input.charAt(i++)),enc4=this._base64_keyStr.indexOf(input.charAt(i++)),chr1=enc1<<2|enc2>>4,chr2=(15&enc2)<<4|enc3>>2,chr3=(3&enc3)<<6|enc4,output+=String.fromCharCode(chr1),64!=enc3&&(output+=String.fromCharCode(chr2)),64!=enc4&&(output+=String.fromCharCode(chr3));return output},String.prototype.md5=function(){if(this.length){var md5=function(s){function L(k,d){return k<<d|k>>>32-d}function K(G,k){var I,d,F,H,x;return F=2147483648&G,H=2147483648&k,I=1073741824&G,d=1073741824&k,x=(1073741823&G)+(1073741823&k),I&d?2147483648^x^F^H:I|d?1073741824&x?3221225472^x^F^H:1073741824^x^F^H: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){return G=K(G,K(K(r(F,aa,Z),k),I)),K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){return G=K(G,K(K(q(F,aa,Z),k),I)),K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){return G=K(G,K(K(p(F,aa,Z),k),I)),K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){return G=K(G,K(K(n(F,aa,Z),k),I)),K(L(G,H),F)}function e(G){for(var Z,F=G.length,x=F+8,k=(x-x%64)/64,I=16*(k+1),aa=Array(I-1),d=0,H=0;F>H;)Z=(H-H%4)/4,d=H%4*8,aa[Z]=aa[Z]|G.charCodeAt(H)<<d,H++;return 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,aa}function B(x){var G,d,k="",F="";for(d=0;3>=d;d++)G=x>>>8*d&255,F="0"+G.toString(16),k+=F.substr(F.length-2,2);return k}function J(k){k=k.replace(/rn/g,"n");for(var d="",F=0;F<k.length;F++){var x=k.charCodeAt(F);128>x?d+=String.fromCharCode(x):x>127&&2048>x?(d+=String.fromCharCode(x>>6|192),d+=String.fromCharCode(63&x|128)):(d+=String.fromCharCode(x>>12|224),d+=String.fromCharCode(x>>6&63|128),d+=String.fromCharCode(63&x|128))}return d}var P,h,E,v,g,Y,X,W,V,C=Array(),S=7,Q=12,N=17,M=22,A=5,z=9,y=14,w=20,o=4,m=11,l=16,j=23,U=6,T=10,R=15,O=21;for(s=J(s),C=e(s),Y=1732584193,X=4023233417,W=2562383102,V=271733878,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()};return md5(this.toLowerCase())}},String.prototype.capitalize=function(){return this.charAt(0).toUpperCase()+this.slice(1)},String.prototype.asDate=function(){var newDate,date=this.split("/");return 3==date.length?newDate=new Date(date[2],date[1]-1,date[0]):(date=this.split("-"),3==date.length?newDate=new Date(date[0],date[1]-1,date[2]):8==this.length&&(newDate=new Date(this.substring(0,4),this.substring(4,6)-1,this.substring(6,8)))),newDate},String.prototype.formatTime=function(hours,minutes){var newString=this,p="am",i=hours,m=minutes;return hours>12&&(p="pm",i=hours%12),10>minutes&&(m="0"+minutes),newString=newString.replace("%H",10>hours?"0"+hours:hours),newString=newString.replace("%I",10>i?"0"+i:i),newString=newString.replace("%M",m),newString=newString.replace("%p",p)},Date.prototype.daysUpTo=function(otherDate){var days=[],day1=this.getTime(),day2=otherDate.getTime();if(day1>day2){var tmp=day1;day1=day2,day2=tmp}for(var nbrDays=Math.round((day2-day1)/864e5)+1,i=0;nbrDays>i;i++){var newDate=new Date;newDate.setTime(day1+864e5*i),days.push(newDate)}return days},String.prototype.isValidEmail=function(){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;return emailRE.test(this)},String.prototype.asCSSIdentifier=function(){for(var characters=["_","\\.","#","@","\\*",":",","," ","'","&","\\+"],escapeds=["_U_","_D_","_H_","_A_","_S_","_C_","_CO_","_SP_","_SQ_","_AM_","_P_"],newString=this,i=0;i<characters.length;i++){var re=new RegExp(characters[i],"g");newString=newString.replace(re,escapeds[i])}return/^\d+/.test(newString)&&(newString="_"+newString),newString},String.prototype.timeInterval=function(){var interval;return interval="once_per_hour"==this?3600:"every_minute"==this?60:60*parseInt(this.substr(6))},Date.prototype.stringWithSeparator=function(separator){var month=""+(this.getMonth()+1),day=""+this.getDate(),year=this.getYear();return 1e3>year&&(year=""+(year+1900)),1==month.length&&(month="0"+month),1==day.length&&(day="0"+day),"-"==separator?str=year+"-"+month+"-"+day:str=day+"/"+month+"/"+year,str},Date.prototype.addDays=function(nbrDays){var milliSeconds=this.getTime();milliSeconds+=864e5*nbrDays,this.setTime(milliSeconds);
},Date.prototype.addHours=function(nbrHours){var milliSeconds=this.getTime();milliSeconds+=36e5*nbrHours,this.setTime(milliSeconds)},Date.prototype.addMinutes=function(nbrMinutes){var milliSeconds=this.getTime();milliSeconds+=6e4*nbrMinutes,this.setTime(milliSeconds)},Date.prototype.beginOfDay=function(){var beginOfDay=new Date(this.getTime());return beginOfDay.setHours(0),beginOfDay.setMinutes(0),beginOfDay.setSeconds(0),beginOfDay.setMilliseconds(0),beginOfDay},Date.prototype.beginOfWeek=function(){var offset=firstDayOfWeek-this.getDay();offset>0&&(offset-=7);var beginOfWeek=this.beginOfDay();return beginOfWeek.setHours(12),beginOfWeek.addDays(offset),beginOfWeek},Date.prototype.endOfWeek=function(){var endOfWeek=this.beginOfWeek();return endOfWeek.addDays(6),endOfWeek.setHours(23),endOfWeek.setMinutes(59),endOfWeek.setSeconds(59),endOfWeek.setMilliseconds(999),endOfWeek},Date.prototype.getDayString=function(){var newString=this.getYear();1e3>newString&&(newString+=1900);var month=""+(this.getMonth()+1);1==month.length&&(month="0"+month),newString+=month;var day=""+this.getDate();return 1==day.length&&(day="0"+day),newString+=day},Date.prototype.getHourString=function(){var newString=this.getHours()+"00";return 3==newString.length&&(newString="0"+newString),newString};
//# sourceMappingURL=Common.js.map