sogo/UI/WebServerResources/js/Scheduler.js
2015-12-04 15:38:30 -05:00

3 lines
48 KiB
JavaScript

(function(){"use strict";angular.module("SOGo.SchedulerUI",["ngSanitize","ui.router","angularFileUpload","SOGo.Common","SOGo.PreferencesUI","SOGo.ContactsUI","SOGo.MailerUI"]).config(configure).run(runBlock);configure.$inject=["$stateProvider","$urlRouterProvider"];function configure($stateProvider,$urlRouterProvider){$stateProvider.state("calendars",{url:"/calendar",views:{calendars:{templateUrl:"UIxCalMainView",controller:"CalendarsController",controllerAs:"app"}},resolve:{stateCalendars:stateCalendars}}).state("calendars.view",{url:"/{view:(?:day|week|month|multicolumnday)}/:day",views:{calendarView:{templateUrl:function($stateParams){return $stateParams.view+"view?day="+$stateParams.day},controller:"CalendarController",controllerAs:"calendar"}},resolve:{stateEventsBlocks:stateEventsBlocks}});$urlRouterProvider.when("/calendar/day",function(){var now=new Date;return"/calendar/day/"+now.getDayString()});$urlRouterProvider.when("/calendar/multicolumnday",function(){var now=new Date;return"/calendar/multicolumnday/"+now.getDayString()});$urlRouterProvider.when("/calendar/week",function(){var now=new Date;return"/calendar/week/"+now.getDayString()});$urlRouterProvider.when("/calendar/month",function(){var now=new Date;return"/calendar/month/"+now.getDayString()});$urlRouterProvider.otherwise("/calendar")}stateCalendars.$inject=["Calendar"];function stateCalendars(Calendar){return Calendar.$calendars||Calendar.$findAll(window.calendarsData)}stateEventsBlocks.$inject=["$stateParams","Component","Calendar"];function stateEventsBlocks($stateParams,Component,Calendar){return Component.$eventsBlocksForView($stateParams.view,$stateParams.day.asDate()).then(function(views){_.forEach(views,function(view){if(view.id){view.calendar=new Calendar({id:view.id,name:view.calendarName})}});return views})}runBlock.$inject=["$rootScope","$log","$location","$state","Preferences"];function runBlock($rootScope,$log,$location,$state,Preferences){$rootScope.$on("$stateChangeError",function(event,toState,toParams,fromState,fromParams,error){$log.error(error);$state.go("calendar")});$rootScope.$on("$routeChangeError",function(event,current,previous,rejection){$log.error(event,current,previous,rejection)});if($location.url().length===0){Preferences.ready().then(function(){var view=/(.+)view/.exec(Preferences.settings.Calendar.View);if(view){$location.replace().url("/calendar/"+view[1])}})}}})();(function(){"use strict";CalendarController.$inject=["$scope","$rootScope","$state","$stateParams","Calendar","Component","stateEventsBlocks"];function CalendarController($scope,$rootScope,$state,$stateParams,Calendar,Component,stateEventsBlocks){var vm=this,deregisterCalendarsList;vm.views=stateEventsBlocks;vm.changeView=changeView;deregisterCalendarsList=$rootScope.$on("calendars:list",updateView);$scope.$on("$destroy",deregisterCalendarsList);function updateView(){Component.$eventsBlocksForView($stateParams.view,$stateParams.day.asDate()).then(function(data){vm.views=data;_.forEach(vm.views,function(view){if(view.id){view.calendar=new Calendar({id:view.id,name:view.calendarName})}})})}function changeView($event){var date=angular.element($event.currentTarget).attr("date");$state.go("calendars.view",{view:$stateParams.view,day:date})}}angular.module("SOGo.SchedulerUI").controller("CalendarController",CalendarController)})();(function(){"use strict";CalendarListController.$inject=["$rootScope","$timeout","$state","$mdDialog","Dialog","Preferences","Calendar","Component"];function CalendarListController($rootScope,$timeout,$state,$mdDialog,Dialog,Preferences,Calendar,Component){var vm=this;vm.component=Component;vm.componentType="events";vm.selectedList=0;vm.selectComponentType=selectComponentType;vm.unselectComponents=unselectComponents;vm.selectAll=selectAll;vm.toggleComponentSelection=toggleComponentSelection;vm.confirmDeleteSelectedComponents=confirmDeleteSelectedComponents;vm.openEvent=openEvent;vm.openTask=openTask;vm.newComponent=newComponent;vm.filter=filter;vm.filteredBy=filteredBy;vm.sort=sort;vm.sortedBy=sortedBy;vm.reload=reload;vm.cancelSearch=cancelSearch;vm.mode={search:false};Preferences.ready().then(function(){var type="events";if(Preferences.settings.Calendar.SelectedList=="tasksListView"){vm.selectedList=1;type="tasks"}selectComponentType(type,{reload:true})});$rootScope.$on("calendars:list",function(){Component.$filter(vm.componentType,{reload:true})});$rootScope.$on("calendar:dragend",updateComponentFromGhost);function selectComponentType(type,options){if(options&&options.reload||vm.componentType!=type){if(angular.isUndefined(Component["$"+type]))Component.$filter(type);vm.unselectComponents();vm.componentType=type;Component.saveSelectedList(type)}}function unselectComponents(){_.each(Component["$"+vm.componentType],function(component){component.selected=false})}function selectAll(){_.each(Component["$"+vm.componentType],function(component){component.selected=true})}function toggleComponentSelection($event,component){component.selected=!component.selected;$event.preventDefault();$event.stopPropagation()}function confirmDeleteSelectedComponents(){Dialog.confirm(l("Warning"),l("Are you sure you want to delete the selected components?")).then(function(){var components=_.filter(Component["$"+vm.componentType],function(component){return component.selected});Calendar.$deleteComponents(components)},function(data,status){})}function openEvent($event,event){openComponent($event,event,"appointment")}function openTask($event,task){openComponent($event,task,"task")}function openComponent($event,component,type){if(component.viewable){var templateUrl="UIx"+type.capitalize()+"ViewTemplate";$mdDialog.show({parent:angular.element(document.body),targetEvent:$event,clickOutsideToClose:true,escapeToClose:true,templateUrl:templateUrl,controller:"ComponentController",controllerAs:"editor",locals:{stateComponent:component}})}}function newComponent($event,baseComponent){var type="appointment",component;if(baseComponent){component=baseComponent;type=baseComponent.type}else{if(vm.componentType=="tasks")type="task";component=new Component({pid:"personal",type:type})}var templateUrl="UIx"+type.capitalize()+"EditorTemplate";return $mdDialog.show({parent:angular.element(document.body),targetEvent:$event,clickOutsideToClose:true,escapeToClose:true,templateUrl:templateUrl,controller:"ComponentEditorController",controllerAs:"editor",locals:{stateComponent:component}})}function updateComponentFromGhost($event){var component,pointerHandler,coordinates,delta,params;component=Component.$ghost.component;pointerHandler=Component.$ghost.pointerHandler;if(component.isNew){coordinates=pointerHandler.currentEventCoordinates;if(component.isAllDay)coordinates.duration-=96;component.setDelta(coordinates.duration*15);newComponent(null,component).finally(function(){$timeout(function(){Component.$ghost.pointerHandler=null;Component.$ghost.component=null})})}else{delta=pointerHandler.currentEventCoordinates.getDelta(pointerHandler.originalEventCoordinates);params={days:delta.dayNumber,start:delta.start*15,duration:delta.duration*15};if(component.isException||!component.occurrenceId)component.$adjust(params).then(function(){$rootScope.$emit("calendars:list");$timeout(function(){Component.$ghost={}})});else if(component.occurrenceId){$mdDialog.show({clickOutsideToClose:true,escapeToClose:true,locals:{component:component,params:params},template:['<md-dialog flex="50" md-flex="80" sm-flex="90">',' <md-dialog-content class="md-dialog-content">'," <p>"+l("editRepeatingItem")+"</p>"," </md-dialog-content>"," <md-dialog-actions>",' <md-button ng-click="updateThisOccurrence()">'+l("button_thisOccurrenceOnly")+"</md-button>",' <md-button ng-click="updateAllOccurrences()">'+l("button_allOccurrences")+"</md-button>"," </md-dialog-actions>","</md-dialog>"].join(""),controller:RecurrentComponentDialogController}).then(function(){$rootScope.$emit("calendars:list")}).finally(function(){$timeout(function(){Component.$ghost={}})})}}RecurrentComponentDialogController.$inject=["$scope","$mdDialog","component","params"];function RecurrentComponentDialogController($scope,$mdDialog,component,params){$scope.updateThisOccurrence=function(){component.$adjust(params).then($mdDialog.hide,$mdDialog.cancel)};$scope.updateAllOccurrences=function(){delete component.occurrenceId;component.$adjust(params).then($mdDialog.hide,$mdDialog.cancel)}}}function filter(filterpopup){Component.$filter(vm.componentType,{filterpopup:filterpopup})}function filteredBy(filterpopup){return Component["$query"+vm.componentType.capitalize()].filterpopup==filterpopup}function sort(field){Component.$filter(vm.componentType,{sort:field})}function sortedBy(field){return Component["$query"+vm.componentType.capitalize()].sort==field}function reload(){$rootScope.$emit("calendars:list")}function cancelSearch(){vm.mode.search=false;Component.$filter(vm.componentType,{value:""})}}angular.module("SOGo.SchedulerUI").controller("CalendarListController",CalendarListController)})();(function(){"use strict";CalendarsController.$inject=["$rootScope","$scope","$window","$mdDialog","$log","$mdToast","FileUploader","sgFocus","Dialog","sgSettings","Preferences","Calendar","User","stateCalendars"];function CalendarsController($rootScope,$scope,$window,$mdDialog,$log,$mdToast,FileUploader,focus,Dialog,Settings,Preferences,Calendar,User,stateCalendars){var vm=this;vm.activeUser=Settings.activeUser;vm.service=Calendar;vm.newCalendar=newCalendar;vm.addWebCalendar=addWebCalendar;vm.confirmDelete=confirmDelete;vm.editFolder=editFolder;vm.revertEditing=revertEditing;vm.renameFolder=renameFolder;vm.share=share;vm.importCalendar=importCalendar;vm.exportCalendar=exportCalendar;vm.showLinks=showLinks;vm.showProperties=showProperties;vm.subscribeToFolder=subscribeToFolder;vm.today=today;Preferences.ready().then(function(){vm.categories=_.map(Preferences.defaults.SOGoCalendarCategories,function(name){return{id:name.asCSSIdentifier(),name:name,color:Preferences.defaults.SOGoCalendarCategoriesColors[name]}})});$scope.$watch(function(){return _.union(_.map(Calendar.$calendars,function(o){return _.pick(o,["id","active","color"])}),_.map(Calendar.$subscriptions,function(o){return _.pick(o,["id","active","color"])}),_.map(Calendar.$webcalendars,function(o){return _.pick(o,["id","active","color"])}))},function(newList,oldList){var ids=_.pluck(_.filter(newList,function(o,i){return!_.isEqual(o,oldList[i])}),"id");if(ids.length>0){$log.debug(ids.join(", ")+" changed");_.each(ids,function(id){var calendar=Calendar.$get(id);calendar.$setActivation().then(function(){$rootScope.$emit("calendars:list")})})}},true);function newCalendar(ev){Dialog.prompt(l("New calendar"),l("Name of the Calendar")).then(function(name){var calendar=new Calendar({name:name,isEditable:true,isRemote:false,owner:UserLogin});calendar.$id().then(function(){Calendar.$add(calendar)})})}function addWebCalendar(){Dialog.prompt(l("Subscribe to a web calendar..."),l("URL of the Calendar"),{inputType:"url"}).then(function(url){Calendar.$addWebCalendar(url)})}function confirmDelete(folder){if(folder.isSubscription){folder.$delete().then(function(){$rootScope.$emit("calendars:list")},function(data,status){Dialog.alert(l('An error occured while deleting the calendar "%{0}".',folder.name),l(data.error))})}else{Dialog.confirm(l("Warning"),l("Are you sure you want to delete the calendar <em>%{0}</em>?",folder.name)).then(function(){folder.$delete().then(function(){$rootScope.$emit("calendars:list")},function(data,status){Dialog.alert(l('An error occured while deleting the calendar "%{0}".',folder.name),l(data.error))})})}}function importCalendar($event,folder){$mdDialog.show({parent:angular.element(document.body),targetEvent:$event,clickOutsideToClose:true,escapeToClose:true,templateUrl:"UIxCalendarImportDialog",controller:CalendarImportDialogController,controllerAs:"$CalendarImportDialogController",locals:{folder:folder}});CalendarImportDialogController.$inject=["scope","$mdDialog","folder"];function CalendarImportDialogController(scope,$mdDialog,folder){var vm=this;vm.uploader=new FileUploader({url:ApplicationBaseURL+[folder.id,"import"].join("/"),autoUpload:true,queueLimit:1,filters:[{name:filterByExtension,fn:filterByExtension}],onSuccessItem:function(item,response,status,headers){var msg;$mdDialog.hide();if(response.imported===0)msg=l("No event was imported.");else{msg=l("A total of %{0} events were imported in the calendar.",response.imported);$rootScope.$emit("calendars:list")}$mdToast.show($mdToast.simple().content(msg).position("top right").hideDelay(3e3))},onErrorItem:function(item,response,status,headers){$mdToast.show({template:["<md-toast>",' <md-icon class="md-warn md-hue-1">error_outline</md-icon>'," <span>"+l("An error occurred while importing calendar.")+"</span>","</md-toast>"].join(""),position:"top right",hideDelay:3e3})}});vm.close=function(){$mdDialog.hide()};function filterByExtension(item){var isTextFile=item.type.indexOf("text")===0||/\.(ics)$/.test(item.name);if(!isTextFile)$mdToast.show({template:["<md-toast>",' <md-icon class="md-warn md-hue-1">error_outline</md-icon>'," <span>"+l("Select an iCalendar file (.ics).")+"</span>","</md-toast>"].join(""),position:"top right",hideDelay:3e3});return isTextFile}}}function exportCalendar(calendar){window.location.href=ApplicationBaseURL+"/"+calendar.id+".ics"+"/export"}function showLinks(calendar){$mdDialog.show({parent:angular.element(document.body),clickOutsideToClose:true,escapeToClose:true,templateUrl:calendar.id+"/links",controller:LinksDialogController,controllerAs:"links",locals:{calendar:calendar}});LinksDialogController.$inject=["$mdDialog","calendar"];function LinksDialogController($mdDialog,calendar){var vm=this;vm.calendar=calendar;vm.close=close;function close(){$mdDialog.hide()}}}function showProperties(calendar){var color=calendar.color;$mdDialog.show({templateUrl:calendar.id+"/properties",controller:PropertiesDialogController,controllerAs:"properties",clickOutsideToClose:true,escapeToClose:true,locals:{srcCalendar:calendar}}).catch(function(){calendar.color=color});PropertiesDialogController.$inject=["$scope","$mdDialog","srcCalendar"];function PropertiesDialogController($scope,$mdDialog,srcCalendar){var vm=this;vm.calendar=new Calendar(srcCalendar.$omit());vm.saveProperties=saveProperties;vm.close=close;$scope.$watch("properties.calendar.color",function(){srcCalendar.color=vm.calendar.color});function saveProperties(){vm.calendar.$save();srcCalendar.init(vm.calendar.$omit());$mdDialog.hide()}function close(){$mdDialog.cancel()}}}function editFolder(folder){vm.calendarName=folder.name;vm.editMode=folder.id;focus("calendarName_"+folder.id)}function revertEditing(folder){folder.$reset();vm.editMode=false}function renameFolder(folder){folder.$rename().then(function(data){vm.editMode=false},function(data,status){Dialog.alert(l("Warning"),data)})}function share(calendar){calendar.$acl.$users().then(function(){$mdDialog.show({templateUrl:calendar.id+"/UIxAclEditor",controller:"AclController",controllerAs:"acl",clickOutsideToClose:true,escapeToClose:true,locals:{usersWithACL:calendar.$acl.users,User:User,folder:calendar}})})}function subscribeToFolder(calendarData){$log.debug("subscribeToFolder "+calendarData.owner+calendarData.name);Calendar.$subscribe(calendarData.owner,calendarData.name).catch(function(data){Dialog.alert(l("Warning"),l("An error occured please try again."))})}function today(){var fragments=$window.location.hash.split("/"),state=fragments[1],view=fragments[2],now=new Date,path=["#",state,view,now.getDayString()];$window.location=path.join("/")}}angular.module("SOGo.SchedulerUI").controller("CalendarsController",CalendarsController)})();(function(){"use strict";ComponentController.$inject=["$rootScope","$mdDialog","Calendar","AddressBook","Alarm","stateComponent"];function ComponentController($rootScope,$mdDialog,Calendar,AddressBook,Alarm,stateComponent){var vm=this,component;vm.component=stateComponent;vm.close=close;vm.cardFilter=cardFilter;vm.edit=edit;vm.editAllOccurrences=editAllOccurrences;vm.reply=reply;vm.replyAllOccurrences=replyAllOccurrences;vm.deleteOccurrence=deleteOccurrence;vm.deleteAllOccurrences=deleteAllOccurrences;vm.toggleRawSource=toggleRawSource;if(angular.isUndefined(vm.component.$futureComponentData)){component=Calendar.$get(vm.component.pid).$getComponent(vm.component.id,vm.component.occurrenceId);component.$futureComponentData.then(function(){vm.component=component;vm.organizer=[vm.component.organizer]})}function close(){$mdDialog.hide()}function cardFilter($query){AddressBook.$filterAll($query);return AddressBook.$cards}function edit(){var type=vm.component.component=="vevent"?"Appointment":"Task";$mdDialog.hide().then(function(){var templateUrl="UIx"+type+"EditorTemplate";$mdDialog.show({parent:angular.element(document.body),clickOutsideToClose:true,escapeToClose:true,templateUrl:templateUrl,controller:"ComponentEditorController",controllerAs:"editor",locals:{stateComponent:vm.component}})})}function editAllOccurrences(){component=Calendar.$get(vm.component.pid).$getComponent(vm.component.id);component.$futureComponentData.then(function(){vm.component=component;edit()})}function reply(component){var c=component||vm.component;c.$reply().then(function(){$rootScope.$emit("calendars:list");$mdDialog.hide();Alarm.getAlarms()})}function replyAllOccurrences(){component=Calendar.$get(vm.component.pid).$getComponent(vm.component.id);component.$futureComponentData.then(function(){component.reply=vm.component.reply;component.delegatedTo=vm.component.delegatedTo;component.$hasAlarm=vm.component.$hasAlarm;component.alarm=vm.component.alarm;reply(component)})}function deleteOccurrence(){vm.component.remove(true).then(function(){$rootScope.$emit("calendars:list");$mdDialog.hide()})}function deleteAllOccurrences(){vm.component.remove().then(function(){$rootScope.$emit("calendars:list");$mdDialog.hide()})}function toggleRawSource($event){Calendar.$$resource.post(vm.component.pid+"/"+vm.component.id,"raw").then(function(data){$mdDialog.hide();$mdDialog.show({parent:angular.element(document.body),targetEvent:$event,clickOutsideToClose:true,escapeToClose:true,template:['<md-dialog flex="80" flex-xs="100" aria-label="'+l("View Raw Source")+'">',' <md-dialog-content class="md-dialog-content">'," <pre>",data," </pre>"," </md-dialog-content>"," <md-dialog-actions>",' <md-button ng-click="close()">'+l("Close")+"</md-button>"," </md-dialog-actions>","</md-dialog>"].join(""),controller:ComponentRawSourceDialogController});ComponentRawSourceDialogController.$inject=["scope","$mdDialog"];function ComponentRawSourceDialogController(scope,$mdDialog){scope.close=function(){$mdDialog.hide()}}})}}ComponentEditorController.$inject=["$rootScope","$scope","$log","$timeout","$mdDialog","User","Calendar","Component","AddressBook","Card","Alarm","stateComponent"];function ComponentEditorController($rootScope,$scope,$log,$timeout,$mdDialog,User,Calendar,Component,AddressBook,Card,Alarm,stateComponent){var vm=this,component,oldStartDate,oldEndDate,oldDueDate;vm.calendars=Calendar.$calendars;vm.component=stateComponent;vm.categories={};vm.showRecurrenceEditor=vm.component.$hasCustomRepeat;vm.toggleRecurrenceEditor=toggleRecurrenceEditor;vm.showAttendeesEditor=angular.isDefined(vm.component.attendees);vm.toggleAttendeesEditor=toggleAttendeesEditor;vm.cardFilter=cardFilter;vm.addAttendee=addAttendee;vm.addAttachUrl=addAttachUrl;vm.cancel=cancel;vm.save=save;vm.attendeesEditor={days:getDays(),hours:getHours()};vm.addStartDate=addStartDate;vm.addDueDate=addDueDate;vm.updateStartTime=updateStartTime;vm.adjustStartTime=adjustStartTime;vm.updateEndTime=updateEndTime;vm.adjustEndTime=adjustEndTime;vm.updateDueTime=updateDueTime;vm.adjustDueTime=adjustDueTime;if(vm.component.start)oldStartDate=new Date(vm.component.start.getTime());if(vm.component.end)oldEndDate=new Date(vm.component.end.getTime());if(vm.component.due)oldDueDate=new Date(vm.component.due.getTime());function addAttachUrl(){var i=vm.component.addAttachUrl("");focus("attachUrl_"+i)}function toggleRecurrenceEditor(){vm.showRecurrenceEditor=!vm.showRecurrenceEditor;vm.component.$hasCustomRepeat=vm.showRecurrenceEditor}function toggleAttendeesEditor(){vm.showAttendeesEditor=!vm.showAttendeesEditor}function cardFilter($query){AddressBook.$filterAll($query);return AddressBook.$cards}function addAttendee(card){if(angular.isString(card)){if(card.isValidEmail()){vm.component.addAttendee(new Card({emails:[{value:card}]}));vm.searchText=""}}else{vm.component.addAttendee(card)}}function save(form){if(form.$valid){vm.component.$save().then(function(data){$rootScope.$emit("calendars:list");$mdDialog.hide();Alarm.getAlarms()},function(data,status){$log.debug("failed")})}}function cancel(){vm.component.$reset();if(vm.component.isNew){vm.component=null}$mdDialog.cancel()}function getDays(){var days=[];if(vm.component.start&&vm.component.end)days=vm.component.start.daysUpTo(vm.component.end);return _.map(days,function(date){return{stringWithSeparator:date.stringWithSeparator(),getDayString:date.getDayString()}})}function getHours(){var hours=[];for(var i=0;i<=23;i++){hours.push(i.toString())}return hours}function addStartDate(){vm.component.$addStartDate();oldStartDate=new Date(vm.component.start.getTime())}function addDueDate(){vm.component.$addDueDate();oldDueDate=new Date(vm.component.due.getTime())}function updateStartTime(){vm.component.start.addMinutes(oldStartDate.getHours()*60+oldStartDate.getMinutes());adjustStartTime()}function adjustStartTime(){var delta;delta=oldStartDate.valueOf()-vm.component.start.valueOf();if(delta!==0){oldStartDate=new Date(vm.component.start.getTime());if(vm.component.type==="appointment"){vm.component.end=new Date(vm.component.start.getTime());vm.component.end.addMinutes(vm.component.delta);oldEndDate=new Date(vm.component.end.getTime())}}updateFreeBusy()}function updateEndTime(){vm.component.end.addMinutes(oldEndDate.getHours()*60+oldEndDate.getMinutes());adjustEndTime()}function adjustEndTime(){var delta=vm.component.start.minutesTo(vm.component.end);if(delta<0)vm.component.end=new Date(oldEndDate.getTime());else{vm.component.delta=delta;oldEndDate=new Date(vm.component.end.getTime())}updateFreeBusy()}function updateDueTime(){vm.component.due.addMinutes(oldDueDate.getHours()*60+oldDueDate.getMinutes());adjustDueTime()}function adjustDueTime(){oldDueDate=new Date(vm.component.due.getTime())}function updateFreeBusy(){vm.attendeesEditor.days=getDays();vm.component.updateFreeBusy()}}angular.module("SOGo.SchedulerUI").controller("ComponentController",ComponentController).controller("ComponentEditorController",ComponentEditorController)})();(function(){"use strict";function sgCalendarDay(){return{restrict:"E",scope:{day:"@sgDay",dayNumber:"@sgDayNumber",dayString:"@sgDayString"},controller:sgCalendarDayController}}sgCalendarDayController.$inject=["$scope"];function sgCalendarDayController($scope){this.day=$scope.day;this.dayNumber=$scope.dayNumber;this.dayString=$scope.dayString}angular.module("SOGo.SchedulerUI").directive("sgCalendarDay",sgCalendarDay)})();(function(){"use strict";sgCalendarDayBlock.$inject=["CalendarSettings"];function sgCalendarDayBlock(CalendarSettings){return{restrict:"E",scope:{block:"=sgBlock",clickBlock:"&sgClick"},replace:true,template:['<div class="sg-event"'," ng-class=\"{'sg-event--dragging': block.dragging}\">",' <div class="eventInside"',' ng-click="clickBlock({clickEvent: $event, clickComponent: block.component})">',' <div class="sg-category" ng-repeat="category in block.component.categories"'," ng-class=\"'bg-category' + category\""," ng-style=\"{ right: ($index * 3) + 'px' }\"></div>",' <div class="text">{{ block.component.summary }}',' <span class="icons">',' <md-icon ng-if="block.component.occurrenceId" class="material-icons icon-repeat"></md-icon>',' <md-icon ng-if="block.component.c_nextalarm" class="material-icons icon-alarm"></md-icon>',' <md-icon ng-if="block.component.c_classification == 1" class="material-icons icon-visibility-off"></md-icon>',' <md-icon ng-if="block.component.c_classification == 2" class="material-icons icon-vpn-key"></md-icon>'," </span>",' <div class="secondary" ng-if="block.component.c_location">'," <md-icon>place</md-icon> {{block.component.c_location}}"," </div>"," </div>"," </div>","</div>"].join(""),link:link};function link(scope,iElement,attrs){var pc,left,right;pc=100/scope.block.siblings;left=scope.block.position*pc;right=100-(scope.block.position+1)*pc;if(pc<100){if(left>0)left-=2;if(right>0)right-=2}if(left===0)left=2;if(right===0)right=2;iElement.css("left",left+"%");iElement.css("right",right+"%");iElement.addClass("starts"+scope.block.start);iElement.addClass("lasts"+scope.block.length);if(scope.block.component)iElement.addClass("bg-folder"+scope.block.component.pid)}}angular.module("SOGo.SchedulerUI").directive("sgCalendarDayBlock",sgCalendarDayBlock)})();(function(){"use strict";function sgCalendarDayTable(){return{restrict:"E",scope:{blocks:"=sgBlocks",day:"@sgDay",clickBlock:"&sgClick"},template:["<sg-calendar-day-block",' class="sg-draggable-calendar-block"',' ng-repeat="block in blocks[day]"',' sg-block="block"',' sg-click="clickBlock({event: clickEvent, component: clickComponent})"/>'].join("")}}angular.module("SOGo.SchedulerUI").directive("sgCalendarDayTable",sgCalendarDayTable)})();(function(){"use strict";sgCalendarGhost.$inject=["$rootScope","$timeout","CalendarSettings","Calendar","Component"];function sgCalendarGhost($rootScope,$timeout,CalendarSettings,Calendar,Component){return{restrict:"A",require:["^sgCalendarDay","^sgCalendarScrollView"],link:link};function link(scope,iElement,attrs,ctrls){var domElement,calendarDayCtrl,scrollViewCtrl;domElement=iElement[0];calendarDayCtrl=ctrls[0];scrollViewCtrl=ctrls[1];iElement.addClass("sg-event--ghost md-whiteframe-3dp ng-hide");var deregisterDragStart=$rootScope.$on("calendar:dragstart",initGhost);var deregisterDrag=$rootScope.$on("calendar:drag",updateGhost);var deregisterDragEnd=$rootScope.$on("calendar:dragend",hideGhost);scope.$on("$destroy",function(){deregisterDragStart();deregisterDrag();deregisterDragEnd()});function initGhost(){scope.block=Component.$ghost;iElement.addClass("bg-folder"+scope.block.component.pid)}function hideGhost(){_.forEachRight(domElement.classList,function(c){if(/^bg-folder/.test(c))iElement.removeClass(c)});iElement.addClass("ng-hide")}function updateGhost(){var showGhost,isRelative,originalDay,currentDay,wasOtherBlock,start,duration,durationLeft,maxDuration,enableTransition;showGhost=false;enableTransition=function(){iElement.removeClass("sg-event--notransition")};if(Calendar.$view&&Calendar.$view.type==scrollViewCtrl.type){isRelative=scrollViewCtrl.type==="multiday-allday";originalDay=scope.block.pointerHandler.originalEventCoordinates.dayNumber;currentDay=scope.block.pointerHandler.currentEventCoordinates.dayNumber;start=scope.block.pointerHandler.currentEventCoordinates.start;durationLeft=scope.block.pointerHandler.currentEventCoordinates.duration;maxDuration=CalendarSettings.EventDragDayLength-start;if(angular.isUndefined(durationLeft))return;duration=durationLeft;if(duration>maxDuration)duration=maxDuration;delete scope.startHour;delete scope.endHour;if(currentDay>-1&&currentDay==calendarDayCtrl.dayNumber){showGhost=true;if(!isRelative){scope.startHour=getStartTime(start);wasOtherBlock=parseInt(iElement.css("top"))===0;if(wasOtherBlock)iElement.addClass("sg-event--notransition");if(Calendar.$view.quarterHeight){iElement.css("top",start*Calendar.$view.quarterHeight+"px");iElement.css("height",duration*Calendar.$view.quarterHeight+"px")}else iElement.css("top",Calendar.$view.topOffset+"px");if(wasOtherBlock)$timeout(enableTransition)}iElement.removeClass("fg-folder"+scope.block.component.pid);iElement.removeClass("sg-event--ghost--last");iElement.addClass("sg-event--ghost--first")}durationLeft-=duration;currentDay++;while(!showGhost&&durationLeft&&currentDay<=calendarDayCtrl.dayNumber){duration=durationLeft;if(duration>CalendarSettings.EventDragDayLength)duration=CalendarSettings.EventDragDayLength;if(currentDay>-1&&currentDay==calendarDayCtrl.dayNumber){showGhost=true;if(!isRelative){wasOtherBlock=parseInt(iElement.css("top"))!==0;if(wasOtherBlock)iElement.addClass("sg-event--notransition");iElement.css("top",Calendar.$view.topOffset+"px");if(Calendar.$view.quarterHeight)iElement.css("height",duration*Calendar.$view.quarterHeight+"px");if(wasOtherBlock)$timeout(enableTransition)}iElement.removeClass("sg-event--ghost--first");iElement.removeClass("sg-event--ghost--last");iElement.addClass("fg-folder"+scope.block.component.pid)}durationLeft-=duration;currentDay++;start=0}if(!durationLeft){if(isRelative){iElement.addClass("sg-event--ghost--last")}else{scope.endHour=getEndTime(start,duration)}}}if(showGhost)iElement.removeClass("ng-hide");else iElement.addClass("ng-hide")}function quartersToHM(quarters){var minutes,hours,mins;minutes=quarters*15;hours=Math.floor(minutes/60);if(hours<10)hours="0"+hours;mins=minutes%60;if(mins<10)mins="0"+mins;return""+hours+":"+mins}function getStartTime(start){return quartersToHM(start)}function getEndTime(start,duration){var end=(start+duration)%CalendarSettings.EventDragDayLength;return quartersToHM(end)}}}angular.module("SOGo.SchedulerUI").directive("sgCalendarGhost",sgCalendarGhost)})();(function(){"use strict";function sgCalendarMonthDay(){return{restrict:"E",scope:{blocks:"=sgBlocks",day:"@sgDay",clickBlock:"&sgClick"},template:["<sg-calendar-month-event",' class="sg-draggable-calendar-block"',' ng-repeat="block in blocks[day]"',' sg-block="block"',' sg-click="clickBlock({event: clickEvent, component: clickComponent})"/>'].join("")}}angular.module("SOGo.SchedulerUI").directive("sgCalendarMonthDay",sgCalendarMonthDay)})();(function(){"use strict";function sgCalendarMonthEvent(){return{restrict:"E",scope:{block:"=sgBlock",clickBlock:"&sgClick"},replace:true,template:['<div class="sg-event"'," ng-class=\"{'sg-event--dragging': block.dragging}\"",' ng-click="clickBlock({clickEvent: $event, clickComponent: block.component})">',' <span class="secondary" ng-if="!block.component.c_isallday">{{ block.starthour }}</span>'," {{ block.component.summary }}",' <span class="icons">',' <md-icon ng-if="block.component.occurrenceId" class="material-icons icon-repeat"></md-icon>',' <md-icon ng-if="block.component.c_nextalarm" class="material-icons icon-alarm"></md-icon>',' <md-icon ng-if="block.component.c_classification == 1" class="material-icons icon-visibility-off"></md-icon>',' <md-icon ng-if="block.component.c_classification == 2" class="material-icons icon-vpn-key"></md-icon>'," </span>","</div>"].join(""),link:link};function link(scope,iElement,attrs){if(scope.block.component)iElement.addClass("bg-folder"+scope.block.component.pid)}}angular.module("SOGo.SchedulerUI").directive("sgCalendarMonthEvent",sgCalendarMonthEvent)})();(function(){"use strict";sgCalendarScrollView.$inject=["$rootScope","$window","$document","$q","$timeout","$mdGesture","Calendar","Component","Preferences"];function sgCalendarScrollView($rootScope,$window,$document,$q,$timeout,$mdGesture,Calendar,Component,Preferences){return{restrict:"A",scope:{type:"@sgCalendarScrollView"},controller:sgCalendarScrollViewController,link:function(scope,element,attrs,controller){var view,scrollView,type,lastScroll,deregisterDragStart,deregisterDragStop;scrollView=element[0];type=scope.type;lastScroll=0;deregisterDragStart=$rootScope.$on("calendar:dragstart",onDragStart);deregisterDragStop=$rootScope.$on("calendar:dragend",onDragEnd);$timeout(initView);scope.$on("$destroy",function(){deregisterDragStart();deregisterDragStop();element.off("mouseover",updateFromPointerHandler);angular.element($window).off("resize",updateCoordinates)});function initView(){
var quarterHeight;quarterHeight=getQuarterHeight();view={type:type,quarterHeight:quarterHeight,scrollStep:6*quarterHeight,maxX:getMaxColumns(),element:scrollView};angular.element($window).on("resize",updateCoordinates);updateCoordinates();if(type!="monthly")Preferences.ready().then(function(){var time,hourCell,quartersOffset;if(Preferences.defaults.SOGoDayStartTime){time=Preferences.defaults.SOGoDayStartTime.split(":");hourCell=document.getElementById("hour"+parseInt(time[0]));quartersOffset=parseInt(time[1])*quarterHeight;scrollView.scrollTop=hourCell.offsetTop+quartersOffset}})}function getQuarterHeight(){var hour0,hour23,height=null;hour0=document.getElementById("hour0");hour23=document.getElementById("hour23");if(hour0&&hour23)height=(hour23.offsetTop-hour0.offsetTop)/(23*4);return height}function getDayDimensions(viewLeft){var width,height,leftOffset,topOffset,nodes,domRect,tileHeader;height=width=leftOffset=topOffset=0;nodes=scrollView.getElementsByClassName("day0");if(nodes.length>0){domRect=nodes[0].getBoundingClientRect();height=domRect.height;width=domRect.width;leftOffset=domRect.left-viewLeft;tileHeader=nodes[0].getElementsByClassName("sg-calendar-tile-header");if(tileHeader.length>0)topOffset=tileHeader[0].clientHeight}return{height:height,width:width,offset:{left:leftOffset,top:topOffset}}}function getMaxColumns(){var max=0;max=scrollView.getElementsByClassName("day").length-1;return max}function updateCoordinates(){var domRect,dayDimensions;domRect=scrollView.getBoundingClientRect();dayDimensions=getDayDimensions(domRect.left);angular.extend(view,{coordinates:{x:domRect.left,y:domRect.top},dayHeight:dayDimensions.height,dayWidth:dayDimensions.width,daysOffset:dayDimensions.offset.left,topOffset:dayDimensions.offset.top})}function onDragStart(){element.on("mouseover",updateFromPointerHandler);updateFromPointerHandler()}function onDragEnd(){element.off("mouseover",updateFromPointerHandler);Calendar.$view=null}function updateFromPointerHandler(){var scrollStep,pointerHandler,pointerCoordinates,now,scrollY,minY,delta;scrollStep=view.scrollStep;pointerHandler=Component.$ghost.pointerHandler;if(pointerHandler){pointerCoordinates=pointerHandler.getContainerBasedCoordinates(view);if(pointerCoordinates){Calendar.$view=view;now=(new Date).getTime();if(!lastScroll||now>lastScroll+100){lastScroll=now;scrollY=pointerCoordinates.y-scrollStep;if(scrollY<0){minY=-scrollView.scrollTop;if(scrollY<minY)scrollY=minY;scrollView.scrollTop+=scrollY}else{scrollY=pointerCoordinates.y+scrollStep;delta=scrollY-scrollView.clientHeight;if(delta>0){scrollView.scrollTop+=delta}}}}}}}}}sgCalendarScrollViewController.$inject=["$scope"];function sgCalendarScrollViewController($scope){this.type=$scope.type}angular.module("SOGo.SchedulerUI").directive("sgCalendarScrollView",sgCalendarScrollView)})();(function(){"use strict";function sgCalendarTable(){return{restrict:"E",scope:{calendars:"=sgCalendars",calendar:"@sgCalendar",blocksType:"@sgBlocksType",day:"@sgDay",clickBlock:"&sgClick"},template:["<sg-calendar-day-table",' sg-blocks="calendars[calendar][blocksType]"',' sg-day="day"',' sg-click="clickBlock({event: clickEvent, component: clickComponent})"/>'].join("")}}angular.module("SOGo.SchedulerUI").directive("sgCalendarTable",sgCalendarTable)})();(function(){"use strict";function sgCategoryStylesheet(){return{restrict:"E",require:"ngModel",scope:{ngModel:"="},replace:true,template:['<style type="text/css">'," .bg-category{{ ngModel.id }} {"," background-color: {{ ngModel.color }} !important;"," }"," .bdr-category{{ ngModel.id }} {"," border-color: {{ ngModel.color }} !important;"," }","</style>"].join("")}}angular.module("SOGo.SchedulerUI").directive("sgCategoryStylesheet",sgCategoryStylesheet)})();(function(){"use strict";sgDraggableCalendarBlock.$inject=["$rootScope","$timeout","$log","Calendar","CalendarSettings","Component"];function sgDraggableCalendarBlock($rootScope,$timeout,$log,Calendar,CalendarSettings,Component){return{restrict:"CA",require:"^sgCalendarDay",link:link};function link(scope,element,attrs,calendarDayCtrl){if(scope.block){if(scope.block.component.editable)initGrips();else return}element.on("mousedown",onDragDetect);scope.$on("$destroy",function(){element.off("mousedown",onDragDetect);element.off("mousemove",onDrag)});function initGrips(){var component,dayNumber,blockIndex,isFirstBlock,isLastBlock,dragGrip,leftGrip,rightGrip,topGrip,bottomGrip;component=scope.block.component;dayNumber=scope.block.dayNumber;blockIndex=_.findIndex(component.blocks,_.matchesProperty("dayNumber",dayNumber));isFirstBlock=blockIndex===0;isLastBlock=blockIndex===component.blocks.length-1;dragGrip=angular.element('<div class="dragGrip"></div>');dragGrip.addClass("bdr-folder"+component.pid);if(component.c_isallday||element[0].parentNode.tagName==="SG-CALENDAR-MONTH-DAY"){if(isFirstBlock){leftGrip=angular.element('<div class="dragGrip-left"></div>').append(dragGrip);element.append(leftGrip)}if(isLastBlock){rightGrip=angular.element('<div class="dragGrip-right"></div>').append(dragGrip.clone());element.append(rightGrip)}}else{if(isFirstBlock){topGrip=angular.element('<div class="dragGrip-top"></div>').append(dragGrip);element.append(topGrip)}if(isLastBlock){bottomGrip=angular.element('<div class="dragGrip-bottom"></div>').append(dragGrip.clone());element.append(bottomGrip)}}}function onDragDetect(ev){var block,dragMode,eventType,startDate,newData,newComponent,pointerHandler;ev.stopPropagation();dragMode="move-event";if(scope.block&&scope.block.component){if(ev.target.className=="dragGrip-top"||ev.target.className=="dragGrip-left")dragMode="change-start";else if(ev.target.className=="dragGrip-bottom"||ev.target.className=="dragGrip-right")dragMode="change-end"}else{dragMode="change-end"}pointerHandler=new SOGoEventDragPointerHandler(dragMode);pointerHandler.initFromEvent(ev);Component.$ghost.pointerHandler=pointerHandler;angular.element(document).one("mouseup",onDragEnd);angular.element(document).on("mousemove",onDrag)}function dragStart(ev){var block,dragMode,eventType,isHourCell,isMonthly,startDate,newData,newComponent,pointerHandler;isHourCell=element.hasClass("clickableHourCell");isMonthly=element[0].parentNode.tagName=="SG-CALENDAR-MONTH-DAY"||element.hasClass("clickableDayCell");if(scope.block&&scope.block.component){block=scope.block}else{startDate=new Date(calendarDayCtrl.dayString.substring(0,10)+" "+calendarDayCtrl.dayString.substring(11,16));newData={type:"appointment",pid:"personal",summary:l("New Event"),startDate:startDate,isAllDay:isHourCell?0:1};newComponent=new Component(newData);block={component:newComponent,dayNumber:calendarDayCtrl.dayNumber,length:0};block.component.blocks=[block]}eventType="multiday";if(isMonthly)eventType="monthly";else if(block.component.c_isallday)eventType="multiday-allday";_.forEach(block.component.blocks,function(b){b.dragging=true});pointerHandler=Component.$ghost.pointerHandler;pointerHandler.prepareWithEventType(eventType);pointerHandler.initFromBlock(block);Component.$ghost.starthour=block.starthour;Component.$ghost.component=block.component;$log.debug("emit calendar:dragstart");$rootScope.$emit("calendar:dragstart")}function onDrag(ev){var pointerHandler=Component.$ghost.pointerHandler;$timeout(function(){pointerHandler.updateFromEvent(ev)})}function onDragEnd(ev){var block,pointer;block=scope.block;pointer=Component.$ghost.pointerHandler;angular.element(document).off("mousemove",onDrag);if(pointer.dragHasStarted){$rootScope.$emit("calendar:dragend");pointer.dragHasStarted=false}if(block)_.forEach(block.component.blocks,function(b){b.dragging=false})}function SOGoCoordinates(){}SOGoCoordinates.prototype={x:-1,y:-1,getDelta:function SC_getDelta(otherCoordinates){var delta=new SOGoCoordinates;delta.x=this.x-otherCoordinates.x;delta.y=this.y-otherCoordinates.y;return delta},getDistance:function SC_getDistance(otherCoordinates){var delta=this.getDelta(otherCoordinates);return Math.sqrt(delta.x*delta.x+delta.y*delta.y)},clone:function SC_clone(){var coordinates=new SOGoCoordinates;coordinates.x=this.x;coordinates.y=this.y;return coordinates}};function SOGoEventDragEventCoordinates(eventType){this.setEventType(eventType)}SOGoEventDragEventCoordinates.prototype={dayNumber:-1,start:-1,duration:-1,eventType:null,setEventType:function(eventType){this.eventType=eventType},initFromBlock:function(block){if(this.eventType==="monthly"){this.start=0;this.duration=block.component.blocks.length*96}else{this.start=block.component.blocks[0].start;this.duration=_.sum(block.component.blocks,function(b){return b.length})}this.dayNumber=block.component.blocks[0].dayNumber},getDelta:function(otherCoordinates){var delta=new SOGoEventDragEventCoordinates;delta.dayNumber=this.dayNumber-otherCoordinates.dayNumber;delta.start=this.start-otherCoordinates.start;delta.duration=this.duration-otherCoordinates.duration;return delta},_quartersToHM:function(quarters){var minutes=quarters*15;var hours=Math.floor(minutes/60);if(hours<10)hours="0"+hours;var mins=minutes%60;if(mins<10)mins="0"+mins;return""+hours+":"+mins},getStartTime:function(){return this._quartersToHM(this.start)},getEndTime:function(){var end=(this.start+this.duration)%CalendarSettings.EventDragDayLength;return this._quartersToHM(end)},clone:function(){var coordinates=new SOGoEventDragEventCoordinates;coordinates.dayNumber=this.dayNumber;coordinates.start=this.start;coordinates.duration=this.duration;return coordinates}};function SOGoEventDragPointerHandler(dragMode){this.dragMode=dragMode}SOGoEventDragPointerHandler.prototype={originalCoordinates:null,currentCoordinates:null,originalViewCoordinates:null,currentViewCoordinates:null,originalEventCoordinates:null,currentEventCoordinates:null,dragHasStarted:false,getEventViewCoordinates:null,initFromBlock:function SEDPH_initFromBlock(block){this.currentEventCoordinates=new SOGoEventDragEventCoordinates(this.eventType);this.originalEventCoordinates=new SOGoEventDragEventCoordinates(this.eventType);this.originalEventCoordinates.initFromBlock(block)},initFromEvent:function SEDPH_initFromEvent(event){this.currentCoordinates=new SOGoCoordinates;this.updateFromEvent(event);this.originalCoordinates=this.currentCoordinates.clone()},updateFromEvent:function SEDPH_updateFromEvent(event){this.currentCoordinates.x=event.pageX;this.currentCoordinates.y=event.pageY;if(this.dragHasStarted&&Calendar.$view){var newEventCoordinates=this.getEventViewCoordinates(Calendar.$view);if(!this.originalViewCoordinates){this.originalViewCoordinates=this.getEventViewCoordinates(Calendar.$view,this.originalCoordinates);if(Component.$ghost.component.isNew){this.setTimeFromQuarters(Component.$ghost.component.start,this.originalViewCoordinates.y);$log.debug("new event start date "+Component.$ghost.component.start)}}if(!this.currentViewCoordinates||!newEventCoordinates||newEventCoordinates.x!=this.currentViewCoordinates.x||newEventCoordinates.y!=this.currentViewCoordinates.y){this.currentViewCoordinates=newEventCoordinates;if(this.originalViewCoordinates){if(!newEventCoordinates){this.currentViewCoordinates=this.originalViewCoordinates.clone()}this.updateEventCoordinates()}}}else if(this.originalCoordinates&&this.currentCoordinates&&!this.dragHasStarted){var distance=this.getDistance();if(distance>3){this.dragHasStarted=true;dragStart(event)}}},updateEventCoordinates:function SEDGC__updateCoordinates(){var newDuration;var delta=this.currentViewCoordinates.getDelta(this.originalViewCoordinates);var deltaQuarters=delta.x*CalendarSettings.EventDragDayLength+delta.y;$log.debug("quarters delta "+deltaQuarters);if(angular.isUndefined(this.originalEventCoordinates.start)){this.originalEventCoordinates.dayNumber=this.originalViewCoordinates.x;this.originalEventCoordinates.start=this.originalViewCoordinates.y}this.currentEventCoordinates.dayNumber=this.originalEventCoordinates.dayNumber;if(this.dragMode=="move-event"){this.currentEventCoordinates.start=this.originalEventCoordinates.start+deltaQuarters;this.currentEventCoordinates.duration=this.originalEventCoordinates.duration}else{if(this.dragMode=="change-start"){newDuration=this.originalEventCoordinates.duration-deltaQuarters;if(newDuration>0){this.currentEventCoordinates.start=this.originalEventCoordinates.start+deltaQuarters;this.currentEventCoordinates.duration=newDuration}else if(newDuration<0){this.currentEventCoordinates.start=this.originalEventCoordinates.start+this.originalEventCoordinates.duration;this.currentEventCoordinates.duration=-newDuration}}else if(this.dragMode=="change-end"){newDuration=this.originalEventCoordinates.duration+deltaQuarters;if(newDuration>0){this.currentEventCoordinates.start=this.originalEventCoordinates.start;this.currentEventCoordinates.duration=newDuration}else if(newDuration<0){this.currentEventCoordinates.start=this.originalEventCoordinates.start+newDuration;this.currentEventCoordinates.duration=-newDuration}}}var deltaDays;if(this.currentEventCoordinates.start<0){deltaDays=Math.ceil(-this.currentEventCoordinates.start/CalendarSettings.EventDragDayLength);this.currentEventCoordinates.start+=deltaDays*CalendarSettings.EventDragDayLength;this.currentEventCoordinates.dayNumber-=deltaDays}else if(this.currentEventCoordinates.start>=CalendarSettings.EventDragDayLength){deltaDays=Math.floor(this.currentEventCoordinates.start/CalendarSettings.EventDragDayLength);this.currentEventCoordinates.start-=deltaDays*CalendarSettings.EventDragDayLength;this.currentEventCoordinates.dayNumber+=deltaDays}$log.debug("event coordinates "+JSON.stringify(this.currentEventCoordinates));$rootScope.$emit("calendar:drag")},getContainerBasedCoordinates:function SEDPH_getCBC(view,pointerCoordinates){var currentCoordinates=pointerCoordinates||this.currentCoordinates;var coordinates=currentCoordinates.getDelta(view.coordinates);var container=view.element;if(coordinates.x<view.daysOffset||coordinates.x>container.clientWidth||coordinates.y<0||coordinates.y>container.clientHeight)coordinates=null;return coordinates},prepareWithEventType:function SEDPH_prepareWithEventType(eventType){var methods={multiday:this.getEventMultiDayViewCoordinates,"multiday-allday":this.getEventMultiDayAllDayViewCoordinates,monthly:this.getEventMonthlyViewCoordinates,unknown:null};var method=methods[eventType];this.eventType=eventType;this.getEventViewCoordinates=method},getEventMultiDayViewCoordinates:function SEDPH_gEMultiDayViewC(view,pointerCoordinates){var coordinates=this.getEventMultiDayAllDayViewCoordinates(view,pointerCoordinates);if(coordinates){var quarterHeight=view.quarterHeight;var pxCoordinates=this.getContainerBasedCoordinates(view,pointerCoordinates);pxCoordinates.y+=view.element.scrollTop;coordinates.y=Math.floor((pxCoordinates.y-CalendarSettings.EventDragHorizontalOffset)/quarterHeight);var maxY=CalendarSettings.EventDragDayLength-1;if(coordinates.y<0)coordinates.y=0;else if(coordinates.y>maxY)coordinates.y=maxY}return coordinates},getEventMultiDayAllDayViewCoordinates:function SEDPH_gEMultiDayADVC(view,pointerCoordinates){var coordinates;var pxCoordinates=this.getContainerBasedCoordinates(view,pointerCoordinates);if(pxCoordinates){coordinates=new SOGoCoordinates;var dayWidth=view.dayWidth;var daysOffset=view.daysOffset;coordinates.x=Math.floor((pxCoordinates.x-daysOffset)/dayWidth);var maxX=Calendar.$view.maxX;if(coordinates.x<0)coordinates.x=0;else if(coordinates.x>maxX)coordinates.x=maxX;coordinates.y=0}else{coordinates=null}return coordinates},getEventMonthlyViewCoordinates:function SEDPH_gEMonthlyViewC(view,pointerCoordinates){var coordinates;var pxCoordinates=this.getContainerBasedCoordinates(view,pointerCoordinates);if(pxCoordinates){coordinates=new SOGoCoordinates;var daysTopOffset=0;var dayWidth=view.dayWidth;var daysOffset=view.daysOffset;var dayHeight=view.dayHeight;var daysY=Math.floor((pxCoordinates.y-daysTopOffset)/dayHeight);if(daysY<0)daysY=0;coordinates.x=Math.floor((pxCoordinates.x-daysOffset)/dayWidth);if(coordinates.x<0)coordinates.x=0;else if(coordinates.x>6)coordinates.x=6;coordinates.x+=7*daysY;coordinates.y=0}else{coordinates=null}return coordinates},getDistance:function SEDPH_getDistance(){return this.currentCoordinates.getDistance(this.originalCoordinates)},setTimeFromQuarters:function SEDPH_setTimeFromQuarters(date,quarters){var hours,minutes;hours=Math.floor(quarters/4);minutes=quarters%4*15;date.setHours(hours,minutes)}}}}angular.module("SOGo.SchedulerUI").directive("sgDraggableCalendarBlock",sgDraggableCalendarBlock)})();(function(){"use strict";sgDroppableBlock.$inject=["$rootScope","$timeout","$mdGesture","Calendar","CalendarSettings","Component"];function sgDroppableBlock($rootScope,$timeout,$mdGesture,Calendar,CalendarSettings,Component){return{restrict:"CA",scope:{onDrop:"&sgOnDrop"},link:function(scope,element,attrs,controller){var deregister=$rootScope.$on("calendar:dragend",scope.onDrop);scope.$on("$destroy",deregister)}}}angular.module("SOGo.SchedulerUI").directive("sgDroppableBlock",sgDroppableBlock)})();
//# sourceMappingURL=Scheduler.js.map