/*! frontier-digital-voice - v1.0.0 - 2020-11-03 */ "use strict";var fdvShortSHA="c22fd621";angular.module("fdvService.constants",[]),angular.module("fdvService.utils",[]),angular.module("fdvService.config",[]),angular.module("fdvService.route",[]),angular.module("fdvService.modal",[]),angular.module("fdvService.video",[]),angular.module("fdvService.analyticsService",[]),angular.module("fdvService.models",[]),angular.module("fdvService.services",[]),angular.module("fdvService.widgets",[]),angular.module("fdvService.directives",[]),angular.module("fdvService.filters",[]),angular.module("fdvService.events",[]),angular.module("mwl.calendar",[]),angular.module("fdvService",["fdvService.constants","fdvService.utils","fdvService.config","fdvService.widgets","fdvService.modal","fdvService.video","fdvService.models","fdvService.services","fdvService.route","fdvService.events","fdvService.filters","fdvService.directives","mwl.calendar","fdvService.directives.ui.bootstrap.datepicker"]).config(["$compileProvider","$httpProvider",function($compileProvider,$httpProvider){$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|sms|tel|mailto):/),$httpProvider.defaults.withCredentials=!0}]),angular.module("mwl.calendar").directive("tooltip",function(){return{restrict:"A",link:function(scope,element){$(element).hover(function(){$(element).tooltip("show")},function(){$(element).tooltip("hide")})}}}),angular.module("mwl.calendar").controller("MwlCalendarCtrl",["$scope","$timeout","$window","$locale","moment","calendarTitle","calendarDebounce",function($scope,$timeout,$window,$locale,moment,calendarTitle,calendarDebounce){$scope.viewTitle="lll";var vm=this;$scope.events=$scope.events||[],vm.changeView=function(view,newDay){$scope.view=view,$scope.currentDay=newDay},vm.drillDown=function(date){var rawDate=moment(date).toDate(),nextView={year:"month",month:"day",week:"day"};$scope.onDrillDownClick({calendarDate:rawDate,calendarNextView:nextView[$scope.view]})!==!1&&vm.changeView(nextView[$scope.view],rawDate)};var previousDate=moment($scope.currentDay),previousView=angular.copy($scope.view),refreshCalendar=calendarDebounce(function(){calendarTitle[$scope.view]&&($scope.viewTitle=calendarTitle[$scope.view]($scope.currentDay)),$scope.events=$scope.events.map(function(event,index){return Object.defineProperty(event,"$id",{enumerable:!1,value:index}),event});var currentDate=moment($scope.currentDay),shouldUpdate=!0;previousDate.clone().startOf($scope.view).isSame(currentDate.clone().startOf($scope.view))&&!previousDate.isSame(currentDate)&&$scope.view===previousView&&(shouldUpdate=!1),previousDate=currentDate,previousView=angular.copy($scope.view),shouldUpdate&&$timeout(function(){$scope.$broadcast("calendar.refreshView")}.bind(this))}.bind(this),50),unbindLocaleWatcher=$scope.$watch(function(){return moment.locale()+$locale.id},refreshCalendar),unbindOnDestroy=[];unbindOnDestroy.push(unbindLocaleWatcher),unbindOnDestroy.push($scope.$watch("currentDay",refreshCalendar)),unbindOnDestroy.push($scope.$watch("view",refreshCalendar)),unbindOnDestroy.push($scope.$watch("events",refreshCalendar,!0));var unbindDestroyListener=$scope.$on("$destroy",function(){unbindOnDestroy.forEach(function(unbind){unbind()})});unbindOnDestroy.push(unbindDestroyListener)}]).directive("mwlCalendar",["fdvConfig",function(fdvConfig){return{templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendar.html"),restrict:"EA",scope:{events:"=",view:"=",viewTitle:"=",currentDay:"=",editEventHtml:"=",deleteEventHtml:"=",autoOpen:"=",onEventClick:"&",onEventTimesChanged:"&",onEditEventClick:"&",onDeleteEventClick:"&",onTimespanClick:"&",onDrillDownClick:"&",cellModifier:"&",dayViewStart:"@",dayViewEnd:"@",dayViewSplit:"@"},controller:"MwlCalendarCtrl as vm",link:function(){}}}]),angular.module("mwl.calendar").controller("MwlCalendarDayCtrl",["$scope","$timeout","$sce","moment","calendarHelper","calendarConfig",function($scope,$timeout,$sce,moment,calendarHelper,calendarConfig){var vm=this;vm.calendarConfig=calendarConfig,vm.$sce=$sce;var unbindListener=$scope.$on("calendar.refreshView",function(){vm.dayViewHeight=calendarHelper.getDayViewHeight($scope.dayViewStart,$scope.dayViewEnd,$scope.dayViewSplit),vm.view=calendarHelper.getDayView($scope.events,$scope.currentDay,$scope.dayViewStart,$scope.dayViewEnd,$scope.dayViewSplit)});$scope.$on("$destroy",function(){unbindListener()}),vm.eventDragComplete=function(event,minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit,newStart=moment(event.startsAt).add(minutesDiff,"minutes"),newEnd=moment(event.endsAt).add(minutesDiff,"minutes");delete event.tempStartsAt,$scope.onEventTimesChanged({calendarEvent:event,calendarNewEventStart:newStart.toDate(),calendarNewEventEnd:newEnd.toDate()})},vm.eventDragged=function(event,minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit;event.tempStartsAt=moment(event.startsAt).add(minutesDiff,"minutes").toDate()},vm.eventResizeComplete=function(event,edge,minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit,start=moment(event.startsAt),end=moment(event.endsAt);"start"===edge?start.add(minutesDiff,"minutes"):end.add(minutesDiff,"minutes"),delete event.tempStartsAt,$scope.onEventTimesChanged({calendarEvent:event,calendarNewEventStart:start.toDate(),calendarNewEventEnd:end.toDate()})},vm.eventResized=function(event,edge,minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit;"start"===edge&&(event.tempStartsAt=moment(event.startsAt).add(minutesDiff,"minutes").toDate())}}]).directive("mwlCalendarDay",["fdvConfig",function(fdvConfig){return{templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarDayView.html"),restrict:"EA",require:"^mwlCalendar",scope:{events:"=",currentDay:"=",onEventClick:"=",onEventTimesChanged:"=",dayViewStart:"=",dayViewEnd:"=",dayViewSplit:"="},controller:"MwlCalendarDayCtrl as vm"}}]),angular.module("mwl.calendar").controller("MwlCalendarHourListCtrl",["$scope","moment","calendarConfig","calendarHelper",function($scope,moment,calendarConfig,calendarHelper){function updateDays(){dayViewStart=moment($scope.dayViewStart||"00:00","HH:mm"),dayViewEnd=moment($scope.dayViewEnd||"23:00","HH:mm"),vm.dayViewSplit=parseInt($scope.dayViewSplit),vm.hours=[];for(var dayCounter=moment(dayViewStart),i=0;i<=dayViewEnd.diff(dayViewStart,"hours");i++)vm.hours.push({label:calendarHelper.formatDate(dayCounter,calendarConfig.dateFormats.hour)}),dayCounter.add(1,"hour")}var dayViewStart,dayViewEnd,vm=this,originalLocale=moment.locale(),unbindListener=$scope.$on("calendar.refreshView",function(){originalLocale!==moment.locale()&&(originalLocale=moment.locale(),updateDays())});$scope.$on("$destroy",function(){unbindListener()}),updateDays()}]).directive("mwlCalendarHourList",["fdvConfig",function(fdvConfig){return{restrict:"EA",templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarHourList.html"),controller:"MwlCalendarHourListCtrl as vm",scope:{dayViewStart:"=",dayViewEnd:"=",dayViewSplit:"="}}}]),angular.module("mwl.calendar").controller("MwlCalendarMonthCtrl",["$scope","moment","calendarHelper",function($scope,moment,calendarHelper){var vm=this;$scope.refreshView=function(){vm.weekDays=calendarHelper.getWeekDayNames(),vm.view=calendarHelper.getMonthView($scope.events,$scope.currentDay,$scope.cellModifier);var rows=Math.floor(vm.view.length/7);vm.monthOffsets=[];for(var i=0;rows>i;i++)vm.monthOffsets.push(7*i);$scope.autoOpen&&vm.view.forEach(function(day){day.inMonth&&moment($scope.currentDay).startOf("day").isSame(day.date)&&!vm.openDayIndex&&vm.dayClicked(day,!0)}),$('[data-toggle="tooltip"]').tooltip()};var unbindListener=$scope.$on("calendar.refreshView",$scope.refreshView);$scope.$on("$destroy",function(){unbindListener()}),vm.dayClicked=function(day,dayClickedFirstRun){dayClickedFirstRun||$scope.onTimespanClick({calendarDate:day.date.toDate()})},vm.highlightEvent=function(event,shouldAddClass){vm.view.forEach(function(day){if(delete day.highlightClass,shouldAddClass){var dayContainsEvent=day.events.indexOf(event)>-1;dayContainsEvent&&(day.highlightClass="day-highlight dh-event-"+event.type)}})},vm.handleEventDrop=function(event,newDayDate){var newStart=moment(event.startsAt).date(moment(newDayDate).date()).month(moment(newDayDate).month()),newEnd=calendarHelper.adjustEndDateFromStartDiff(event.startsAt,newStart,event.endsAt);$scope.onEventTimesChanged({calendarEvent:event,calendarDate:newDayDate,calendarNewEventStart:newStart.toDate(),calendarNewEventEnd:newEnd.toDate()})}}]).directive("mwlCalendarMonth",["fdvConfig",function(fdvConfig){return{templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarMonthView.html"),restrict:"EA",require:"^mwlCalendar",scope:{events:"=",currentDay:"=",onEventClick:"=",onEditEventClick:"=",onDeleteEventClick:"=",onEventTimesChanged:"=",editEventHtml:"=",deleteEventHtml:"=",autoOpen:"=",onTimespanClick:"=",cellModifier:"="},controller:"MwlCalendarMonthCtrl as vm",link:function(scope,element,attrs,calendarCtrl){scope.vm.calendarCtrl=calendarCtrl}}}]),angular.module("mwl.calendar").controller("MwlCalendarSlideBoxCtrl",["$scope","$sce",function($scope,$sce){var vm=this;vm.$sce=$sce;var unbindWatcher=$scope.$watch("isOpen",function(isOpen){vm.shouldCollapse=!isOpen}),unbindDestroy=$scope.$on("$destroy",function(){unbindDestroy(),unbindWatcher()})}]).directive("mwlCalendarSlideBox",["fdvConfig",function(fdvConfig){return{restrict:"EA",templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarSlideBox.html"),replace:!0,controller:"MwlCalendarSlideBoxCtrl as vm",require:["^?mwlCalendarMonth","^?mwlCalendarYear"],link:function(scope,elm,attrs,ctrls){scope.isMonthView=!!ctrls[0],scope.isYearView=!!ctrls[1]},scope:{isOpen:"=",events:"=",onEventClick:"=",editEventHtml:"=",onEditEventClick:"=",deleteEventHtml:"=",onDeleteEventClick:"="}}}]),angular.module("mwl.calendar").controller("MwlCalendarWeekCtrl",["$scope","$sce","moment","calendarHelper","calendarConfig",function($scope,$sce,moment,calendarHelper,calendarConfig){var vm=this;vm.showTimes=calendarConfig.showTimesOnWeekView,vm.$sce=$sce;var unbindListener=$scope.$on("calendar.refreshView",function(){vm.dayViewHeight=calendarHelper.getDayViewHeight($scope.dayViewStart,$scope.dayViewEnd,$scope.dayViewSplit),vm.view=vm.showTimes?calendarHelper.getWeekViewWithTimes($scope.events,$scope.currentDay,$scope.dayViewStart,$scope.dayViewEnd,$scope.dayViewSplit):calendarHelper.getWeekView($scope.events,$scope.currentDay)});$scope.$on("$destroy",function(){unbindListener()}),$('[data-toggle="tooltip"]').tooltip(),vm.weekDragged=function(event,daysDiff,minuteChunksMoved){var newStart=moment(event.startsAt).add(daysDiff,"days"),newEnd=moment(event.endsAt).add(daysDiff,"days");if(minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit;newStart=newStart.add(minutesDiff,"minutes"),newEnd=newEnd.add(minutesDiff,"minutes")}delete event.tempStartsAt,$scope.onEventTimesChanged({calendarEvent:event,calendarNewEventStart:newStart.toDate(),calendarNewEventEnd:newEnd.toDate()})},vm.weekResized=function(event,edge,daysDiff){var start=moment(event.startsAt),end=moment(event.endsAt);"start"===edge?start.add(daysDiff,"days"):end.add(daysDiff,"days"),$scope.onEventTimesChanged({calendarEvent:event,calendarNewEventStart:start.toDate(),calendarNewEventEnd:end.toDate()})},vm.tempTimeChanged=function(event,minuteChunksMoved){var minutesDiff=minuteChunksMoved*$scope.dayViewSplit;event.tempStartsAt=moment(event.startsAt).add(minutesDiff,"minutes").toDate()}}]).directive("mwlCalendarWeek",["fdvConfig",function(fdvConfig){return{templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarWeekView.html"),restrict:"EA",require:"^mwlCalendar",scope:{events:"=",currentDay:"=",onEventClick:"=",onEventTimesChanged:"=",dayViewStart:"=",dayViewEnd:"=",dayViewSplit:"="},controller:"MwlCalendarWeekCtrl as vm",link:function(scope,element,attrs,calendarCtrl){scope.vm.calendarCtrl=calendarCtrl}}}]),angular.module("mwl.calendar").controller("MwlCalendarYearCtrl",["$scope","moment","calendarHelper",function($scope,moment,calendarHelper){var vm=this,unbindListener=$scope.$on("calendar.refreshView",function(){vm.view=calendarHelper.getYearView($scope.events,$scope.currentDay,$scope.cellModifier),$scope.autoOpen&&vm.view.forEach(function(month){moment($scope.currentDay).startOf("month").isSame(month.date)&&!vm.openMonthIndex&&vm.monthClicked(month,!0)})});$scope.$on("$destroy",function(){unbindListener()}),vm.monthClicked=function(month,monthClickedFirstRun){monthClickedFirstRun||$scope.onTimespanClick({calendarDate:month.date.toDate()})},vm.handleEventDrop=function(event,newMonthDate){var newStart=moment(event.startsAt).month(moment(newMonthDate).month()),newEnd=calendarHelper.adjustEndDateFromStartDiff(event.startsAt,newStart,event.endsAt);$scope.onEventTimesChanged({calendarEvent:event,calendarDate:newMonthDate,calendarNewEventStart:newStart.toDate(),calendarNewEventEnd:newEnd.toDate()})}}]).directive("mwlCalendarYear",["fdvConfig",function(fdvConfig){return{templateUrl:fdvConfig.getTemplateUrl("calendar/angular-bootstrap-calendar/calendarYearView.html"),restrict:"EA",require:"^mwlCalendar",scope:{events:"=",currentDay:"=",onEventClick:"=",onEventTimesChanged:"=",onEditEventClick:"=",onDeleteEventClick:"=",editEventHtml:"=",deleteEventHtml:"=",autoOpen:"=",onTimespanClick:"=",cellModifier:"="},controller:"MwlCalendarYearCtrl as vm",link:function(scope,element,attrs,calendarCtrl){scope.vm.calendarCtrl=calendarCtrl}}}]),angular.module("mwl.calendar").controller("MwlCollapseFallbackCtrl",["$scope","$attrs","$element",function($scope,$attrs,$element){var unbindWatcher=$scope.$watch($attrs.mwlCollapseFallback,function(shouldCollapse){shouldCollapse?$element.addClass("ng-hide"):$element.removeClass("ng-hide")}),unbindDestroy=$scope.$on("$destroy",function(){unbindDestroy(),unbindWatcher()})}]).directive("mwlCollapseFallback",["$injector",function($injector){return $injector.has("collapseDirective")?{}:{restrict:"A",controller:"MwlCollapseFallbackCtrl"}}]),angular.module("mwl.calendar").controller("MwlDateModifierCtrl",["$element","$attrs","$scope","moment",function($element,$attrs,$scope,moment){function onClick(){angular.isDefined($attrs.setToToday)?$scope.date=new Date:angular.isDefined($attrs.increment)?$scope.date=moment($scope.date).add(1,$scope.increment).toDate():angular.isDefined($attrs.decrement)&&($scope.date=moment($scope.date).subtract(1,$scope.decrement).toDate()),$scope.$apply()}$element.bind("click",onClick),$scope.$on("$destroy",function(){$element.unbind("click",onClick)})}]).directive("mwlDateModifier",function(){return{restrict:"A",controller:"MwlDateModifierCtrl",scope:{date:"=",increment:"=",decrement:"="}}}),angular.module("mwl.calendar").controller("MwlDraggableCtrl",["$element","$scope","$window","$parse","$attrs","$timeout","interact",function($element,$scope,$window,$parse,$attrs,$timeout,interact){function translateElement(elm,transformValue){return elm.css("transform",transformValue).css("-ms-transform",transformValue).css("-webkit-transform",transformValue)}function canDrag(){return $parse($attrs.mwlDraggable)($scope)}function getUnitsMoved(x,y,gridDimensions){var result={x:x,y:y};return gridDimensions&&gridDimensions.x&&(result.x/=gridDimensions.x),gridDimensions&&gridDimensions.y&&(result.y/=gridDimensions.y),result}if(interact){var snap,snapGridDimensions;$attrs.snapGrid&&(snapGridDimensions=$parse($attrs.snapGrid)($scope),snap={targets:[interact.createSnapGrid(snapGridDimensions)]}),interact($element[0]).draggable({snap:snap,onstart:function(event){canDrag()&&(angular.element(event.target).addClass("dragging-active"),event.target.dropData=$parse($attrs.dropData)($scope),event.target.style.pointerEvents="none",$attrs.onDragStart&&($parse($attrs.onDragStart)($scope),$scope.$apply()))},onmove:function(event){if(canDrag()){var elm=angular.element(event.target),x=(parseFloat(elm.attr("data-x"))||0)+(event.dx||0),y=(parseFloat(elm.attr("data-y"))||0)+(event.dy||0);switch($parse($attrs.axis)($scope)){case"x":y=0;break;case"y":x=0}"static"===$window.getComputedStyle(elm[0]).position&&elm.css("position","relative"),translateElement(elm,"translate("+x+"px, "+y+"px)").css("z-index",1e3).attr("data-x",x).attr("data-y",y),$attrs.onDrag&&($parse($attrs.onDrag)($scope,getUnitsMoved(x,y,snapGridDimensions)),$scope.$apply())}},onend:function(event){if(canDrag()){var elm=angular.element(event.target),x=elm.attr("data-x"),y=elm.attr("data-y");event.target.style.pointerEvents="auto",$attrs.onDragEnd&&($parse($attrs.onDragEnd)($scope,getUnitsMoved(x,y,snapGridDimensions)),$scope.$apply()),$timeout(function(){translateElement(elm,null).removeAttr("data-x").removeAttr("data-y").removeClass("dragging-active")},50)}}});var unbindDestroy=$scope.$on("$destroy",function(){unbindDestroy(),interact($element[0]).unset()})}}]).directive("mwlDraggable",function(){return{restrict:"A",controller:"MwlDraggableCtrl"}}),angular.module("mwl.calendar").controller("MwlDroppableCtrl",["$element","$scope","$parse","$attrs","interact",function($element,$scope,$parse,$attrs,interact){if(interact){interact($element[0]).dropzone({ondragenter:function(event){angular.element(event.target).addClass("drop-active")},ondragleave:function(event){angular.element(event.target).removeClass("drop-active")},ondropdeactivate:function(event){angular.element(event.target).removeClass("drop-active")},ondrop:function(event){event.relatedTarget.dropData&&($parse($attrs.onDrop)($scope,{dropData:event.relatedTarget.dropData}),$scope.$apply())}});var unbindDestroy=$scope.$on("$destroy",function(){unbindDestroy(),interact($element[0]).unset()})}}]).directive("mwlDroppable",function(){return{restrict:"A",controller:"MwlDroppableCtrl"}}),angular.module("mwl.calendar").controller("MwlElementDimensionsCtrl",["$element","$scope","$parse","$attrs",function($element,$scope,$parse,$attrs){$parse($attrs.mwlElementDimensions).assign($scope,{width:$element[0].offsetWidth,height:$element[0].offsetHeight})}]).directive("mwlElementDimensions",function(){return{restrict:"A",controller:"MwlElementDimensionsCtrl"}}),angular.module("mwl.calendar").controller("MwlResizableCtrl",["$element","$scope","$parse","$attrs","interact",function($element,$scope,$parse,$attrs,interact){function canResize(){return $parse($attrs.mwlResizable)($scope)}function getUnitsResized(edge,elm,gridDimensions){var unitsResized={};return unitsResized.edge=edge,"start"===edge?(unitsResized.x=elm.data("x"),unitsResized.y=elm.data("y")):"end"===edge&&(unitsResized.x=parseFloat(elm.css("width").replace("px",""))-originalDimensions.width,unitsResized.y=parseFloat(elm.css("height").replace("px",""))-originalDimensions.height),gridDimensions&&gridDimensions.x&&(unitsResized.x=Math.round(unitsResized.x/gridDimensions.x)),gridDimensions&&gridDimensions.y&&(unitsResized.y=Math.round(unitsResized.y/gridDimensions.y)),unitsResized}if(interact){var snap,snapGridDimensions;$attrs.snapGrid&&(snapGridDimensions=$parse($attrs.snapGrid)($scope),snap={targets:[interact.createSnapGrid(snapGridDimensions)]});var resizeEdge,originalDimensions={},originalDimensionsStyle={};interact($element[0]).resizable({edges:$parse($attrs.resizeEdges)($scope),snap:snap,onstart:function(event){if(canResize()){resizeEdge="end";var elm=angular.element(event.target);originalDimensions.height=elm[0].offsetHeight,originalDimensions.width=elm[0].offsetWidth,originalDimensionsStyle.height=elm.css("height"),originalDimensionsStyle.width=elm.css("width")}},onmove:function(event){if(canResize()){var elm=angular.element(event.target),x=parseFloat(elm.data("x")||0),y=parseFloat(elm.data("y")||0);elm.css({width:event.rect.width+"px",height:event.rect.height+"px"}),x+=event.deltaRect.left,y+=event.deltaRect.top,elm.css("transform","translate("+x+"px,"+y+"px)"),elm.data("x",x),elm.data("y",y),(0!==event.deltaRect.left||0!==event.deltaRect.top)&&(resizeEdge="start"),$attrs.onResize&&($parse($attrs.onResize)($scope,getUnitsResized(resizeEdge,elm,snapGridDimensions)),$scope.$apply())}},onend:function(event){if(canResize()){var elm=angular.element(event.target),unitsResized=getUnitsResized(resizeEdge,elm,snapGridDimensions);elm.data("x",null).data("y",null).css({transform:null,width:originalDimensionsStyle.width,height:originalDimensionsStyle.height}),$attrs.onResizeEnd&&($parse($attrs.onResizeEnd)($scope,unitsResized),$scope.$apply())}}});var unbindDestroy=$scope.$on("$destroy",function(){unbindDestroy(),interact($element[0]).unset()})}}]).directive("mwlResizable",function(){return{restrict:"A",controller:"MwlResizableCtrl"}}),angular.module("mwl.calendar").filter("calendarDate",["calendarHelper","calendarConfig",function(calendarHelper,calendarConfig){function calendarDate(date,format,getFromConfig){return getFromConfig===!0&&(format=calendarConfig.dateFormats[format]),calendarHelper.formatDate(date,format)}return calendarDate.$stateful=!0,calendarDate}]),angular.module("mwl.calendar").filter("calendarLimitTo",["limitToFilter",function(limitToFilter){return angular.version.minor>=4?limitToFilter:function(input,limit,begin){return limit=Math.abs(Number(limit))===1/0?Number(limit):parseInt(limit),isNaN(limit)?input:(angular.isNumber(input)&&(input=input.toString()),angular.isArray(input)||angular.isString(input)?(begin=!begin||isNaN(begin)?0:parseInt(begin),begin=0>begin&&begin>=-input.length?input.length+begin:begin,limit>=0?input.slice(begin,begin+limit):0===begin?input.slice(limit,input.length):input.slice(Math.max(0,begin+limit),begin)):input)}}]),angular.module("mwl.calendar").filter("calendarTruncateEventTitle",function(){return function(string,length,boxHeight){return string?string.length>=length&&string.length/20>boxHeight/30?string.substr(0,length)+"...":string:""}}),function(realWindow){function blank(){}function isElement(o){if(!o||"object"!=typeof o)return!1;var _window=getWindow(o)||window;return/object|function/.test(typeof _window.Element)?o instanceof _window.Element:1===o.nodeType&&"string"==typeof o.nodeName}function isWindow(thing){return thing===window||!(!thing||!thing.Window)&&thing instanceof thing.Window}function isDocFrag(thing){return!!thing&&thing instanceof DocumentFragment}function isArray(thing){return isObject(thing)&&void 0!==typeof thing.length&&isFunction(thing.splice)}function isObject(thing){return!!thing&&"object"==typeof thing}function isFunction(thing){return"function"==typeof thing}function isNumber(thing){return"number"==typeof thing}function isBool(thing){return"boolean"==typeof thing}function isString(thing){return"string"==typeof thing}function trySelector(value){return isString(value)?(document.querySelector(value),!0):!1}function extend(dest,source){for(var prop in source)dest[prop]=source[prop];return dest}function pointerExtend(dest,source){for(var prop in source){var deprecated=!1;for(var vendor in prefixedPropREs)if(0===prop.indexOf(vendor)&&prefixedPropREs[vendor].test(prop)){deprecated=!0;break}deprecated||(dest[prop]=source[prop])}return dest}function copyCoords(dest,src){dest.page=dest.page||{},dest.page.x=src.page.x,dest.page.y=src.page.y,dest.client=dest.client||{},dest.client.x=src.client.x,dest.client.y=src.client.y,dest.timeStamp=src.timeStamp}function setEventXY(targetObj,pointers,interaction){var pointer=pointers.length>1?pointerAverage(pointers):pointers[0];getPageXY(pointer,tmpXY,interaction),targetObj.page.x=tmpXY.x,targetObj.page.y=tmpXY.y,getClientXY(pointer,tmpXY,interaction),targetObj.client.x=tmpXY.x,targetObj.client.y=tmpXY.y,targetObj.timeStamp=(new Date).getTime()}function setEventDeltas(targetObj,prev,cur){targetObj.page.x=cur.page.x-prev.page.x,targetObj.page.y=cur.page.y-prev.page.y,targetObj.client.x=cur.client.x-prev.client.x,targetObj.client.y=cur.client.y-prev.client.y,targetObj.timeStamp=(new Date).getTime()-prev.timeStamp;var dt=Math.max(targetObj.timeStamp/1e3,.001);targetObj.page.speed=hypot(targetObj.page.x,targetObj.page.y)/dt,targetObj.page.vx=targetObj.page.x/dt,targetObj.page.vy=targetObj.page.y/dt,targetObj.client.speed=hypot(targetObj.client.x,targetObj.page.y)/dt,targetObj.client.vx=targetObj.client.x/dt,targetObj.client.vy=targetObj.client.y/dt}function isNativePointer(pointer){return pointer instanceof window.Event||supportsTouch&&window.Touch&&pointer instanceof window.Touch}function getXY(type,pointer,xy){return xy=xy||{},type=type||"page",xy.x=pointer[type+"X"],xy.y=pointer[type+"Y"],xy}function getPageXY(pointer,page){return page=page||{},isOperaMobile&&isNativePointer(pointer)?(getXY("screen",pointer,page),page.x+=window.scrollX,page.y+=window.scrollY):getXY("page",pointer,page),page}function getClientXY(pointer,client){return client=client||{},isOperaMobile&&isNativePointer(pointer)?getXY("screen",pointer,client):getXY("client",pointer,client),client}function getScrollXY(win){return win=win||window,{x:win.scrollX||win.document.documentElement.scrollLeft,y:win.scrollY||win.document.documentElement.scrollTop}}function getPointerId(pointer){return isNumber(pointer.pointerId)?pointer.pointerId:pointer.identifier}function getActualElement(element){return element instanceof SVGElementInstance?element.correspondingUseElement:element}function getWindow(node){if(isWindow(node))return node;var rootNode=node.ownerDocument||node;return rootNode.defaultView||rootNode.parentWindow||window}function getElementClientRect(element){var clientRect=element instanceof SVGElement?element.getBoundingClientRect():element.getClientRects()[0];return clientRect&&{left:clientRect.left,right:clientRect.right,top:clientRect.top,bottom:clientRect.bottom,width:clientRect.width||clientRect.right-clientRect.left,height:clientRect.height||clientRect.bottom-clientRect.top}}function getElementRect(element){var clientRect=getElementClientRect(element);if(!isIOS7&&clientRect){var scroll=getScrollXY(getWindow(element));clientRect.left+=scroll.x,clientRect.right+=scroll.x,clientRect.top+=scroll.y,clientRect.bottom+=scroll.y}return clientRect}function getTouchPair(event){var touches=[];return isArray(event)?(touches[0]=event[0],touches[1]=event[1]):"touchend"===event.type?1===event.touches.length?(touches[0]=event.touches[0],touches[1]=event.changedTouches[0]):0===event.touches.length&&(touches[0]=event.changedTouches[0],touches[1]=event.changedTouches[1]):(touches[0]=event.touches[0],touches[1]=event.touches[1]),touches}function pointerAverage(pointers){for(var prop,average={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},i=0;i1){var touches=getTouchPair(event),minX=Math.min(touches[0].pageX,touches[1].pageX),minY=Math.min(touches[0].pageY,touches[1].pageY),maxX=Math.max(touches[0].pageX,touches[1].pageX),maxY=Math.max(touches[0].pageY,touches[1].pageY);return{x:minX,y:minY,left:minX,top:minY,width:maxX-minX,height:maxY-minY}}}function touchDistance(event,deltaSource){deltaSource=deltaSource||defaultOptions.deltaSource;var sourceX=deltaSource+"X",sourceY=deltaSource+"Y",touches=getTouchPair(event),dx=touches[0][sourceX]-touches[1][sourceX],dy=touches[0][sourceY]-touches[1][sourceY];return hypot(dx,dy)}function touchAngle(event,prevAngle,deltaSource){deltaSource=deltaSource||defaultOptions.deltaSource;var sourceX=deltaSource+"X",sourceY=deltaSource+"Y",touches=getTouchPair(event),dx=touches[0][sourceX]-touches[1][sourceX],dy=touches[0][sourceY]-touches[1][sourceY],angle=180*Math.atan(dy/dx)/Math.PI;if(isNumber(prevAngle)){var dr=angle-prevAngle,drClamped=dr%360;drClamped>315?angle-=360+angle/360|0:drClamped>135?angle-=180+angle/360|0:-315>drClamped?angle+=360+angle/360|0:-135>drClamped&&(angle+=180+angle/360|0)}return angle}function getOriginXY(interactable,element){var origin=interactable?interactable.options.origin:defaultOptions.origin;return"parent"===origin?origin=parentElement(element):"self"===origin?origin=interactable.getRect(element):trySelector(origin)&&(origin=closest(element,origin)||{x:0,y:0}),isFunction(origin)&&(origin=origin(interactable&&element)),isElement(origin)&&(origin=getElementRect(origin)),origin.x="x"in origin?origin.x:origin.left,origin.y="y"in origin?origin.y:origin.top,origin}function _getQBezierValue(t,p1,p2,p3){var iT=1-t;return iT*iT*p1+2*iT*t*p2+t*t*p3}function getQuadraticCurvePoint(startX,startY,cpX,cpY,endX,endY,position){return{x:_getQBezierValue(position,startX,cpX,endX),y:_getQBezierValue(position,startY,cpY,endY)}}function easeOutQuad(t,b,c,d){return t/=d,-c*t*(t-2)+b}function nodeContains(parent,child){for(;child;){if(child===parent)return!0;child=child.parentNode}return!1}function closest(child,selector){for(var parent=parentElement(child);isElement(parent);){if(matchesSelector(parent,selector))return parent;parent=parentElement(parent)}return null}function parentElement(node){var parent=node.parentNode;if(isDocFrag(parent)){for(;(parent=parent.host)&&isDocFrag(parent););return parent}return parent}function inContext(interactable,element){return interactable._context===element.ownerDocument||nodeContains(interactable._context,element)}function testIgnore(interactable,interactableElement,element){var ignoreFrom=interactable.options.ignoreFrom;return ignoreFrom&&isElement(element)?isString(ignoreFrom)?matchesUpTo(element,ignoreFrom,interactableElement):isElement(ignoreFrom)?nodeContains(ignoreFrom,element):!1:!1}function testAllow(interactable,interactableElement,element){var allowFrom=interactable.options.allowFrom;return allowFrom?isElement(element)?isString(allowFrom)?matchesUpTo(element,allowFrom,interactableElement):isElement(allowFrom)?nodeContains(allowFrom,element):!1:!1:!0}function checkAxis(axis,interactable){if(!interactable)return!1;var thisAxis=interactable.options.drag.axis;return"xy"===axis||"xy"===thisAxis||thisAxis===axis}function checkSnap(interactable,action){var options=interactable.options;return/^resize/.test(action)&&(action="resize"),options[action].snap&&options[action].snap.enabled}function checkRestrict(interactable,action){var options=interactable.options;return/^resize/.test(action)&&(action="resize"),options[action].restrict&&options[action].restrict.enabled}function checkAutoScroll(interactable,action){var options=interactable.options;return/^resize/.test(action)&&(action="resize"),options[action].autoScroll&&options[action].autoScroll.enabled}function withinInteractionLimit(interactable,element,action){for(var options=interactable.options,maxActions=options[action.name].max,maxPerElement=options[action.name].maxPerElement,activeInteractions=0,targetCount=0,targetElementCount=0,i=0,len=interactions.length;len>i;i++){var interaction=interactions[i],otherAction=interaction.prepared.name,active=interaction.interacting();if(active){if(activeInteractions++,activeInteractions>=maxInteractions)return!1;if(interaction.target===interactable){if(targetCount+=otherAction===action.name|0,targetCount>=maxActions)return!1;if(interaction.element===element&&(targetElementCount++,otherAction!==action.name||targetElementCount>=maxPerElement))return!1}}}return maxInteractions>0}function indexOfDeepestElement(elements){var dropzone,parent,child,i,n,deepestZone=elements[0],index=deepestZone?0:-1,deepestZoneParents=[],dropzoneParents=[];for(i=1;ii;i++){interaction=interactions[i];var element=eventTarget;if(interaction.inertiaStatus.active&&interaction.target.options[interaction.prepared.name].inertia.allowResume&&interaction.mouse===mouseEvent)for(;element;){if(element===interaction.element)return interaction;element=parentElement(element)}}if(mouseEvent||!supportsTouch&&!supportsPointerEvent){for(i=0;len>i;i++)if(interactions[i].mouse&&!interactions[i].inertiaStatus.active)return interactions[i];for(i=0;len>i;i++)if(interactions[i].mouse&&(!/down/.test(eventType)||!interactions[i].inertiaStatus.active))return interaction;return interaction=new Interaction,interaction.mouse=!0,interaction}for(i=0;len>i;i++)if(contains(interactions[i].pointerIds,id))return interactions[i];if(/up|end|out/i.test(eventType))return null;for(i=0;len>i;i++)if(interaction=interactions[i],!(interaction.prepared.name&&!interaction.target.options.gesture.enabled||interaction.interacting()||!mouseEvent&&interaction.mouse))return interaction;return new Interaction}function doOnInteractions(method){return function(event){var interaction,i,eventTarget=getActualElement(event.path?event.path[0]:event.target),curEventTarget=getActualElement(event.currentTarget);if(supportsTouch&&/touch/.test(event.type))for(prevTouchTime=(new Date).getTime(),i=0;i600&&this.timeStamp-interaction.prevEvent.timeStamp<150){var angle=180*Math.atan2(interaction.prevEvent.velocityY,interaction.prevEvent.velocityX)/Math.PI,overlap=22.5;0>angle&&(angle+=360);var left=angle>=135-overlap&&225+overlap>angle,up=angle>=225-overlap&&315+overlap>angle,right=!left&&(angle>=315-overlap||45+overlap>angle),down=!up&&angle>=45-overlap&&135+overlap>angle;this.swipe={up:up,down:down,left:left,right:right,angle:angle,speed:interaction.prevEvent.speed,velocity:{x:interaction.prevEvent.velocityX,y:interaction.prevEvent.velocityY}}}}function preventOriginalDefault(){this.originalEvent.preventDefault()}function getActionCursor(action){var cursor="";if("drag"===action.name&&(cursor=actionCursors.drag),"resize"===action.name)if(action.axis)cursor=actionCursors[action.name+action.axis];else if(action.edges){for(var cursorKey="resize",edgeNames=["top","bottom","left","right"],i=0;4>i;i++)action.edges[edgeNames[i]]&&(cursorKey+=edgeNames[i]);cursor=actionCursors[cursorKey]}return cursor}function checkResizeEdge(name,value,page,element,interactableElement,rect,margin){if(!value)return!1;if(value===!0){var width=isNumber(rect.width)?rect.width:rect.right-rect.left,height=isNumber(rect.height)?rect.height:rect.bottom-rect.top;if(0>width&&("left"===name?name="right":"right"===name&&(name="left")),0>height&&("top"===name?name="bottom":"bottom"===name&&(name="top")),"left"===name)return page.x<(width>=0?rect.left:rect.right)+margin;if("top"===name)return page.y<(height>=0?rect.top:rect.bottom)+margin;if("right"===name)return page.x>(width>=0?rect.right:rect.left)-margin;if("bottom"===name)return page.y>(height>=0?rect.bottom:rect.top)-margin}return isElement(element)?isElement(value)?value===element:matchesUpTo(element,value,interactableElement):!1}function defaultActionChecker(pointer,interaction,element){var resizeEdges,rect=this.getRect(element),shouldResize=!1,action=null,resizeAxes=null,page=extend({},interaction.curCoords.page),options=this.options;if(!rect)return null;if(actionIsEnabled.resize&&options.resize.enabled){var resizeOptions=options.resize;if(resizeEdges={left:!1,right:!1,top:!1,bottom:!1},isObject(resizeOptions.edges)){for(var edge in resizeEdges)resizeEdges[edge]=checkResizeEdge(edge,resizeOptions.edges[edge],page,interaction._eventTarget,element,rect,resizeOptions.margin||margin);resizeEdges.left=resizeEdges.left&&!resizeEdges.right,resizeEdges.top=resizeEdges.top&&!resizeEdges.bottom,shouldResize=resizeEdges.left||resizeEdges.right||resizeEdges.top||resizeEdges.bottom}else{var right="y"!==options.resize.axis&&page.x>rect.right-margin,bottom="x"!==options.resize.axis&&page.y>rect.bottom-margin;shouldResize=right||bottom,resizeAxes=(right?"x":"")+(bottom?"y":"")}}return action=shouldResize?"resize":actionIsEnabled.drag&&options.drag.enabled?"drag":null,actionIsEnabled.gesture&&interaction.pointerIds.length>=2&&!interaction.dragging&&!interaction.resizing&&(action="gesture"),action?{name:action,axis:resizeAxes,edges:resizeEdges}:null}function validateAction(action,interactable){if(!isObject(action))return null;var actionName=action.name,options=interactable.options;return("resize"===actionName&&options.resize.enabled||"drag"===actionName&&options.drag.enabled||"gesture"===actionName&&options.gesture.enabled)&&actionIsEnabled[actionName]?(("resize"===actionName||"resizeyx"===actionName)&&(actionName="resizexy"),action):null}function delegateListener(event,useCapture){var fakeEvent={},delegated=delegatedEvents[event.type],eventTarget=getActualElement(event.path?event.path[0]:event.target),element=eventTarget;useCapture=useCapture?!0:!1;for(var prop in event)fakeEvent[prop]=event[prop];for(fakeEvent.originalEvent=event,fakeEvent.preventDefault=preventOriginalDefault;isElement(element);){for(var i=0;ii;i++)if(array[i]===target)return i;return-1}function contains(array,target){return-1!==indexOf(array,target)}function matchesSelector(element,selector,nodeList){return ie8MatchesSelector?ie8MatchesSelector(element,selector,nodeList):(window!==realWindow&&(selector=selector.replace(/\/deep\//g," ")),element[prefixedMatchesSelector](selector))}function matchesUpTo(element,selector,limit){for(;isElement(element);){if(matchesSelector(element,selector))return!0;if(element=parentElement(element),element===limit)return matchesSelector(element,selector)}return!1}if(realWindow){var pEventTypes,ie8MatchesSelector,window=function(){var el=realWindow.document.createTextNode("");return el.ownerDocument!==realWindow.document&&"function"==typeof realWindow.wrap&&realWindow.wrap(el)===el?realWindow.wrap(realWindow):realWindow}(),document=window.document,DocumentFragment=window.DocumentFragment||blank,SVGElement=window.SVGElement||blank,SVGSVGElement=window.SVGSVGElement||blank,SVGElementInstance=window.SVGElementInstance||blank,HTMLElement=window.HTMLElement||window.Element,PointerEvent=window.PointerEvent||window.MSPointerEvent,hypot=Math.hypot||function(x,y){return Math.sqrt(x*x+y*y)},tmpXY={},documents=[],interactables=[],interactions=[],dynamicDrop=!1,delegatedEvents={},defaultOptions={base:{accept:null,actionChecker:null,styleCursor:!0,preventDefault:"auto",origin:{x:0,y:0},deltaSource:"page",allowFrom:null,ignoreFrom:null,_context:document,dropChecker:null},drag:{enabled:!1,manualStart:!0,max:1/0,maxPerElement:1,snap:null,restrict:null,inertia:null,autoScroll:null,axis:"xy"},drop:{enabled:!1,accept:null,overlap:"pointer"},resize:{enabled:!1,manualStart:!1,max:1/0,maxPerElement:1,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:0/0,edges:null,invert:"none"},gesture:{manualStart:!1,enabled:!1,max:1/0,maxPerElement:1,restrict:null},perAction:{manualStart:!1,max:1/0,maxPerElement:1,snap:{enabled:!1,endOnly:!1,range:1/0,targets:null,offsets:null,relativePoints:null},restrict:{enabled:!1,endOnly:!1},autoScroll:{enabled:!1,container:null,margin:60,speed:300},inertia:{enabled:!1,resistance:10,minSpeed:100,endSpeed:10,allowResume:!0,zeroResumeDelta:!0,smoothEndDuration:300}},_holdDuration:600},autoScroll={interaction:null,i:null,x:0,y:0,scroll:function(){var vx,vy,sx,sy,options=autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll,container=options.container||getWindow(autoScroll.interaction.element),now=(new Date).getTime(),dtx=(now-autoScroll.prevTimeX)/1e3,dty=(now-autoScroll.prevTimeY)/1e3;options.velocity?(vx=options.velocity.x,vy=options.velocity.y):vx=vy=options.speed,sx=vx*dtx,sy=vy*dty,(sx>=1||sy>=1)&&(isWindow(container)?container.scrollBy(autoScroll.x*sx,autoScroll.y*sy):container&&(container.scrollLeft+=autoScroll.x*sx,container.scrollTop+=autoScroll.y*sy),sx>=1&&(autoScroll.prevTimeX=now),sy>=1&&(autoScroll.prevTimeY=now)),autoScroll.isScrolling&&(cancelFrame(autoScroll.i),autoScroll.i=reqFrame(autoScroll.scroll))},isScrolling:!1,prevTimeX:0,prevTimeY:0,start:function(interaction){autoScroll.isScrolling=!0,cancelFrame(autoScroll.i),autoScroll.interaction=interaction,autoScroll.prevTimeX=(new Date).getTime(),autoScroll.prevTimeY=(new Date).getTime(),autoScroll.i=reqFrame(autoScroll.scroll)},stop:function(){autoScroll.isScrolling=!1,cancelFrame(autoScroll.i)}},supportsTouch="ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch,supportsPointerEvent=!!PointerEvent,margin=supportsTouch||supportsPointerEvent?20:10,pointerMoveTolerance=1,prevTouchTime=0,maxInteractions=1/0,actionCursors=document.all&&!window.atob?{drag:"move",resizex:"e-resize",resizey:"s-resize",resizexy:"se-resize",resizetop:"n-resize",resizeleft:"w-resize",resizebottom:"s-resize",resizeright:"e-resize",resizetopleft:"se-resize",resizebottomright:"se-resize",resizetopright:"ne-resize",resizebottomleft:"ne-resize",gesture:""}:{drag:"move",resizex:"ew-resize",resizey:"ns-resize",resizexy:"nwse-resize",resizetop:"ns-resize",resizeleft:"ew-resize",resizebottom:"ns-resize",resizeright:"ew-resize",resizetopleft:"nwse-resize",resizebottomright:"nwse-resize",resizetopright:"nesw-resize",resizebottomleft:"nesw-resize",gesture:""},actionIsEnabled={drag:!0,resize:!0,gesture:!0},wheelEvent="onmousewheel"in document?"mousewheel":"wheel",eventTypes=["dragstart","dragmove","draginertiastart","dragend","dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop","resizestart","resizemove","resizeinertiastart","resizeend","gesturestart","gesturemove","gestureinertiastart","gestureend","down","move","up","cancel","tap","doubletap","hold"],globalEvents={},isOperaMobile="Opera"==navigator.appName&&supportsTouch&&navigator.userAgent.match("Presto"),isIOS7=/iP(hone|od|ad)/.test(navigator.platform)&&/OS 7[^\d]/.test(navigator.appVersion),prefixedMatchesSelector="matches"in Element.prototype?"matches":"webkitMatchesSelector"in Element.prototype?"webkitMatchesSelector":"mozMatchesSelector"in Element.prototype?"mozMatchesSelector":"oMatchesSelector"in Element.prototype?"oMatchesSelector":"msMatchesSelector",reqFrame=realWindow.requestAnimationFrame,cancelFrame=realWindow.cancelAnimationFrame,events=function(){function add(element,type,listener,useCapture){var elementIndex=indexOf(elements,element),target=targets[elementIndex];if(target||(target={events:{},typeCount:0},elementIndex=elements.push(element)-1,targets.push(target),attachedListeners.push(useAttachEvent?{supplied:[],wrapped:[],useCount:[]}:null)),target.events[type]||(target.events[type]=[],target.typeCount++),!contains(target.events[type],listener)){var ret;if(useAttachEvent){var listeners=attachedListeners[elementIndex],listenerIndex=indexOf(listeners.supplied,listener),wrapped=listeners.wrapped[listenerIndex]||function(event){event.immediatePropagationStopped||(event.target=event.srcElement,event.currentTarget=element,event.preventDefault=event.preventDefault||preventDef,event.stopPropagation=event.stopPropagation||stopProp,event.stopImmediatePropagation=event.stopImmediatePropagation||stopImmProp,/mouse|click/.test(event.type)&&(event.pageX=event.clientX+getWindow(element).document.documentElement.scrollLeft,event.pageY=event.clientY+getWindow(element).document.documentElement.scrollTop),listener(event))};ret=element[addEvent](on+type,wrapped,Boolean(useCapture)),-1===listenerIndex?(listeners.supplied.push(listener),listeners.wrapped.push(wrapped),listeners.useCount.push(1)):listeners.useCount[listenerIndex]++}else ret=element[addEvent](type,listener,useCapture||!1);return target.events[type].push(listener),ret}}function remove(element,type,listener,useCapture){var i,listeners,listenerIndex,elementIndex=indexOf(elements,element),target=targets[elementIndex],wrapped=listener;if(target&&target.events)if(useAttachEvent&&(listeners=attachedListeners[elementIndex],listenerIndex=indexOf(listeners.supplied,listener),wrapped=listeners.wrapped[listenerIndex]),"all"!==type){if(target.events[type]){var len=target.events[type].length;if("all"===listener){for(i=0;len>i;i++)remove(element,type,target.events[type][i],Boolean(useCapture));return}for(i=0;len>i;i++)if(target.events[type][i]===listener){element[removeEvent](on+type,wrapped,useCapture||!1),target.events[type].splice(i,1),useAttachEvent&&listeners&&(listeners.useCount[listenerIndex]--,0===listeners.useCount[listenerIndex]&&(listeners.supplied.splice(listenerIndex,1),listeners.wrapped.splice(listenerIndex,1),listeners.useCount.splice(listenerIndex,1)));break}target.events[type]&&0===target.events[type].length&&(target.events[type]=null,target.typeCount--)}target.typeCount||(targets.splice(elementIndex,1),elements.splice(elementIndex,1),attachedListeners.splice(elementIndex,1))}else for(type in target.events)target.events.hasOwnProperty(type)&&remove(element,type,"all")}function preventDef(){this.returnValue=!1}function stopProp(){this.cancelBubble=!0}function stopImmProp(){this.cancelBubble=!0,this.immediatePropagationStopped=!0}var useAttachEvent="attachEvent"in window&&!("addEventListener"in window),addEvent=useAttachEvent?"attachEvent":"addEventListener",removeEvent=useAttachEvent?"detachEvent":"removeEventListener",on=useAttachEvent?"on":"",elements=[],targets=[],attachedListeners=[];return{add:add,remove:remove,useAttachEvent:useAttachEvent,_elements:elements,_targets:targets,_attachedListeners:attachedListeners}}(),prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/};Interaction.prototype={getPageXY:function(pointer,xy){return getPageXY(pointer,xy,this)},getClientXY:function(pointer,xy){return getClientXY(pointer,xy,this)},setEventXY:function(target,ptr){return setEventXY(target,ptr,this)},pointerOver:function(pointer,event,eventTarget){function pushCurMatches(interactable,selector){interactable&&inContext(interactable,eventTarget)&&!testIgnore(interactable,eventTarget,eventTarget)&&testAllow(interactable,eventTarget,eventTarget)&&matchesSelector(eventTarget,selector)&&(curMatches.push(interactable),curMatchElements.push(eventTarget))}if(!this.prepared.name&&this.mouse){var curMatches=[],curMatchElements=[],prevTargetElement=this.element;this.addPointer(pointer),!this.target||!testIgnore(this.target,this.element,eventTarget)&&testAllow(this.target,this.element,eventTarget)||(this.target=null,this.element=null,this.matches=[],this.matchElements=[]);var elementInteractable=interactables.get(eventTarget),elementAction=elementInteractable&&!testIgnore(elementInteractable,eventTarget,eventTarget)&&testAllow(elementInteractable,eventTarget,eventTarget)&&validateAction(elementInteractable.getAction(pointer,event,this,eventTarget),elementInteractable);elementAction&&!withinInteractionLimit(elementInteractable,eventTarget,elementAction)&&(elementAction=null),elementAction?(this.target=elementInteractable,this.element=eventTarget,this.matches=[],this.matchElements=[]):(interactables.forEachSelector(pushCurMatches),this.validateSelector(pointer,event,curMatches,curMatchElements)?(this.matches=curMatches,this.matchElements=curMatchElements,this.pointerHover(pointer,event,this.matches,this.matchElements),events.add(eventTarget,PointerEvent?pEventTypes.move:"mousemove",listeners.pointerHover)):this.target&&(nodeContains(prevTargetElement,eventTarget)?(this.pointerHover(pointer,event,this.matches,this.matchElements),events.add(this.element,PointerEvent?pEventTypes.move:"mousemove",listeners.pointerHover)):(this.target=null,this.element=null,this.matches=[],this.matchElements=[])))}},pointerHover:function(pointer,event,eventTarget,curEventTarget,matches,matchElements){var target=this.target;if(!this.prepared.name&&this.mouse){var action;this.setEventXY(this.curCoords,[pointer]),matches?action=this.validateSelector(pointer,event,matches,matchElements):target&&(action=validateAction(target.getAction(this.pointers[0],event,this,this.element),this.target)),target&&target.options.styleCursor&&(target._doc.documentElement.style.cursor=action?getActionCursor(action):"")}else this.prepared.name&&this.checkAndPreventDefault(event,target,this.element)},pointerOut:function(pointer,event,eventTarget){this.prepared.name||(interactables.get(eventTarget)||events.remove(eventTarget,PointerEvent?pEventTypes.move:"mousemove",listeners.pointerHover),this.target&&this.target.options.styleCursor&&!this.interacting()&&(this.target._doc.documentElement.style.cursor=""))},selectorDown:function(pointer,event,eventTarget,curEventTarget){function pushMatches(interactable,selector,context){var elements=ie8MatchesSelector?context.querySelectorAll(selector):void 0;inContext(interactable,element)&&!testIgnore(interactable,element,eventTarget)&&testAllow(interactable,element,eventTarget)&&matchesSelector(element,selector,elements)&&(that.matches.push(interactable),that.matchElements.push(element))}var action,that=this,eventCopy=events.useAttachEvent?extend({},event):event,element=eventTarget,pointerIndex=this.addPointer(pointer);if(this.holdTimers[pointerIndex]=setTimeout(function(){that.pointerHold(events.useAttachEvent?eventCopy:pointer,eventCopy,eventTarget,curEventTarget)},defaultOptions._holdDuration),this.pointerIsDown=!0,this.inertiaStatus.active&&this.target.selector)for(;isElement(element);){if(element===this.element&&validateAction(this.target.getAction(pointer,event,this,this.element),this.target).name===this.prepared.name)return cancelFrame(this.inertiaStatus.i),this.inertiaStatus.active=!1,void this.collectEventTargets(pointer,event,eventTarget,"down");element=parentElement(element)}if(this.interacting())return void this.collectEventTargets(pointer,event,eventTarget,"down");for(this.setEventXY(this.curCoords,[pointer]),this.downEvent=event;isElement(element)&&!action;)this.matches=[],this.matchElements=[],interactables.forEachSelector(pushMatches),action=this.validateSelector(pointer,event,this.matches,this.matchElements),element=parentElement(element);return action?(this.prepared.name=action.name,this.prepared.axis=action.axis,this.prepared.edges=action.edges,this.collectEventTargets(pointer,event,eventTarget,"down"),this.pointerDown(pointer,event,eventTarget,curEventTarget,action)):(this.downTimes[pointerIndex]=(new Date).getTime(),this.downTargets[pointerIndex]=eventTarget,pointerExtend(this.downPointer,pointer),copyCoords(this.prevCoords,this.curCoords),this.pointerWasMoved=!1,void this.collectEventTargets(pointer,event,eventTarget,"down"))},pointerDown:function(pointer,event,eventTarget,curEventTarget,forceAction){if(!forceAction&&!this.inertiaStatus.active&&this.pointerWasMoved&&this.prepared.name)return void this.checkAndPreventDefault(event,this.target,this.element);this.pointerIsDown=!0,this.downEvent=event;var action,pointerIndex=this.addPointer(pointer);if(this.pointerIds.length>1&&this.target._element===this.element){var newAction=validateAction(forceAction||this.target.getAction(pointer,event,this,this.element),this.target);withinInteractionLimit(this.target,this.element,newAction)&&(action=newAction),this.prepared.name=null; }else if(!this.prepared.name){var interactable=interactables.get(curEventTarget);interactable&&!testIgnore(interactable,curEventTarget,eventTarget)&&testAllow(interactable,curEventTarget,eventTarget)&&(action=validateAction(forceAction||interactable.getAction(pointer,event,this,curEventTarget),interactable,eventTarget))&&withinInteractionLimit(interactable,curEventTarget,action)&&(this.target=interactable,this.element=curEventTarget)}var target=this.target,options=target&&target.options;if(!target||!forceAction&&this.prepared.name)this.inertiaStatus.active&&curEventTarget===this.element&&validateAction(target.getAction(pointer,event,this,this.element),target).name===this.prepared.name&&(cancelFrame(this.inertiaStatus.i),this.inertiaStatus.active=!1,this.checkAndPreventDefault(event,target,this.element));else{if(action=action||validateAction(forceAction||target.getAction(pointer,event,this,curEventTarget),target,this.element),this.setEventXY(this.startCoords,this.pointers),!action)return;options.styleCursor&&(target._doc.documentElement.style.cursor=getActionCursor(action)),this.resizeAxes="resize"===action.name?action.axis:null,"gesture"===action&&this.pointerIds.length<2&&(action=null),this.prepared.name=action.name,this.prepared.axis=action.axis,this.prepared.edges=action.edges,this.snapStatus.snappedX=this.snapStatus.snappedY=this.restrictStatus.restrictedX=this.restrictStatus.restrictedY=0/0,this.downTimes[pointerIndex]=(new Date).getTime(),this.downTargets[pointerIndex]=eventTarget,pointerExtend(this.downPointer,pointer),copyCoords(this.prevCoords,this.startCoords),this.pointerWasMoved=!1,this.checkAndPreventDefault(event,target,this.element)}},setModifications:function(coords,preEnd){var target=this.target,shouldMove=!0,shouldSnap=checkSnap(target,this.prepared.name)&&(!target.options[this.prepared.name].snap.endOnly||preEnd),shouldRestrict=checkRestrict(target,this.prepared.name)&&(!target.options[this.prepared.name].restrict.endOnly||preEnd);return shouldSnap?this.setSnapping(coords):this.snapStatus.locked=!1,shouldRestrict?this.setRestriction(coords):this.restrictStatus.restricted=!1,shouldSnap&&this.snapStatus.locked&&!this.snapStatus.changed?shouldMove=shouldRestrict&&this.restrictStatus.restricted&&this.restrictStatus.changed:shouldRestrict&&this.restrictStatus.restricted&&!this.restrictStatus.changed&&(shouldMove=!1),shouldMove},setStartOffsets:function(action,interactable,element){var width,height,rect=interactable.getRect(element),origin=getOriginXY(interactable,element),snap=interactable.options[this.prepared.name].snap,restrict=interactable.options[this.prepared.name].restrict;rect?(this.startOffset.left=this.startCoords.page.x-rect.left,this.startOffset.top=this.startCoords.page.y-rect.top,this.startOffset.right=rect.right-this.startCoords.page.x,this.startOffset.bottom=rect.bottom-this.startCoords.page.y,width="width"in rect?rect.width:rect.right-rect.left,height="height"in rect?rect.height:rect.bottom-rect.top):this.startOffset.left=this.startOffset.top=this.startOffset.right=this.startOffset.bottom=0,this.snapOffsets.splice(0);var snapOffset=snap&&"startCoords"===snap.offset?{x:this.startCoords.page.x-origin.x,y:this.startCoords.page.y-origin.y}:snap&&snap.offset||{x:0,y:0};if(rect&&snap&&snap.relativePoints&&snap.relativePoints.length)for(var i=0;ipointerMoveTolerance),duplicateMove||this.pointerIsDown&&!this.pointerWasMoved||(this.pointerIsDown&&clearTimeout(this.holdTimers[pointerIndex]),this.collectEventTargets(pointer,event,eventTarget,"move")),this.pointerIsDown){if(duplicateMove&&this.pointerWasMoved&&!preEnd)return void this.checkAndPreventDefault(event,this.target,this.element);if(setEventDeltas(this.pointerDelta,this.prevCoords,this.curCoords),this.prepared.name){if(this.pointerWasMoved&&(!this.inertiaStatus.active||pointer instanceof InteractEvent&&/inertiastart/.test(pointer.type))){if(!this.interacting()&&(setEventDeltas(this.pointerDelta,this.prevCoords,this.curCoords),"drag"===this.prepared.name)){var absX=Math.abs(dx),absY=Math.abs(dy),targetAxis=this.target.options.drag.axis,axis=absX>absY?"x":absY>absX?"y":"xy";if("xy"!==axis&&"xy"!==targetAxis&&targetAxis!==axis){this.prepared.name=null;for(var element=eventTarget;isElement(element);){var elementInteractable=interactables.get(element);if(elementInteractable&&elementInteractable!==this.target&&!elementInteractable.options.drag.manualStart&&"drag"===elementInteractable.getAction(this.downPointer,this.downEvent,this,element).name&&checkAxis(axis,elementInteractable)){this.prepared.name="drag",this.target=elementInteractable,this.element=element;break}element=parentElement(element)}if(!this.prepared.name){var thisInteraction=this,getDraggable=function(interactable,selector,context){var elements=ie8MatchesSelector?context.querySelectorAll(selector):void 0;if(interactable!==thisInteraction.target)return inContext(interactable,eventTarget)&&!interactable.options.drag.manualStart&&!testIgnore(interactable,element,eventTarget)&&testAllow(interactable,element,eventTarget)&&matchesSelector(element,selector,elements)&&"drag"===interactable.getAction(thisInteraction.downPointer,thisInteraction.downEvent,thisInteraction,element).name&&checkAxis(axis,interactable)&&withinInteractionLimit(interactable,element,"drag")?interactable:void 0};for(element=eventTarget;isElement(element);){var selectorInteractable=interactables.forEachSelector(getDraggable);if(selectorInteractable){this.prepared.name="drag",this.target=selectorInteractable,this.element=element;break}element=parentElement(element)}}}}var starting=!!this.prepared.name&&!this.interacting();if(starting&&(this.target.options[this.prepared.name].manualStart||!withinInteractionLimit(this.target,this.element,this.prepared)))return void this.stop(event);if(this.prepared.name&&this.target){starting&&this.start(this.prepared,this.target,this.element);var shouldMove=this.setModifications(this.curCoords.page,preEnd);(shouldMove||starting)&&(this.prevEvent=this[this.prepared.name+"Move"](event)),this.checkAndPreventDefault(event,this.target,this.element)}}copyCoords(this.prevCoords,this.curCoords),(this.dragging||this.resizing)&&this.autoScrollMove(pointer)}}},dragStart:function(event){var dragEvent=new InteractEvent(this,event,"drag","start",this.element);this.dragging=!0,this.target.fire(dragEvent),this.activeDrops.dropzones=[],this.activeDrops.elements=[],this.activeDrops.rects=[],this.dynamicDrop||this.setActiveDrops(this.element);var dropEvents=this.getDropEvents(event,dragEvent);return dropEvents.activate&&this.fireActiveDrops(dropEvents.activate),dragEvent},dragMove:function(event){var target=this.target,dragEvent=new InteractEvent(this,event,"drag","move",this.element),draggableElement=this.element,drop=this.getDrop(dragEvent,event,draggableElement);this.dropTarget=drop.dropzone,this.dropElement=drop.element;var dropEvents=this.getDropEvents(event,dragEvent);return target.fire(dragEvent),dropEvents.leave&&this.prevDropTarget.fire(dropEvents.leave),dropEvents.enter&&this.dropTarget.fire(dropEvents.enter),dropEvents.move&&this.dropTarget.fire(dropEvents.move),this.prevDropTarget=this.dropTarget,this.prevDropElement=this.dropElement,dragEvent},resizeStart:function(event){var resizeEvent=new InteractEvent(this,event,"resize","start",this.element);if(this.prepared.edges){var startRect=this.target.getRect(this.element);if(this.target.options.resize.square||this.target.options.resize.preserveAspectRatio){var linkedEdges=extend({},this.prepared.edges);linkedEdges.top=linkedEdges.top||linkedEdges.left&&!linkedEdges.bottom,linkedEdges.left=linkedEdges.left||linkedEdges.top&&!linkedEdges.right,linkedEdges.bottom=linkedEdges.bottom||linkedEdges.right&&!linkedEdges.top,linkedEdges.right=linkedEdges.right||linkedEdges.bottom&&!linkedEdges.left,this.prepared._linkedEdges=linkedEdges}else this.prepared._linkedEdges=null;this.target.options.resize.preserveAspectRatio&&(this.resizeStartAspectRatio=startRect.width/startRect.height),this.resizeRects={start:startRect,current:extend({},startRect),restricted:extend({},startRect),previous:extend({},startRect),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},resizeEvent.rect=this.resizeRects.restricted,resizeEvent.deltaRect=this.resizeRects.delta}return this.target.fire(resizeEvent),this.resizing=!0,resizeEvent},resizeMove:function(event){var resizeEvent=new InteractEvent(this,event,"resize","move",this.element),edges=this.prepared.edges,invert=this.target.options.resize.invert,invertible="reposition"===invert||"negate"===invert;if(edges){var dx=resizeEvent.dx,dy=resizeEvent.dy,start=this.resizeRects.start,current=this.resizeRects.current,restricted=this.resizeRects.restricted,delta=this.resizeRects.delta,previous=extend(this.resizeRects.previous,restricted),originalEdges=edges;if(this.target.options.resize.preserveAspectRatio){var resizeStartAspectRatio=this.resizeStartAspectRatio;edges=this.prepared._linkedEdges,originalEdges.left&&originalEdges.bottom||originalEdges.right&&originalEdges.top?dy=-dx/resizeStartAspectRatio:originalEdges.left||originalEdges.right?dy=dx/resizeStartAspectRatio:(originalEdges.top||originalEdges.bottom)&&(dx=dy*resizeStartAspectRatio)}else this.target.options.resize.square&&(edges=this.prepared._linkedEdges,originalEdges.left&&originalEdges.bottom||originalEdges.right&&originalEdges.top?dy=-dx:originalEdges.left||originalEdges.right?dy=dx:(originalEdges.top||originalEdges.bottom)&&(dx=dy));if(edges.top&&(current.top+=dy),edges.bottom&&(current.bottom+=dy),edges.left&&(current.left+=dx),edges.right&&(current.right+=dx),invertible){if(extend(restricted,current),"reposition"===invert){var swap;restricted.top>restricted.bottom&&(swap=restricted.top,restricted.top=restricted.bottom,restricted.bottom=swap),restricted.left>restricted.right&&(swap=restricted.left,restricted.left=restricted.right,restricted.right=swap)}}else restricted.top=Math.min(current.top,start.bottom),restricted.bottom=Math.max(current.bottom,start.top),restricted.left=Math.min(current.left,start.right),restricted.right=Math.max(current.right,start.left);restricted.width=restricted.right-restricted.left,restricted.height=restricted.bottom-restricted.top;for(var edge in restricted)delta[edge]=restricted[edge]-previous[edge];resizeEvent.edges=this.prepared.edges,resizeEvent.rect=restricted,resizeEvent.deltaRect=delta}return this.target.fire(resizeEvent),resizeEvent},gestureStart:function(event){var gestureEvent=new InteractEvent(this,event,"gesture","start",this.element);return gestureEvent.ds=0,this.gesture.startDistance=this.gesture.prevDistance=gestureEvent.distance,this.gesture.startAngle=this.gesture.prevAngle=gestureEvent.angle,this.gesture.scale=1,this.gesturing=!0,this.target.fire(gestureEvent),gestureEvent},gestureMove:function(event){if(!this.pointerIds.length)return this.prevEvent;var gestureEvent;return gestureEvent=new InteractEvent(this,event,"gesture","move",this.element),gestureEvent.ds=gestureEvent.scale-this.gesture.scale,this.target.fire(gestureEvent),this.gesture.prevAngle=gestureEvent.angle,this.gesture.prevDistance=gestureEvent.distance,gestureEvent.scale===1/0||null===gestureEvent.scale||void 0===gestureEvent.scale||isNaN(gestureEvent.scale)||(this.gesture.scale=gestureEvent.scale),gestureEvent},pointerHold:function(pointer,event,eventTarget){this.collectEventTargets(pointer,event,eventTarget,"hold")},pointerUp:function(pointer,event,eventTarget,curEventTarget){var pointerIndex=this.mouse?0:indexOf(this.pointerIds,getPointerId(pointer));clearTimeout(this.holdTimers[pointerIndex]),this.collectEventTargets(pointer,event,eventTarget,"up"),this.collectEventTargets(pointer,event,eventTarget,"tap"),this.pointerEnd(pointer,event,eventTarget,curEventTarget),this.removePointer(pointer)},pointerCancel:function(pointer,event,eventTarget,curEventTarget){var pointerIndex=this.mouse?0:indexOf(this.pointerIds,getPointerId(pointer));clearTimeout(this.holdTimers[pointerIndex]),this.collectEventTargets(pointer,event,eventTarget,"cancel"),this.pointerEnd(pointer,event,eventTarget,curEventTarget),this.removePointer(pointer)},ie8Dblclick:function(pointer,event,eventTarget){this.prevTap&&event.clientX===this.prevTap.clientX&&event.clientY===this.prevTap.clientY&&eventTarget===this.prevTap.target&&(this.downTargets[0]=eventTarget,this.downTimes[0]=(new Date).getTime(),this.collectEventTargets(pointer,event,eventTarget,"tap"))},pointerEnd:function(pointer,event,eventTarget,curEventTarget){var endEvent,target=this.target,options=target&&target.options,inertiaOptions=options&&this.prepared.name&&options[this.prepared.name].inertia,inertiaStatus=this.inertiaStatus;if(this.interacting()){if(inertiaStatus.active&&!inertiaStatus.ending)return;var pointerSpeed,startEvent,now=(new Date).getTime(),inertiaPossible=!1,inertia=!1,smoothEnd=!1,endSnap=checkSnap(target,this.prepared.name)&&options[this.prepared.name].snap.endOnly,endRestrict=checkRestrict(target,this.prepared.name)&&options[this.prepared.name].restrict.endOnly,dx=0,dy=0;if(pointerSpeed=this.dragging?"x"===options.drag.axis?Math.abs(this.pointerDelta.client.vx):"y"===options.drag.axis?Math.abs(this.pointerDelta.client.vy):this.pointerDelta.client.speed:this.pointerDelta.client.speed,inertiaPossible=inertiaOptions&&inertiaOptions.enabled&&"gesture"!==this.prepared.name&&event!==inertiaStatus.startEvent,inertia=inertiaPossible&&now-this.curCoords.timeStamp<50&&pointerSpeed>inertiaOptions.minSpeed&&pointerSpeed>inertiaOptions.endSpeed,inertiaPossible&&!inertia&&(endSnap||endRestrict)){var snapRestrict={};snapRestrict.snap=snapRestrict.restrict=snapRestrict,endSnap&&(this.setSnapping(this.curCoords.page,snapRestrict),snapRestrict.locked&&(dx+=snapRestrict.dx,dy+=snapRestrict.dy)),endRestrict&&(this.setRestriction(this.curCoords.page,snapRestrict),snapRestrict.restricted&&(dx+=snapRestrict.dx,dy+=snapRestrict.dy)),(dx||dy)&&(smoothEnd=!0)}if(inertia||smoothEnd){if(copyCoords(inertiaStatus.upCoords,this.curCoords),this.pointers[0]=inertiaStatus.startEvent=startEvent=new InteractEvent(this,event,this.prepared.name,"inertiastart",this.element),inertiaStatus.t0=now,target.fire(inertiaStatus.startEvent),inertia){inertiaStatus.vx0=this.pointerDelta.client.vx,inertiaStatus.vy0=this.pointerDelta.client.vy,inertiaStatus.v0=pointerSpeed,this.calcInertia(inertiaStatus);var statusObject,page=extend({},this.curCoords.page),origin=getOriginXY(target,this.element);if(page.x=page.x+inertiaStatus.xe-origin.x,page.y=page.y+inertiaStatus.ye-origin.y,statusObject={useStatusXY:!0,x:page.x,y:page.y,dx:0,dy:0,snap:null},statusObject.snap=statusObject,dx=dy=0,endSnap){var snap=this.setSnapping(this.curCoords.page,statusObject);snap.locked&&(dx+=snap.dx,dy+=snap.dy)}if(endRestrict){var restrict=this.setRestriction(this.curCoords.page,statusObject);restrict.restricted&&(dx+=restrict.dx,dy+=restrict.dy)}inertiaStatus.modifiedXe+=dx,inertiaStatus.modifiedYe+=dy,inertiaStatus.i=reqFrame(this.boundInertiaFrame)}else inertiaStatus.smoothEnd=!0,inertiaStatus.xe=dx,inertiaStatus.ye=dy,inertiaStatus.sx=inertiaStatus.sy=0,inertiaStatus.i=reqFrame(this.boundSmoothEndFrame);return void(inertiaStatus.active=!0)}(endSnap||endRestrict)&&this.pointerMove(pointer,event,eventTarget,curEventTarget,!0)}if(this.dragging){endEvent=new InteractEvent(this,event,"drag","end",this.element);var draggableElement=this.element,drop=this.getDrop(endEvent,event,draggableElement);this.dropTarget=drop.dropzone,this.dropElement=drop.element;var dropEvents=this.getDropEvents(event,endEvent);dropEvents.leave&&this.prevDropTarget.fire(dropEvents.leave),dropEvents.enter&&this.dropTarget.fire(dropEvents.enter),dropEvents.drop&&this.dropTarget.fire(dropEvents.drop),dropEvents.deactivate&&this.fireActiveDrops(dropEvents.deactivate),target.fire(endEvent)}else this.resizing?(endEvent=new InteractEvent(this,event,"resize","end",this.element),target.fire(endEvent)):this.gesturing&&(endEvent=new InteractEvent(this,event,"gesture","end",this.element),target.fire(endEvent));this.stop(event)},collectDrops:function(element){var i,drops=[],elements=[];for(element=element||this.element,i=0;ij;j++){var currentElement=dropElements[j];currentElement!==element&&(drops.push(current),elements.push(currentElement))}}return{dropzones:drops,elements:elements}},fireActiveDrops:function(event){var i,current,currentElement,prevElement;for(i=0;it?(inertiaStatus.sx=easeOutQuad(t,0,inertiaStatus.xe,duration),inertiaStatus.sy=easeOutQuad(t,0,inertiaStatus.ye,duration),this.pointerMove(inertiaStatus.startEvent,inertiaStatus.startEvent),inertiaStatus.i=reqFrame(this.boundSmoothEndFrame)):(inertiaStatus.ending=!0,inertiaStatus.sx=inertiaStatus.xe,inertiaStatus.sy=inertiaStatus.ye,this.pointerMove(inertiaStatus.startEvent,inertiaStatus.startEvent),this.pointerEnd(inertiaStatus.startEvent,inertiaStatus.startEvent),inertiaStatus.smoothEnd=inertiaStatus.active=inertiaStatus.ending=!1)},addPointer:function(pointer){var id=getPointerId(pointer),index=this.mouse?0:indexOf(this.pointerIds,id);return-1===index&&(index=this.pointerIds.length),this.pointerIds[index]=id,this.pointers[index]=pointer,index},removePointer:function(pointer){var id=getPointerId(pointer),index=this.mouse?0:indexOf(this.pointerIds,id);-1!==index&&(this.pointers.splice(index,1),this.pointerIds.splice(index,1),this.downTargets.splice(index,1),this.downTimes.splice(index,1),this.holdTimers.splice(index,1))},recordPointer:function(pointer){var index=this.mouse?0:indexOf(this.pointerIds,getPointerId(pointer));-1!==index&&(this.pointers[index]=pointer)},collectEventTargets:function(pointer,event,eventTarget,eventType){function collectSelectors(interactable,selector,context){var els=ie8MatchesSelector?context.querySelectorAll(selector):void 0;interactable._iEvents[eventType]&&isElement(element)&&inContext(interactable,element)&&!testIgnore(interactable,element,eventTarget)&&testAllow(interactable,element,eventTarget)&&matchesSelector(element,selector,els)&&(targets.push(interactable),elements.push(element))}var pointerIndex=this.mouse?0:indexOf(this.pointerIds,getPointerId(pointer));if("tap"!==eventType||!this.pointerWasMoved&&this.downTargets[pointerIndex]&&this.downTargets[pointerIndex]===eventTarget){for(var targets=[],elements=[],element=eventTarget;element;)interact.isSet(element)&&interact(element)._iEvents[eventType]&&(targets.push(interact(element)),elements.push(element)),interactables.forEachSelector(collectSelectors),element=parentElement(element);(targets.length||"tap"===eventType)&&this.firePointers(pointer,event,eventTarget,targets,elements,eventType)}},firePointers:function(pointer,event,eventTarget,targets,elements,eventType){var i,interval,createNewDoubleTap,pointerIndex=this.mouse?0:indexOf(this.pointerIds,getPointerId(pointer)),pointerEvent={};for("doubletap"===eventType?pointerEvent=pointer:(pointerExtend(pointerEvent,event),event!==pointer&&pointerExtend(pointerEvent,pointer),pointerEvent.preventDefault=preventOriginalDefault,pointerEvent.stopPropagation=InteractEvent.prototype.stopPropagation,pointerEvent.stopImmediatePropagation=InteractEvent.prototype.stopImmediatePropagation,pointerEvent.interaction=this,pointerEvent.timeStamp=(new Date).getTime(),pointerEvent.originalEvent=event,pointerEvent.originalPointer=pointer,pointerEvent.type=eventType,pointerEvent.pointerId=getPointerId(pointer),pointerEvent.pointerType=this.mouse?"mouse":supportsPointerEvent?isString(pointer.pointerType)?pointer.pointerType:[,,"touch","pen","mouse"][pointer.pointerType]:"touch"),"tap"===eventType&&(pointerEvent.dt=pointerEvent.timeStamp-this.downTimes[pointerIndex],interval=pointerEvent.timeStamp-this.tapTime,createNewDoubleTap=!!(this.prevTap&&"doubletap"!==this.prevTap.type&&this.prevTap.target===pointerEvent.target&&500>interval),pointerEvent["double"]=createNewDoubleTap,this.tapTime=pointerEvent.timeStamp),i=0;ii;i++){var match=matches[i],matchElement=matchElements[i],action=validateAction(match.getAction(pointer,event,this,matchElement),match);if(action&&withinInteractionLimit(match,matchElement,action))return this.target=match,this.element=matchElement,action}},setSnapping:function(pageCoords,status){var target,page,i,snap=this.target.options[this.prepared.name].snap,targets=[];if(status=status||this.snapStatus,status.useStatusXY)page={x:status.x,y:status.y};else{var origin=getOriginXY(this.target,this.element);page=extend({},pageCoords),page.x-=origin.x,page.y-=origin.y}status.realX=page.x,status.realY=page.y,page.x=page.x-this.inertiaStatus.resumeDx,page.y=page.y-this.inertiaStatus.resumeDy;for(var len=snap.targets?snap.targets.length:0,relIndex=0;relIndexi;i++)target=isFunction(snap.targets[i])?snap.targets[i](relative.x,relative.y,this):snap.targets[i],target&&targets.push({x:isNumber(target.x)?target.x+this.snapOffsets[relIndex].x:relative.x,y:isNumber(target.y)?target.y+this.snapOffsets[relIndex].y:relative.y,range:isNumber(target.range)?target.range:snap.range})}var closest={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(i=0,len=targets.length;len>i;i++){target=targets[i];var range=target.range,dx=target.x-page.x,dy=target.y-page.y,distance=hypot(dx,dy),inRange=range>=distance;range===1/0&&closest.inRange&&closest.range!==1/0&&(inRange=!1),(!closest.target||(inRange?closest.inRange&&range!==1/0?distance/rangecontainer.innerWidth-autoScroll.margin,bottom=pointer.clientY>container.innerHeight-autoScroll.margin;else{var rect=getElementClientRect(container);left=pointer.clientXrect.right-autoScroll.margin,bottom=pointer.clientY>rect.bottom-autoScroll.margin}autoScroll.x=right?1:left?-1:0,autoScroll.y=bottom?1:top?-1:0,autoScroll.isScrolling||(autoScroll.margin=options.margin,autoScroll.speed=options.speed,autoScroll.start(this))}},_updateEventTargets:function(target,currentTarget){this._eventTarget=target,this._curEventTarget=currentTarget}},InteractEvent.prototype={preventDefault:blank,stopImmediatePropagation:function(){this.immediatePropagationStopped=this.propagationStopped=!0},stopPropagation:function(){this.propagationStopped=!0}};for(var listeners={},interactionListeners=["dragStart","dragMove","resizeStart","resizeMove","gestureStart","gestureMove","pointerOver","pointerOut","pointerHover","selectorDown","pointerDown","pointerMove","pointerUp","pointerCancel","pointerEnd","addPointer","removePointer","recordPointer","autoScrollMove"],i=0,len=interactionListeners.length;len>i;i++){var name=interactionListeners[i];listeners[name]=doOnInteractions(name)}interactables.indexOfElement=function(element,context){context=context||document;for(var i=0;irect.left&&page.xrect.top&&page.y=rect.left&&cx<=rect.right&&cy>=rect.top&&cy<=rect.bottom}if(isNumber(dropOverlap)){var overlapArea=Math.max(0,Math.min(rect.right,dragRect.right)-Math.max(rect.left,dragRect.left))*Math.max(0,Math.min(rect.bottom,dragRect.bottom)-Math.max(rect.top,dragRect.top)),overlapRatio=overlapArea/(dragRect.width*dragRect.height);dropped=overlapRatio>=dropOverlap}return this.options.drop.checker&&(dropped=this.options.drop.checker(dragEvent,event,dropped,this,dropElement,draggable,draggableElement)),dropped},dropChecker:function(checker){return isFunction(checker)?(this.options.drop.checker=checker,this):null===checker?(delete this.options.getRect,this):this.options.drop.checker},accept:function(newValue){return isElement(newValue)?(this.options.drop.accept=newValue,this):trySelector(newValue)?(this.options.drop.accept=newValue,this):null===newValue?(delete this.options.drop.accept,this):this.options.drop.accept},resizable:function(options){return isObject(options)?(this.options.resize.enabled=options.enabled===!1?!1:!0,this.setPerAction("resize",options),this.setOnEvents("resize",options),/^x$|^y$|^xy$/.test(options.axis)?this.options.resize.axis=options.axis:null===options.axis&&(this.options.resize.axis=defaultOptions.resize.axis),isBool(options.preserveAspectRatio)?this.options.resize.preserveAspectRatio=options.preserveAspectRatio:isBool(options.square)&&(this.options.resize.square=options.square),this):isBool(options)?(this.options.resize.enabled=options,this):this.options.resize},squareResize:function(newValue){return isBool(newValue)?(this.options.resize.square=newValue,this):null===newValue?(delete this.options.resize.square,this):this.options.resize.square},gesturable:function(options){return isObject(options)?(this.options.gesture.enabled=options.enabled===!1?!1:!0,this.setPerAction("gesture",options),this.setOnEvents("gesture",options),this):isBool(options)?(this.options.gesture.enabled=options,this):this.options.gesture},autoScroll:function(options){return isObject(options)?options=extend({actions:["drag","resize"]},options):isBool(options)&&(options={actions:["drag","resize"],enabled:options}),this.setOptions("autoScroll",options)},snap:function(options){var ret=this.setOptions("snap",options);return ret===this?this:ret.drag},setOptions:function(option,options){var i,actions=options&&isArray(options.actions)?options.actions:["drag"];if(isObject(options)||isBool(options)){for(i=0;ii&&!iEvent.immediatePropagationStopped;i++)funcName=listeners[i].name,listeners[i](iEvent);if(isFunction(this[onEvent])&&(funcName=this[onEvent].name,this[onEvent](iEvent)),iEvent.type in globalEvents&&(listeners=globalEvents[iEvent.type]))for(i=0,len=listeners.length;len>i&&!iEvent.immediatePropagationStopped;i++)funcName=listeners[i].name,listeners[i](iEvent);return this},on:function(eventType,listener,useCapture){var i;if(isString(eventType)&&-1!==eventType.search(" ")&&(eventType=eventType.trim().split(/ +/)),isArray(eventType)){for(i=0;i=0&&(delegated.selectors[index]!==this.selector||delegated.contexts[index]!==this._context);index--);-1===index&&(index=delegated.selectors.length,delegated.selectors.push(this.selector),delegated.contexts.push(this._context),delegated.listeners.push([])),delegated.listeners[index].push([listener,useCapture])}else events.add(this._element,eventType,listener,useCapture);return this},off:function(eventType,listener,useCapture){var i;if(isString(eventType)&&-1!==eventType.search(" ")&&(eventType=eventType.trim().split(/ +/)),isArray(eventType)){for(i=0;i=0;index--)if(delegated.selectors[index]===this.selector&&delegated.contexts[index]===this._context){var listeners=delegated.listeners[index];for(i=listeners.length-1;i>=0;i--){var fn=listeners[i][0],useCap=listeners[i][1];if(fn===listener&&useCap===useCapture){listeners.splice(i,1),listeners.length||(delegated.selectors.splice(index,1),delegated.contexts.splice(index,1),delegated.listeners.splice(index,1),events.remove(this._context,eventType,delegateListener),events.remove(this._context,eventType,delegateUseCapture,!0),delegated.selectors.length||(delegatedEvents[eventType]=null)),matchFound=!0;break}}if(matchFound)break}}else events.remove(this._element,eventType,listener,useCapture);return this},set:function(options){isObject(options)||(options={}),this.options=extend({},defaultOptions.base);var i,actions=["drag","drop","resize","gesture"],methods=["draggable","dropzone","resizable","gesturable"],perActions=extend(extend({},defaultOptions.perAction),options[action]||{});for(i=0;ii;i++){var setting=settings[i];this.options[setting]=defaultOptions.base[setting],setting in options&&this[setting](options[setting])}return this},unset:function(){if(events.remove(this._element,"all"),isString(this.selector))for(var type in delegatedEvents)for(var delegated=delegatedEvents[type],i=0;i=0;i--)interactions[i].stop(event);return interact},interact.dynamicDrop=function(newValue){return isBool(newValue)?(dynamicDrop=newValue,interact):dynamicDrop},interact.pointerMoveTolerance=function(newValue){return isNumber(newValue)?(pointerMoveTolerance=newValue,this):pointerMoveTolerance},interact.maxInteractions=function(newValue){return isNumber(newValue)?(maxInteractions=newValue,this):maxInteractions},interact.createSnapGrid=function(grid){return function(x,y){var offsetX=0,offsetY=0;isObject(grid.offset)&&(offsetX=grid.offset.x,offsetY=grid.offset.y);var gridx=Math.round((x-offsetX)/grid.x),gridy=Math.round((y-offsetY)/grid.y),newX=gridx*grid.x+offsetX,newY=gridy*grid.y+offsetY;return{x:newX,y:newY,range:grid.range}}},listenToDocument(document),prefixedMatchesSelector in Element.prototype&&isFunction(Element.prototype[prefixedMatchesSelector])||(ie8MatchesSelector=function(element,selector,elems){elems=elems||element.parentNode.querySelectorAll(selector);for(var i=0,len=elems.length;len>i;i++)if(elems[i]===element)return!0;return!1}),function(){for(var lastTime=0,vendors=["ms","moz","webkit","o"],x=0;xcount;)weekdays.push(formatDate(moment().weekday(count++),calendarConfig.dateFormats.weekDay));return weekdays}function getYearView(events,currentDay,cellModifier){for(var view=[],eventsInPeriod=getEventsInPeriod(currentDay,"year",events),month=moment(currentDay).startOf("year"),count=0;12>count;){var startPeriod=month.clone(),endPeriod=startPeriod.clone().endOf("month"),periodEvents=filterEventsInPeriod(eventsInPeriod,startPeriod,endPeriod),cell={label:formatDate(startPeriod,calendarConfig.dateFormats.month),isToday:startPeriod.isSame(moment().startOf("month")),events:periodEvents,date:startPeriod,badgeTotal:getBadgeTotal(periodEvents)};cellModifier({calendarCell:cell}),view.push(cell),month.add(1,"month"),count++}return view}function getMonthView(events,currentDay,cellModifier){var eventsInPeriod,startOfMonth=moment(currentDay).startOf("month"),day=startOfMonth.clone().startOf("week"),endOfMonthView=moment(currentDay).endOf("month").endOf("week");eventsInPeriod=calendarConfig.displayAllMonthEvents?filterEventsInPeriod(events,day,endOfMonthView):filterEventsInPeriod(events,startOfMonth,startOfMonth.clone().endOf("month"));for(var view=[],today=moment().startOf("day");day.isBefore(endOfMonthView);){var inMonth=day.month()===moment(currentDay).month(),monthEvents=[];(inMonth||calendarConfig.displayAllMonthEvents)&&(monthEvents=filterEventsInPeriod(eventsInPeriod,day,day.clone().endOf("day")));var cell={label:day.date(),date:day.clone(),inMonth:inMonth,isPast:today.isAfter(day),isToday:today.isSame(day),isFuture:today.isBefore(day),isWeekend:[0,6].indexOf(day.day())>-1,events:monthEvents,badgeTotal:getBadgeTotal(monthEvents)};cellModifier({calendarCell:cell}),view.push(cell),day.add(1,"day")}return view}function getWeekView(events,currentDay){for(var startOfWeek=moment(currentDay).startOf("week"),endOfWeek=moment(currentDay).endOf("week"),dayCounter=startOfWeek.clone(),days=[],today=moment().startOf("day");days.length<7;)days.push({weekDayLabel:formatDate(dayCounter,calendarConfig.dateFormats.weekDay),date:dayCounter.clone(),dayLabel:formatDate(dayCounter,calendarConfig.dateFormats.day),isPast:dayCounter.isBefore(today),isToday:dayCounter.isSame(today),isFuture:dayCounter.isAfter(today),isWeekend:[0,6].indexOf(dayCounter.day())>-1}),dayCounter.add(1,"day");var eventsSorted=filterEventsInPeriod(events,startOfWeek,endOfWeek).map(function(event){var offset,span,eventStart=moment(event.startsAt).startOf("day"),eventEnd=moment(event.endsAt||event.startsAt).startOf("day"),weekViewStart=moment(startOfWeek).startOf("day"),weekViewEnd=moment(endOfWeek).startOf("day");return offset=eventStart.isBefore(weekViewStart)||eventStart.isSame(weekViewStart)?0:eventStart.diff(weekViewStart,"days"),eventEnd.isAfter(weekViewEnd)&&(eventEnd=weekViewEnd), eventStart.isBefore(weekViewStart)&&(eventStart=weekViewStart),span=moment(eventEnd).diff(eventStart,"days")+1,event.daySpan=span,event.dayOffset=offset,event});return{days:days,events:eventsSorted}}function getDayView(events,currentDay,dayViewStart,dayViewEnd,dayViewSplit){var dayStartHour=moment(dayViewStart||"00:00","HH:mm").hours(),dayEndHour=moment(dayViewEnd||"23:00","HH:mm").hours(),hourHeight=60/dayViewSplit*30,calendarStart=moment(currentDay).startOf("day").add(dayStartHour,"hours"),calendarEnd=moment(currentDay).startOf("day").add(dayEndHour,"hours"),calendarHeight=(dayEndHour-dayStartHour+1)*hourHeight,hourHeightMultiplier=hourHeight/60,buckets=[],eventsInPeriod=filterEventsInPeriod(events,moment(currentDay).startOf("day").toDate(),moment(currentDay).endOf("day").toDate()),minDisplayTime=15,sortedEvents=eventsInPeriod.map(function(event){if(event.isAllDayEvent=moment(event.startsAt).isBefore(calendarStart)&&moment(event.endsAt).isAfter(calendarEnd)||moment(event.startsAt).isSame(calendarStart)&&moment(event.endsAt).isSame(calendarEnd)?!0:!1,event.top=moment(event.startsAt).isBefore(calendarStart)?0:moment(event.startsAt).startOf("minute").diff(calendarStart.startOf("minute"),"minutes")*hourHeightMultiplier-2,moment(event.endsAt||event.startsAt).isAfter(calendarEnd))event.height=calendarHeight-event.top;else{var diffStart=event.startsAt;moment(event.startsAt).isBefore(calendarStart)&&(diffStart=calendarStart.toDate()),event.height=!event.endsAt||moment(event.endsAt||event.startsAt).diff(event.startsAt,"minutes")<=minDisplayTime?36:moment(event.endsAt||event.startsAt).diff(diffStart,"minutes")*hourHeightMultiplier}return event.top-event.height>calendarHeight&&(event.height=0),event.left=0,event}).filter(function(event){return event.height>0}).map(function(event){if(event.isAllDayEvent)return event;var cannotFitInABucket=!0;return buckets.forEach(function(bucket,bucketIndex){var canFitInThisBucket=!0,eventDisplayEndTime=moment(event.endsAt||event.startsAt).diff(event.startsAt,"minutes")<=minDisplayTime?moment(event.startsAt).add(minDisplayTime,"minutes"):event.endsAt||event.startsAt;bucket.forEach(function(bucketItem){var bucketDisplayItemEndTime=moment(bucketItem.endsAt||bucketItem.startsAt).diff(bucketItem.startsAt,"minutes")<=minDisplayTime?moment(bucketItem.startsAt).add(minDisplayTime,"minutes"):bucketItem.endsAt||bucketItem.startsAt;(dateRangeIsInPeriod(event.startsAt,eventDisplayEndTime,bucketItem.startsAt,bucketDisplayItemEndTime)||dateRangeIsInPeriod(bucketItem.startsAt,bucketDisplayItemEndTime,event.startsAt,eventDisplayEndTime))&&(canFitInThisBucket=!1)}),canFitInThisBucket&&cannotFitInABucket&&(cannotFitInABucket=!1,event.left=150*bucketIndex,buckets[bucketIndex].push(event))}),cannotFitInABucket&&(event.left=150*buckets.length,buckets.push([event])),event}),width=100/12*11*4;buckets.length<5&&(width=100/12*11/buckets.length);var currentLeft=100/12;return buckets.forEach(function(bucket){bucket.forEach(function(event){event.left=currentLeft,event.width=width}),currentLeft+=width}),sortedEvents}function getWeekViewWithTimes(events,currentDay,dayViewStart,dayViewEnd,dayViewSplit){var weekView=getWeekView(events,currentDay),newEvents=[];return weekView.days.forEach(function(day){var dayEvents=weekView.events.filter(function(event){return moment(event.startsAt).startOf("day").isSame(moment(day.date).startOf("day"))}),newDayEvents=getDayView(dayEvents,day.date,dayViewStart,dayViewEnd,dayViewSplit);newEvents=newEvents.concat(newDayEvents)}),weekView.events=newEvents,weekView}function getDayViewHeight(dayViewStart,dayViewEnd,dayViewSplit){var dayViewStartM=moment(dayViewStart||"00:00","HH:mm"),dayViewEndM=moment(dayViewEnd||"23:00","HH:mm"),hourHeight=60/dayViewSplit*30;return(dayViewEndM.diff(dayViewStartM,"hours")+1)*hourHeight+2}return{getWeekDayNames:getWeekDayNames,getYearView:getYearView,getMonthView:getMonthView,getWeekView:getWeekView,getDayView:getDayView,getWeekViewWithTimes:getWeekViewWithTimes,getDayViewHeight:getDayViewHeight,adjustEndDateFromStartDiff:adjustEndDateFromStartDiff,formatDate:formatDate,eventIsInPeriod:eventIsInPeriod}}]),angular.module("mwl.calendar").factory("calendarTitle",["moment","calendarConfig","calendarHelper",function(moment,calendarConfig,calendarHelper){function day(currentDay){return calendarHelper.formatDate(currentDay,calendarConfig.titleFormats.day)}function week(currentDay){var weekTitleLabel=calendarConfig.titleFormats.week;return weekTitleLabel.replace("{week}",moment(currentDay).week()).replace("{year}",moment(currentDay).format("YYYY"))}function month(currentDay){return calendarHelper.formatDate(currentDay,calendarConfig.titleFormats.month)}function year(currentDay){return calendarHelper.formatDate(currentDay,calendarConfig.titleFormats.year)}return{day:day,week:week,month:month,year:year}}]),angular.module("mwl.calendar").constant("interact",interact),angular.module("mwl.calendar").constant("moment",moment),angular.module("fdvService.directives").directive("fdvCalendar",["$timeout","$q","$locale","fdvLog","fdvConfig","fdvRoute","fdvModalManager","fdvJsonApi","fdvUserData","fdvCalendarEventModel","fdvConstant","fdvAlertManager","locale",function($timeout,$q,$locale,fdvLog,fdvConfig,fdvRoute,fdvModalManager,fdvJsonApi,fdvUserData,fdvCalendarEventModel,fdvConstant,fdvAlertManager,locale){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("calendar/calendar.html"),controller:["$scope","$element",function($scope){$scope.loading=!0,$scope.paginationSelectedPage=0,$scope.calendar=void 0,$scope.timePeriods=[{id:"day",name:locale.getString("fdv.calendar-day")},{id:"week",name:locale.getString("fdv.calendar-week")},{id:"month",name:locale.getString("fdv.calendar-month")}],$scope.selectedTimePeriod=$scope.timePeriods[2],$scope.calendarView="",$scope.calendarDay=moment(new Date),$scope.events=[],$scope.calendarTitle="",$scope.setInitialCalendarMode=function(){""===$scope.calendarView&&($scope.calendarView="month")},$scope.loadCalendar=function(){var selectedPhoneLine=$scope.selectedPhoneLine;"undefined"!=typeof selectedPhoneLine&&fdvJsonApi.voiceCalendarGetPaged(selectedPhoneLine.number,$scope.calendarDay.month(),$scope.calendarDay.year()).then(function(model){$scope.calendar=model,$scope.events=[];var timeFrameStart=moment().set({year:$scope.calendarDay.year(),month:$scope.calendarDay.month()}).startOf("month"),timeFrameEnd=moment().set({year:$scope.calendarDay.year(),month:$scope.calendarDay.month()}).endOf("month");$scope.calendar.events.forEach(function(model){var isWeekend=function(momentDate){return 0===momentDate.day()||6===momentDate.day()},isWeekday=function(momentDate){return momentDate.day()>0&&momentDate.day()<6},isWithinTimeFrame=function(momentDateStart,momentDateEnd,timeFrameStart,timeFrameEnd){return momentDateStart.isBefore(timeFrameStart)&&momentDateEnd.isAfter(timeFrameEnd)||momentDateStart.isAfter(timeFrameStart)&&momentDateStart.isAfter(timeFrameEnd)||momentDateEnd.isAfter(timeFrameStart)&&momentDateEnd.isAfter(timeFrameEnd)?!0:!1},endDate=model.startDate;model.hasEndDate()&&(endDate=model.endDate);var diff=moment(endDate).diff(moment(model.startDate)),subEvents=[];if(model.hasRepeat()){var repeatModel=model.getRepeat();switch(repeatModel.frequency){case"daily":var clipedStartDate=moment(model.startDate);for(moment(model.startDate).isBefore(timeFrameStart)&&clipedStartDate.set({year:$scope.calendarDay.year(),month:$scope.calendarDay.month(),date:1});clipedStartDate.isBefore(timeFrameEnd)&&clipedStartDate.isBefore(repeatModel.repeatThrough);)("only_weekdays"===repeatModel.restrictions&&isWeekday(clipedStartDate)||"only_weekends"===repeatModel.restrictions&&isWeekend(clipedStartDate)||repeatModel.restrictions===!1)&&subEvents.push({startDate:moment(clipedStartDate),endDate:moment(clipedStartDate).add("milliseconds",diff)}),clipedStartDate.add("day",1);break;case"weekly":var clipedStartDate=moment(model.startDate);if(moment(model.startDate).isBefore(timeFrameStart)){var weeksTillTimeFrameStart=moment(timeFrameStart).diff(moment(model.startDate),"weeks");clipedStartDate.add(Math.floor(weeksTillTimeFrameStart/repeatModel.interval)*repeatModel.interval,"weeks")}for(var weeksFromStartDate=moment(endDate).diff(moment(model.startDate),"weeks");clipedStartDate.isBefore(timeFrameEnd)&&clipedStartDate.isBefore(repeatModel.repeatThrough);)weeksFromStartDate%repeatModel.interval===0&&subEvents.push({startDate:moment(clipedStartDate),endDate:moment(clipedStartDate).add("milliseconds",diff)}),clipedStartDate.add("weeks",1),weeksFromStartDate++;break;case"monthly":if(isWithinTimeFrame(moment(model.startDate),moment(repeatModel.repeatThrough),timeFrameStart,timeFrameEnd)){var clipedStartDate=moment(model.startDate);if(moment(model.startDate).isBefore(timeFrameStart)){var monthsTillTimeFrameStart=moment(timeFrameStart).diff(moment(model.startDate),"months");clipedStartDate.add(Math.floor(monthsTillTimeFrameStart/repeatModel.interval)*repeatModel.interval,"months")}for(var monthsFromStartDate=moment(endDate).diff(moment(model.startDate),"months");clipedStartDate.isBefore(timeFrameEnd)&&clipedStartDate.isBefore(repeatModel.repeatThrough);)monthsFromStartDate%repeatModel.interval===0&&subEvents.push({startDate:moment(clipedStartDate),endDate:moment(clipedStartDate).add("milliseconds",diff)}),clipedStartDate.add("months",1),monthsFromStartDate++}break;case"yearly":if(isWithinTimeFrame(moment(model.startDate),moment(repeatModel.repeatThrough),timeFrameStart,timeFrameEnd)){var clipedStartDate=moment(model.startDate);clipedStartDate.set({year:$scope.calendarDay.year()}),subEvents.push({startDate:moment(clipedStartDate),endDate:moment(clipedStartDate.add("milliseconds",diff))})}}}else subEvents.push({startDate:moment(model.startDate),endDate:moment(model.endDate)});subEvents.forEach(function(subEvent){$scope.events.push({model:model,title:model.name,callFrom:selectedPhoneLine.number,callTarget:model.getReminderPhoneNumber(),type:model.getEventType(),startsAt:subEvent.startDate,endsAt:subEvent.endDate,deletable:!1,draggable:!1,resizable:!1,incrementsBadgeTotal:!1,cssClass:"a-css-class-name",toolTip:"",toolTipString:function(eventScope){var startOfToday=eventScope.date,endOfToday=moment(eventScope.date).endOf("day"),eventDays=moment.duration(moment(this.model.endDate).diff(this.model.startDate)).days(),titleDate="";return titleDate=eventDays>0&&moment(this.model.startDate).isBetween(startOfToday,endOfToday)?moment(this.model.startDate).format("LLLL")+" "+locale.getString("fdv.calendar-to")+" "+moment(this.model.endDate).format("LLLL"):eventDays>0&&moment(this.model.endDate).isBetween(startOfToday,endOfToday)?moment(this.model.startDate).format("LLLL")+" "+locale.getString("fdv.calendar-to")+" "+moment(this.model.endDate).format("LLLL"):moment(this.model.startDate).isBefore(startOfToday)&&moment(this.model.endDate).isAfter(endOfToday)?moment(this.model.startDate).format("LLLL")+" "+locale.getString("fdv.calendar-to")+" "+moment(this.model.endDate).format("LLLL"):moment(this.model.startDate).format("LT")+" "+locale.getString("fdv.calendar-to")+" "+moment(this.model.endDate).format("LT")},toolTipStringWeek:function(){return moment(this.model.startDate).format("LLLL")+" "+locale.getString("fdv.calendar-to")+" "+moment(this.model.endDate).format("LLLL")}})})}.bind(this)),$scope.loading=!1,$scope.setInitialCalendarMode()}.bind(this))["catch"](function(){$scope.loading=!1,$scope.setInitialCalendarMode()}.bind(this))},$scope.nextTimePeriod=function(){switch($scope.calendarView){case"month":$scope.calendarDay=moment($scope.calendarDay).add(1,"month");break;case"week":$scope.calendarDay=moment($scope.calendarDay).add(1,"week");break;case"day":$scope.calendarDay=moment($scope.calendarDay).add(1,"day")}$scope.loading=!0,$scope.loadCalendar()},$scope.prevTimePeriod=function(){switch($scope.calendarView){case"month":$scope.calendarDay=moment($scope.calendarDay).subtract(1,"month");break;case"week":$scope.calendarDay=moment($scope.calendarDay).subtract(1,"week");break;case"day":$scope.calendarDay=moment($scope.calendarDay).subtract(1,"day")}$scope.loading=!0,$scope.loadCalendar()},$scope.timePeriodChanged=function(timePeriod){switch(timePeriod.id){case"day":$scope.calendarView="day";break;case"week":$scope.calendarView="week";break;case"month":$scope.calendarView="month"}$scope.selectedTimePeriod=timePeriod},$scope.$watch(function(){return $scope.calendarView},function(newValue){$scope.timePeriods.forEach(function(timePeriod){newValue==timePeriod.id&&($scope.selectedTimePeriod=timePeriod)})}),$scope.selectedPhoneLineWatch=$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue){$scope.selectedPage=0,$scope.selectedPhoneLine=newValue,$scope.loadCalendar()}),$scope.addCalendarEvent=function(){$scope.actionManager.addCalendarEvent(new fdvCalendarEventModel).then(function(){$scope.loading=!0,$scope.loadCalendar()}.bind(this))["catch"](function(){})},$scope.showContextualMenu=function(event){switch($scope.selectedItem=event,$scope.contextualMenuItems=[],$scope.selectedItem.getEventType()){case"event":$scope.contextualMenuItems.push({id:fdvConstant.ACTION.VIEW_EDIT_EVENT,label:locale.getString("fdv.action-edit-event")});break;case"schedulecall":$scope.contextualMenuItems.push({id:fdvConstant.ACTION.VIEW_EDIT_EVENT_SCHEDULED_CALL,label:locale.getString("fdv.action-edit-event-schedule-call")})}$scope.contextualMenuItems.push({id:fdvConstant.ACTION.DELETE_EVENT,label:locale.getString("fdv.action-delete-event")})},$scope.contextualMenuClicked=function(menuItem){if(void 0===$scope.selectedItem)return fdvLog.error("Calendar Page","No event is selected"),!0;switch(menuItem.id){case fdvConstant.ACTION.VIEW_EDIT_EVENT:$scope.actionManager.viewCalendarEvent($scope.selectedItem).then(function(){$scope.loading=!0,$scope.loadCalendar()}.bind(this))["catch"](function(){});break;case fdvConstant.ACTION.VIEW_EDIT_EVENT_SCHEDULED_CALL:$scope.actionManager.viewScheduleCall($scope.selectedItem).then(function(){$scope.loading=!0,$scope.loadCalendar()}.bind(this))["catch"](function(){});break;case fdvConstant.ACTION.DELETE_EVENT:$scope.actionManager.deleteCalenarEvent($scope.selectedItem).then(function(){$scope.loading=!0,$scope.loadCalendar()}.bind(this))["catch"](function(){})}return!0},$scope.allowShowContextualMenu=!1,$scope.calendarEventClicked=function(calendarEvent){$scope.showContextualMenu(calendarEvent.model.copy()),$scope.allowShowContextualMenu=!0},$scope.validateContextualMenuAppearance=function(){return $scope.allowShowContextualMenu?($scope.allowShowContextualMenu=!1,!0):!1},$scope.scheduleCall=function(){var scheduleEvent=new fdvCalendarEventModel;scheduleEvent.setReminderPhone(),$scope.actionManager.scheduleCall(scheduleEvent).then(function(){$scope.loading=!0,$scope.loadCalendar()}.bind(this))["catch"](function(){})}}],link:function(){}}}]),angular.module("fdvService.directives").directive("fdvCall",["fdvLog","fdvConfig","fdvConstant","fdvNativeApi","fdvActionManager","fdvUserData","fdvJsonApi",function(fdvLog,fdvConfig,fdvConstant,fdvNativeApi,fdvActionManager,fdvUserData,fdvJsonApi){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("calls/call.html"),controller:["$scope",function($scope){$scope.componentName="Call Page",$scope.call=$scope.routeManager.getCurrentRoute().getParamsData(),$scope.loading=!0,$scope.deleteCall=function(){$scope.actionManager.deleteACall($scope.call).then(function(){$scope.routeManager.goBack()===!1&&(fdvLog.debug($scope.componentName,"Exiting FDV, go to dashboard page"),$scope.eventTriggered({event:{type:fdvConstant.EVENT.EXIT_FDV,data:{path:"dashboard"}}}))})},fdvNativeApi.registerWebViewResume(function(){$scope.getTelephonyAvaiability()}.bind(this)),$scope.addToExistingContactNative=function(){fdvActionManager.saveToDeviceContacts().then(function(){fdvNativeApi.nativeEditContactInContactView($scope.call.contactName,$scope.call.getRelevantPhoneNumber()).then(function(){fdvLog.debug($scope.componentName,"Number is saved to device contacts")}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: Number is not saved to device contacts")}.bind(this))})},$scope.createNewContactNative=function(){fdvActionManager.saveToDeviceContacts().then(function(){fdvNativeApi.nativeCreateNewContactInContactView($scope.call.contactName,$scope.call.getRelevantPhoneNumber()).then(function(){fdvLog.debug($scope.componentName,"Number is added to device contacts")}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: Number is not added to device contacts")}.bind(this))})},$scope.viewContactNative=function(){fdvNativeApi.nativeViewContactInContactView($scope.call.getRelevantPhoneNumber()).then(function(){}.bind(this))["catch"](function(){}.bind(this))},$scope.blockCaller=function(){$scope.actionManager.blockCaller($scope.call.getRelevantPhoneNumber(),$scope.options).then(function(){$scope.call.isBlocked=!0})},$scope.unblockCaller=function(){$scope.actionManager.unblockCaller($scope.call.getRelevantPhoneNumber(),$scope.options).then(function(){$scope.call.isBlocked=!1})},$scope.textBack=function(){fdvNativeApi.nativeOpenSMSApp($scope.call.getRelevantPhoneNumber(),"")},$scope.callBack=function(){$scope.isTelephonyAvailable?fdvNativeApi.nativeOpenDialPad($scope.call.getRelevantPhoneNumber()):$scope.actionManager.callBack($scope.call.getRelevantPhoneNumber())},$scope.getContactStatus=function(){angular.isUndefined($scope.call)||fdvNativeApi.nativeGetContactsByPhoneNumber($scope.call.getRelevantPhoneNumber()).then(function(){$scope.isNumberOnNativeContacts=!0,fdvLog.debug($scope.componentName,"Number is already in native contacts")}.bind(this))["catch"](function(){$scope.isNumberOnNativeContacts=!1,fdvLog.debug($scope.componentName,"Number is not in native contacts")}.bind(this))},$scope.getTelephonyAvaiability=function(){$scope.isTelephonyAvailable=!1,fdvNativeApi.nativeIsTelephonyAvailable().then(function(){fdvLog.debug($scope.componentName,"Telephony is available"),$scope.isTelephonyAvailable=!0,$scope.getContactStatus()},function(){$scope.getContactStatus(),fdvLog.debug($scope.componentName,"Telephony is not available")})},$scope.getTelephonyAvaiability(),$scope.loadOptions=function(){return $scope.options=void 0,$scope.isNumberOnNativeContacts=!1,$scope.isTelephonyAvailable=!1,$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),angular.isUndefined($scope.selectedPhoneLine)?void fdvLog.error($scope.componentName,"No phone line selected"):($scope.loading=!0,void fdvJsonApi.voiceOptionsGet($scope.selectedPhoneLine.number).then(function(model){$scope.options=model,$scope.loading=!1})["catch"](function(){fdvLog.error($scope.componentName,"Error: loading options faied")}))},$scope.loadOptions()}],link:function(scope){scope.$on("$destroy",function(){fdvNativeApi.unregisterWebViewResume()})}}}]),angular.module("fdvService.directives").directive("fdvCalls",["$timeout","$filter","$q","fdvLog","fdvConfig","fdvConstant","fdvJsonApi","fdvUserData","fdvAlertManager","fdvContactModel","fdvLocaleManager","fdvAnalytics",function($timeout,$filter,$q,fdvLog,fdvConfig,fdvConstant,fdvJsonApi,fdvUserData,fdvAlertManager,fdvContactModel,fdvLocaleManager,fdvAnalytics){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("calls/calls.html"),controller:["$scope","$element",function($scope,$element){$scope.componentName="Calls Page",$scope.editMode=!1,$scope.isAllSelected=!1,$scope.selectedPage=0,$scope.filters=[{id:"",label:"fdv.label-calls-all"},{id:fdvConstant.CALL.INCOMING_MISSED,label:"fdv.label-calls-missed"}],$scope.selectedFilter=$scope.filters[0],$scope.selectedCalls=[],$scope.trackPageView=function(){var pageName="recentcalls:all";angular.isObject($scope.selectedFilter)&&$scope.selectedFilter.id===fdvConstant.CALL.INCOMING_MISSED&&(pageName="recentcalls:missed"),fdvAnalytics.enterPage(pageName)},$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue,oldValue){angular.isDefined(newValue)&&newValue!=oldValue&&($scope.selectedPage=0,$scope.selectedFilter=$scope.filters[0],$scope.loadCalls())}),$scope.filterChanged=function(filter){$scope.editMode=!1,$scope.isAllSelected=!1,$scope.selectedCalls=[],$scope.selectedPage=0,$scope.selectedFilter=filter,$scope.trackPageView(),$scope.loadCalls()},$scope.paginationSelectionChanged=function(page){$scope.editMode=!1,$scope.isAllSelected=!1,$scope.selectedCalls=[],$scope.selectedPage=page,$scope.loadCalls()},$element.find(".fdv-page-content").on("scroll",function(){if(angular.isDefined($scope.pageData)&&this.scrollTop>=this.scrollHeight-this.clientHeight-20){var pageCount=$scope.pageData.maxItems/$scope.pageData.maxItemsPerPage;$scope.selectedPage=0&&($scope.contacts.contacts[index]=result),fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)}.bind(this));break;case fdvConstant.ACTION.UNBLOCK_CALLER:$scope.actionManager.unblockCaller(phoneNumber,$scope.options).then(function(){fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)});break;case fdvConstant.ACTION.BLOCK_CALLER:$scope.actionManager.blockCaller(phoneNumber,$scope.options).then(function(){fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)});break;case fdvConstant.ACTION.ADD_CALL_NOTIFICATION:$scope.actionManager.callNotification(phoneNumber,$scope.options).then(function(){fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)});break;case fdvConstant.ACTION.REMOVE_CALL_NOTIFICATION:$scope.actionManager.removeCallNotification(phoneNumber,$scope.options).then(function(){fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)});break;case fdvConstant.ACTION.DELETE_CALL:$scope.actionManager.deleteACall($scope.activeItem).then(function(){$scope.loadCalls(!0)})}return!0},$scope.contextualMenuClosed=function(){$scope.$apply(function(){})},$scope.selectACall=function(selected,call){if(call.isSelected=selected,call.isSelected===!1){$scope.isAllSelected=!1;for(var i=0;i<$scope.selectedCalls.length;i++)if($scope.selectedCalls[i].id===call.id){$scope.selectedCalls.splice(i,1);break}}else $scope.selectedCalls.push(call)},$scope.selectAllCalls=function(selected){$scope.selectedCalls=[],$scope.isAllSelected=selected,angular.isDefined($scope.calls)&&angular.isArray($scope.calls.callLog)&&$scope.calls.callLog.forEach(function(call){call.isSelected=$scope.isAllSelected,call.isSelected&&$scope.selectedCalls.push(call)})},$scope.enableEditMode=function(){$scope.editMode=!0},$scope.disableEditMode=function(){$scope.editMode=!1},$scope.deleteCalls=function(){$scope.actionManager.deleteCalls($scope.selectedCalls).then(function(){$scope.selectedPage=0,$scope.loadCalls(!0),$scope.selectedCalls=[],$scope.isAllSelected=!1})},$scope.deleteAllCalls=function(){var filterId=angular.isDefined($scope.selectedFilter)?$scope.selectedFilter.id:"";$scope.actionManager.deleteAllCalls(filterId).then(function(){$scope.isAllSelected=!1,$scope.editMode=!1,$scope.selectedPage=0,$scope.calls=void 0,$scope.currentRoute.setContext({dataLength:0})})},$scope.trackPageView(),$scope.loadCalls()}],link:function(scope){scope.$on(fdvConstant.EVENT.OPTIONS_MENU_CLICKED,function(event,data){data.id===fdvConstant.ACTION.DELETE_ALL&&scope.deleteAllCalls()}),scope.$onclose=function(){return scope.editMode===!0?($timeout(function(){scope.disableEditMode(),scope.selectAllCalls(!1)}),!0):!1},scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){switch(eventData.keyCode){case fdvConstant.KEY.KEY_C:case fdvConstant.KEY.REMOTE_KEY_C:scope.loadCalls()}})}}}]),angular.module("fdvService.config").service("fdvConfig",["$q","fdvLog","fdvConstant","fdvConstantValidator","fdvAccountModel",function($q,fdvLog,fdvConstant,fdvConstantValidator,fdvAccountModel){var componentName="Config Service";if("undefined"!=typeof window.fdvServiceAppConstants&&"undefined"!=typeof window.fdvServiceAppConstants.DATASERVER)var _server=fdvServiceAppConstants.DATASERVER;else var _server="";var _unitAddress,_platform=fdvConstant.PLATFORM.WEB,_startPage=fdvConstant.ROUTE.HOME,_account=new fdvAccountModel;this.getTemplateUrl=function(template){return"fdv/templates/"+template},this.setPlatform=function(platform){fdvConstantValidator.contains(fdvConstant.PLATFORM,platform)?_platform=platform:(_platform=fdvConstant.PLATFORM.WEB,fdvLog.error("Config Service","Invalid platform: "+platform+", use web platform"))},this.getPlatform=function(){return _platform},this.setServer=function(server){_server=server},this.getServer=function(){return _server},this.setStartPage=function(startPage){fdvConstantValidator.contains(fdvConstant.ROUTE,startPage)?_startPage=startPage:(_startPage=fdvConstant.ROUTE.HOME,fdvLog.warn(componentName,"Start page is not set or invalid: "+startPage+", start home page"))},this.getStartPage=function(){return _startPage},this.setAccount=function(account){_account=account},this.getAccount=function(){return _account},this.setUnitAddress=function(unitAddress){_unitAddress=unitAddress},this.getUnitAddress=function(){return _unitAddress},this.isMobile=function(){return _platform===fdvConstant.PLATFORM.MOBILE},this.isStb=function(){return _platform===fdvConstant.PLATFORM.STB},this.isWeb=function(){return _platform===fdvConstant.PLATFORM.WEB}}]),angular.module("fdvService.directives").directive("fdvContacts",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("contacts/contacts.html"),controller:["$q","$scope","fdvLog","fdvConfig","fdvNativeApi","fdvJsonApi","fdvUserData","fdvConstant","fdvContactModel","fdvAlertManager","locale",function($q,$scope,fdvLog,fdvConfig,fdvNativeApi,fdvJsonApi,fdvUserData,fdvConstant,fdvContactModel,fdvAlertManager,locale){$scope.loading=!0,$scope.contacts=[],$scope.selectedPage=0,$scope.options=void 0,$scope.editMode=!1,$scope.selectAll=!1,$scope.contactSelections={},$scope.contactSelectionCount=0,$scope.alphabet=locale.getString("fdv.contacts-alphabet"),$scope.alphabetArray=[],$scope.filterOff=!0,$scope.filterLetter="",$scope.contactsStats,fdvUserData.invalidateContacts(),$scope.addContact=function(){$scope.actionManager.addContact(new fdvContactModel).then(function(){fdvUserData.invalidateContacts(),$scope.loadContacts()})},$scope.startEditMode=function(){$scope.selectAll=!1,$scope.editMode=!0},$scope.cancelEditMode=function(){$scope.editMode=!1,$scope.contactSelections={},$scope.selectAll=!1,$scope.calculateContactSelectionCount()},$scope.calculateContactSelectionCount=function(){var contactList=[];for(var key in $scope.contactSelections)$scope.contactSelections[key]===!0&&contactList.push(key); $scope.contactSelectionCount=contactList.length},$scope.deleteContacts=function(){$scope.selectAll=!1;var contactList=[];for(var key in $scope.contactSelections)$scope.contactSelections[key]===!0&&contactList.push(key);1===contactList.length?$scope.actionManager.deleteAContact(contactList[0],function(){$scope.loading=!0}.bind(this)).then(function(){fdvUserData.invalidateContacts(),$scope.loadContacts(),$scope.cancelEditMode()})["catch"](function(){$scope.loading=!1,$scope.cancelEditMode()}):contactList.length>1&&$scope.actionManager.deleteContacts(contactList,function(){$scope.loading=!0}.bind(this)).then(function(){fdvUserData.invalidateContacts(),$scope.loadContacts(),$scope.cancelEditMode()})["catch"](function(){$scope.loading=!1,$scope.cancelEditMode()})},$scope.deleteAllContacts=function(){$scope.selectAll=!1,$scope.actionManager.deleteAllContacts(function(){$scope.loading=!0}.bind(this)).then(function(){$scope.loading=!1,fdvUserData.invalidateContacts(),$scope.loadContacts()}.bind(this))["catch"](function(){$scope.loading=!1}.bind(this))},$scope.paginationSelectionChanged=function(){$scope.loadContacts(),$scope.selectAll=!1},$scope.filterOffClicked=function(){$scope.filterLetter="",$scope.filterOff=!0,$scope.loading=!0,$scope.selectedPage=0,$scope.selectAll=!1,$scope.loadContacts()},$scope.filterByLetterClicked=function(model){model.count>0&&($scope.filterLetter=model.letter,$scope.filterOff=!1,$scope.loading=!0,$scope.selectedPage=0,$scope.selectAll=!1,$scope.loadContacts())},$scope.selectAContact=function(contact){$scope.selectAll=!1,$scope.contactSelections[contact.id]="undefined"!=typeof $scope.contactSelections[contact.id]?!$scope.contactSelections[contact.id]:!0,$scope.calculateContactSelectionCount()},$scope.selectAllContactsOnPage=function(){$scope.selectAll=!$scope.selectAll,angular.isUndefined($scope.contacts)||$scope.contacts.forEach(function(contact){$scope.contactSelections[contact.model.id]=$scope.selectAll}.bind(this)),$scope.calculateContactSelectionCount()},$scope.loadContactStats=function(){var deferred=$q.defer();if("undefined"!=typeof $scope.selectedPhoneLine){var number=$scope.selectedPhoneLine.number.replace(/([\D]*)/g,"");fdvJsonApi.voiceContactsStatsGet(number).then(function(model){$scope.contactsStats=model,$scope.alphabetArray=[];for(var alphabetIndex=0;alphabetIndex<$scope.alphabet.length;alphabetIndex++){for(var count=0,statIndex=0;statIndex<$scope.contactsStats.countByLetter.length;statIndex++)if($scope.alphabet[alphabetIndex].toLowerCase()===$scope.contactsStats.countByLetter[statIndex].letter.toLowerCase()){count=$scope.contactsStats.countByLetter[statIndex].count;break}$scope.alphabetArray.push({letter:$scope.alphabet[alphabetIndex],count:count})}deferred.resolve()}.bind(this))["catch"](function(){$scope.alphabetArray=[],deferred.reject()})}else deferred.reject();return deferred.promise},$scope.loadContacts=function(){if("undefined"!=typeof $scope.selectedPhoneLine){var number=$scope.selectedPhoneLine.number.replace(/([\D]*)/g,"");$scope.loadContactStats().then(function(){if(!$scope.filterOff){for(var haveContent=!1,index=0;index<$scope.alphabetArray.length;index++)if($scope.alphabetArray[index].letter===$scope.filterLetter&&$scope.alphabetArray[index].count>0){haveContent=!0;break}haveContent||($scope.filterLetter="",$scope.filterOff=!0)}if($scope.filterOff||""===$scope.filterLetter)var request=fdvJsonApi.voiceContactsPagedGet(number,$scope.selectedPage,fdvConstant.PAGINATION.MAX_PER_PAGE);else var request=fdvJsonApi.voiceContactsPagedGet(number,$scope.selectedPage,fdvConstant.PAGINATION.MAX_PER_PAGE,$scope.filterLetter.toLowerCase());return request}.bind(this)).then(function(model){return $scope.selectedPage>0&&0===model.contacts.length&&model.total>0?($scope.selectedPage--,$scope.filterOff||""===$scope.filterLetter?fdvJsonApi.voiceContactsPagedGet(number,$scope.selectedPage,fdvConstant.PAGINATION.MAX_PER_PAGE):fdvJsonApi.voiceContactsPagedGet(number,$scope.selectedPage,fdvConstant.PAGINATION.MAX_PER_PAGE,$scope.filterLetter.toLowerCase())):model}.bind(this)).then(function(model){return $scope.allContacts=model,$scope.contacts=[],model.contacts.forEach(function(model){var numberOptions=[];model.hasMobileNumber()&&numberOptions.push({label:locale.getString("fdv.contacts-mobile"),number:model.getMobileNumber()}),model.hasWorkNumber()&&numberOptions.push({label:locale.getString("fdv.contacts-work"),number:model.getWorkNumber()}),model.hasHomeNumber()&&numberOptions.push({label:locale.getString("fdv.contacts-home"),number:model.getHomeNumber()});var numberObject,number=model.getRelevantPhoneNumber();numberOptions.forEach(function(n){n.number===number&&(numberObject=n)}),$scope.contacts.push({model:model,numberOptions:numberOptions,selectedNumber:numberObject})}),$scope.pageData={maxItems:model.total,maxItemsPerPage:fdvConstant.PAGINATION.MAX_PER_PAGE},fdvUserData.getOptions(number)}.bind(this)).then(function(model){return $scope.options=model,fdvUserData.getContacts(number)}.bind(this)).then(function(){$scope.loading=!1}.bind(this))["catch"](function(){fdvAlertManager.error(locale.getString("fdv.contacts-service-error")),$scope.contacts=[],$scope.allContacts={total:0},$scope.pageData={maxItems:0,maxItemsPerPage:fdvConstant.PAGINATION.MAX_PER_PAGE},$scope.loading=!1}.bind(this))}else fdvLog.error("Calls Page","selected phone line is invalid'"),$scope.loading=!1},$scope.showContextualMenu=function(contact){$scope.selectedItem=contact,$scope.contextualMenuItems=[],$scope.contextualMenuItems.push({id:fdvConstant.ACTION.VIEW_CONTACT,label:locale.getString("fdv.action-contact-view")}),contact.hasPhoneNumber()&&$scope.contextualMenuItems.push({id:fdvConstant.ACTION.CALL_BACK,label:locale.getString("fdv.action-call")}),$scope.contextualMenuItems.push({id:fdvConstant.ACTION.DELETE_CONTACT,label:locale.getString("fdv.action-contact-delete")})},$scope.contextualMenuClicked=function(menuItem){if(void 0===$scope.selectedItem)return fdvLog.error("Calls Page","No contact is selected"),!0;var phoneNumber=$scope.selectedItem.getRelevantPhoneNumber();switch(menuItem.id){case fdvConstant.ACTION.CALL_BACK:var selectedNumber=phoneNumber;$scope.contacts.forEach(function(contact){contact.model.id===$scope.selectedItem.id&&"undefined"!=typeof contact.selectedNumber&&(selectedNumber=contact.selectedNumber.number)}),$scope.actionManager.callBack(selectedNumber);break;case fdvConstant.ACTION.VIEW_CONTACT:$scope.actionManager.viewContact(phoneNumber,$scope.selectedItem.copy()).then(function(){fdvUserData.invalidateContacts(),$scope.loadContacts()}.bind(this))["catch"](function(){});break;case fdvConstant.ACTION.DELETE_CONTACT:$scope.actionManager.deleteAContact($scope.selectedItem.id).then(function(){fdvUserData.invalidateContacts(),$scope.loadContacts()}.bind(this))["catch"](function(){})}return!0},$scope.allowShowContextualMenu=!0,$scope.contactNumberClicked=function(){$scope.allowShowContextualMenu=!1},$scope.validateContextualMenuAppearance=function(){return $scope.allowShowContextualMenu?!0:($scope.allowShowContextualMenu=!0,!1)},$scope.selectedPhoneLineWatch=$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue){$scope.selectedPage=0,$scope.selectedPhoneLine=newValue,$scope.loadContacts()})}],link:function(){}}}]),angular.module("fdvService.constants").service("fdvConstantValidator",function(){this.contains=function(valueSet,value){var valid=!1;return angular.forEach(valueSet,function(v){value===v&&(valid=!0)}),valid}}).constant("fdvConstant",{SCREEN:{XXS:0,XS:480,SM:768,MD:992,LG:1200},PLATFORM:{WEB:"web",MOBILE:"mobile",STB:"stb"},ROUTE:{HOME:"home",SUMMARY:"summary",CALLS:"calls",VOICEMAILS:"voicemails",CONTACTS:"contacts",CALENDAR:"calendar",SETTINGS:"settings",SUBSETTINGS:"subsettings",NUMBERLIST:"numberlist",FAQS:"faqs",CALL:"call",VOICEMAIL:"voicemail"},MODAL:{CONFIRM:"confirm-modal",PLACE_A_CALL:"place-a-call-modal",VIEW_CONTACT:"view-contact-modal",ADD_CONTACT:"add-contact-modal",ADD_CALL_NOTIFICATION:"add-call-notification-modal",REMOVE_CALL_NOTIFICATION:"remove-call-notification-modal",SETTINGS:"settings-modal",FORWARD_VOICEMAIL:"forward-voicemail-modal",ADD_CALENDAR_EVENT:"add-calendar-event-modal",CONTEXTUAL:"contextual-modal",CALL_BLOCK:"call-block-modal",DELETE_MAILBOX:"delete-mailbox-modal",STANDARD_PROMPTS:"standard-prompts-modal",SCHEDULE_CALL:"schedule-call-modal",ACCESS_MAILBOX:"access-mailbox-modal",SELECTED_NUMBERS:"selected-numbers-modal",ENTER_UNIT_ADDRESS:"enter-unit-address-modal",RECORD_GREETINGS:"record-greetings-modal"},EVENT:{BACK_BUTTON_CLICKED:"go-back",EXIT_FDV:"exit_fdv",ROUTE_CHANGED:"route-change",SUMMARY_CARD_CLICKED:"summary-card-clicked",OPTIONS_MENU_CLICKED:"options-menu-clicked",KEY_PRESSED:"key_press",VOICEMAIL_PLAYED:"voicemail_played",AUDIOPLAYER:{ERROR:"error",LOADING:"loading",LOADED:"loaded",DATA_LOADED:"data_loaded",METADATA_LOADED:"metadata_loaded",PLAYING:"playing",PAUSED:"paused",ENDED:"ended",SEEKING:"seeking",SEEKED:"seeked",POSITION_CHANGED:"position_changed",DURATION_CHANGED:"duration_changed",SOURCE_CHANGED:"source_changed"}},ACTION:{CANCEL:"cancel",OK:"ok",CALL_BACK:"call-back",TEXT_BACK:"text-back",BLOCK_CALLER:"block-caller",UNBLOCK_CALLER:"unblock-caller",ADD_CALL_NOTIFICATION:"add-call-notification",REMOVE_CALL_NOTIFICATION:"remove-call-notification",VIEW_CONTACT:"view-contact",ADD_TO_CONTACT:"add-to-contact",DELETE_CALL:"delete-call",DELETE_VOICEMAIL:"delete-voicemail",DELETE_CONTACT:"delete-contact",FORWARD_VOICEMAIL:"forward-voicemail",RENEW_VOICEMAIL:"renew-voicemail",VIEW_EDIT_EVENT:"view-edit-event",VIEW_EDIT_EVENT_SCHEDULED_CALL:"view-edit-event-scheduled-call",DELETE_EVENT:"delete-event",PLAY_VOICEMAIL:"play-voicemail",DELETE_ALL:"delete-all",CHANGE_PHONE_LINE:"change-phone-line",VIEW_EXPIRED_VOICEMAILS:"voice-expired-voicemails",OPEN_SUB_OPTIONS:"open-sub-options"},ACTION_RESULT:{CONTACT_SAVED:"contact-saved"},PAGINATION:{MAX_PER_PAGE:10,MAX_PER_PAGE_FOR_STB:5,MAX_PER_PAGE_FOR_MOBILE:50},ALERT:{SUCCESS:"success",INFO:"info",WARNING:"warning",DANGER:"danger"},CALL:{OUTGOING:"outgoing",INCOMING:"incoming",INCOMING_MISSED:"incoming.missed",INCOMING_ANSWERED:"incoming.answered",INCOMING_VOICEMAIL:"incoming.voicemail"},KEY:{KEY_0:48,KEY_1:49,KEY_2:50,KEY_3:51,KEY_4:52,KEY_5:53,KEY_6:54,KEY_7:55,KEY_8:56,KEY_9:57,BACKSPACE:8,TAB:9,ENTER:13,ESC:27,EXIT:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46,KEY_A:65,KEY_B:66,KEY_C:67,KEY_D:68,REMOTE_KEY_A:405,REMOTE_KEY_B:83,REMOTE_KEY_C:71,REMOTE_KEY_D:404},LINKS:{USER_GUIDE:"https://frontier.com/~/media/HelpCenter/Documents/phone/voicemail/fiosdigitalvoice-userguide.ashx",FAQ:"https://frontier.com/~/media/HelpCenter/Documents/phone/voicemail/fiosdigitalvoice-faqs.ashx",PLANS:"https://frontier.com/~/media/HelpCenter/Documents/phone/calling-features/fiosdigitalvoice-worldplans_300-500-rates.ashx",RATES:"https://frontier.com/~/media/HelpCenter/Documents/phone/calling-features/fiosdigitalvoice-international-rates.ashx",TOS:"https://frontier.com/~/media/HelpCenter/Documents/phone/voicemail/fiosdigitalvoice-tos.ashx",voiceTOS:"https://frontier.com/~/media/corporate/terms/voice-residential-voip-digital-voice.ashx"},LINKS_FBV:{USER_GUIDE:"https://frontier.com/~/media/HelpCenter/Documents/phone/voicemail/business-voice-user-guide.ashx",FAQ:"https://frontier.com/~/media/HelpCenter/Documents/phone/calling-features/faqs-fios-digital-voice-business.ashx",RATES:"https://frontier.com/~/media/HelpCenter/Documents/phone/calling-features/business-optional-call-plan-international-rates.ashx"}}),angular.module("fdvService.directives.ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function($locale,orderByFilter){function createParser(format){var map=[],regex=format.split("");return angular.forEach(formatCodeToRegex,function(data,code){var index=format.indexOf(code);if(index>-1){format=format.split(""),regex[index]="("+data.regex+")",format[index]="$";for(var i=index+1,n=index+code.length;n>i;i++)regex[i]="",format[i]="$";format=format.join(""),map.push({index:index,apply:data.apply})}}),{regex:new RegExp("^"+regex.join("")+"$"),map:orderByFilter(map,"index")}}function isValid(year,month,date){return 1===month&&date>28?29===date&&(year%4===0&&year%100!==0||year%400===0):3===month||5===month||8===month||10===month?31>date:!0}this.parsers={};var formatCodeToRegex={yyyy:{regex:"\\d{4}",apply:function(value){this.year=+value}},yy:{regex:"\\d{2}",apply:function(value){this.year=+value+2e3}},y:{regex:"\\d{1,4}",apply:function(value){this.year=+value}},MMMM:{regex:$locale.DATETIME_FORMATS.MONTH.join("|"),apply:function(value){this.month=$locale.DATETIME_FORMATS.MONTH.indexOf(value)}},MMM:{regex:$locale.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(value){this.month=$locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(value){this.month=value-1}},M:{regex:"[1-9]|1[0-2]",apply:function(value){this.month=value-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(value){this.date=+value}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(value){this.date=+value}},EEEE:{regex:$locale.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:$locale.DATETIME_FORMATS.SHORTDAY.join("|")}};this.parse=function(input,format){if(!angular.isString(input)||!format)return input;format=$locale.DATETIME_FORMATS[format]||format,this.parsers[format]||(this.parsers[format]=createParser(format));var parser=this.parsers[format],regex=parser.regex,map=parser.map,results=input.match(regex);if(results&&results.length){for(var dt,fields={year:1900,month:0,date:1,hours:0},i=1,n=results.length;n>i;i++){var mapper=map[i-1];mapper.apply&&mapper.apply.call(fields,results[i])}return isValid(fields.year,fields.month,fields.date)&&(dt=new Date(fields.year,fields.month,fields.date,fields.hours)),dt}}}]),angular.module("fdvService.directives.ui.bootstrap.datepicker",["fdvService.directives.ui.bootstrap.dateparser","fdvService.directives.ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMM",formatDayTitleYear:"yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function($scope,$attrs,$parse,$interpolate,$timeout,$log,dateFilter,datepickerConfig){var self=this,ngModelCtrl={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatDayTitleYear","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(key,index){self[key]=angular.isDefined($attrs[key])?8>index?$interpolate($attrs[key])($scope.$parent):$scope.$parent.$eval($attrs[key]):datepickerConfig[key]}),angular.forEach(["minDate","maxDate"],function(key){$attrs[key]?$scope.$parent.$watch($parse($attrs[key]),function(value){self[key]=value?new Date(value):null,self.refreshView()}):self[key]=datepickerConfig[key]?new Date(datepickerConfig[key]):null}),$scope.datepickerMode=$scope.datepickerMode||datepickerConfig.datepickerMode,$scope.uniqueId="datepicker-"+$scope.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined($attrs.initDate)?$scope.$parent.$eval($attrs.initDate):new Date,$scope.isActive=function(dateObject){return 0===self.compare(dateObject.date,self.activeDate)?($scope.activeDateId=dateObject.uid,!0):!1},this.init=function(ngModelCtrl_){ngModelCtrl=ngModelCtrl_,ngModelCtrl.$render=function(){self.render()}},this.render=function(){if(ngModelCtrl.$modelValue){var date=new Date(ngModelCtrl.$modelValue),isValid=!isNaN(date);isValid?this.activeDate=date:$log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),ngModelCtrl.$setValidity("date",isValid)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var date=ngModelCtrl.$modelValue?new Date(ngModelCtrl.$modelValue):null;ngModelCtrl.$setValidity("date-disabled",!date||this.element&&!this.isDisabled(date))}},this.createDateObject=function(date,format){var model=ngModelCtrl.$modelValue?new Date(ngModelCtrl.$modelValue):null;return{date:date,label:dateFilter(date,format),selected:model&&0===this.compare(date,model),disabled:this.isDisabled(date),current:0===this.compare(date,new Date)}},this.isDisabled=function(date){return this.minDate&&this.compare(date,this.minDate)<0||this.maxDate&&this.compare(date,this.maxDate)>0||$attrs.dateDisabled&&$scope.dateDisabled({date:date,mode:$scope.datepickerMode})},this.split=function(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays},$scope.select=function(date){if($scope.datepickerMode===self.minMode){var dt=ngModelCtrl.$modelValue?new Date(ngModelCtrl.$modelValue):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),ngModelCtrl.$setViewValue(dt),ngModelCtrl.$render()}else self.activeDate=date,$scope.datepickerMode=self.modes[self.modes.indexOf($scope.datepickerMode)-1]},$scope.move=function(direction){var year=self.activeDate.getFullYear()+direction*(self.step.years||0),month=self.activeDate.getMonth()+direction*(self.step.months||0);self.activeDate.setFullYear(year,month,1),self.refreshView()},$scope.moveYear=function(direction){var year=self.activeDate.getFullYear()+direction,month=self.activeDate.getMonth();self.activeDate.setFullYear(year,month,1),self.refreshView()},$scope.toggleMode=function(direction){direction=direction||1,$scope.datepickerMode===self.maxMode&&1===direction||$scope.datepickerMode===self.minMode&&-1===direction||($scope.datepickerMode=self.modes[self.modes.indexOf($scope.datepickerMode)+direction])},$scope.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var focusElement=function(){$timeout(function(){self.element[0].focus()},0,!1)};$scope.$on("datepicker.focus",focusElement),$scope.keydown=function(evt){var key=$scope.keys[evt.which];if(key&&!evt.shiftKey&&!evt.altKey)if(evt.preventDefault(),evt.stopPropagation(),"enter"===key||"space"===key){if(self.isDisabled(self.activeDate))return;$scope.select(self.activeDate),focusElement()}else!evt.ctrlKey||"up"!==key&&"down"!==key?(self.handleKeyDown(key,evt),self.refreshView()):($scope.toggleMode("up"===key?1:-1),focusElement())}}]).directive("datepicker",["fdvConfig",function(fdvConfig){return{restrict:"EA",replace:!0,templateUrl:fdvConfig.getTemplateUrl("datepicker/datepicker.html"),scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(scope,element,attrs,ctrls){var datepickerCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl&&datepickerCtrl.init(ngModelCtrl)}}}]).directive("daypicker",["dateFilter","fdvConfig",function(dateFilter,fdvConfig){return{restrict:"EA",replace:!0,templateUrl:fdvConfig.getTemplateUrl("datepicker/day.html"),require:"^datepicker",link:function(scope,element,attrs,ctrl){function getDaysInMonth(year,month){return 1!==month||year%4!==0||year%100===0&&year%400!==0?DAYS_IN_MONTH[month]:29}function getDates(startDate,n){var dates=new Array(n),current=new Date(startDate),i=0;for(current.setHours(12);n>i;)dates[i++]=new Date(current),current.setDate(current.getDate()+1);return dates}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}scope.showWeeks=ctrl.showWeeks,ctrl.step={months:1},ctrl.element=element;var DAYS_IN_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31];ctrl._refreshView=function(){var year=ctrl.activeDate.getFullYear(),month=ctrl.activeDate.getMonth(),firstDayOfMonth=new Date(year,month,1),difference=ctrl.startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth);numDisplayedFromPreviousMonth>0&&firstDate.setDate(-numDisplayedFromPreviousMonth+1);for(var days=getDates(firstDate,42),i=0;42>i;i++)days[i]=angular.extend(ctrl.createDateObject(days[i],ctrl.formatDay),{secondary:days[i].getMonth()!==month,uid:scope.uniqueId+"-"+i});scope.labels=new Array(7);for(var j=0;7>j;j++)scope.labels[j]={abbr:dateFilter(days[j].date,ctrl.formatDayHeader),full:dateFilter(days[j].date,"EEEE")};if(scope.title=dateFilter(ctrl.activeDate,ctrl.formatDayTitle),scope.titleYear=dateFilter(ctrl.activeDate,ctrl.formatDayTitleYear),scope.rows=ctrl.split(days,7),scope.showWeeks){scope.weekNumbers=[];for(var weekNumber=getISO8601WeekNumber(scope.rows[0][0].date),numWeeks=scope.rows.length;scope.weekNumbers.push(weekNumber++)i;i++)months[i]=angular.extend(ctrl.createDateObject(new Date(year,i,1),ctrl.formatMonth),{uid:scope.uniqueId+"-"+i});scope.title=dateFilter(ctrl.activeDate,ctrl.formatMonthTitle),scope.rows=ctrl.split(months,3)},ctrl.compare=function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth())-new Date(date2.getFullYear(),date2.getMonth())},ctrl.handleKeyDown=function(key){var date=ctrl.activeDate.getMonth();if("left"===key)date-=1;else if("up"===key)date-=3;else if("right"===key)date+=1;else if("down"===key)date+=3;else if("pageup"===key||"pagedown"===key){var year=ctrl.activeDate.getFullYear()+("pageup"===key?-1:1);ctrl.activeDate.setFullYear(year)}else"home"===key?date=0:"end"===key&&(date=11);ctrl.activeDate.setMonth(date)},ctrl.refreshView()}}}]).directive("yearpicker",["dateFilter","fdvConfig",function(dateFilter,fdvConfig){return{restrict:"EA",replace:!0,templateUrl:fdvConfig.getTemplateUrl("datepicker/year.html"),require:"^datepicker",link:function(scope,element,attrs,ctrl){function getStartingYear(year){return parseInt((year-1)/range,10)*range+1}var range=ctrl.yearRange;ctrl.step={years:range},ctrl.element=element,ctrl._refreshView=function(){for(var years=new Array(range),i=0,start=getStartingYear(ctrl.activeDate.getFullYear());range>i;i++)years[i]=angular.extend(ctrl.createDateObject(new Date(start+i,0,1),ctrl.formatYear),{uid:scope.uniqueId+"-"+i});scope.title=[years[0].label,years[range-1].label].join(" - "),scope.rows=ctrl.split(years,5)},ctrl.compare=function(date1,date2){return date1.getFullYear()-date2.getFullYear()},ctrl.handleKeyDown=function(key){var date=ctrl.activeDate.getFullYear();"left"===key?date-=1:"up"===key?date-=5:"right"===key?date+=1:"down"===key?date+=5:"pageup"===key||"pagedown"===key?date+=("pageup"===key?-1:1)*ctrl.step.years:"home"===key?date=getStartingYear(ctrl.activeDate.getFullYear()):"end"===key&&(date=getStartingYear(ctrl.activeDate.getFullYear())+range-1),ctrl.activeDate.setFullYear(date)},ctrl.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function($compile,$parse,$document,$position,dateFilter,dateParser,datepickerPopupConfig){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(scope,element,attrs,ngModel){function cameltoDash(string){return string.replace(/([A-Z])/g,function($1){return"-"+$1.toLowerCase()})}function parseDate(viewValue){if(viewValue){if(angular.isDate(viewValue)&&!isNaN(viewValue))return ngModel.$setValidity("date",!0),viewValue;if(angular.isString(viewValue)){var date=dateParser.parse(viewValue,dateFormat)||new Date(viewValue);return isNaN(date)?void ngModel.$setValidity("date",!1):(ngModel.$setValidity("date",!0),date)}return void ngModel.$setValidity("date",!1)}return ngModel.$setValidity("date",!0),null}var dateFormat,closeOnDateSelection=angular.isDefined(attrs.closeOnDateSelection)?scope.$parent.$eval(attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined(attrs.datepickerAppendToBody)?scope.$parent.$eval(attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody;scope.showButtonBar=angular.isDefined(attrs.showButtonBar)?scope.$parent.$eval(attrs.showButtonBar):datepickerPopupConfig.showButtonBar,scope.getText=function(key){return scope[key+"Text"]||datepickerPopupConfig[key+"Text"]},attrs.$observe("datepickerPopup",function(value){dateFormat=value||datepickerPopupConfig.datepickerPopup,ngModel.$render()});var popupEl=angular.element("
");popupEl.attr({"ng-model":"date","ng-change":"dateSelection()"});var datepickerEl=angular.element(popupEl.children()[0]);attrs.datepickerOptions&&angular.forEach(scope.$parent.$eval(attrs.datepickerOptions),function(value,option){datepickerEl.attr(cameltoDash(option),value)}),scope.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(key){if(attrs[key]){var getAttribute=$parse(attrs[key]);if(scope.$parent.$watch(getAttribute,function(value){scope.watchData[key]=value}),datepickerEl.attr(cameltoDash(key),"watchData."+key),"datepickerMode"===key){var setAttribute=getAttribute.assign;scope.$watch("watchData."+key,function(value,oldvalue){value!==oldvalue&&setAttribute(scope.$parent,value)})}}}),attrs.dateDisabled&&datepickerEl.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),ngModel.$parsers.unshift(parseDate),scope.dateSelection=function(dt){angular.isDefined(dt)&&(scope.date=dt),ngModel.$setViewValue(scope.date),ngModel.$render(),closeOnDateSelection&&(scope.isOpen=!1,element[0].focus())},element.bind("input change keyup",function(){scope.$apply(function(){scope.date=ngModel.$modelValue})}),ngModel.$render=function(){var date=ngModel.$viewValue?dateFilter(ngModel.$viewValue,dateFormat):"";element.val(date),scope.date=parseDate(ngModel.$modelValue)};var documentClickBind=function(event){scope.isOpen&&event.target!==element[0]&&scope.$apply(function(){scope.isOpen=!1})},keydown=function(evt){scope.keydown(evt)};element.bind("keydown",keydown),scope.keydown=function(evt){27===evt.which?(evt.preventDefault(),evt.stopPropagation(),scope.close()):40!==evt.which||scope.isOpen||(scope.isOpen=!0)},scope.$watch("isOpen",function(value){value?(scope.$broadcast("datepicker.focus"),scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top=scope.position.top+element.prop("offsetHeight"),$document.bind("click",documentClickBind)):$document.unbind("click",documentClickBind)}),scope.select=function(date){if("today"===date){var today=new Date;angular.isDate(ngModel.$modelValue)?(date=new Date(ngModel.$modelValue),date.setFullYear(today.getFullYear(),today.getMonth(),today.getDate())):date=new Date(today.setHours(0,0,0,0))}scope.dateSelection(date)},scope.close=function(){scope.isOpen=!1,element[0].focus()};var $popup=$compile(popupEl)(scope);popupEl.remove(),appendToBody?$document.find("body").append($popup):element.after($popup),scope.$on("$destroy",function(){$popup.remove(),element.unbind("keydown",keydown),$document.unbind("click",documentClickBind)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(scope,element){element.bind("click",function(event){event.preventDefault(),event.stopPropagation()})}}}),angular.module("fdvService.directives.ui.bootstrap.position",[]).factory("$position",["$document","$window",function($document,$window){function getStyle(el,cssprop){return el.currentStyle?el.currentStyle[cssprop]:$window.getComputedStyle?$window.getComputedStyle(el)[cssprop]:el.style[cssprop]}function isStaticPositioned(element){return"static"===(getStyle(element,"position")||"static")}var parentOffsetEl=function(element){for(var docDomEl=$document[0],offsetParent=element.offsetParent||docDomEl;offsetParent&&offsetParent!==docDomEl&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||docDomEl};return{position:function(element){var elBCR=this.offset(element),offsetParentBCR={top:0,left:0},offsetParentEl=parentOffsetEl(element[0]);offsetParentEl!=$document[0]&&(offsetParentBCR=this.offset(angular.element(offsetParentEl)),offsetParentBCR.top+=offsetParentEl.clientTop-offsetParentEl.scrollTop,offsetParentBCR.left+=offsetParentEl.clientLeft-offsetParentEl.scrollLeft);var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:elBCR.top-offsetParentBCR.top,left:elBCR.left-offsetParentBCR.left}},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].documentElement.scrollLeft)}},positionElements:function(hostEl,targetEl,positionStr,appendToBody){var hostElPos,targetElWidth,targetElHeight,targetElPos,positionStrParts=positionStr.split("-"),pos0=positionStrParts[0],pos1=positionStrParts[1]||"center";hostElPos=appendToBody?this.offset(hostEl):this.position(hostEl),targetElWidth=targetEl.prop("offsetWidth"),targetElHeight=targetEl.prop("offsetHeight");var shiftWidth={center:function(){return hostElPos.left+hostElPos.width/2-targetElWidth/2},left:function(){return hostElPos.left},right:function(){return hostElPos.left+hostElPos.width}},shiftHeight={center:function(){return hostElPos.top+hostElPos.height/2-targetElHeight/2},top:function(){return hostElPos.top},bottom:function(){return hostElPos.top+hostElPos.height}};switch(pos0){case"right":targetElPos={top:shiftHeight[pos1](),left:shiftWidth[pos0]()};break;case"left":targetElPos={top:shiftHeight[pos1](),left:hostElPos.left-targetElWidth};break;case"bottom":targetElPos={top:shiftHeight[pos0](),left:shiftWidth[pos1]()};break;default:targetElPos={top:hostElPos.top-targetElHeight,left:shiftWidth[pos1]()}}return targetElPos}}}]),angular.module("fdvService.directives").directive("ngBlurDelayed",["$parse","$timeout",function($parse,$timeout){return{restrict:"A",compile:function($element,attr){var fn=$parse(attr.ngBlurDelayed,null,!0);return function(scope,element){element.on("blur",function(event){var callback=function(){$timeout(function(){fn(scope,{$event:event})},200)};scope.$evalAsync(callback)})}}}}]),angular.module("fdvService.directives").directive("ngClickDelayed",["$parse","$timeout",function($parse,$timeout){ return{restrict:"A",compile:function($element,attr){var fn=$parse(attr.ngClickDelayed,null,!0);return function(scope,element){element.on("click",function(event){var callback=function(){$timeout(function(){fn(scope,{$event:event})},200)};scope.$evalAsync(callback)})}}}}]),angular.module("fdvService.directives").directive("required",["fdvValidation",function(fdvValidation){return{restrict:"A",require:"?ngModel",link:function(scope,element,attrs,ngModelCtrl){if(!angular.isUndefined(ngModelCtrl)&&null!==ngModelCtrl){var validate=function(value){return ngModelCtrl.$setValidity("required",!fdvValidation.isEmpty(value)),value};ngModelCtrl.$parsers.unshift(validate)}}}}]).directive("pattern",["fdvValidation",function(fdvValidation){return{restrict:"A",require:"?ngModel",link:function(scope,element,attrs,ngModelCtrl){if(!angular.isUndefined(ngModelCtrl)&&null!==ngModelCtrl){var validate=function(value){var re=new RegExp(attrs.pattern,"g"),isValid=fdvValidation.isEmpty(value)||re.test(value);return ngModelCtrl.$setValidity("pattern",isValid),value};ngModelCtrl.$parsers.unshift(validate),ngModelCtrl.$formatters.push(validate)}}}}]).directive("phoneNumber",["$filter","fdvValidation",function($filter,fdvValidation){return{restrict:"A",require:"?ngModel",link:function(scope,element,attrs,ngModelCtrl){if(!angular.isUndefined(ngModelCtrl)&&null!==ngModelCtrl){var validate=function(value){angular.isString(value)&&(value=fdvValidation.onlyDigits(value));var isValid=fdvValidation.isEmpty(value)||fdvValidation.validatePhoneNumber(value);return ngModelCtrl.$setValidity("phone-number",isValid),value=$filter("phoneNumber")(value)};ngModelCtrl.$parsers.unshift(validate),ngModelCtrl.$formatters.push(validate)}}}}]).directive("email",["fdvValidation",function(fdvValidation){return{restrict:"A",require:"?ngModel",link:function(scope,element,attrs,ngModelCtrl){if(!angular.isUndefined(ngModelCtrl)&&null!==ngModelCtrl){var validate=function(value){var isValid=fdvValidation.isEmpty(value)||fdvValidation.validateEmail(value);return ngModelCtrl.$setValidity("email",isValid),value};ngModelCtrl.$parsers.unshift(validate),ngModelCtrl.$formatters.push(validate)}}}}]).directive("multipleEmails",["fdvValidation",function(fdvValidation){return{restrict:"A",require:"?ngModel",link:function(scope,element,attrs,ngModelCtrl){if(!angular.isUndefined(ngModelCtrl)&&null!==ngModelCtrl){var validate=function(value){if(fdvValidation.isEmpty(value))return ngModelCtrl.$setValidity("multiple-emails",!0),value;if(!angular.isString(value))return ngModelCtrl.$setValidity("multiple-emails",!1),value;for(var emails=value.replace(/\s|,/g,";").replace(/;+/g,";").split(";"),isValid=!0,i=0;i0&&(userTime=userTime.isDST()?userTime.utcOffset(timeOffset).add(1,"hours"):userTime.utcOffset(timeOffset));var formattedDate="";if(angular.isString(dateFormat)&&dateFormat.length>0){var today=new Date,todayYear=today.getFullYear(),todayMonth=today.getMonth(),todayDay=today.getDate();today.setDate(todayDay-1);var yesterdayDay=today.getDate();formattedDate=todayYear===time.getFullYear()&&todayMonth===time.getMonth()&&todayDay===time.getDate()?locale.getString("fdv.label-today"):todayYear===time.getFullYear()&&todayMonth===time.getMonth()&&yesterdayDay===time.getDate()?locale.getString("fdv.label-yesterday"):userTime.format(dateFormat)}return angular.isString(timeFormat)&&timeFormat.length>0&&(formattedDate+=formattedDate.length>0?" ":"",formattedDate+=userTime.format(timeFormat)),formattedDate}}]),angular.module("fdvService.filters").filter("trusted",["$sce",function($sce){return function(url){return $sce.trustAsResourceUrl(url)}}]).filter("duration",function(){return function(duration){var seconds=duration,hours=Math.floor(seconds/3600),minutes=Math.floor(seconds%3600/60),seconds=Math.round(seconds%3600%60),timeString="";return hours>0&&(timeString=timeString.concat(hours)),0===minutes?timeString=timeString.concat(timeString.length>0?":00":"0"):minutes>0&&10>minutes?timeString=timeString.concat(timeString.length>0?":0"+minutes:minutes):minutes>=10&&(timeString=timeString.concat(timeString.length>0?":"+minutes:minutes)),0===seconds?timeString=timeString.concat(timeString.length>0?":00":"0"):seconds>0&&10>seconds?timeString=timeString.concat(timeString.length>0?":0"+seconds:seconds):seconds>=10&&(timeString=timeString.concat(timeString.length>0?":"+seconds:seconds)),timeString}}),angular.module("fdvService.filters").filter("phoneNumber",function(){return function(phoneNumber){var phoneNumberFormats={standard:"ddd-ddd-dddd",standardPlusOne:"d-ddd-ddd-dddd"};if("string"==typeof phoneNumber){phoneNumber=phoneNumber.replace(/([\D]*)/g,"");var formatPhoneNumber=function(phoneNumber,template){for(var index=0;index-1&&(template=template.substr(0,lastDidgitIndex)+didgit+template.substr(lastDidgitIndex+1))}return template};10===phoneNumber.length?phoneNumber=formatPhoneNumber(phoneNumber,phoneNumberFormats.standard):11===phoneNumber.length}return phoneNumber}}),angular.module("fdvService.directives").directive("fdvHome",["$q","fdvLog","fdvConfig","fdvUserData","fdvAlertManager","fdvVideoManager","fdvConstant","fdvNativeApi","fdvAnalytics",function($q,fdvLog,fdvConfig,fdvUserData,fdvAlertManager,fdvVideoManager,fdvConstant,fdvNativeApi,fdvAnalytics){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("home/home.html"),controller:["$scope","fdvJsonApi",function($scope,fdvJsonApi){$scope.componentName="Home page",$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue,oldValue){angular.isDefined(newValue)&&newValue!=oldValue&&$scope.loadSummary()}),$scope.$watch(function(){return fdvUserData.getSelectedMailbox()},function(newValue,oldValue){angular.isDefined(newValue)&&(angular.isUndefined(oldValue)||newValue.id!==oldValue.id)?$scope.loadVoicemails():$scope.showVoicemail=!1}),$scope.loadSummary=function(){if($scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.options=void 0,$scope.contacts=void 0,$scope.mailboxes=void 0,$scope.calls=void 0,$scope.voicemails=void 0,$scope.optionButtons=[],$scope.loading=!1,angular.isUndefined($scope.selectedPhoneLine))return void fdvLog.error($scope.componentName,"Error: No phone line selected");$scope.loading=!0;var requests=[{procs:[fdvJsonApi.voiceOptionsGet($scope.selectedPhoneLine.number)],success:function(results){$scope.options=results[0],$scope.bindOptionsToButtons(),angular.isDefined($scope.calls)&&fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)},failure:function(reason){fdvAlertManager.error(403==reason.data.status?"Account has been blocked."==reason.data.title?"fdv.summary-message-blocked-account":"Authentication Failed"==reason.data.title?"fdv.summary-message-auth-account":"Account Locked"==reason.data.title?"fdv.summary-message-locked-account":"fdv.summary-message-options-load-failed":"fdv.summary-message-options-load-failed"),fdvLog.error($scope.componentName,"Error: loading options faied")}},{procs:[fdvJsonApi.voiceContactsPagedGet($scope.selectedPhoneLine.number,0,1e3)],success:function(results){$scope.contacts=results[0],angular.isDefined($scope.calls)&&fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)},failure:function(reason){fdvAlertManager.error(403==reason.data.status?"Account has been blocked."==reason.data.title?"fdv.summary-message-blocked-account":"Authentication Failed"==reason.data.title?"fdv.summary-message-auth-account":"Account Locked"==reason.data.title?"fdv.summary-message-locked-account":"fdv.summary-message-contacts-load-failed":"fdv.summary-message-contacts-load-failed"),fdvLog.error($scope.componentName,"Error: loading contacts faied")}},{procs:[fdvJsonApi.voiceCallHistoryPagedGet($scope.selectedPhoneLine.number,0,fdvConstant.PAGINATION.MAX_PER_PAGE)],success:function(results){$scope.calls=results[0],angular.isDefined($scope.calls)&&fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.calls.callLog)},failure:function(reason){fdvAlertManager.error(403==reason.data.status?"Account has been blocked."==reason.data.title?"fdv.summary-message-blocked-account":"Authentication Failed"==reason.data.title?"fdv.summary-message-auth-account":"Account Locked"==reason.data.title?"fdv.summary-message-locked-account":"fdv.summary-message-calls-load-failed":"fdv.summary-message-calls-load-failed"),fdvLog.error($scope.componentName,"Error: loading call logs faied")}},{procs:[fdvUserData.getMailboxes($scope.selectedPhoneLine.number)],success:function(results){$scope.mailboxes=results[0]},failure:function(reason){fdvAlertManager.error(403==reason.data.status?"Account has been blocked."==reason.data.title?"fdv.summary-message-blocked-account":"Authentication Failed"==reason.data.title?"fdv.summary-message-auth-account":"Account Locked"==reason.data.title?"fdv.summary-message-locked-account":"fdv.summary-message-mailboxes-load-failed":"fdv.summary-message-mailboxes-load-failed"),fdvLog.error($scope.componentName,"Error: loading mailboxes faied")}}];fdvUserData.loadMultipleData(requests).then(function(){angular.isArray($scope.mailboxes)&&$scope.mailboxes.length>0?$scope.loadVoicemails():$scope.loading=!1})["catch"](function(reason){fdvLog.error($scope.componentName,reason)})},$scope.loadVoicemails=function(){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox(),$scope.voicemailAccess=!1,$scope.voicemails=void 0,$scope.showVoicemail=!0,angular.isDefined($scope.selectedPhoneLine)&&angular.isDefined($scope.selectedMailbox)?($scope.loading=!0,fdvLog.debug($scope.componentName,"Getting totalUnread for mailbox: "+$scope.selectedMailbox.label),fdvJsonApi.voiceMailboxTotalUnreadGet($scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(model){$scope.totalUnread=model.totalUnread},function(){$scope.totalUnread=0,fdvLog.debug($scope.componentName,"Can't get totalUnread")}),fdvLog.debug($scope.componentName,"Checking access to mailbox: "+$scope.selectedMailbox.label),fdvUserData.getVoicemailAccess($scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.voicemailAccess=!0,fdvLog.debug($scope.componentName,"Loading voicemails for phone line:"+$scope.selectedPhoneLine.number+", mailbox:"+$scope.selectedMailbox.label),fdvJsonApi.voiceMailboxMessagesPagedGet($scope.selectedPhoneLine.number,$scope.selectedMailbox.id,0,fdvConstant.PAGINATION.MAX_PER_PAGE).then(function(model){$scope.voicemails=model,angular.isDefined($scope.voicemails)&&fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages),$scope.loading=!1}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: loading voicemail messages faied"),$scope.loading=!1}.bind(this))},function(){$scope.loading=!1,fdvLog.debug($scope.componentName,"No access to mailbox:"+$scope.selectedMailbox.label)})):($scope.loading=!1,fdvLog.error($scope.componentName,angular.isDefined($scope.selectedPhoneLine)?"No mailbox selected":"No phone line selected"))},$scope.bindOptionsToButtons=function(){$scope.optionsToShowAsButtons={callWaiting:{iconClass:"fdv-icon fdv-icon-call-waiting",label:"fdv.settings-call-settings-call-waiting",value:$scope.options.callWaiting},forwarding:{iconClass:"fdv-icon fdv-icon-forwarding",label:"fdv.settings-call-settings-call-forwarding",value:$scope.options.forwarding.enabled},locateMe:{iconClass:"fdv-icon fdv-icon-locate-me",label:"fdv.settings-call-settings-locate-me",value:$scope.options.locateMe.enabled}},$scope.optionButtons=[];for(var key in $scope.optionsToShowAsButtons)void 0!==$scope.options[key]&&$scope.optionsToShowAsButtons.hasOwnProperty(key)&&$scope.optionButtons.push($scope.optionsToShowAsButtons[key])},$scope.videoClick=function(id){fdvVideoManager.showVideo(id)},$scope.gotoFAQs=function(){fdvLog.debug($scope.componentName,"Exiting FDV, go to help center page"),$scope.eventTriggered({event:{type:fdvConstant.EVENT.EXIT_FDV,data:{path:"faqs"}}})},$scope.gotoFrontierPages=function(){fdvAnalytics.enterPage("frontierpages"),fdvNativeApi.nativeOpenBrowser("http://frontierpages.com")},$scope.loadSummary()}],link:function(){}}}]),angular.module("fdvService.directives").directive("fdvMain",["$q","$compile","$timeout","$filter","fdvConfig","fdvRoute","fdvLog","fdvConstant","fdvUserData","fdvActionManager","fdvAccountModel","fdvServiceProxy","fdvAlertManager","fdvLocaleManager","fdvSettingsItem","fdvJsonApi","fdvAnalytics",function($q,$compile,$timeout,$filter,fdvConfig,fdvRoute,fdvLog,fdvConstant,fdvUserData,fdvActionManager,fdvAccountModel,fdvServiceProxy,fdvAlertManager,fdvLocaleManager,fdvSettingsItem,fdvJsonApi,fdvAnalytics){return{restrict:"AE",templateUrl:fdvConfig.getTemplateUrl("main/main.html"),scope:{platform:"@",account:"=",unitAddress:"@",userRole:"=",startPage:"=",startPageParams:"=",eventTriggered:"&"},controller:["$scope","$element",function($scope,$element){$element.addClass("frontier-digital-voice").attr("data-fgs",fdvShortSHA),$scope.componentName="Main Entry",fdvLog.info($scope.componentName,"FDV Service is loaded, Platform="+$scope.platform+", Account="+JSON.stringify($scope.account)+", unitAddress="+JSON.stringify($scope.unitAddress)+", Start Page="+$scope.startPage+", Start Page Params="+$scope.startPageParams+", ShortSHA="+fdvShortSHA),$scope.CONSTANT=fdvConstant,$scope.actionManager=fdvActionManager,$scope.routeManager=fdvRoute,fdvConfig.setPlatform($scope.platform),fdvConfig.setStartPage($scope.startPage),fdvServiceProxy.subscribeEvent($scope),$scope.loadVoiceData=function(){fdvRoute.reset(),$scope.loading=!0,$scope.phoneLines=void 0,$scope.fdvLabel="Business"===($scope.account&&$scope.account.accountType)?"Frontier Business Voice":"Frontier Digital Voice";var accountId=angular.isDefined($scope.account)?$scope.account.id:void 0;fdvLog.debug($scope.componentName,"Loading phone lines for account:"+accountId),fdvUserData.getPhoneLines(accountId).then(function(model){$scope.phoneLines=model,$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.loading=!1,$timeout(function(){fdvRoute.goTo(fdvConfig.getStartPage(),{data:$scope.startPageParams})})})["catch"](function(){$scope.loading=!1,$timeout(function(){fdvRoute.goTo(fdvConfig.getStartPage(),{data:$scope.startPageParams})})})},$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine()}),$scope.optionItemClicked=function(optionItem){switch(optionItem.id){case fdvConstant.ACTION.CHANGE_PHONE_LINE:fdvUserData.setSelectedPhoneLine(optionItem.value);break;case fdvConstant.ACTION.DELETE_ALL:$scope.$broadcast(fdvConstant.EVENT.OPTIONS_MENU_CLICKED,optionItem)}},$scope.getSettingsItemValue=function(){return this.value=fdvSettingsItem.getSettingsItemValue(),this},$scope.stbLogin=function(unitAddress){$scope.loading=!0,fdvJsonApi.stbSessionPost(unitAddress).then(function(){$scope.loadVoiceData()},function(){fdvLog.error($scope.componentName,"Couldn't create session for VMS: "+unitAddress)})},fdvLocaleManager.init().then(function(){fdvConfig.isStb()?angular.isDefined($scope.unitAddress)&&""!==$scope.unitAddress.trim()?$scope.stbLogin($scope.unitAddress):fdvLog.error($scope.componentName,"Error: Unit Address is not found"):$scope.$watch("account",function(newValue){angular.isObject(newValue)?(fdvConfig.setAccount(new fdvAccountModel(newValue)),$scope.loadVoiceData()):fdvLog.error($scope.componentName,"Error: Account is not a valid Account object")})})}],compile:function(){return{pre:function(scope,element){element.on("$destroy",function(){$("#fdv-alert-container").remove(),scope.$destroy(),fdvServiceProxy.unsubscribeEvent()}),scope.$watch(function(){return scope.routeManager.getCurrentRoute()},function(newValue,oldValue){angular.isDefined(newValue)&&newValue!==oldValue&&(angular.isDefined(scope.childScope)&&scope.childScope.$destroy(),scope.childScope=scope.$new(),scope.currentRoute=newValue,scope.currentRoute.scope=scope.childScope,fdvConfig.isMobile()&&scope.currentRoute instanceof Object&&"fdv.route-sub-settings"===scope.currentRoute.title&&(scope.currentRoute.title=scope.currentRoute.params.data.item.label),fdvConfig.isStb()&&scope.currentRoute instanceof Object&&"fdv.route-settings"===scope.currentRoute.title&&(scope.currentRoute.title="fdv.settings-call-settings"),element.find("#fdv-view").empty().append($compile('
')(scope.childScope)),scope.eventTriggered({event:{type:fdvConstant.EVENT.ROUTE_CHANGED,data:{route:scope.currentRoute,root:scope.routeManager.getRootRoute()}}}),$timeout(function(){element.find('[data-toggle="tooltip"]').tooltip()},500),fdvAnalytics.enterPage(scope.currentRoute.path))}),scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){var activePage=$("#fdv-options-menu.open");if(!(activePage.length>0||(activePage=$("#fdv-modal.open"),activePage.length>0))){if(activePage=$("#fdv-view"),0===activePage.length)return void fdvLog.error(scope.componentName,"Error: couldn't find any modal, options menu or page to receive key event");for(var focusCurrent,index=-1,focusableElements=activePage.find(".fdv-focusable"),i=0;i0&&input.focus().val(input.val());break}switch(eventData.keyCode){case fdvConstant.KEY.BACKSPACE:break;case fdvConstant.KEY.DELETE:case fdvConstant.KEY.REMOTE_KEY_D:if(focusCurrent){var input=focusCurrent.find("input:first");input&&input.val()&&input.val(input.val().substr(0,input.val().length-1))}break;case fdvConstant.KEY.REMOTE_KEY_A:case fdvConstant.KEY.KEY_A:$("#fdv-options-menu").find(".btn-options").click();break;case fdvConstant.KEY.LEFT:scope.$apply(function(){fdvRoute.goBack()});break;case fdvConstant.KEY.ENTER:focusCurrent.click();break;case fdvConstant.KEY.UP:if(0>index)focusableElements.eq(0).addClass("active");else if(0===index)activePage.find(".fdv-page-prev").click();else{var focusPrev=focusableElements.eq(--index);focusCurrent.removeClass("active"),focusPrev.addClass("active");var input=focusPrev.find("input");input.length>0&&input.focus().val(input.val())}break;case fdvConstant.KEY.DOWN:if(0>index)focusableElements.eq(0).addClass("active");else if(index===focusableElements.length-1)activePage.find(".fdv-page-next").click();else{var focusPrev=focusableElements.eq(++index);focusCurrent.removeClass("active"),focusPrev.addClass("active");var input=focusPrev.find("input");input.length>0&&input.focus().val(input.val())}}}})},post:function(){$("body").prepend('
'),$("#fdv-alert-container").prepend($("#fdv-alert").detach())}}}}}]),angular.module("fdvService.modal").directive("fdvAccessMailboxModal",["fdvLog","fdvConfig","$timeout","fdvConstant","fdvRoute","fdvUserData",function(fdvLog,fdvConfig,$timeout,fdvConstant,fdvRoute,fdvUserData){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/access-mailbox-modal.html"),controller:["$scope","$element",function($scope){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.goToResetPasscode=function(){$scope.cancel().then(function(){if(fdvRoute.isSummary()){var deepLinkData={};deepLinkData.indexLabel="fdv.settings-voicemail-settings-reset-passcode",deepLinkData.tabId="1";var currentRoute=fdvRoute.getCurrentRoute();currentRoute.scope.triggerEvent(fdvConstant.ROUTE.SETTINGS,deepLinkData)}else fdvRoute.gotoVoicemailSetting({label:"fdv.settings-voicemail-settings-reset-passcode"})})}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvAddCalendarEventModal",["fdvLog","fdvConfig","fdvCalendarEventModel","locale",function(fdvLog,fdvConfig,fdvCalendarEventModel,locale){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/add-calendar-event-modal.html"),controller:["$scope","$element",function($scope){$scope.eventModel=$scope.options.model,$scope.showStartDatePicker=!1,$scope.showRepeatDatePicker=!1,$scope.showEndDatePicker=!1,$scope.selectedReminderIndex=0,$scope.reminderItems=[{id:"none",name:locale.getString("fdv.add-calendar-event-reminder-none"),reminderDuration:0},{id:"starttime",name:locale.getString("fdv.add-calendar-event-reminder-start"),reminderDuration:0},{id:"5mins",name:locale.getString("fdv.add-calendar-event-reminder-5mins"),reminderDuration:3e5},{id:"10mins",name:locale.getString("fdv.add-calendar-event-reminder-10mins"),reminderDuration:6e5},{id:"15mins",name:locale.getString("fdv.add-calendar-event-reminder-15mins"),reminderDuration:9e5},{id:"30mins",name:locale.getString("fdv.add-calendar-event-reminder-30mins"),reminderDuration:18e5},{id:"1hour",name:locale.getString("fdv.add-calendar-event-reminder-1hour"),reminderDuration:36e5},{id:"2hour",name:locale.getString("fdv.add-calendar-event-reminder-2hours"),reminderDuration:72e5},{id:"1day",name:locale.getString("fdv.add-calendar-event-reminder-1day"),reminderDuration:864e5}],$scope.reminder=$scope.reminderItems[0],$scope.allDayEvent=!1,$scope.repeatEvent=!1,$scope.repeatInterval="daily",$scope.repeatOptions=[{id:"daily",name:locale.getString("fdv.add-calendar-event-daily")},{id:"weekly",name:locale.getString("fdv.add-calendar-event-weekly")},{id:"monthly",name:locale.getString("fdv.add-calendar-event-monthly")},{id:"yearly",name:locale.getString("fdv.add-calendar-event-yearly")}],$scope.selectedRepeatOption=$scope.repeatOptions[0],$scope.toggleStartDatePicker=function(){$scope.toggleAllPickersExcept("showStartDatePicker")},$scope.toggleStartTimePicker=function(){$scope.toggleAllPickersExcept("showStartTimePicker")},$scope.toggleEndDatePicker=function(){$scope.toggleAllPickersExcept("showEndDatePicker")},$scope.toggleEndTimePicker=function(){$scope.toggleAllPickersExcept("showEndTimePicker")},$scope.repeatEventChanged=function(repeat){$scope.selectedRepeatItem=repeat},$scope.repeatIntervalChanged=function(value){$scope.repeatInterval=value;var dailyIntervals={everyDay:"daily",everyWeekDay:"only_weekdays",everyWeekend:"only_weekends"},weeklyIntervals={everyWeek:"every_week",everyOtherWeek:"every_other_week"},monthlyIntervals={everyMonth:"every_month",everyOtherMonth:"every_other_month"},yearlyIntervals={everyYear:"every_year"};switch($scope.selectedRepeatOption.id){case"daily":$scope.eventModel.setRepeatDaily(dailyIntervals[$scope.repeatInterval]);break;case"weekly":$scope.eventModel.setRepeatWeekly(weeklyIntervals[$scope.repeatInterval]);break;case"monthly":$scope.eventModel.setRepeatMonthly(monthlyIntervals[$scope.repeatInterval]);break;case"yearly":$scope.eventModel.setRepeatYearly(yearlyIntervals[$scope.repeatInterval])}$scope.eventModel.setRepeatThroughDate($scope.eventModel.startDate)},$scope.repeatOptionChanged=function(value){$scope.selectedRepeatOption=value},$scope.allDayEventOptionChanged=function(value){$scope.allDayEvent=value,value?($scope.eventModel.startDate=moment($scope.eventModel.startDate).startOf("day"),$scope.eventModel.endDate=moment($scope.eventModel.startDate).endOf("day")):($scope.eventModel.startDate=moment(new Date).startOf("hour"),$scope.eventModel.endDate=moment($scope.eventModel.startDate).endOf("hour"))},$scope.reminderDurationChanged=function(value){"none"==value.id?($scope.eventModel.clearReminder(),$scope.sendReminderTo=void 0):$scope.eventModel.setReminderDuration(value.reminderDuration),$scope.eventModel.validateData()},$scope.sendReminderToOptions=[{id:"email",name:locale.getString("fdv.add-calendar-event-reminder-email")},{id:"pager",name:locale.getString("fdv.add-calendar-event-reminder-pager")},{id:"text",name:locale.getString("fdv.add-calendar-event-reminder-text")}],$scope.sendReminderTo,$scope.sendReminderToChanged=function(model){switch(model.id){case"email":$scope.eventModel.setReminderEmail();break;case"pager":$scope.eventModel.setReminderPager();break;case"text":$scope.eventModel.setReminderText()}$scope.eventModel.validateData()},$scope.pagerProviderOptions=[{name:"American Messaging"},{name:"Aquis Communications"},{name:"Arch Wireless"},{name:"Clearnet"},{name:"Cook Paging"},{name:"Digicomm"},{name:"GCS Paging"},{name:"Metrocall"},{name:"Skytel"},{name:"Spring Paging"},{name:"SunCom Wireless"},{name:"USA Mobility"},{name:"Western Wireless"}],$scope.pagerProviderOptionSelectionChanged=function(model){$scope.eventModel.setReminderPagerProvider(model.name),$scope.eventModel.validateData()},$scope.pagerProviderOptionSelection,$scope.smsProviderOptions=[{name:"Alltel Wireless"},{name:"AT&T"},{name:"Boost Mobile"},{name:"MetroPCS Wireless"},{name:"Sprint Nextel"},{name:"T-Mobile Wireless"},{name:"U.S. Cellular"},{name:"Verizon Wireless"},{name:"Virgin Mobile"}],$scope.smsProviderOptionSelectionChanged=function(model){$scope.eventModel.setReminderTextProvider(model.name),$scope.eventModel.validateData()},$scope.smsProviderOptionSelection,$scope.validateEventModel=function(){$scope.eventModel.validateData()},$scope.validateEventModel(),$scope.$watch(function(){return $scope.eventModel.startDate},function(){$scope.validateEventModel(),$scope.showStartDatePicker=!1}),$scope.$watch(function(){return $scope.eventModel.endDate},function(){$scope.validateEventModel(),$scope.showEndDatePicker=!1}),$scope.$watch(function(){return $scope.eventModel.repeat.repeatThrough},function(){$scope.validateEventModel(),$scope.showRepeatDatePicker=!1}),$scope.repeatThisEventChanged=function(){$scope.repeatEvent=value,$scope.repeatEvent&&($scope.eventModel.clearRepeat(),$scope.repeatInterval="")};var repeat=$scope.eventModel.getRepeat();if(repeat===!1)$scope.repeatEvent=!1;else switch(repeat.frequency){case"daily":$scope.repeatEvent=!0,$scope.selectedRepeatOption=$scope.repeatOptions[0],repeat.restrictions===!1?$scope.repeatInterval="everyDay":"only_weekdays"===repeat.restrictions?$scope.repeatInterval="everyWeekDay":"only_weekends"===repeat.restrictions&&($scope.repeatInterval="everyWeekend");break;case"weekly":$scope.repeatEvent=!0,$scope.selectedRepeatOption=$scope.repeatOptions[1],$scope.repeatInterval=1===repeat.interval?"everyWeek":"everyOtherWeek";break;case"monthly":$scope.repeatEvent=!0,$scope.selectedRepeatOption=$scope.repeatOptions[2],$scope.repeatInterval=1===repeat.interval?"everyMonth":"everyOtherMonth";break;case"yearly":$scope.repeatEvent=!0,$scope.selectedRepeatOption=$scope.repeatOptions[3],$scope.repeatInterval="everyYear"}var reminder=$scope.eventModel.getReminderType();if("none"!==reminder)switch($scope.reminderItems.forEach(function(reminderOption){reminderOption.reminderDuration===$scope.eventModel.getReminderDuration()&&($scope.reminder=reminderOption)}),reminder){case"sms":$scope.sendReminderTo=$scope.sendReminderToOptions[2],$scope.smsProviderOptions.forEach(function(model){model.name===$scope.eventModel.getTextProvider()&&($scope.smsProviderOptionSelection=model)});break;case"pager":$scope.sendReminderTo=$scope.sendReminderToOptions[1],$scope.pagerProviderOptions.forEach(function(model){model.name===$scope.eventModel.getPagerProvider()&&($scope.pagerProviderOptionSelection=model)});break;case"email":$scope.sendReminderTo=$scope.sendReminderToOptions[0]}var endOfDay=moment($scope.eventModel.startDate).endOf("day");moment($scope.eventModel.startDate).isSame(moment($scope.eventModel.startDate).startOf("day"))&&moment($scope.eventModel.endDate).year()==endOfDay.year()&&moment($scope.eventModel.endDate).month()==endOfDay.month()&&moment($scope.eventModel.endDate).hour()==endOfDay.hour()&&moment($scope.eventModel.endDate).minute()==endOfDay.minute()&&($scope.allDayEvent=!0),$scope.toggleAllPickersExcept=function(pickerProperty){var value=$scope[pickerProperty];$scope.showStartDatePicker=!1,$scope.showRepeatDatePicker=!1,$scope.showEndDatePicker=!1,$scope[pickerProperty]=!value}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.modal").directive("fdvAddCallNotificationModal",["fdvLog","fdvConfig","fdvJsonApi","fdvUserData","fdvRoute",function(fdvLog,fdvConfig,fdvJsonApi,fdvUserData,fdvRoute){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/add-call-notification-modal.html"),controller:["$scope","$element",function($scope){$scope.hasEmail=angular.isDefined($scope.options.model.email)&&$scope.options.model.email.length>0,$scope.editEmail=function(){$scope.cancel(),fdvRoute.gotoCallSetting({label:"fdv.settings-call-settings-call-notification"})},$scope.scheduleNotification=function(){}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvAddContactModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/add-contact-modal.html"),controller:["$scope","$element",function(){}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvCallBlockModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/call-block-modal.html"),controller:["$scope",function($scope){$scope.title=$scope.$parent.options.title,$scope.text=$scope.$parent.options.text,$scope.model=$scope.$parent.options.model,$scope.clickOk=function(){$scope.confirm()},$scope.clickCancel=function(){$scope.confirm()}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvConfirmModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/confirm-modal.html"),controller:["$scope","$element",function(){}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvContextualModal",["fdvLog","fdvConfig","fdvJsonApi","fdvConstant",function(fdvLog,fdvConfig,fdvJsonApi,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/contextual-modal.html"),controller:["$scope","$element",function($scope){$scope.actionClicked=function(actionItem){$scope.options.model.actionItem=actionItem, angular.isFunction(actionItem.handler)?actionItem.handler(actionItem):$scope.confirm()},$scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){switch(eventData.keyCode){case fdvConstant.KEY.LEFT:$scope.$apply(function(){$scope.actionClicked($scope.options.model.contextualActionItems[0])})}})}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvDeleteMailboxModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/delete-mailbox-modal.html"),controller:["$scope","fdvSettingsItem","fdvLocaleManager",function($scope){$scope.title=$scope.$parent.options.title,$scope.text=$scope.$parent.options.text,$scope.model=$scope.$parent.options.model,$scope.mailbox=$scope.$parent.options.model.mailbox,$scope.clickOk=function(){$scope.confirm()},$scope.clickCancel=function(){$scope.confirm()}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvEnterUnitAddressModal",["fdvLog","fdvConfig","$timeout",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/enter-unit-address-modal.html"),controller:["$scope","$element",function(){}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvForwardVoicemailModal",["fdvLog","fdvConfig","fdvJsonApi","fdvUserData",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/forward-voicemail-modal.html"),controller:["$scope","$element",function(){}],link:function(){}}}]),angular.module("fdvService.modal").service("fdvModalManager",["fdvLog","fdvConfig","fdvConstant","$q",function(fdvLog,fdvConfig,fdvConstant,$q){var deferred=null,modalConfig=void 0,confirmed=!1,open=!1;this.showConfirm=function(options){return this.show(fdvConstant.MODAL.CONFIRM,options)},this.show=function(type,options){return confirmed=!1,open=!0,modalConfig={type:type,options:options},deferred=$q.defer(),deferred.promise},this.close=function(){var result=angular.copy(modalConfig.options.model);confirmed?deferred.resolve(result):deferred.reject(result),open=!1,modalConfig=void 0,deferred=null},this.confirm=function(){confirmed=!0},this.isModalOpen=function(){return open},this.getModalConfig=function(){return modalConfig}}]).directive("fdvModalDialog",["$q","fdvLog","fdvConfig","fdvModalManager","fdvConstant","fdvConstantValidator","$compile","$timeout","$document",function($q,fdvLog,fdvConfig,fdvModalManager,fdvConstant,fdvConstantValidator,$compile){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/modal-dialog.html"),scope:!0,controller:["$scope","$element",function($scope,$element){var modalDialog=$element.find("#fdv-modal"),deferred=$q.defer();$scope.confirm=function(){return fdvModalManager.confirm(),modalDialog.modal("hide"),deferred.promise},$scope.cancel=function(){return modalDialog.modal("hide"),deferred.promise},modalDialog.on("hidden.bs.modal",function(){angular.isDefined($scope.childScope)&&$scope.childScope.$destroy(),modalDialog.find("input").blur(),modalDialog.removeClass("open"),fdvModalManager.close(),deferred.resolve()}),modalDialog.on("shown.bs.modal",function(){modalDialog.addClass("open"),modalDialog.find("input:first").focus()})}],compile:function(){return{pre:function(){},post:function(scope,iElement){iElement.on("$destroy",function(){scope.$destroy()}),scope.$watch(function(){return fdvModalManager.getModalConfig()},function(newValue){angular.isUndefined(newValue)||angular.isUndefined(newValue.type)||angular.isUndefined(newValue.options)||(fdvConstantValidator.contains(fdvConstant.MODAL,newValue.type)?(scope.childScope=scope.$new(),scope.options=newValue.options,fdvConfig.isWeb()&&angular.isUndefined(scope.options.closeButton)&&(scope.options.closeButton=!0),angular.isUndefined(scope.options.backDrop)&&(scope.options.backDrop="static"),iElement.find(".modal-content").empty().append($compile('
')(scope.childScope)),iElement.find("#fdv-modal").attr("data-backdrop",scope.options.backDrop).modal("show")):fdvLog.error("Modal Manager","Invalid modal type: "+newValue.type))}),scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){var element=iElement;if(0!==element.find("#fdv-modal.open").length){for(var focusCurrent,index=-1,focusableElements=element.find(".fdv-focusable"),i=0;iindex)focusableElements.eq(0).addClass("active");else if(0===index);else{element.find("input").blur();var focusPrev=focusableElements.eq(--index);focusCurrent.removeClass("active"),focusPrev.addClass("active");var input=focusPrev.find("input:first");input.length>0&&(input.focus(),input.val(input.val()).trigger("change"))}break;case fdvConstant.KEY.DOWN:if(0>index)focusableElements.eq(0).addClass("active");else if(index===focusableElements.length-1);else{element.find("input").blur();var focusNext=focusableElements.eq(++index);focusCurrent.removeClass("active"),focusNext.addClass("active");var input=focusNext.find("input:first");input.length>0&&(input.focus(),input.val(input.val()).trigger("change"))}}}})}}}}}]),angular.module("fdvService.modal").directive("fdvPlaceACallModal",["fdvLog","fdvConfig","fdvJsonApi","fdvUserData","fdvConstant",function(fdvLog,fdvConfig,fdvJsonApi,fdvUserData,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/place-a-call-modal.html"),controller:["$scope","$element",function($scope){var contacts=void 0;$scope.reloadSuggestions=function(value){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&angular.isUndefined(contacts)?fdvJsonApi.voiceContactsPagedGet(selectedPhoneLine.number,0,1e3).then(function(model){contacts=model,$scope.suggestions=fdvUserData.searchContacts(contacts,value)}):$scope.suggestions=fdvUserData.searchContacts(contacts,value)},$scope.$watch("options.model.callFrom",function(newValue){angular.isDefined(newValue)&&fdvJsonApi.voiceCallHistoryPagedGet(newValue.number,0,50,fdvConstant.CALL.OUTGOING).then(function(model){if($scope.options.model.recentDialedNumbers=[],angular.isArray(model.callLog))for(var i=0;i0?($scope.options.model.recentDialedNumber=void 0,$scope.options.model.callTo=newValue):$scope.options.model.callTo=void 0}),$scope.$watch("options.model.recentDialedNumber",function(newValue){angular.isDefined(newValue)?($scope.options.model.enterNumber=void 0,$scope.options.model.callTo=newValue.to):$scope.options.model.callTo=void 0})}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvRecordGreetingsModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/record-greetings.html"),controller:["$scope",function($scope){$scope.options.model.greetingNumber="8443875200"}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvRemoveCallNotificationModal",["fdvLog","fdvConfig","fdvRoute",function(fdvLog,fdvConfig,fdvRoute){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/remove-call-notification-modal.html"),controller:["$scope","$element",function($scope){$scope.gotoCallNotificationList=function(){$scope.cancel(),fdvRoute.gotoCallSetting({label:"fdv.settings-call-settings-call-notification"})}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvScheduleCallModal",["fdvLog","fdvConfig","fdvUserData","fdvJsonApi","locale",function(fdvLog,fdvConfig,fdvUserData,fdvJsonApi,locale){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/schedule-call.html"),controller:["$scope","$element",function($scope){$scope.noteCharactersRemaining=0,$scope.maxCharacters=50,$scope.showNote=0===$scope.options.model.description.length?!1:!0,$scope.showDatePicker=!1,$scope.phoneLines=fdvUserData.getUserPhoneLines(),$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.showNoteBox=function(){$scope.showNote=!$scope.showNote},$scope.noteChanged=function(){$scope.noteCharactersRemaining=$scope.maxCharacters-$scope.options.model.description.length},$scope.noteChanged(),$scope.toggleDatePicker=function(){$scope.showDatePicker=!$scope.showDatePicker},$scope.timeChanged=function(){$scope.options.model.endDate=moment(new Date(modelData.startDate)),$scope.options.model.validateData()},$scope.phoneChanged=function(){$scope.options.model.validateData(),$scope.writeAdditionalEventDetails()},$scope.$watch(function(){return $scope.options.model.getReminderTarget().numberTo},function(){$scope.options.model.setReminderPhoneNumber($scope.options.model.getReminderTarget().numberTo),$scope.writeAdditionalEventDetails(),$scope.options.model.validateData()}),$scope.$watch(function(){return $scope.options.model.startDate},function(){$scope.options.model.endDate=moment(new Date($scope.options.model.startDate)),$scope.showDatePicker=!1,$scope.options.model.validateData()}),$scope.writeAdditionalEventDetails=function(){$scope.options.model.name=locale.getString("fdv.schedule-call-event-default-title",{phoneNumberFrom:fdvUserData.getSelectedPhoneLine().number,phoneNumberTo:$scope.options.model.getReminderTarget().numberTo}),$scope.options.model.setReminderDuration(0)},$scope.writeAdditionalEventDetails();var contacts=void 0;$scope.reloadSuggestions=function(value){$scope.options.model.getReminderTarget().numberTo=value;var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&angular.isUndefined(contacts)?fdvJsonApi.voiceContactsPagedGet(selectedPhoneLine.number,0,1e3).then(function(model){contacts=model,$scope.suggestions=fdvUserData.searchContacts(contacts,value)}):$scope.suggestions=fdvUserData.searchContacts(contacts,value)}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.modal").directive("fdvSelectedNumbersModal",["fdvLog","fdvConfig","fdvSettingsItem","fdvValidation",function(fdvLog,fdvConfig,fdvSettingsItem,fdvValidation){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/selected-numbers.html"),controller:["$scope",function($scope){switch($scope.item=$scope.options.model,$scope.text=$scope.options.text,$scope.title=$scope.options.title,$scope.showEdit=$scope.options.showEdit,$scope.showAdd=$scope.options.showAdd,$scope.showDelete=$scope.options.showDelete,$scope.arr=[],$scope.item.model){case"forwarding":"undefined"!=typeof $scope.item.settings.bySourceNumbers.numbers&&($scope.arr=$scope.item.settings.bySourceNumbers.numbers);break;case"dnd":"undefined"!=typeof $scope.item.settings.exceptions.numbers&&($scope.arr=$scope.item.settings.exceptions.numbers);break;default:"undefined"!=typeof $scope.item.settings.numbers&&($scope.arr=$scope.item.settings.numbers)}$scope.numberEdits=[],$scope.arr.forEach(function(){$scope.numberEdits.push(!1)}),$scope.addNumber=function(value){var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";$scope.arr&&fdvValidation.validateLocalPhoneNumber(value)&&$scope.arr.indexOf(sanitizedValue)<0?($scope.arr.unshift(sanitizedValue),$scope.numberEdits.unshift(!1)):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.editNumber=function(index){$scope.currentEditedNumber=$scope.arr[index]||"",$scope.numberEdits[index]=!0},$scope.deleteNumber=function(index){$scope.arr.splice(index,1),$scope.numberEdits.splice(index,1)},$scope.cancelNumber=function(index){$scope.numberEdits[index]=!1},$scope.saveNumber=function(index,value){var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";$scope.arr&&fdvValidation.validateLocalPhoneNumber(value)&&$scope.arr.indexOf(sanitizedValue)<0?($scope.arr[index]=sanitizedValue,$scope.numberEdits[index]=!1):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.clickClose=function(){$scope.confirm()},$scope.isNumberValid=function(value){var isValid=fdvValidation.validateLocalPhoneNumber(value);return isValid}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvSettingsModal",["fdvLog","fdvConfig","fdvLocaleManager",function(fdvLog,fdvConfig,fdvLocaleManager){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/settings-modal.html"),controller:["$scope",function($scope){var stateOn=''+fdvLocaleManager.getString("fdv.label-on")+"",stateOff=''+fdvLocaleManager.getString("fdv.label-off")+"",value=fdvConfig.isStb()?$scope.options.item.value:$scope.options.model.value,model=fdvConfig.isStb()?$scope.options.item.model:$scope.options.model.model;$scope.message="blockIncomingAnonymousOrPrivate"===model?fdvLocaleManager.getString("fdv.settings-call-settings-incoming-call-block-save"):fdvConfig.isMobile()||fdvConfig.isStb()?$scope.options.message:fdvLocaleManager.getString("fdv.settings-turn",{state:value?stateOff:stateOn,feature:fdvLocaleManager.getString($scope.options.title)}),$scope.clickOk=function(){fdvConfig.isStb()?$scope.options.model=$scope.options.model[1]:$scope.options.model.value=!$scope.options.model.value,$scope.confirm()},$scope.clickCancel=function(){fdvConfig.isStb()&&($scope.options.model=$scope.options.model[0]),$scope.confirm()}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvStandardPromptsModal",["fdvLog","fdvConfig",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/standard-prompts-modal.html"),controller:["$scope",function($scope){$scope.title=$scope.$parent.options.title,$scope.text=$scope.$parent.options.text,$scope.clickOk=function(){$scope.confirm()}}],link:function(){}}}]),angular.module("fdvService.modal").directive("fdvViewContactModal",["fdvLog","fdvConfig","locale","fdvValidation","fdvUserData",function(fdvLog,fdvConfig,locale,fdvValidation){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("modals/view-contact-modal.html"),controller:["$scope","$element",function($scope){$scope.hasAdded={firstName:!1,familyName:!1},$scope.phoneTypes=[{name:"mobilePhone",label:locale.getString("fdv.view-contact-mobile-phone")},{name:"homePhone",label:locale.getString("fdv.view-contact-home-phone")},{name:"workPhone",label:locale.getString("fdv.view-contact-work-phone")}],$scope.modelFunctionMappings={firstName:{editingProperty:"firstName",has:"hasFirstName",create:"createFirstName",remove:"removeFirstName"},familyName:{editingProperty:"familyName",has:"hasFamilyName",create:"createFamilyName",remove:"removeFamilyName"},homePhone:{editingProperty:"homePhone",has:"hasHomeNumber",remove:"removeHomeNumber",set:"setHomeNumber",showPhoneType:!1},workPhone:{editingProperty:"workPhone",has:"hasWorkNumber",remove:"removeWorkNumber",set:"setWorkNumber",showPhoneType:!1},mobilePhone:{editingProperty:"mobilePhone",has:"hasMobileNumber",remove:"removeMobileNumber",set:"setMobileNumber",showPhoneType:!1}},$scope.options.model.createName(),$scope.model=$scope.options.model,$scope.modelCopy=$scope.options.model.copy(),$scope.modelPhoneTypeUid=0,$scope.showPhoneTypes=!1,$scope.modelPhoneTypes=[],$scope.getPhoneTypeByName=function(name){var foundPhoneType;return $scope.phoneTypes.forEach(function(phoneType){phoneType.name===name&&(foundPhoneType=phoneType)}),foundPhoneType},$scope.createMobileType=function(){var obj={uid:$scope.modelPhoneTypeUid,selectedPhoneType:$scope.getPhoneTypeByName("mobilePhone"),phoneType:"mobilePhone",number:$scope.model.getMobileNumber()?$scope.model.getMobileNumber():""};return $scope.modelPhoneTypeUid++,obj},$scope.createHomeType=function(){var obj={uid:$scope.modelPhoneTypeUid,selectedPhoneType:$scope.getPhoneTypeByName("homePhone"),phoneType:"homePhone",number:$scope.model.getHomeNumber()?$scope.model.getHomeNumber():""};return $scope.modelPhoneTypeUid++,obj},$scope.createWorkType=function(){var obj={uid:$scope.modelPhoneTypeUid,selectedPhoneType:$scope.getPhoneTypeByName("workPhone"),phoneType:"workPhone",number:$scope.model.getWorkNumber()?$scope.model.getWorkNumber():""};return $scope.modelPhoneTypeUid++,obj},$scope.model.hasMobileNumber()&&$scope.modelPhoneTypes.push($scope.createMobileType()),$scope.model.hasHomeNumber()&&$scope.modelPhoneTypes.push($scope.createHomeType()),$scope.model.hasWorkNumber()&&$scope.modelPhoneTypes.push($scope.createWorkType()),$scope.model.hasFirstName()&&($scope.hasAdded.firstName=!0),$scope.model.hasFamilyName()&&($scope.hasAdded.familyName=!0),$scope.resolvePhoneAddButton=function(){return $scope._alreadyHasPhoneType("mobilePhone")&&$scope._alreadyHasPhoneType("homePhone")&&$scope._alreadyHasPhoneType("workPhone")?!1:!0},$scope._alreadyHasPhoneType=function(type){var found=!1;return $scope.modelPhoneTypes.forEach(function(phoneType){type===phoneType.phoneType&&(found=!0)}),found},$scope.addPhone=function(){$scope._alreadyHasPhoneType("mobilePhone")?$scope._alreadyHasPhoneType("homePhone")?$scope._alreadyHasPhoneType("workPhone")||$scope.modelPhoneTypes.push($scope.createWorkType()):$scope.modelPhoneTypes.push($scope.createHomeType()):$scope.modelPhoneTypes.push($scope.createMobileType())},$scope.removePhone=function(model){for(var index=0;index<$scope.modelPhoneTypes.length;index++)if(model.uid==$scope.modelPhoneTypes[index].uid)return void $scope.modelPhoneTypes.splice(index,1)},$scope.selectPhoneType=function(selectedPhoneType,modelPhoneType){var otherType=null;$scope.modelPhoneTypes.forEach(function(phoneType){selectedPhoneType.name===phoneType.phoneType&&modelPhoneType.uid!==phoneType.uid&&(otherType=phoneType)}),modelPhoneType.phoneType=selectedPhoneType.name,modelPhoneType.selectedPhoneType=$scope.getPhoneTypeByName(modelPhoneType.phoneType),null!==otherType&&($scope._alreadyHasPhoneType("mobilePhone")||(otherType.phoneType="mobilePhone",otherType.selectedPhoneType=$scope.getPhoneTypeByName(otherType.phoneType)),$scope._alreadyHasPhoneType("homePhone")||(otherType.phoneType="homePhone",otherType.selectedPhoneType=$scope.getPhoneTypeByName(otherType.phoneType)),$scope._alreadyHasPhoneType("workPhone")||(otherType.phoneType="workPhone",otherType.selectedPhoneType=$scope.getPhoneTypeByName(otherType.phoneType)))},$scope.hasProperty=function(name){return"undefined"!=typeof name&&"undefined"!=typeof $scope.model&&"function"==typeof $scope.model[$scope.modelFunctionMappings[name].has]?$scope.model[$scope.modelFunctionMappings[name].has]():void 0},$scope.removePropertyButton=function(name){"undefined"!=typeof name&&("function"==typeof $scope.model[$scope.modelFunctionMappings[name].remove]&&$scope.model[$scope.modelFunctionMappings[name].remove](),"undefined"!=typeof $scope.hasAdded[name]&&($scope.hasAdded[name]=!1))},$scope.addPropertyButton=function(name){"undefined"!=typeof name&&("function"==typeof $scope.model[$scope.modelFunctionMappings[name].create]&&$scope.model[$scope.modelFunctionMappings[name].create](),"undefined"!=typeof $scope.hasAdded[name]&&($scope.hasAdded[name]=!0))},$scope.atLeastOneNameAndPhoneNumber=function(){return $scope.prepareModelForSave(),($scope.options.model.hasFamilyName()||$scope.options.model.hasFirstName())&&($scope.options.model.hasHomeNumber()||$scope.options.model.hasWorkNumber()||$scope.options.model.hasMobileNumber())?!0:!1},$scope.isModelValid=function(){if($scope.prepareModelForSave(),$scope.options.model.validateData(),!$scope.options.model.isValid)return!1;var isValid=!0;return $scope.modelPhoneTypes.forEach(function(phoneType){fdvValidation.validatePhoneNumber(phoneType.number)!==!0&&(isValid=!1)}),$scope.atLeastOneNameAndPhoneNumber()||(isValid=!1),isValid},$scope.sanitizeIfValid=function(phoneType){"undefined"!=typeof phoneType&&fdvValidation.validatePhoneNumber(phoneType.number)&&(phoneType.number=phoneType.number.replace(/([\D]*)/g,""))},$scope.prepareModelForSave=function(){$scope.model.removeHomeNumber(),$scope.model.removeMobileNumber(),$scope.model.removeWorkNumber(),$scope.modelPhoneTypes.forEach(function(phoneType){"undefined"!=typeof $scope.modelFunctionMappings[phoneType.phoneType]&&$scope.model[$scope.modelFunctionMappings[phoneType.phoneType].set](phoneType.number)}),$scope.model.sanitizePhoneNumbers()},$scope.didModelChange=function(){return $scope.modelCopy.equals($scope.options.model)?!1:!0},$scope.saveModel=function(){$scope.prepareModelForSave(),$scope.confirm()}}],link:function(){}}}]),angular.module("fdvService.models").factory("fdvAccountModel",function(){function fdvAccountModel(data){this.id="",this.hasBillingAccessPermission=!1,this.isAgent=!1,data&&this.setData(data)}return fdvAccountModel.prototype={setData:function(data){angular.extend(this,data)}},fdvAccountModel}),angular.module("fdvService.models").factory("fdvCalendarEventListModel",["fdvModelValidation","fdvCalendarEventModel",function(fdvModelValidation,fdvCalendarEventModel){function fdvCalendarEventListModel(modelData){this.events=[],modelData&&this.setData(modelData)}return fdvCalendarEventListModel.prototype={setData:function(data){return this.events=[],"undefined"!=typeof data&&data.forEach(function(itemData){var model=new fdvCalendarEventModel(itemData);this.events.push(model)}.bind(this)),this.validateData()},validateData:function(){var validationConstraints={};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation}},fdvCalendarEventListModel}]),angular.module("fdvService.models").factory("fdvCalendarEventModel",["fdvModelValidation","fdvModelBase","fdvRepeatDailyModel","fdvRepeatWeeklyModel","fdvRepeatMonthlyModel","fdvRepeatYearlyModel","fdvSmsTargetModel","fdvPagerTargetModel","fdvEmailTargetModel","fdvPhoneTargetModel",function(fdvModelValidation,fdvModelBase,fdvRepeatDailyModel,fdvRepeatWeeklyModel,fdvRepeatMonthlyModel,fdvRepeatYearlyModel,fdvSmsTargetModel,fdvPagerTargetModel,fdvEmailTargetModel,fdvPhoneTargetModel){function fdvCalendarEventModel(modelData){this.id="",this.name="",this.description="",this.startDate=new Date,this.endDate=moment(new Date(this.startDate)).add(15,"minutes"),this.repeat=!1,this.location="",this.reminder=!1,modelData&&this.setData(modelData)}return fdvCalendarEventModel.prototype={id:"",name:"",description:"",startDate:"",endDate:"",repeat:"",location:"",reminder:{durationBefore:"",target:""},setData:function(modelData){if(angular.extend(this,modelData),this.startDate=new Date(modelData.startDate),this.endDate=new Date(modelData.endDate),"undefined"!=typeof modelData.reminder&&"undefined"!=typeof modelData.reminder.target&&"undefined"!=typeof modelData.reminder.target.type&&modelData.reminder!==!1){switch(modelData.reminder.target.type){case"pager":this.reminder.target=new fdvPagerTargetModel(modelData.reminder.target);break;case"sms":this.reminder.target=new fdvSmsTargetModel(modelData.reminder.target);break;case"email":this.reminder.target=new fdvEmailTargetModel(modelData.reminder.target);break;case"phone":this.reminder.target=new fdvPhoneTargetModel(modelData.reminder.target)}if(modelData.repeat!==!1)switch(modelData.repeat.frequency){case"yearly":this.repeat=new fdvRepeatYearlyModel(modelData.repeat);break;case"monthly":this.repeat=new fdvRepeatMonthlyModel(modelData.repeat);break;case"weekly":this.repeat=new fdvRepeatWeeklyModel(modelData.repeat);break;case"daily":this.repeat=new fdvRepeatDailyModel(modelData.repeat)}}return this.validateData()},validateData:function(){var validationConstraints={id:{numericality:{onlyInteger:!0}},name:{string:!0,length:{minimum:1,maximum:100}},description:{string:!0,length:{maximum:100}},startData:{datetime:!0},endDate:{datetime:!0},repeat:{falseOrObject:!0},location:{string:!0,length:{minimum:1,maximum:100}},reminder:{falseOrScheduleReminder:!0}},validationConstraintsReminder={durationBefore:{presence:!1,numericality:{onlyInteger:!0}},target:{presence:!1,falseOrObject:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.reminder!==!1&&(this.reminderValidation=fdvModelValidation.validateModel(this.reminder,validationConstraintsReminder),"undefined"!=typeof this.reminderValidation&&(this.isValid=!1)),"none"!==this.getReminderType()&&(this.reminder.target.validateData(),this.reminder.target.isValid||(this.isValid=!1)),this.repeat!==!1&&(this.repeat.validateData(),this.repeat.isValid||(this.isValid=!1)),"phone"!==this.getReminderType()&&(""===this.name||moment(this.startDate).year()==moment(this.endDate).year()&&moment(this.startDate).month()==moment(this.endDate).month()&&moment(this.startDate).day()==moment(this.endDate).day()&&moment(this.startDate).hour()==moment(this.endDate).hour()&&moment(this.startDate).minute()==moment(this.endDate).minute()||moment(this.startDate).isAfter(this.endDate))&&(this.isValid=!1),this.hasRepeat()&&moment(this.startDate).isAfter(this.repeat.getRepeatThrough())&&(this.isValid=!1),this.validation},copy:function(){return this.copyModel("fdvCalendarEventModel")},hasEndDate:function(){return"undefined"==typeof this.endDate?!1:!0},clearReminder:function(){this.reminder=!1},clearRepeat:function(){this.repeat=!1},setRepeatDaily:function(repeatInterval){("daily"===repeatInterval||"only_weekdays"===repeatInterval||"only_weekends"===repeatInterval)&&(this.repeat=new fdvRepeatDailyModel,this.repeat.setRepeatInterval(repeatInterval,this.startDate))},setRepeatWeekly:function(repeatInterval){("every_week"===repeatInterval||"every_other_week"===repeatInterval)&&(this.repeat=new fdvRepeatWeeklyModel,this.repeat.setRepeatInterval(repeatInterval,this.startDate))},setRepeatMonthly:function(repeatInterval){("every_month"===repeatInterval||"every_other_month"===repeatInterval)&&(this.repeat=new fdvRepeatMonthlyModel,this.repeat.setRepeatInterval(repeatInterval,this.startDate))},setRepeatYearly:function(repeatInterval){"every_year"===repeatInterval&&(this.repeat=new fdvRepeatYearlyModel,this.repeat.setRepeatInterval(repeatInterval,this.startDate))},setRepeatThroughDate:function(repeatThroughData){this.hasRepeat()&&this.repeat.setRepeatThrough(repeatThroughData)},hasRepeat:function(){return"boolean"==typeof this.repeat?this.repeat:!0},getRepeat:function(){return this.repeat},hasReminder:function(){return this.reminder===!1?!1:!0},hasReminderType:function(){return"none"!==this.getReminderType()?!0:!1},getReminderType:function(){return this.reminder===!1||"undefined"==typeof this.reminder.target?"none":this.reminder.target.type},setReminderDuration:function(duration){this.reminder===!1?this.reminder={durationBefore:duration}:this.reminder.durationBefore=duration},getReminderDuration:function(){return this.reminder===!1?0:this.reminder.durationBefore},setReminderEmail:function(){this.hasReminder()&&(this.reminder.target=new fdvEmailTargetModel,this.reminder.target.setType())},setReminderPager:function(){this.hasReminder()&&(this.reminder.target=new fdvPagerTargetModel,this.reminder.target.setType())},setReminderText:function(){this.hasReminder()&&(this.reminder.target=new fdvSmsTargetModel,this.reminder.target.setType())},setReminderTextProvider:function(provider){"sms"===this.getReminderType()&&this.reminder.target.setProvider(provider)},setReminderPagerProvider:function(provider){"pager"===this.getReminderType()&&this.reminder.target.setProvider(provider)},getPagerProvider:function(){return"pager"===this.getReminderType()?this.reminder.target.getProvider():void 0},getTextProvider:function(){return"sms"===this.getReminderType()?this.reminder.target.getProvider():void 0},setReminderPhone:function(){this.reminder={durationBefore:0,target:""},this.reminder.target=new fdvPhoneTargetModel,this.reminder.target.setType()},setReminderPhoneNumber:function(number){return"phone"===this.getReminderType()?this.reminder.target.setNumber(number):void 0},getReminderPhoneNumber:function(){return"phone"===this.getReminderType()?this.reminder.target.getNumber():void 0},getReminderTarget:function(){return"false"!==this.reminder?this.reminder.target:void 0},getEventType:function(){return this.reminder!==!1&&"phone"===this.getReminderTarget().type?"schedulecall":"event"}},angular.extend(fdvCalendarEventModel.prototype,fdvModelBase),fdvCalendarEventModel}]),angular.module("fdvService.models").factory("fdvCallLogListModel",["fdvModelValidation","fdvCallLogModel",function(fdvModelValidation,fdvCallLogModel){function fdvCallLogListModel(modelData){this.callLog=[],this.total=0,modelData&&this.setData(modelData)}return fdvCallLogListModel.prototype={setData:function(data){return this.callLog=[],this.total=data.total,"undefined"!=typeof data.results&&data.results.forEach(function(itemData){var callModel=new fdvCallLogModel(itemData);this.callLog.push(callModel)}.bind(this)),this.validateData()},validateData:function(){var validationConstraints={callLog:{array:!0},total:{numericality:{onlyInteger:!0}}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation}},fdvCallLogListModel}]),angular.module("fdvService.models").factory("fdvCallLogModel",["fdvModelValidation","fdvConstant","fdvModelBase",function(fdvModelValidation,fdvConstant,fdvModelBase){function fdvCallLogModel(modelData){this.id="",this.from="",this.to="",this.timestamp="",this.status="",this.duration=0,this.description="",this.name="",modelData&&this.setData(modelData)}return fdvCallLogModel.prototype={setData:function(modelData){return angular.extend(this,modelData),this.timestamp=new Date(this.timestamp),this.validateData()},validateData:function(){var validationConstraints={id:{presence:!0},from:{},to:{phoneNumber:!0},timestamp:{presence:!0,definedDate:!0},status:{presence:!0,inclusion:[fdvConstant.CALL.OUTGOING,fdvConstant.CALL.INCOMING,fdvConstant.CALL.INCOMING_MISSED,fdvConstant.CALL.INCOMING_ANSWERED,fdvConstant.CALL.INCOMING_VOICEMAIL]},duration:{optionalDuration:!0},description:{optionalDescription:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation},copy:function(){return this.copyModel("fdvCallLogModel")},isDeletable:function(){return this.canDelete!==!1},isOutgoingCall:function(){return this.status===fdvConstant.CALL.OUTGOING?!0:!1},isIncomingCall:function(){return this.status!==fdvConstant.CALL.OUTGOING?!0:!1},isIncomingMissedCall:function(){return this.status===fdvConstant.CALL.INCOMING_MISSED?!0:!1},isIncomingAnsweredCall:function(){return this.status===fdvConstant.CALL.INCOMING_ANSWERED||this.status===fdvConstant.CALL.INCOMING?!0:!1},getRelevantPhoneNumber:function(){return this.isIncomingCall()?this.from:this.to},daysLeftBeforeExpiry:function(){var oneDay=864e5,today=new Date,expiryDate=this.timestamp.getTime()+30*oneDay,daysLeft=(expiryDate-today.getTime())/oneDay;return daysLeft},getStatusLabel:function(){return this.isIncomingMissedCall()?"fdv.label-call-missed":this.isOutgoingCall()?"fdv.label-call-outgoing":"fdv.label-call-incoming"}},angular.extend(fdvCallLogModel.prototype,fdvModelBase),fdvCallLogModel}]),angular.module("fdvService.models").factory("fdvContactListModel",["fdvModelValidation","fdvContactModel",function(fdvModelValidation,fdvContactModel){ function fdvContactListModel(modelData){this.contacts=[],this.total=0,modelData&&this.setData(modelData)}return fdvContactListModel.prototype={setData:function(data){return this.contacts=[],this.total=data.total,"undefined"!=typeof data.results?data.results.forEach(function(itemData){var model=new fdvContactModel(itemData);this.contacts.push(model)}.bind(this)):"undefined"!=typeof data.length&&data.forEach(function(itemData){var model=new fdvContactModel(itemData);this.contacts.push(model)}.bind(this)),this.validateData()},validateData:function(){var validationConstraints={contacts:{array:!0},total:{numericality:{onlyInteger:!0}}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation}},fdvContactListModel}]),angular.module("fdvService.models").factory("fdvContactModel",["fdvModelValidation","fdvModelBase",function(fdvModelValidation,fdvModelBase){function fdvContactModel(modelData){this.id="",this.groups=[],this.name="",this.number="",this.email={home:"",work:""},modelData&&this.setData(modelData)}var nameArrayIndexes={FAMILY:0,GIVEN:1,MIDDLE:2,PREFIX:3,SUFFIX:4};return fdvContactModel.prototype={setData:function(modelData){if(angular.extend(this,modelData),"undefined"!=typeof this.number){if("string"==typeof this.number){var homeNumber=this.number;this.number={home:homeNumber,work:"",mobile:""}}if("undefined"!=typeof this.email&&"string"==typeof this.email){var email=this.email;this.email={home:email,work:""}}}return this.validateData()},validateData:function(){var validationConstraints={id:{numericality:{onlyInteger:!0}},groups:{array:!0},name:{name:!0},number:{contactNumber:!0},email:{emailOrEmailObject:!0},"email.work":{email:!0},"email.home":{email:!0},"email.mobile":{email:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.hasName()||(this.isValid=!1),this.validation},copy:function(){return this.copyModel("fdvContactModel")},equals:function(model){return angular.equals(this.groups,model.groups)&&angular.equals(this.number,model.number)&&angular.equals(this.name,model.name)&&angular.equals(this.email,model.email)?!0:!1},isMatchingPhoneNumber:function(phoneNumber){if(phoneNumber=this.numbersOnly(phoneNumber),""===phoneNumber)return!1;if("object"==typeof this.number){var isWorkMatching=!1;"undefined"!=typeof this.number.work&&(isWorkMatching=this.numbersOnly(this.number.work)===phoneNumber);var isHomeMatching=!1;"undefined"!=typeof this.number.work&&(isHomeMatching=this.numbersOnly(this.number.home)===phoneNumber);var isMobileMatching=!1;return"undefined"!=typeof this.number.mobile&&(isMobileMatching=this.numbersOnly(this.number.mobile)===phoneNumber),isWorkMatching||isHomeMatching||isMobileMatching?!0:!1}return"string"==typeof this.number?this.numbersOnly(this.number)===phoneNumber:!1},sanitizePhoneNumbers:function(){"object"==typeof this.number?("undefined"!=typeof this.number.work&&(this.number.work=this.numbersOnly(this.number.work)),"undefined"!=typeof this.number.home&&(this.number.home=this.numbersOnly(this.number.home)),"undefined"!=typeof this.number.mobile&&(this.number.mobile=this.numbersOnly(this.number.mobile))):"string"==typeof this.number&&(this.number=this.numbersOnly(this.number))},hasName:function(){var name=this.getName();return"undefined"!=typeof name&&""!=name?!0:!1},getName:function(){if("[object Array]"===Object.prototype.toString.call(this.name)){var name="",order=[nameArrayIndexes.PREFIX,nameArrayIndexes.GIVEN,nameArrayIndexes.MIDDLE,nameArrayIndexes.FAMILY,nameArrayIndexes.SUFFIX];return order.forEach(function(nameArrayIndex){""!==this.name[nameArrayIndex]&&"undefined"!=typeof this.name[nameArrayIndex]&&"undefined"!==this.name[nameArrayIndex]&&(name+=""!=name?" "+this.name[nameArrayIndex]:this.name[nameArrayIndex])}.bind(this)),name}return"string"==typeof this.name?this.name:void 0},removeName:function(){this.name=["","","","",""]},createName:function(){if("undefined"==typeof this.name)this.name=["","","","",""];else if(!this.isNameStructured()){var unstructuredName=this.getName();this.name=["","","","",""],this.name[nameArrayIndexes.GIVEN]=unstructuredName}},hasFirstName:function(){var name=this.getFirstName();return"undefined"!=typeof name&&""!=name?!0:!1},getFirstName:function(){return this.isNameStructured()?this.name[nameArrayIndexes.GIVEN]:void 0},setFirstName:function(name){this.isNameStructured()&&(this.name[nameArrayIndexes.GIVEN]=name)},removeFirstName:function(){this.isNameStructured()&&(this.name[nameArrayIndexes.GIVEN]="")},createFirstName:function(){this.isNameStructured()&&(this.name[nameArrayIndexes.GIVEN]="")},hasFamilyName:function(){var name=this.getFamilyName();return"undefined"!=typeof name&&""!=name?!0:!1},getFamilyName:function(){return this.isNameStructured()?this.name[nameArrayIndexes.FAMILY]:void 0},setFamilyName:function(name){this.isNameStructured()&&(this.name[nameArrayIndexes.FAMILY]=name)},removeFamilyName:function(){this.isNameStructured()&&(this.name[nameArrayIndexes.FAMILY]="")},createFamilyName:function(){this.isNameStructured()&&(this.name[nameArrayIndexes.FAMILY]="")},isNameStructured:function(){return"[object Array]"===Object.prototype.toString.call(this.name)?!0:!1},hasGroups:function(){return"undefined"!==this.getGroups()},getGroups:function(){return"[object Array]"===Object.prototype.toString.call(this.groups)&&this.groups.length>0?this.groups:void 0},addGroup:function(groupName){if("[object Array]"===Object.prototype.toString.call(this.groups)){var alreadyExist=!1;this.groups.forEach(function(group){group===groupName&&(alreadyExist=!1)}.bind(this)),alreadyExist||this.groups.push(groupName)}},removeGroup:function(groupName){if("[object Array]"===Object.prototype.toString.call(this.groups)){for(var foundIndex=void 0,index=0;indexMAX_PHONE_LENGTH?"is too long":void 0}return"is not a phone number"},validate.validators.localPhoneNumber=function(value){return"string"!=typeof value?"is not a string":PHONE_LOCAL_NUMBER_REGEX.test(value)?ALL_ZEROES_REGEX.test(value.replace(DIGIT_ONLY_REGEX,""))?"contains all zeroes":void 0:"is not a phone number"},validate.validators.falseOrPhoneNumber=function(value,options,key,attributes){if("boolean"==typeof value){if(!value)return}else if("string"==typeof value&&PHONE_NUMBER_REGEX.test(value)===!0)return validate.validators.phoneNumber(value,options,key,attributes);return"is not false or a phone number"},validate.validators.optionalPhoneNumber=function(value,options,key,attributes){return"undefined"==typeof value?void 0:validate.validators.phoneNumber(value,options,key,attributes)},validate.validators.integerOrNull=function(value){return null==value||validate.isInteger(value)?void 0:"value is not null or an integer"},validate.validators.falseOrPhoneNumberArray=function(value){if("boolean"!=typeof value||value!==!1){if(validate.isArray(value)){var isOK=!0;if(value.forEach(function(value){("string"!=typeof value||PHONE_NUMBER_REGEX.test(value)!==!0)&&(isOK=!1)}),isOK)return}return"is not false or array of phone numbers"}},validate.validators.falseOrArray=function(value){return"boolean"==typeof value&&value===!1||validate.isArray(value)?void 0:"is not false or an array"},validate.validators.falseOrArrayIncluding=function(value,options){if("boolean"!=typeof value||value!==!1){if("string"==typeof value){if(options.within&&validate.contains(options.within,value))return}else if(validate.isArray(value)&&options.within){var isOK=!0;if(value.forEach(function(value){validate.contains(options.within,value)||(isOK=!1)}),isOK)return}return"is not false or an array including within values"}},validate.validators.falseOrObject=function(value){return"boolean"==typeof value&&value===!1||validate.isObject(value)?void 0:"is not false or an object"},validate.validators.dateOrFalse=function(value,options){if("boolean"==typeof value){if(0==value)return}else if("string"==typeof value||"object"==typeof value)return validate.validators.datetime.call(validate.validators.datetime,value,options);return"is not false or a date"},validate.validators.optionalDate=function(value,options){return"undefined"!=typeof value?"string"==typeof value&&value.length>0||value instanceof Date?validate.validators.datetime.call(validate.validators.datetime,value,options):"is not false or a date":void 0},validate.validators.definedDate=function(value,options){return value instanceof Date?void 0:"string"==typeof value&&value.length>0?validate.validators.datetime.call(validate.validators.datetime,value,options):"is not a date"},validate.validators.optionalDuration=function(value){return"undefined"==typeof value||"number"==typeof value&&validate.isInteger(value)?void 0:"is not a duration"},validate.validators.optionalDescription=function(value){return"undefined"!=typeof value&&"string"!=typeof value?"is not an optional description":void 0},validate.validators.contactNumber=function(value,options,key,attributes){if("string"==typeof value)return validate.validators.phoneNumber(value,options,key,attributes);{if("object"!=typeof value)return"is not a phone number or a contact object work, home, mobile";if("string"==typeof value.work&&""!=value.work&&"undefined"!=typeof validate.validators.phoneNumber(value.work,options,key,attributes))return"work property is not a valid phone number";if("string"==typeof value.home&&""!=value.home&&"undefined"!=typeof validate.validators.phoneNumber(value.home,options,key,attributes))return"home property is not a valid phone number";if("string"==typeof value.mobile&&""!=value.mobile&&"undefined"!=typeof validate.validators.phoneNumber(value.mobile,options,key,attributes))return"mobile property is not a valid phone number"}},validate.validators.name=function(value){if("string"==typeof value)return value.length>MAX_NAME_LENGTH?"is too long":void 0;if(validate.isArray(value)){var error;return value.forEach(function(v){v.length>MAX_NAME_LENGTH?error="is too long":"string"!=typeof v&&(error="is not a name")}),error}return"is not an name"},validate.validators.string=function(value){return"string"!=typeof value?"is not a string":void 0},validate.validators.falseOrString=function(value){if("boolean"==typeof value){if(!value)return}else if("string"==typeof value)return;return"is not a string"},validate.validators["boolean"]=function(value){return"boolean"!=typeof value?"is not a boolean":void 0},validate.validators.inclusionWithThisObject=function(value,options,key,attributes){var inclusionArray=validate.getDeepObjectValue(attributes,options);if("undefined"==typeof inclusionArray||!validate.contains(inclusionArray,value))return"is not included"},validate.validators.emailOrEmailObject=function(value,options){if("string"==typeof value)return 0===value.length?void 0:validate.validators.email.call(validate.validators.email,value,options);if("object"!=typeof value)return"is not a email string or object"},validate.validators.falseOrScheduleReminder=function(value){return"boolean"==typeof value&&value===!1||validate.isObject(value)?void 0:"is not false or an object"},validate.validators.locateNumber=function(value){return"object"!=typeof value?"is not an an object":value.number&&"string"==typeof value.number?PHONE_LOCAL_NUMBER_REGEX.test(value.number)?ALL_ZEROES_REGEX.test(value.number.replace(DIGIT_ONLY_REGEX,""))?"contains all zeroes":value.numberRings&&"number"==typeof value.numberRings?2>value.numberRings||value.numberRings>10?"number of rings is out of bounds":void 0:"does not contain number of rings":"is not a phone number":"does not contain number"},validate.validators.uniqueLocateNumber=function(targetNumbers){var strippedArray=targetNumbers.reduce(function(sa,target){var found=targetNumbers.filter(function(t){return t.number.replace(DIGIT_ONLY_REGEX,"")===target.number.replace(DIGIT_ONLY_REGEX,"")});return(1===found.length||""===target.number)&&sa.push(target),sa},[]);return targetNumbers.length!==strippedArray.length?"duplicate objects are in array":void 0},validate.validators.atLeastOneLocateNumber=function(targetNumbers){if(!(targetNumbers instanceof Array))return"it is not array";var found=0;return targetNumbers.forEach(function(value){value.number&&found++}),0===found?"All numbers are empty":void 0},validate.validators.oldPasscode=function(value){return OLD_PASSCODE_REGEX.test(value)?void 0:"passcode is not valid"},validate.validators.oldMetaPasscode=function(value){return value&&(value.length<4||value.length>MAX_META_NEWPASSCODE_LENGTH)?"passcode is not valid":void 0},validate.validators.newPasscode=function(value){return NEW_PASSCODE_REGEX.test(value)?void 0:"passcode is not valid"},validate.validators.newPasscodeMismatch=function(value){return value.code!==value.confirm?"passcode and confirmation do not match":void 0},validate.validators.newPasscodeRepeated=function(value){return REPEAT_REGEX.test(value)?"passcode consists of repeated digits":void 0},validate.validators.newPasscodeConsecutive=function(value){return value&&(self.areConsecutive(value)||self.areConsecutive(value.split("").reverse().join("")))?"passcode consists of consecutive digits":void 0},validate.validators.newPasscodeContained=function(value){return value.number.indexOf(value.code)>-1&&""!==value.code?"Phone number contains passcode":void 0},validate.validators.newPasscodeMetaLength=function(value){return!value||value.length>=MIN_META_NEWPASSCODE_LENGTH&&value.length<=MAX_META_NEWPASSCODE_LENGTH?void 0:"Your new password must be between 6 to 20 characters"},validate.validators.phoneNumberUnique=function(numbers){var strippedArray=numbers.reduce(function(sa,number){var found=numbers.filter(function(n){return n.replace(DIGIT_ONLY_REGEX,"")===number.replace(DIGIT_ONLY_REGEX,"")});return(1===found.length||""===number)&&sa.push(number),sa},[]);return numbers.length!==strippedArray.length?"duplicate numbers are in array":void 0},validate.validators.phoneNumberAtLeastOne=function(numbers){if(!(numbers instanceof Array))return"it is not array";var found=0;return numbers.forEach(function(value){value&&found++}),0===found?"All numbers are empty":void 0},this.areConsecutive=function(value){return null!==value.split("").reduce(function(prev,curr){return prev&&curr-prev===1?curr:null})},this.validateModel=function(model,constraints){var validationResult=validate(model,constraints);if("undefined"!=typeof validationResult&&this.logOnError){fdvLog.debug("modelvalidation","Error validating model:"+model.constructor.name);var err=new Error;fdvLog.debug("modelvalidation",err.stack),fdvLog.debug("modelvalidation",JSON.stringify(validationResult))}return validationResult},this.setLogOnError=function(value){this.logOnError=value}}]),angular.module("fdvService.models").factory("fdvOptionsModel",["fdvModelValidation","fdvScheduleModel","fdvModelBase",function(fdvModelValidation,fdvScheduleModel,fdvModelBase){function fdvOptionsModel(modelData){this.timeOffset="",this.voicemailEnabled=!0,this.voicemailNumberRings="",this.simultaneousRing={enabled:"",numbers:[]},this.backupNumber={enabled:"",number:""},this.blockIncomingAnonymousOrPrivate="",this.blockIncomingSelectedNumbers={enabled:"",numbers:[]},this.blockOutgoingCallerId="",this.blockOutgoingInternational="",this.forwarding={enabled:"",destNumber:"",bySourceNumbers:{enabled:"",numbers:[]}},this.locateMe={enabled:"",targets:[]},this.dnd={enabled:"",action:"",exceptions:{enabled:"",numbers:[]}},modelData&&this.setData(modelData)}return fdvOptionsModel.prototype={setData:function(data){if(angular.extend(this,data),"object"==typeof data.forwarding&&"[object Array]"===Object.prototype.toString.call(data.forwarding.schedule)){var schedule=[];data.forwarding.schedule.forEach(function(itemData){var model=new fdvScheduleModel(itemData);schedule.push(model)}.bind(this)),this.forwarding.schedule=schedule}if("object"==typeof data.notifications&&"[object Array]"===Object.prototype.toString.call(data.notifications.schedule)){var schedule=[];data.notifications.schedule.forEach(function(itemData){var model=new fdvScheduleModel(itemData);schedule.push(model)}.bind(this)),this.notifications.schedule=schedule}if("object"==typeof data.dnd&&"[object Array]"===Object.prototype.toString.call(data.dnd.schedule)){var schedule=[];data.dnd.schedule.forEach(function(itemData){var model=new fdvScheduleModel(itemData);schedule.push(model)}.bind(this)),this.dnd.schedule=schedule}return this.validateData()},toJson:function(){return JSON.stringify(this)},createEmptyDnd:function(){this.dnd={action:!1,exceptions:!1,schedule:!1}},isMaximumBlockedNumbersReached:function(){return angular.isObject(this.blockIncomingSelectedNumbers)&&angular.isArray(this.blockIncomingSelectedNumbers.numbers)&&this.blockIncomingSelectedNumbers.numbers.length>=200},isMaximumNotifiedNumbersReached:function(){return angular.isObject(this.notifications)&&angular.isObject(this.notifications.bySourceNumbers)&&angular.isArray(this.notifications.bySourceNumbers.numbers)&&this.notifications.bySourceNumbers.numbers.length>=10},isNumberBlocked:function(phoneNumber){if("string"!=typeof phoneNumber)return!1;if(!angular.isObject(this.blockIncomingSelectedNumbers)||null===this.blockIncomingSelectedNumbers)return!1;if(this.blockIncomingSelectedNumbers.enabled===!1)return!1;if(angular.isArray(this.blockIncomingSelectedNumbers.numbers)===!1)return!1;phoneNumber=phoneNumber.replace(/([\D]*)/g,"");for(var index=0;indexlength&&(err=options.tooShort||this.tooShort||"is too short (minimum is %{count} characters)",errors.push(v.format(err,{count:minimum}))),v.isNumber(maximum)&&length>maximum&&(err=options.tooLong||this.tooLong||"is too long (maximum is %{count} characters)",errors.push(v.format(err,{count:maximum}))),errors.length>0?options.message||errors:void 0):(v.error(v.format("Attribute %{attr} has a non numeric value for `length`",{attr:attribute})),options.message||this.notValid||"has an incorrect length")}},numericality:function(value,options){if(!v.isEmpty(value)){options=v.extend({},this.options,options);var name,count,errors=[],checks={greaterThan:function(v,c){return v>c},greaterThanOrEqualTo:function(v,c){return v>=c},equalTo:function(v,c){return v===c},lessThan:function(v,c){return c>v},lessThanOrEqualTo:function(v,c){return c>=v}};if(options.noStrings!==!0&&v.isString(value)&&(value=+value),!v.isNumber(value))return options.message||this.notValid||"is not a number";if(options.onlyInteger&&!v.isInteger(value))return options.message||this.notInteger||"must be an integer";for(name in checks)if(count=options[name],v.isNumber(count)&&!checks[name](value,count)){var msg=this["not"+v.capitalize(name)]||"must be %{type} %{count}";errors.push(v.format(msg,{count:count,type:v.prettify(name)}))}return options.odd&&value%2!==1&&errors.push(this.notOdd||"must be odd"),options.even&&value%2!==0&&errors.push(this.notEven||"must be even"),errors.length?options.message||errors:void 0}},datetime:v.extend(function(value,options){if(!v.isEmpty(value)){options=v.extend({},this.options,options);var err,errors=[],earliest=options.earliest?this.parse(options.earliest,options):0/0,latest=options.latest?this.parse(options.latest,options):0/0;return value=this.parse(value,options),isNaN(value)||options.dateOnly&&value%864e5!==0?options.message||this.notValid||"must be a valid date":(!isNaN(earliest)&&earliest>value&&(err=this.tooEarly||"must be no earlier than %{date}",err=v.format(err,{date:this.format(earliest,options)}),errors.push(err)),!isNaN(latest)&&value>latest&&(err=this.tooLate||"must be no later than %{date}",err=v.format(err,{date:this.format(latest,options)}),errors.push(err)),errors.length?options.message||errors:void 0)}},{parse:function(value){if(v.isFunction(v.XDate))return new v.XDate(value,!0).getTime();if(v.isDefined(v.moment))return+v.moment.utc(value);throw new Error("Neither XDate or moment.js was found")},format:function(date,options){var format=options.dateFormat;if(v.isFunction(v.XDate))return format=format||(options.dateOnly?"yyyy-MM-dd":"yyyy-MM-dd HH:mm:ss"),new v.XDate(date,!0).toString(format);if(v.isDefined(v.moment))return format=format||(options.dateOnly?"YYYY-MM-DD":"YYYY-MM-DD HH:mm:ss"),v.moment.utc(date).format(format);throw new Error("Neither XDate or moment.js was found")}}),date:function(value,options){return options=v.extend({},options,{dateOnly:!0}),v.validators.datetime.call(v.validators.datetime,value,options)},format:function(value,options){(v.isString(options)||options instanceof RegExp)&&(options={pattern:options}),options=v.extend({},this.options,options);var match,message=options.message||this.message||"is invalid",pattern=options.pattern;return v.isEmpty(value)?void 0:v.isString(value)?(v.isString(pattern)&&(pattern=new RegExp(options.pattern,options.flags)),match=pattern.exec(value),match&&match[0].length==value.length?void 0:message):message},inclusion:function(value,options){if(!v.isEmpty(value)&&(v.isArray(options)&&(options={within:options}),options=v.extend({},this.options,options),!v.contains(options.within,value))){var message=options.message||this.message||"^%{value} is not included in the list";return v.format(message,{value:value})}},exclusion:function(value,options){if(!v.isEmpty(value)&&(v.isArray(options)&&(options={within:options}),options=v.extend({},this.options,options),v.contains(options.within,value))){var message=options.message||this.message||"^%{value} is restricted";return v.format(message,{value:value })}},email:v.extend(function(value,options){options=v.extend({},this.options,options);var message=options.message||this.message||"is not a valid email";if(!v.isEmpty(value))return v.isString(value)&&this.PATTERN.exec(value)?void 0:message},{PATTERN:/^[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i}),equality:function(value,options,attribute,attributes){if(!v.isEmpty(value)){v.isString(options)&&(options={attribute:options}),options=v.extend({},this.options,options);var message=options.message||this.message||"is not equal to %{attribute}";if(v.isEmpty(options.attribute)||!v.isString(options.attribute))throw new Error("The attribute must be a non empty string");var otherValue=v.getDeepObjectValue(attributes,options.attribute),comparator=options.comparator||function(v1,v2){return v1===v2};return comparator(value,otherValue,options,attribute,attributes)?void 0:v.format(message,{attribute:v.prettify(options.attribute)})}},url:function(value,options){if(!v.isEmpty(value)){options=v.extend({},this.options,options);var message=options.message||this.message||"is not a valid url",schemes=options.schemes||this.schemes||["http","https"],allowLocal=options.allowLocal||this.allowLocal||!1;if(!v.isString(value))return message;var regex="^(?:(?:"+schemes.join("|")+"):\\/\\/)(?:\\S+(?::\\S*)?@)?";regex+="(?:";var hostname="(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))";allowLocal?hostname="(?:localhost|"+hostname+")":regex+="(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})",regex+="(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|"+hostname+"(?::\\d{2,5})?(?:\\/[^\\s]*)?$";var PATTERN=new RegExp(regex,"i");return PATTERN.exec(value)?void 0:message}}},validate.exposeModule(validate,this,exports,module,define)}.call(this,"undefined"!=typeof exports?exports:null,"undefined"!=typeof module?module:null,"undefined"!=typeof define?define:null),angular.module("fdvService.models").factory("fdvVirtualNumberListModel",["fdvModelValidation","fdvVirtualNumberModel",function(fdvModelValidation,fdvVirtualNumberModel){function fdvVirtualNumberListModel(modelData){this.virtualNumbers=[],modelData&&this.setData(modelData)}return fdvVirtualNumberListModel.prototype={setData:function(data){return this.virtualNumbers=[],"[object Array]"===Object.prototype.toString.call(data)&&data.forEach(function(itemData){var virtualModel=new fdvVirtualNumberModel(itemData);this.virtualNumbers.push(virtualModel)}.bind(this)),this.validateData()},validateData:function(){var validationConstraints={virtualNumbers:{array:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation}},fdvVirtualNumberListModel}]),angular.module("fdvService.models").factory("fdvVirtualNumberModel",["fdvModelValidation","fdvModelBase",function(fdvModelValidation,fdvModelBase){function VirtualNumberModel(modelData){this.id="",this.number="",this.distinctiveRing={enabled:"",options:[],setting:""},modelData&&this.setData(modelData)}return VirtualNumberModel.prototype={setData:function(modelData){return angular.extend(this,modelData),this.validateData()},validateData:function(){var validationConstraints={id:{presence:!0,length:{minimum:1}},number:{phoneNumber:!0},distinctiveRing:{falseOrObject:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation},copy:function(){return this.copyModel("VirtualNumberModel")}},angular.extend(VirtualNumberModel.prototype,fdvModelBase),VirtualNumberModel}]),angular.module("fdvService.models").factory("fdvVoiceNumberListModel",["fdvModelValidation","fdvVoiceNumberModel",function(fdvModelValidation,fdvVoiceNumberModel){function fdvVoiceNumberListModel(modelData){this.voiceNumbers=[],modelData&&this.setData(modelData)}return fdvVoiceNumberListModel.prototype={setData:function(data){return this.voiceNumbers=[],data.forEach(function(itemData){var voiceModel=new fdvVoiceNumberModel(itemData);this.voiceNumbers.push(voiceModel)}.bind(this)),this.validateData()},validateData:function(){var validationConstraints={voiceNumbers:{array:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation}},fdvVoiceNumberListModel}]),angular.module("fdvService.models").factory("fdvVoiceNumberModel",["fdvModelValidation","fdvModelBase",function(fdvModelValidation,fdvModelBase){function VoiceNumberModel(modelData){this.id="",this.label="",this.number="",modelData&&this.setData(modelData)}return VoiceNumberModel.prototype={setData:function(modelData){return angular.extend(this,modelData),this.validateData()},validateData:function(){var validationConstraints={id:{presence:!0,length:{minimum:1}},label:{presence:!0,length:{minimum:1}},number:{phoneNumber:!0}};return this.validation=fdvModelValidation.validateModel(this,validationConstraints),this.isValid="undefined"==typeof this.validation,this.validation},copy:function(){return this.copyModel("VoiceNumberModel")}},angular.extend(VoiceNumberModel.prototype,fdvModelBase),VoiceNumberModel}]);var XDate=function(g,n,A,p){function f(){var d,a=this instanceof f?this:new f,c=arguments,b=c.length;if("boolean"==typeof c[b-1]&&(d=c[--b],c=q(c,0,b)),b)if(1==b){if(b=c[0],b instanceof g||"number"==typeof b)a[0]=new g(+b);else if(b instanceof f){var c=a,h=new g(+b[0]);l(b)&&(h.toString=v),c[0]=h}else if("string"==typeof b){a[0]=new g(0);a:{for(var e,c=b,b=d||!1,h=f.parsers,w=0;wc&&F(a,c+1,(b-h)*G[c],d)}function H(a,c,b){var a=a.clone().setUTCMode(!0,!0),c=f(c).setUTCMode(!0,!0),d=0;if(0==b||1==b){for(var h=6;h>=b;h--)d/=G[h],d+=j(c,!1,h)-j(a,!1,h);1==b&&(d+=12*(c.getFullYear()-a.getFullYear()))}else 2==b?(b=a.toDate().setUTCHours(0,0,0,0),d=c.toDate().setUTCHours(0,0,0,0),d=n.round((d-b)/864e5)+(c-d-(a-b))/864e5):d=(c-a)/[36e5,6e4,1e3,1][b-3];return d}function s(a){var c=a(0),b=a(1),d=a(2),a=new g(m(c,b,d)),c=t(I(c,b,d));return n.floor(n.round((a-c)/864e5)/7)+1}function I(a,c,b){return c=new g(m(a,c,b)),c=t(a+1)?a+1:a}function t(a){return a=new g(m(a,0,4)),a.setUTCDate(a.getUTCDate()-(a.getUTCDay()+6)%7),a}function J(a,c,b,d){var h=k(j,a,d),e=k(D,a,d);b===p&&(b=I(h(0),h(1),h(2))),b=t(b),d||(b=r(b)),a.setTime(+b),e(2,[h(2)+7*(c-1)])}function K(a,c,b,d,h){var e=f.locales,g=e[f.defaultLocale]||{},i=k(j,a,h),b=("string"==typeof b?e[b]:b)||{};return x(a,c,function(a){if(d)for(var b=(7==a?2:a)-1;b>=0;b--)d.push(i(b));return i(a)},function(a){return b[a]||g[a]},h)}function x(a,c,b,d,e){for(var f,g,i="";f=c.match(N);){if(i+=c.substr(0,f.index),f[1]){g=i;for(var i=a,j=f[1],l=b,m=d,n=e,k=j.length,o=void 0,q="";k>0;)o=O(i,j.substr(0,k),l,m,n),o!==p?(q+=o,j=j.substr(k),k=j.length):k--;i=g+(q+j)}else f[3]?(g=x(a,f[4],b,d,e),parseInt(g.replace(/\D/g,""),10)&&(i+=g)):i+=f[7]||"'";c=c.substr(f.index+f[0].length)}return i+c}function O(a,c,b,d,e){var g=f.formatters[c];if("string"==typeof g)return x(a,g,b,d,e);if("function"==typeof g)return g(a,e||!1,d);switch(c){case"fff":return i(b(6),3);case"s":return b(5);case"ss":return i(b(5));case"m":return b(4);case"mm":return i(b(4));case"h":return b(3)%12||12;case"hh":return i(b(3)%12||12);case"H":return b(3);case"HH":return i(b(3));case"d":return b(2);case"dd":return i(b(2));case"ddd":return d("dayNamesShort")[b(7)]||"";case"dddd":return d("dayNames")[b(7)]||"";case"M":return b(1)+1;case"MM":return i(b(1)+1);case"MMM":return d("monthNamesShort")[b(1)]||"";case"MMMM":return d("monthNames")[b(1)]||"";case"yy":return(b(0)+"").substring(2);case"yyyy":return b(0);case"t":return u(b,d).substr(0,1).toLowerCase();case"tt":return u(b,d).toLowerCase();case"T":return u(b,d).substr(0,1);case"TT":return u(b,d);case"z":case"zz":case"zzz":return e?c="Z":(d=a.getTimezoneOffset(),a=0>d?"+":"-",b=n.floor(n.abs(d)/60),d=n.abs(d)%60,e=b,"zz"==c?e=i(b):"zzz"==c&&(e=i(b)+":"+i(d)),c=a+e),c;case"w":return s(b);case"ww":return i(s(b));case"S":return c=b(2),c>10&&20>c?"th":["st","nd","rd"][c%10-1]||"th"}}function u(a,c){return c(a(3)<12?"amDesignator":"pmDesignator")}function y(a){return!isNaN(+a[0])}function j(a,c,b){return a["get"+(c?"UTC":"")+o[b]]()}function D(a,c,b,d){a["set"+(c?"UTC":"")+o[b]].apply(a,d)}function r(a){return new g(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),a.getUTCHours(),a.getUTCMinutes(),a.getUTCSeconds(),a.getUTCMilliseconds())}function E(a,c){return 32-new g(m(a,c,32)).getUTCDate()}function z(a){return function(){return a.apply(p,[this].concat(q(arguments)))}}function k(a){var c=q(arguments,1);return function(){return a.apply(p,c.concat(q(arguments)))}}function q(a,c,b){return A.prototype.slice.call(a,c||0,b===p?a.length:b)}function L(a,c){for(var b=0;b0){var stay=!1,currentRoute=routeStack[routeStack.length-1];if(angular.isFunction(currentRoute.scope.$onclose)&&(stay=currentRoute.scope.$onclose()),stay)return!0}return routeStack.length>1?($timeout(function(){var ret;do ret=routeStack.pop();while(ret.skipwhengoingBack);routeStack[routeStack.length-1].params={},fdvLog.debug(componentName,"Going back to previous route from : "+ret.path)}),!0):(fdvLog.debug(componentName,"Going back to FDV root route"),!1)},this.goTo=function(path,params,title,iconClass,skipwhengoingBack){if("undefined"==typeof skipwhengoingBack&&(skipwhengoingBack=!1),fdvConstantValidator.contains(fdvConstant.ROUTE,path)){title=angular.isDefined(title)?title:this.getRouteTitle(path),iconClass=angular.isDefined(iconClass)?iconClass:this.getRouteIconClass(path);var gotoRoute=function(path,params,title,iconClass){title=angular.isDefined(title)?title:"",iconClass=angular.isDefined(iconClass)?iconClass:"",params=angular.isDefined(params)?params:{};var route=new fdvRouteModel({path:path,title:title,iconClass:iconClass,params:params,skipwhengoingBack:skipwhengoingBack});routeStack.push(route)};return fdvConstant.ROUTE.VOICEMAILS===path?fdvActionManager.accessVoicemails().then(function(){gotoRoute(path,params,title,iconClass)}):gotoRoute(path,params,title,iconClass),!0}return fdvLog.error(componentName,"Invalid route: "+path),!1},this.getCurrentRoute=function(){return routeStack.length>0?routeStack[routeStack.length-1]:void 0},this.getRootRoute=function(){return routeStack.length>0?routeStack[0]:void 0},this.reset=function(){routeStack=[]},this.gotoHome=function(data){this.goTo(fdvConstant.ROUTE.HOME,{data:angular.copy(data)})},this.gotoRecentCalls=function(data){this.goTo(fdvConstant.ROUTE.CALLS,{data:angular.copy(data)})},this.gotoVoicemails=function(data){this.goTo(fdvConstant.ROUTE.VOICEMAILS,{data:angular.copy(data)})},this.gotoSettings=function(data){this.goTo(fdvConstant.ROUTE.SETTINGS,{data:angular.copy(data)})},this.gotoCallSetting=function(data){var deepLinkData={};deepLinkData.indexLabel=data.label,deepLinkData.tabId="0",this.goTo(fdvConstant.ROUTE.SETTINGS,{data:deepLinkData})},this.gotoVoicemailSetting=function(data){var deepLinkData={};deepLinkData.indexLabel=data.label,deepLinkData.tabId="1",this.goTo(fdvConstant.ROUTE.SETTINGS,{data:deepLinkData})},this.gotoSubSettings=function(data,skipwhengoingBack){this.goTo(fdvConstant.ROUTE.SUBSETTINGS,{data:angular.copy(data)},void 0,void 0,skipwhengoingBack)},this.gotoNumberList=function(data){this.goTo(fdvConstant.ROUTE.NUMBERLIST,{data:angular.copy(data)})},this.gotoFAQs=function(data){this.goTo(fdvConstant.ROUTE.FAQS,{data:angular.copy(data)})},this.gotoCall=function(data){this.goTo(fdvConstant.ROUTE.CALL,{data:angular.copy(data)})},this.gotoVoicemail=function(data){this.goTo(fdvConstant.ROUTE.VOICEMAIL,{data:angular.copy(data)})},this.isEmpty=function(){return 0===routeStack.length},this.isHome=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.HOME},this.isVoicemails=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.VOICEMAILS},this.isCalls=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.CALLS},this.isCall=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.CALL},this.isVoicemail=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.VOICEMAIL},this.isSummary=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.SUMMARY},this.isSettings=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.SETTINGS},this.isSubSettings=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.SUBSETTINGS},this.isNumberList=function(){return routeStack.length>0&&routeStack[routeStack.length-1].path===fdvConstant.ROUTE.NUMBERLIST},this.isDetailsPage=function(){return this.isCall()||this.isVoicemail()||this.isSummary()||this.isSubSettings()||this.isNumberList()}}]),angular.module("fdvService.services").service("fdvHTTPClient",["$http","$q","fdvLog",function($http,$q,fdvLog){this._req=function(method,url,body,canceller){var deferred=$q.defer(),success=function(data,status,headers,config){fdvLog.debug("Rest Service","request="+method+" "+url+" ("+status+"): data="+JSON.stringify(data)),deferred.resolve({data:data,status:status,headers:headers,config:config})},error=function(data,status,headers,config){deferred.reject({data:data,status:status,headers:headers,config:config})},config={};switch(void 0!==canceller&&(config={timeout:canceller.promise}),method){case"GET":$http.get(url,config).success(success).error(error);break;case"PUT":$http.put(url,body,config).success(success).error(error);break;case"POST":$http.post(url,body,config).success(success).error(error);break;case"DELETE":$http["delete"](url,config).success(success).error(error);break;default:deferred.reject({data:null,status:400,headers:null,config:null})}return deferred.promise},this.get=function(url,canceller){return this._req("GET",url,null,canceller)},this.put=function(url,body){return this._req("PUT",url,body)},this.post=function(url,body){return this._req("POST",url,body)},this["delete"]=function(url,body){return this._req("DELETE",url,body)},this.upload=function(url,form){var deferred=$q.defer();return $http.post(url,form,{withCredentials:!0,headers:{"Content-Type":void 0},transformRequest:angular.identity}).success(function(data,status,headers,config){deferred.resolve({data:data,status:status,headers:headers,config:config})}).error(function(data,status,headers,config){deferred.reject({data:data,status:status,headers:headers,config:config})}),deferred.promise}}]),angular.module("fdvService.services").service("fdvAnalytics",["fdvConfig","fdvLog",function(fdvConfig,fdvLog){var componentName="Analytics Service",excludedRoutes=["calls","summary","settings","subsettings"],_serviceProvider=void 0;this.setServiceProvider=function(serviceProvider){_serviceProvider=serviceProvider},this.getServiceProvider=function(){return _serviceProvider},this.enterPage=function(pageName){excludedRoutes.indexOf(pageName)>=0||(fdvLog.debug(componentName,"page=fios-digitalvoice:"+pageName),fdvConfig.isMobile()&&angular.isObject(_serviceProvider)&&_serviceProvider.enterPageSpecial("fios-digitalvoice:"+pageName))}}]),angular.module("fdvService.services").service("fdvJsonApi",["$injector","$q","fdvHTTPClient","fdvConfig",function($injector,$q,fdvHTTPClient,fdvConfig){var baseJsonApiUrl="api",jsonApis={base:"",accountVoice:{url:"/accounts/::0::/voice",get:{model:"fdvVoiceNumberListModel"}},voice:{url:"/voice",get:{model:"fdvVoiceNumberListModel"}},voicePhoneNumber:{url:"/voice/::0::",get:{model:"fdvVoiceNumberModel"}},voiceVirtualNumbers:{url:"/voice/::0::/virtualNumbers",get:{model:"fdvVirtualNumberListModel"}},voiceVirtualNumber:{url:"/voice/::0::/virtualNumbers/::1::",get:{model:"fdvVirtualNumberModel"},post:{model:""}},voiceCall:{url:"/voice/::0::/calls",post:{model:""}},voiceCallHistory:{url:"/voice/::0::/calls/history",get:{model:"fdvCallLogListModel"},"delete":{model:""}},voiceCallHistoryDeleteEntry:{url:"/voice/::0::/calls/history/::1::","delete":{model:""}},voiceOptions:{url:"/voice/::0::/options",get:{model:"fdvOptionsModel"},post:{model:""}},voiceCalendar:{url:"/voice/::0::/calendar",get:{model:"fdvCalendarEventListModel"}},voiceCalendarEvent:{url:"/voice/::0::/calendar/::1::",get:{model:"fdvCalendarEventModel"},post:{model:""},"delete":{model:""}},voiceMailboxes:{url:"/voice/::0::/mailboxes",get:{model:"fdvMailboxListModel"}},voiceMailboxDelete:{url:"/voice/::0::/mailboxes/::1::","delete":{model:""}},voiceMailboxMessages:{url:"/voice/::0::/mailboxes/::1::/messages",get:{model:"fdvMailboxMessageListModel"},"delete":{model:""}},voiceMailboxMessage:{url:"/voice/::0::/mailboxes/::1::/messages/::2::",get:{model:"fdvMailboxMessageModel"},post:{model:""},"delete":{model:""}},voiceMailboxMessageForward:{url:"/voice/::0::/mailboxes/::1::/messages/::2::/forward",post:{model:""}},voiceMailboxTotalUnread:{url:"/voice/::0::/mailboxes/::1::/totalUnread",get:{model:"fdvMailboxOptionsModel"}},voiceMailboxOptions:{url:"/voice/::0::/mailboxes/::1::/options",get:{model:"fdvMailboxOptionsModel"},post:{model:""}},voiceMailboxPasscode:{url:"/voice/::0::/mailboxes/::1::/passcode",post:{model:""}},voiceMailboxPasscodeReset:{url:"/voice/::0::/mailboxes/::1::/resetPasscode",post:{model:"fdvPassCodeModel"}},voiceMailboxPincodeReset:{url:"/voice/::0::/mailboxes/::1::/resetPin",post:{model:"fdvPassCodeModel"}},voiceMailboxAuth:{url:"/voice/::0::/mailboxes/::1::/auth",post:{model:""}},voiceContacts:{url:"/voice/::0::/contacts",get:{model:"fdvContactListModel"},post:{model:""},"delete":{model:""}},voiceContactsStats:{url:"/voice/::0::/contactsstats",get:{model:"fdvContactsStatsModel"}},voiceContact:{url:"/voice/::0::/contacts/::1::",get:{model:"fdvContactModel"},post:{model:""},"delete":{model:""}},voiceSummary:{url:"/voice/::0::/summary/::1::",get:{model:"fdvSummaryModel"}},session:{url:"/session",get:{model:"fdvSessionModel"},post:{model:""}},profileServices:{url:"/profile/services",get:{model:"fdvProfileServicesModel"}}},createApi=function(base,list,api,args){var url=base+list[api].url;if(!url)return"";for(var i=0;i0&&(additionalUrlProperties+="&"),additionalUrlProperties+=property+"="+urlParams[property]);var url=createApi(baseJsonApiUrl,jsonApis,api,args);return additionalUrlProperties.length>0&&(url+="?"+encodeURI(additionalUrlProperties)),url=fdvConfig.getServer()+"/"+url}};this.getModel=function(modelName,data){var modelFactory=$injector.get(modelName),model=new modelFactory;return model.setData(data),model},this.get=function(api,args,urlParams){var deferred=$q.defer();return fdvHTTPClient.get(conf.jsonApi(api,args,urlParams)).then(function(data){var model=this.getModel(jsonApis[api].get.model,data.data);deferred.resolve(model)}.bind(this))["catch"](function(data){deferred.reject(data)}),deferred.promise},this.post=function(api,args,body){var deferred=$q.defer();return fdvHTTPClient.post(conf.jsonApi(api,args),body).then(function(data){var model;"undefined"!=typeof jsonApis[api].post&&"undefined"!=typeof jsonApis[api].post.model&&""!=jsonApis[api].post.model&&(model=this.getModel(jsonApis[api].post.model,data.data)),deferred.resolve(model)}.bind(this))["catch"](function(data){deferred.reject(data)}),deferred.promise},this["delete"]=function(api,args,body){var deferred=$q.defer();return fdvHTTPClient["delete"](conf.jsonApi(api,args),body).then(function(data){var model;"undefined"!=typeof jsonApis[api]["delete"]&&"undefined"!=typeof jsonApis[api]["delete"].model&&""!=jsonApis[api]["delete"].model&&(model=this.getModel(jsonApis[api]["delete"].model,data.data)),deferred.resolve(model)}.bind(this))["catch"](function(data){deferred.reject(data)}),deferred.promise},this.voiceGetByAccount=function(){return this.get("accountVoice",arguments)},this.voiceGet=function(){return this.get("voice",arguments)},this.voicePhoneNumberGet=function(){return this.get("voicePhoneNumber",arguments)},this.voiceVirtualNumbersGet=function(){return this.get("voiceVirtualNumbers",arguments)},this.voiceVirtualNumberGet=function(){return this.get("voiceVirtualNumber",arguments)},this.voiceVirtualNumberPost=function(phoneNumber,virtualId,body){return this.post("voiceVirtualNumber",arguments,body)},this.voiceCallPost=function(phoneNumber,callTo){var body={};return phoneNumber&&(body.phoneNumber=callTo),this.post("voiceCall",arguments,body)},this.voiceCallHistoryGet=function(){return this.get("voiceCallHistory",arguments)},this.voiceCallHistoryPagedGet=function(phoneNumber,page,maxperpage,filter){return"undefined"==typeof filter?this.get("voiceCallHistory",arguments,{pageNumber:page,pageSize:maxperpage}):this.get("voiceCallHistory",arguments,{pageNumber:page,pageSize:maxperpage,status:filter})},this.voiceCallHistoryDelete=function(){return this["delete"]("voiceCallHistory",arguments)},this.voiceCallHistoryDeleteEntry=function(){return this["delete"]("voiceCallHistoryDeleteEntry",arguments)},this.voiceOptionsGet=function(phoneNumber){return this.get("voiceOptions",[phoneNumber])},this.voiceOptionsPost=function(phoneNumber,optionsModel){var body={};phoneNumber&&optionsModel&&(body=optionsModel);var args=[phoneNumber];return this.post("voiceOptions",args,body)},this.voiceCalendarGet=function(){return this.get("voiceCalendar",arguments)},this.voiceCalendarGetPaged=function(phoneNumber,month,year){return this.get("voiceCalendar",arguments,{month:month,year:year})},this.voiceCalendarEventGet=function(){return this.get("voiceCalendarEvent",arguments)},this.voiceCalendarEventPost=function(phoneNumber,eventModel){var body={};"undefined"!=typeof eventModel.id&&delete eventModel.id,phoneNumber&&eventModel&&(body=eventModel.toJson());var args=[phoneNumber];return this.post("voiceCalendar",args,body)},this.voiceCalendarEventPut=function(phoneNumber,eventid,eventModel){var body={};phoneNumber&&eventModel&&(body=eventModel.toJson());var args=[phoneNumber,eventid];return this.post("voiceCalendarEvent",args,body)},this.voiceCalendarEventDelete=function(){return this["delete"]("voiceCalendarEvent",arguments)},this.voiceMailboxesGet=function(){return this.get("voiceMailboxes",arguments)},this.voiceMailboxesDelete=function(){return this["delete"]("voiceMailboxDelete",arguments)},this.voiceMailboxMessagesGet=function(){return this.get("voiceMailboxMessages",arguments)},this.voiceMailboxMessagesPagedGet=function(phoneNumber,mailboxId,page,maxperpage,filter){return"undefined"==typeof filter?this.get("voiceMailboxMessages",arguments,{pageNumber:page,pageSize:maxperpage}):this.get("voiceMailboxMessages",arguments,{pageNumber:page,pageSize:maxperpage,filter:filter})},this.voiceMailboxMessagesDelete=function(){return this["delete"]("voiceMailboxMessages",arguments)},this.voiceMailboxMessageGet=function(){return this.get("voiceMailboxMessage",arguments)},this.voiceMailboxMessagePost=function(phoneNumber,mailboxId,messageId,mailboxMessageModel){var body=mailboxMessageModel.toJson(),args=[phoneNumber,mailboxId,messageId];return this.post("voiceMailboxMessage",args,body)},this.voiceMailboxMessageDelete=function(){return this["delete"]("voiceMailboxMessage",arguments)},this.voiceMailboxMessageForward=function(phoneNumber,mailboxId,messageId,voicemailForwardModel){var body=voicemailForwardModel.toJson(),args=[phoneNumber,mailboxId,messageId];return this.post("voiceMailboxMessageForward",args,body)},this.voiceMailboxTotalUnreadGet=function(){return this.get("voiceMailboxTotalUnread",arguments)},this.voiceMailboxOptionsGet=function(){return this.get("voiceMailboxOptions",arguments)},this.voiceMailboxOptionsPost=function(phoneNumber,mailboxId,optionsModel){var body=optionsModel,args=[phoneNumber,mailboxId];return this.post("voiceMailboxOptions",args,body)},this.voiceMailboxPasscodePost=function(phoneNumber,mailboxId,currentPasscode,newCode){var body={current:currentPasscode,newPasscode:newCode&&newCode.newPasscode,newPin:newCode&&newCode.newPin},args=[phoneNumber,mailboxId];return this.post("voiceMailboxPasscode",args,body)},this.voiceMailboxPasscodeResetPost=function(phoneNumber,mailboxId){var args=[phoneNumber,mailboxId];return this.post("voiceMailboxPasscodeReset",args)},this.voiceMailboxPincodeResetPost=function(phoneNumber,mailboxId){var args=[phoneNumber,mailboxId];return this.post("voiceMailboxPincodeReset",args)},this.voiceMailboxAuthPost=function(phoneNumber,mailboxId,passcode){var body={passcode:passcode},args=[phoneNumber,mailboxId];return this.post("voiceMailboxAuth",args,body)},this.voiceContactsStatsGet=function(){return this.get("voiceContactsStats",arguments)},this.voiceContactsGet=function(){return this.get("voiceContacts",arguments)},this.voiceContactsPagedGet=function(phoneNumber,page,maxperpage,filter){return"undefined"!=typeof filter?this.get("voiceContacts",arguments,{pageNumber:page,pageSize:maxperpage,nameStartsWith:filter}):this.get("voiceContacts",arguments,{pageNumber:page,pageSize:maxperpage})},this.voiceContactsPost=function(phoneNumber,contactModel){var body=contactModel.toJson(),args=[phoneNumber];return this.post("voiceContacts",args,body)},this.voiceContactsDeleteAll=function(){return this["delete"]("voiceContacts",arguments)},this.voiceContactGet=function(){return this.get("voiceContact",arguments)},this.voiceContactPost=function(phoneNumber,contactId,contactModel){var body=contactModel.toJson(),args=[phoneNumber,contactId];return this.post("voiceContact",args,body)},this.voiceContactDelete=function(){return this["delete"]("voiceContact",arguments)},this.voiceSummaryGet=function(){return this.get("voiceSummary",arguments)},this.sessionGet=function(){return this.get("session",arguments)},this.stbSessionPost=function(unitAddress){var body={type:"stb",unitAddress:unitAddress};return this.post("session",[],body)},this.profileServicesGet=function(){return this.get("profileServices",arguments)}}]),angular.module("fdvService.services").service("fdvNativeApi",["$q","$timeout","fdvLog",function($q,$timeout,fdvLog){ this.isOnDevice=function(){return"undefined"!=typeof window.FrontierApp&&window.FrontierApp.nativeContentReady?!0:!1},this.nativeContentReady=function(){"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeContentReady&&$timeout(function(){window.FrontierApp.nativeContentReady()},100)},this.handleNonNative=function(){var deferred=$q.defer();return $timeout(function(){deferred.reject()},0),deferred.promise},this.registerWebViewResume=function(resumeCallback){"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeGetContacts&&(window.FrontierApp.onResumeCallback=function(){resumeCallback()})},this.unregisterWebViewResume=function(){"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeGetContacts&&(window.FrontierApp.onResumeCallback=void 0)},this.nativeGetContacts=function(){if("undefined"!=typeof window.FrontierApp&&FrontierApp.nativeGetContacts){var deferred=$q.defer();return window.FrontierApp.getContactsCallback=function(contacts){fdvLog.debug("nativeapi","window.FrontierApp.getContactsCallback contacts ="+contacts),"string"==typeof contacts&&(contacts=JSON.parse(contacts)),deferred.resolve(contacts)}.bind(this),window.FrontierApp.nativeGetContacts(),deferred.promise}return this.handleNonNative()},this.nativeAddContact=function(firstName,middleName,lastName,homeNumber,workNumber,mobileNumber,workMobileNumber){if("undefined"!=typeof window.FrontierApp&&FrontierApp.nativeAddContact){var deferred=$q.defer(),contactJson={firstName:firstName,middleName:middleName,lastName:lastName,homeNumber:homeNumber,workNumber:workNumber,mobileNumber:mobileNumber,workMobileNumber:workMobileNumber};return window.FrontierApp.addContactCallback=function(success){fdvLog.debug("nativeapi","window.FrontierApp.addContactCallback success ="+success),deferred.resolve(success)}.bind(this),window.FrontierApp.nativeAddContact(JSON.stringify(contactJson)),deferred.promise}return this.handleNonNative()},this.nativeCreateNewContactInContactView=function(name,phoneNumber){if("undefined"!=typeof window.FrontierApp&&FrontierApp.createNewContactInContactView){var deferred=$q.defer();return window.FrontierApp.createNewContactInContactViewCallback=function(success){fdvLog.debug("nativeapi","window.FrontierApp.createNewContactInContactView success ="+success),success===!0||"true"===success?deferred.resolve(success):deferred.reject(success)}.bind(this),window.FrontierApp.createNewContactInContactView(name,phoneNumber),deferred.promise}return this.handleNonNative()},this.nativeEditContactInContactView=function(name,phoneNumber){if("undefined"!=typeof window.FrontierApp&&FrontierApp.editContactInContactView){var deferred=$q.defer();return window.FrontierApp.editContactInContactViewCallback=function(success){fdvLog.debug("nativeapi","window.FrontierApp.editContactInContactView success ="+success),success===!0||"true"===success?deferred.resolve(success):deferred.reject(success)}.bind(this),window.FrontierApp.editContactInContactView(name,phoneNumber),deferred.promise}return this.handleNonNative()},this.nativeViewContactInContactView=function(phoneNumber){if("undefined"!=typeof window.FrontierApp&&FrontierApp.editContactInContactView){var deferred=$q.defer();return window.FrontierApp.viewContactInContactViewCallback=function(success){fdvLog.debug("nativeapi","window.FrontierApp.viewContactInContactView success ="+success),success===!0||"true"===success?deferred.resolve(success):deferred.reject(success)}.bind(this),window.FrontierApp.viewContactInContactView(phoneNumber),deferred.promise}return this.handleNonNative()},this.nativeGetContactsByPhoneNumber=function(phoneNumber){if("undefined"!=typeof window.FrontierApp&&FrontierApp.nativeAddContact){var deferred=$q.defer();return window.FrontierApp.getContactsByPhoneNumberCallback=function(success){fdvLog.debug("nativeapi","window.FrontierApp.getContactsByPhoneNumber success ="+success),"[object Array]"===Object.prototype.toString.call(success)&&success.length>0?deferred.resolve(success):deferred.reject(success)}.bind(this),window.FrontierApp.getContactsByPhoneNumber(phoneNumber),deferred.promise}return this.handleNonNative()},this.nativeOpenDialPad=function(phoneNumber){"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeOpenDialPad&&window.FrontierApp.nativeOpenDialPad(phoneNumber)},this.nativeOpenSMSApp=function(phoneNumber,message){"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeOpenSMSApp&&window.FrontierApp.nativeOpenSMSApp(phoneNumber,message)},this.nativeOpenBrowser=function(url){return"undefined"!=typeof window.FrontierApp&&FrontierApp.nativeAddContact?window.FrontierApp.nativeOpenBrowser(url):void 0},this.nativeOpenPdf=function(url,date){var success;return success="undefined"!=typeof window.FrontierApp&&window.FrontierApp.nativeOpenPdf?window.FrontierApp.nativeOpenPdf(url,date):"undefined"!=typeof window.FrontierApp&&window.FrontierApp.nativeOpenBrowser?window.FrontierApp.nativeOpenBrowser(url):window.open(url)},this.nativeIsTelephonyAvailable=function(){if("undefined"!=typeof window.FrontierApp&&window.FrontierApp.nativeIsTelephonyAvailable){var deferred=$q.defer();return window.FrontierApp.isTelephonyAvailableCallback=function(available){fdvLog.debug("nativeapi","window.FrontierApp.isTelephonyAvailableCallback available ="+available),available===!0||"true"===available?deferred.resolve():deferred.reject()},window.FrontierApp.nativeIsTelephonyAvailable(),deferred.promise}return this.handleNonNative()},this.registerWebviewBackground=function(backgroundCallback){"undefined"!=typeof window.FrontierApp&&(fdvLog.debug("nativeapi","Register onBackground callback"),window.FrontierApp.onBackgroundCallback=function(){fdvLog.debug("nativeapi","onBackground callback gets called."),backgroundCallback()})},this.unregisterWebviewBackground=function(){"undefined"!=typeof window.FrontierApp&&(fdvLog.debug("nativeapi","Unregister onBackground callback"),window.FrontierApp.onBackgroundCallback=void 0)}}]),angular.module("fdvService.utils").service("fdvServiceProxy",["$timeout","fdvLog","fdvConfig","fdvActionManager","fdvModalManager","fdvConstant","fdvRoute","fdvAnalytics",function($timeout,fdvLog,fdvConfig,fdvActionManager,fdvModalManager,fdvConstant,fdvRoute,fdvAnalytics){var scope,componentName="Service Proxy";angular.forEach(fdvConstant,function(value,key){this[key]=value}.bind(this)),this.authenticateVoicemails=function(){return fdvActionManager.accessVoicemails()},this.sendEvent=function(event){switch(fdvLog.debug(componentName,"Event received: event = "+event.type),event.type){case fdvConstant.EVENT.BACK_BUTTON_CLICKED:return fdvModalManager.isModalOpen()?($("#fdv-modal").modal("hide"),!0):fdvRoute.goBack();case fdvConstant.EVENT.KEY_PRESSED:angular.isDefined(scope)&&$timeout(function(){scope.$broadcast(event.type,event.data)})}return!1},this.subscribeEvent=function(target){scope=target},this.unsubscribeEvent=function(){scope=void 0},this.setDebugWindow=function(element){fdvLog.setDebugWindow(element)},this.setUnitAddress=function(){fdvConfig.setUnitAddress(unitAddress)},this.setAnalyticsProvider=function(analyticsProvider){fdvAnalytics.setServiceProvider(analyticsProvider)}}]),angular.module("fdvService.services").service("fdvSettingsItem",["$q","fdvLog","fdvJsonApi","fdvActionManager","fdvConstant","fdvScheduleModel","fdvLocateTargetModel","fdvConfig","locale",function($q,fdvLog,fdvJsonApi,fdvActionManager,fdvConstant,fdvScheduleModel,fdvLocateTargetModel,fdvConfig,locale){var item,description,tab,rings,mailboxes,active;this.getSettingsItem=function(){return item},this.setSettingsItem=function(i){item=i},this.getSettingsItemValue=function(){return item&&item.value},this.getDescription=function(){return description},this.setDescription=function(d){description=d},this.getSettingsTab=function(){return tab},this.setSettingsTab=function(t){tab=t},this.getRings=function(){return rings},this.setRings=function(r){rings=r},this.getMailboxes=function(){return mailboxes},this.setMailboxes=function(m){mailboxes=m},this.getActive=function(){return active},this.setActive=function(a){active=a},this.setIncomingBlockHtons=function(settings){var numbers=[];return"[object Array]"===Object.prototype.toString.call(settings.numbers)&&settings.numbers.forEach(function(itemData){numbers.push(itemData)}),{enabled:settings.enabled,numbers:numbers}},this.incomingBlock=function(data){var model={};if("object"==typeof data.blockIncomingSelectedNumbers&&null!==data.blockIncomingSelectedNumbers){var numbers=[];"[object Array]"===Object.prototype.toString.call(data.blockIncomingSelectedNumbers.numbers)&&data.blockIncomingSelectedNumbers.numbers.forEach(function(itemData){numbers.push(itemData)}),model.enabled=!!data.blockIncomingSelectedNumbers.enabled}else model.enabled=!1;return model.numbers=numbers,model.blockIncomingAnonymousOrPrivate=!!data.blockIncomingAnonymousOrPrivate,model},this.callNotifications=function(data){var model={},numbers=[];return data=data||{enabled:!1},"object"==typeof data.bySourceNumbers?("[object Array]"===Object.prototype.toString.call(data.bySourceNumbers.numbers)&&data.bySourceNumbers.numbers.forEach(function(itemData){numbers.push(itemData)}),model.bySourceNumbers={enabled:data.bySourceNumbers.enabled,numbers:numbers}):model.bySourceNumbers={enabled:!1,numbers:numbers},model.enabled=data.enabled,model.email=data.email,model},this.callForwarding=function(data){var model={},numbers=[];return model.destNumber=data.destNumber||"","object"==typeof data.bySourceNumbers?("[object Array]"===Object.prototype.toString.call(data.bySourceNumbers.numbers)&&data.bySourceNumbers.numbers.forEach(function(itemData){numbers.push(itemData)}),model.bySourceNumbers={enabled:data.bySourceNumbers.enabled,numbers:numbers}):model.bySourceNumbers={enabled:!1,numbers:[]},model.enabled=data.enabled,model},this.simultaneousRing=function(data){var numbers=[];return"[object Array]"===Object.prototype.toString.call(data.numbers)&&data.numbers.forEach(function(itemData){numbers.push(itemData)}),{enabled:data.enabled,numbers:numbers}},this.dnd=function(data){var model={},numbers=[];return"object"==typeof data.exceptions?("[object Array]"===Object.prototype.toString.call(data.exceptions.numbers)&&data.exceptions.numbers.forEach(function(itemData){numbers.push(itemData)}),model.exceptions={enabled:data.exceptions.enabled,numbers:numbers}):model.exceptions={enabled:!1,numbers:[]},model.enabled=data.enabled,model.action=data.action,model},this.locateMe=function(data){var model={},targets=[];"[object Array]"===Object.prototype.toString.call(data.targets)&&data.targets.forEach(function(itemData){var target=new fdvLocateTargetModel(itemData);targets.push(target)});for(var i=targets.length;3>i;i++){var target=new fdvLocateTargetModel;target.numberRings=4,targets.push(target)}return model.targets=targets,model.enabled=data.enabled,model},this.voicemailNotifications=function(data){var model={},targets={},warnings={};return"object"==typeof data.targets?(targets.mobileNumber=data.targets.mobileNumber?angular.copy(data.targets.mobileNumber):void 0,targets.pagerNumber=data.targets.pagerNumber?angular.copy(data.targets.pagerNumber):void 0,targets.email=data.targets.email?angular.copy(data.targets.email):void 0,targets.forwardToNumber=data.targets.forwardToNumber?angular.copy(data.targets.forwardToNumber):void 0):(targets.mobileNumber={enabled:!1,number:"",provider:""},targets.pagerNumber={enabled:!1,number:"",provider:""},targets.email={enabled:!1,address:"",attachVoiceMail:!1},targets.forwardToNumber={enabled:!1,number:""}),model.enabled=data.enabled,model.useMessageLightOrStutterTone=data.useMessageLightOrStutterTone,model.targets=targets,model.warnings=warnings,model},this.defaultSettings=function(tab,callSettings,voicemailSettings,callOptions,voicemailOptions,mailboxes){voicemailSettings.forEach(function(element){var o=voicemailOptions[element.model];switch(element.model){case"resetPasscode":element.settings={},element.settings.resetCompletedArray=[],element.settings.resetFailedArray=[],element.settings.resetPinCompletedArray=[],element.settings.resetPinFailedArray=[],element.settings.passCodeArray=[],element.settings.pinCodeArray=[],mailboxes.forEach(function(){element.settings.resetCompletedArray.push(!1),element.settings.resetFailedArray.push(!1),element.settings.resetPinCompletedArray.push(!1),element.settings.resetPinFailedArray.push(!1),element.settings.passCodeArray.push(!1),element.settings.pinCodeArray.push(!1)});break;case"notifications":element.model="voicemailNotifications",element.value="undefined"!=typeof o&&null!==o,element.settings=o||{}}})},this.options2Settings=function(tab,callSettings,voicemailSettings,accountSettings,callOptions,voicemailOptions,mailboxes,virtualNumbers){var self=this;callOptions.voicemailEnabled=!0;var addRootFor=function(element){element.root={},callSettings.forEach(function(item){element.root[item.model]=item})};[callSettings,voicemailSettings,accountSettings].forEach(function(arr,index){1!==index?(self.setActive(callOptions.voicemailEnabled),arr.forEach(function(element){switch(addRootFor(element),element.model){case"callWaiting":element.value=callOptions.callWaiting;break;case"forwarding":element.settings=self.callForwarding(callOptions[element.model]),element.value=element.settings.enabled===!0,fdvConfig.isMobile()&&(element.forwardingOptions=["fdv.settings-forwarding-options-all","fdv.settings-forwarding-options-selected"],element.choice=element.settings.bySourceNumbers.enabled?element.forwardingOptions[1]:element.forwardingOptions[0]);break;case"notifications":element.settings=self.callNotifications(callOptions[element.model]),element.value=element.settings.enabled===!0;break;case"simultaneousRing":element.settings=self.simultaneousRing(callOptions[element.model]),element.value=element.settings.enabled===!0;break;case"dnd":element.settings=self.dnd(callOptions[element.model]),element.value=element.settings.enabled===!0,element.dndOptions=["fdv.settings-dnd-options-all","fdv.settings-dnd-options-play-message"],element.settings.voicemailEnabled=callOptions.voicemailEnabled,fdvConfig.isMobile()&&(element.choice=element.settings.exceptions.enabled?element.dndOptions[1]:element.dndOptions[0]);break;case"locateMe":element.settings=self.locateMe(callOptions[element.model]),element.value=element.settings.enabled===!0;break;case"virtualNumbers":element.settings=callOptions[element.model]||{},element.settings.numbers=virtualNumbers.virtualNumbers instanceof Array?virtualNumbers.virtualNumbers:[],element.settings.backups=virtualNumbers.virtualNumbers instanceof Array?angular.copy(virtualNumbers.virtualNumbers):[],element.value=element.settings.numbers.length>0;break;case"blockIncomingAnonymousOrPrivate":element.settings=self.incomingBlock(callOptions),element.value=element.settings.blockIncomingAnonymousOrPrivate||element.settings.enabled===!0;break;case"blockOutgoingCallerId":element.value=callOptions.blockOutgoingCallerId,element.settings=callOptions.blockOutgoingInternational;break;case"voicemailNumberRings":self.setRings(callOptions[element.model]);break;case"profile":case"timeOffset":case"backupNumber":element.settings=callOptions[element.model]||{};break;case"blockOutgoingInternational":element.settings=callOptions[element.model]}})):arr.forEach(function(element){addRootFor(element);var o=voicemailOptions[element.model];switch(element.voicemail=!0,element.model){case"voiceMail":element.value=!0;break;case"mailboxes":var requirePasscode=voicemailOptions.requirePasscode?voicemailOptions.requirePasscode.requirePasscode:!1;element.settings={mailboxes:mailboxes,requirePasscode:requirePasscode};break;case"screening":element.value=voicemailOptions.screening,element.settings=voicemailOptions.screening;break;case"validation":break;case"greeting":element.value="undefined"!=typeof o&&null!==o,element.settings=o||{},element.oldType=element.settings.type,element.settings.type=element.settings.extendedAbsence?"extended":element.settings.type,element.greetingOption="extended"===element.settings.type?"fdv.settings-greeting-options-extended":"personal"===element.settings.type?"fdv.settings-greeting-options-personal":("system"===element.settings.type,"fdv.settings-greeting-options-system"),element.systemGreetingOption="system_name"===element.settings.type?"fdv.settings-greeting-options-system-name":"system_number"===element.settings.type?"fdv.settings-greeting-options-system-number":"fdv.settings-greeting-options-system-neither";break;case"settings":element.value="undefined"!=typeof o&&null!==o,element.settings=o||{},element.settings.numberRings=self.getRings();break;case"voicemailNotifications":var o=voicemailOptions.notifications;element.model="voicemailNotifications",element.value="undefined"!=typeof o&&null!==o,element.settings=self.voicemailNotifications(o);break;case"resetPasscode":element.settings={},element.settings.resetCompletedArray=[],element.settings.resetFailedArray=[],element.settings.resetPinCompletedArray=[],element.settings.resetPinFailedArray=[],element.settings.passCodeArray=[],element.settings.pinCodeArray=[],mailboxes.forEach(function(){element.settings.resetCompletedArray.push(!1),element.settings.resetPinCompletedArray.push(!1),element.settings.resetFailedArray.push(!1),element.settings.resetPinFailedArray.push(!1),element.settings.passCodeArray.push(!1),element.settings.pinCodeArray.push(!1)});break;default:fdvLog.debug("SETTINGS","No such model: "+element.model)}})})},this.update=function(item,phoneLine,mailbox){var deferred=$q.defer(),currentItem=this.getSettingsItem();currentItem&¤tItem.model!==item.model||this.setSettingsItem(item);var self=this,model=item.model,type="call settings",settings={},secondSettings={};switch(model){case"callWaiting":case"blockOutgoingCallerId":settings[model]=item.value;break;case"blockIncomingAnonymousOrPrivate":settings.blockIncomingAnonymousOrPrivate=item.settings.blockIncomingAnonymousOrPrivate,settings.blockIncomingSelectedNumbers=self.setIncomingBlockHtons(item.settings);break;case"timeOffset":case"backupNumber":case"blockOutgoingInternational":settings[model]=item.settings;break;case"simultaneousRing":settings[model]={},settings[model].enabled=item.value,settings[model].numbers=[],"[object Array]"===Object.prototype.toString.call(item.settings.numbers)&&item.settings.numbers.forEach(function(value){value&&settings.simultaneousRing.numbers.push(value)});break;case"locateMe":settings[model]={},settings[model].enabled=item.value,settings[model].targets=[],item.settings.targets instanceof Array&&item.settings.targets.forEach(function(target){if(target instanceof Object&&target.number){var locateMeTarget={};locateMeTarget.number=target.number,locateMeTarget.numberRings=target.numberRings,settings.locateMe.targets.push(locateMeTarget)}});break;case"forwarding":case"dnd":settings[model]=item.settings,settings[model].enabled=item.value;break;case"virtualNumbers":settings[model]={},settings[model].enabled=item.value;break;case"voicemailNotifications":settings.notifications={},settings.notifications.useMessageLightOrStutterTone=item.settings.useMessageLightOrStutterTone,settings.notifications.targets=angular.copy(item.settings.targets),settings.notifications.warnings={},type="voicemail settings";break;case"notifications":settings[model]=item.settings,settings[model].enabled=item.value;break;case"greeting":type="voicemail settings",item.settings.extendedAbsence="extended"===item.settings.type,item.settings.type="extended"===item.settings.type?item.oldType:item.settings.type,settings[model]=item.settings;break;case"voiceMail":settings.voicemailEnabled=item.value;break;case"settings":type="voicemail settings",settings.settings={},settings.settings.prompts=item.settings.prompts,secondSettings.voicemailNumberRings=item.settings.numberRings;break;case"validation":type="voicemail settings",settings.passCode=item.settings;break;case"screening":type="voicemail settings",settings[model]=item.value;break;case"mailboxes":type="voicemail settings",settings.requirePasscode=item.settings.requirePasscode;break;default:fdvLog.debug("SETTINGS","No such model: "+model)}if("voicemail settings"===type)if("validation"===model){var settingObject;settingObject="pinpass"===item.settings.passcodeChangeType?{newPin:settings.passCode.newPin,newPasscode:settings.passCode.newPasscode}:"pin"===item.settings.passcodeChangeType?{newPin:settings.passCode.newPin}:{newPasscode:settings.passCode.newPasscode},fdvJsonApi.voiceMailboxPasscodePost(phoneLine,mailbox,settings.passCode.current,settingObject).then(function(){deferred.resolve()})["catch"](function(){fdvLog.debug("SETTINGS","Couldn't update passcode."),deferred.reject(),self.toast({str:"fdv.settings-options-not-saved",type:"error"})})}else"settings"===model?$q.all(fdvJsonApi.voiceMailboxOptionsPost(phoneLine,mailbox,settings),fdvJsonApi.voiceOptionsPost(phoneLine,secondSettings)).then(function(){fdvLog.debug("SETTINGS","Successfully saved options"),deferred.resolve()})["catch"](function(){fdvLog.debug("SETTINGS","Couldn't save settings"),deferred.reject(),self.toast({str:"fdv.settings-options-not-saved",type:"error"})}):fdvJsonApi.voiceMailboxOptionsPost(phoneLine,mailbox,settings).then(function(){deferred.resolve()})["catch"](function(){fdvLog.debug("SETTINGS","Couldn't save settings"),deferred.reject(),self.toast({str:"fdv.settings-options-not-saved",type:"error"})});else if("virtualNumbers"===model){var numbers=[];item.settings.numbers.forEach(function(number){var same=!1;item.settings.backups.forEach(function(n){n.number===number.number&&n.distinctiveRing.enabled===number.distinctiveRing.enabled&&n.distinctiveRing.setting===number.distinctiveRing.setting&&(same=!0)}),same||numbers.push(number)}),numbers.length>0?fdvJsonApi.voiceVirtualNumberPost(phoneLine,numbers[0].id,numbers[0]).then(function(){return numbers.length>1?fdvJsonApi.voiceVirtualNumberPost(phoneLine,numbers[1].id,numbers[1]):(fdvLog.debug("SETTINGS","Successfully saved options"),item.settings.backups=angular.copy(item.settings.numbers),deferred.resolve(),void 0)}).then(function(){return numbers.length>2?fdvJsonApi.voiceVirtualNumberPost(phoneLine,numbers[2].id,numbers[2]):(fdvLog.debug("SETTINGS","Successfully saved options"),item.settings.backups=angular.copy(item.settings.numbers),deferred.resolve(),void 0)}).then(function(){fdvLog.debug("SETTINGS","Successfully saved options"),item.settings.backups=angular.copy(item.settings.numbers),deferred.resolve()})["catch"](function(){fdvLog.debug("SETTINGS","Couldn't save settings"),self.toast({str:"fdv.settings-options-not-saved",type:"error"}),deferred.reject()}):deferred.resolve()}else fdvLog.debug("SETTINGS","Successfully saved options"),fdvJsonApi.voiceOptionsPost(phoneLine,settings).then(function(){deferred.resolve()})["catch"](function(){deferred.reject()});return deferred.promise},this.deleteMailbox=function(item,phoneLine,mailbox,cb,errCb){fdvJsonApi.voiceMailboxesDelete(phoneLine,mailbox).then(function(){cb()})["catch"](function(){fdvLog.debug("SETTINGS","Couldn't save settings"),errCb()})},this.toast=function(message){var toastMessage=message,type="undefined"!=typeof message.type&&"error"===message.type?fdvConstant.ALERT.DANGER:fdvConstant.ALERT.INFO;"undefined"!=typeof message.str&&(toastMessage=locale.getString(message.str)),fdvActionManager.showNotification(type,toastMessage)}}]),angular.module("fdvService.services").service("fdvUserData",["$q","$timeout","fdvLog","fdvJsonApi","fdvLocaleManager",function($q,$timeout,fdvLog,fdvJsonApi,fdvLocaleManager){var selectedPhoneLine,selectedMailbox,phoneLines,phoneLinesAccountNumber,mailboxes,mailboxesPhoneNumber,contacts,contactsPhoneNumber,options,optionsPhoneNumber;this.getUserPhoneLines=function(){return phoneLines},this.setSelectedPhoneLine=function(phoneLine){selectedPhoneLine=phoneLine},this.getSelectedPhoneLine=function(){return selectedPhoneLine},this.getUnselectedPhoneLines=function(){var unselectedPhoneLines=[];return angular.forEach(phoneLines,function(value){value.number!==selectedPhoneLine.number&&unselectedPhoneLines.push(value)}),unselectedPhoneLines},this.setSelectedMailbox=function(mailbox){selectedMailbox=mailbox},this.getSelectedMailbox=function(){return selectedMailbox},this.getPhoneLines=function(accountNumber){var deferred=$q.defer();return"undefined"!=typeof phoneLines&&phoneLinesAccountNumber===accountNumber?$timeout(function(){deferred.resolve(phoneLines)}.bind(this)):(phoneLines=void 0,phoneLinesAccountNumber=void 0,selectedPhoneLine=void 0,angular.isDefined(accountNumber)?fdvJsonApi.voiceGetByAccount(accountNumber).then(function(model){phoneLinesAccountNumber=accountNumber,phoneLines=model.voiceNumbers,angular.isArray(phoneLines)&&phoneLines.length>0&&(selectedPhoneLine=phoneLines[0]),deferred.resolve(phoneLines)}.bind(this))["catch"](function(reason){deferred.reject(reason)}):fdvJsonApi.voiceGet().then(function(model){phoneLinesAccountNumber=accountNumber,phoneLines=model.voiceNumbers,angular.isArray(phoneLines)&&phoneLines.length>0&&(selectedPhoneLine=phoneLines[0]),deferred.resolve(phoneLines)}.bind(this))["catch"](function(reason){deferred.reject(reason)})),deferred.promise},this.setPhoneLines=function(model){phoneLines=model.voiceNumbers,angular.isArray(phoneLines)&&phoneLines.length>0&&(selectedPhoneLine=phoneLines[0])},this.getMailboxes=function(phoneNumber){var deferred=$q.defer();return"undefined"!=typeof mailboxes&&mailboxesPhoneNumber===phoneNumber?$timeout(function(){deferred.resolve(mailboxes)}.bind(this)):(mailboxes=void 0,mailboxesPhoneNumber=void 0,selectedMailbox=void 0,fdvJsonApi.voiceMailboxesGet(phoneNumber).then(function(model){mailboxesPhoneNumber=phoneNumber,mailboxes=model.mailboxes,angular.isArray(mailboxes)&&mailboxes.length>0&&(selectedMailbox=mailboxes[0]),deferred.resolve(mailboxes)}.bind(this))["catch"](function(reason){deferred.reject(reason)})),deferred.promise},this.invalidateContacts=function(){contactsPhoneNumber=""},this.getContacts=function(phoneNumber){var deferred=$q.defer();return"undefined"!=typeof contacts&&contactsPhoneNumber===phoneNumber?$timeout(function(){deferred.resolve(contacts)}.bind(this)):fdvJsonApi.voiceContactsGet(phoneNumber).then(function(model){contactsPhoneNumber=phoneNumber,contacts=model,deferred.resolve(model)}.bind(this))["catch"](function(reason){deferred.reject(reason)}),deferred.promise},this.getContact=function(contacts,phoneNumber){if(angular.isDefined(contacts)&&angular.isArray(contacts.contacts))for(var index=0;index0&&suggestions.push({name:fullName,category:key,number:number,by:"name"})}):(re=new RegExp("^"+keyword,"gi"),angular.forEach(contact.number,function(number,key){re.test(number)&&suggestions.push({name:fullName,category:key,number:number,by:"number"})}))}),suggestions):suggestions},this.loadMultipleData=function(requests){var deferred=$q.defer();angular.isArray(requests)||deferred.reject("Invalid requests");var finished=0;return requests.forEach(function(request){$q.all(request.procs).then(function(results){angular.isFunction(request.success)&&request.success(results),++finished===requests.length&&deferred.resolve()})["catch"](function(reason){angular.isFunction(request.failure)&&request.failure(reason),++finished===requests.length&&deferred.resolve()})}),deferred.promise},this.processVoiceData=function(contacts,options,listData){angular.isArray(listData)&&listData.forEach(function(listItem){if(listItem.isKnownContact=!1,listItem.contactName=fdvLocaleManager.getString("fdv.voicemail-contact-name-unknown"),listItem.phoneNumberType=fdvLocaleManager.getString("fdv.phonenumber-type-unknown"),angular.isDefined(contacts)&&angular.isArray(contacts.contacts))for(var index=0;index0)}.bind(this))}}]),angular.module("fdvService.services").service("fdvValidation",function(){this.validatePhoneNumber=function(value){var isAllZero=new RegExp("^0+$","g").test(value);return!isAllZero&&this.validateValue(value,{prop:{contactNumber:!0}})},this.validateLocalPhoneNumber=function(value){return this.validateValue(value,{prop:{localPhoneNumber:!0}})},this.validateName=function(value){return this.validateValue(value,{prop:{name:!0}})},this.validateCalendarEventName=function(value){return this.validateValue(value,{prop:{string:!0,presence:!0,length:{maximum:100}}})},this.validateLocateNumber=function(value){return this.validateValue(value,{prop:{locateNumber:!0}})},this.validateUniqueLocateNumber=function(value){return this.validateValue(value,{prop:{uniqueLocateNumber:!0}})},this.validateAtLeastOneLocateNumber=function(value){return this.validateValue(value,{prop:{atLeastOneLocateNumber:!0}})},this.validateOldPasscode=function(value){return this.validateValue(value,{prop:{oldPasscode:!0}})},this.validateOldMetaPasscode=function(value){return this.validateValue(value,{prop:{oldMetaPasscode:!0}})},this.validateNewPasscode=function(value){return this.validateValue(value,{prop:{newPasscode:!0}})},this.validateNewPasscodeMismatch=function(value){return this.validateValue(value,{prop:{newPasscodeMismatch:!0}})},this.validateNewPasscodeRepeated=function(value){return this.validateValue(value,{prop:{newPasscodeRepeated:!0}})},this.validateNewPasscodeMetaLength=function(value){return this.validateValue(value,{prop:{newPasscodeMetaLength:!0}})},this.validateNewPasscodeConsecutive=function(value){return this.validateValue(value,{prop:{newPasscodeConsecutive:!0}})},this.validateNewPasscodeContained=function(value){return this.validateValue(value,{prop:{newPasscodeContained:!0}})},this.validateUniquePhoneNumber=function(value){return this.validateValue(value,{prop:{phoneNumberUnique:!0}})},this.validateAtLeastOnePhoneNumber=function(value){return this.validateValue(value,{prop:{phoneNumberAtLeastOne:!0}})},this.validateEmail=function(value){return this.validateValue(value,{prop:{emailOrEmailObject:!0}})},this.validateDateStartEndTimes=function(startDate,endDate){return moment(startDate).year()==moment(endDate).year()&&moment(startDate).month()==moment(endDate).month()&&moment(startDate).day()==moment(endDate).day()&&moment(startDate).hour()==moment(endDate).hour()&&moment(startDate).minute()==moment(endDate).minute()||moment(startDate).isAfter(endDate)?!1:!0},this.validateValue=function(value,constraints){var model={prop:value},validationResult=validate(model,constraints);return"undefined"==typeof validationResult},this.onlyDigits=function(value){return value.replace(/([\D]*)/g,"")},this.isEmpty=function(value){return angular.isUndefined(value)||null===value||angular.isString(value)&&""===value.trim()}}),angular.module("fdvService.directives").directive("fdvNumberlist",["fdvLog","fdvConfig","fdvSettingsItem","fdvValidation","fdvConstant",function(fdvLog,fdvConfig,fdvSettingsItem,fdvValidation,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("settings/settings-number-list.html"),scope:!0,controller:["$scope",function($scope){var params=$scope.routeManager.getCurrentRoute().getParamsData(),maxPerPage=fdvConstant.PAGINATION.MAX_PER_PAGE_FOR_STB;$scope.item=params.item,$scope.numberEdits=[],$scope.selectedPage=0,$scope.loadNumbers=function(){$scope.pageData={maxItems:$scope.item.settings.numbers.length,maxItemsPerPage:maxPerPage};var base=$scope.selectedPage*$scope.pageData.maxItemsPerPage;$scope.item.pagedNumbers=$scope.item.settings.numbers.slice(base,base+maxPerPage)},$scope.loadNumbers(),$scope.paginationSelectionChanged=function(page){$scope.selectedPage=page,$scope.loadNumbers()},$scope.item.settings.numbers&&$scope.item.settings.numbers instanceof Array&&$scope.item.settings.numbers.forEach(function(){$scope.numberEdits.push(!1)}),$scope.editNumber=function(index){$scope.numberEdits[index]?$scope.saveNumber(index,$scope.item.currentEditedNumber):($scope.currentEditedNumber=$scope.item.settings.numbers[index],$scope.numberEdits[index]=!0)},$scope.deleteNumber=function(index){$scope.item.settings.numbers.splice(index,1),$scope.numberEdits.splice(index,1),fdvSettingsItem.setSettingsItem($scope.item)},$scope.saveNumber=function(index,value){value&&$scope.item.settings.numbers.indexOf(value)<0&&($scope.item.settings.numbers[index]=value,fdvSettingsItem.setSettingsItem($scope.item),$scope.numberEdits[index]=!1)},$scope.addNumber=function(value){var isValid=!0;"undefined"!=typeof $scope.validateCollection&&(isValid=$scope.validateCollection()),isValid=isValid&&fdvValidation.validateLocalPhoneNumber(value);var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";$scope.item.settings.numbers.indexOf(sanitizedValue)>-1?fdvSettingsItem.toast({str:"fdv.validation-phone-number-unique-invalid"}):isValid&&($scope.item.settings.numbers.unshift(sanitizedValue),$scope.numberEdits.unshift(!1),$scope.item.currentEditedNumber="",fdvSettingsItem.setSettingsItem($scope.item),$scope.loadNumbers())}}],link:function(){}}}]),angular.module("fdvService.directives").directive("fdvSettingsPane",["$timeout","fdvConfig","fdvLog","fdvModalManager","fdvSettingsItem","fdvUserData","fdvAlertManager",function($timeout,fdvConfig,fdvLog,fdvModalManager,fdvSettingsItem,fdvUserData,fdvAlertManager){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("settings/settings-pane.html"),scope:{item:"=",selectedTab:"=",description:"=",mailboxes:"=",lines:"=",setLoading:"&",clearLoading:"&",refresh:"&",authenticate:"&"},controller:["$scope","$timeout","fdvModalManager","fdvConstant","fdvLocaleManager","fdvValidation","fdvJsonApi",function($scope,$timeout,fdvModalManager,fdvConstant,fdvLocaleManager,fdvValidation,fdvJsonApi){if($scope.selectedIndex=0,$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox()||{id:null},$scope.forwardingOptions=["fdv.settings-forwarding-options-all","fdv.settings-forwarding-options-selected"],$scope.notifications=["fdv.settings-call-notifications-options-all","fdv.settings-call-notifications-options-selected"],$scope.incomingCallBlockNotifications=["fdv.settings-incoming-call-block-options-all","fdv.settings-incoming-call-block-options-selected"],$scope.dndNotifications=["fdv.settings-dnd-options-all","fdv.settings-dnd-options-play-message"],"greeting"===$scope.item.model){var availableTypes=$scope.item.settings.availableTypes;$scope.disabledGreetings={},void 0==$scope.item.settings.extendedAbsence&&($scope.disabledGreetings["fdv.settings-greeting-options-extended"]=!0),void 0==$scope.item.settings.busy&&($scope.disabledGreetings["fdv.settings-greeting-busy-greeting"]=!0),$scope.greetingOptions=["fdv.settings-greeting-options-extended","fdv.settings-greeting-options-personal","fdv.settings-greeting-options-system"],availableTypes.indexOf("personal")<0&&($scope.disabledGreetings["fdv.settings-greeting-options-personal"]=!0),$scope.systemGreetingOptions=[],availableTypes.indexOf("system_name")>=0&&$scope.systemGreetingOptions.push("fdv.settings-greeting-options-system-name"),availableTypes.indexOf("system_number")>=0&&$scope.systemGreetingOptions.push("fdv.settings-greeting-options-system-number"),availableTypes.indexOf("system")>=0&&$scope.systemGreetingOptions.push("fdv.settings-greeting-options-system-neither")}$scope.ringOptions=[{id:"Normal",label:"fdv.settings-distinctive-ring-normal"},{id:"Short-Short-Long",label:"fdv.settings-distinctive-ring-short-short-long"},{id:"Short-Long-Short",label:"fdv.settings-distinctive-ring-short-long-short"},{id:"Long-Long",label:"fdv.settings-distinctive-ring-long-long"}],$scope.simultaneousRingLabel=fdvLocaleManager.getString("fdv.settings-stb-simultaneous-ring-label",{number:$scope.selectedPhoneLine.number}),$scope.embeddedUserGuide=fdvLocaleManager.getString("fdv.settings-description-voicemail-note",{link:''+fdvLocaleManager.getString("fdv.settings-account-settings-guide")+""}),$scope.getRingOption=function(option){var found=$scope.ringOptions.filter(function(o){return o.id===option});return angular.isArray(found)&&found.length>0?found[0].label:""},$scope.item.change="blockIncomingAnonymousOrPrivate"===$scope.item.model,$scope.save=function(){$scope.item.change=!1,"forwarding"===$scope.item.model&&($scope.item.settings.destNumber=fdvValidation.onlyDigits($scope.item.settings.destNumber)),"simultaneousRing"===$scope.item.model&&$scope.item.settings.numbers instanceof Array&&$scope.item.settings.numbers.forEach(function(phone,index,array){array[index]="undefined"!=typeof phone&&phone?fdvValidation.onlyDigits(phone):""}),"locateMe"===$scope.item.model&&$scope.item.settings.targets instanceof Array&&$scope.item.settings.targets.forEach(function(phone){phone.number="undefined"!=typeof phone.number&&phone.number?fdvValidation.onlyDigits(phone.number):""}),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.cancel=function(){$scope.item.change=!1,$scope.refresh()},$scope.change=function(){$scope.item.change=!0},$scope.greetingOptionsSave=function(){$scope.item.settings.type="fdv.settings-greeting-options-extended"===$scope.item.greetingOption?"extended":"fdv.settings-greeting-options-personal"===$scope.item.greetingOption?"personal":"fdv.settings-greeting-options-system"===$scope.item.greetingOption?"fdv.settings-greeting-options-system-name"===$scope.item.systemGreetingOption?"system_name":"fdv.settings-greeting-options-system-number"===$scope.item.systemGreetingOption?"system_number":"system":"system",$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-greetings-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.telephonySettingsSave=function(){fdvLog.debug("Settings","update options for "+$scope.item.model),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-telephony-saved"})})["catch"](function(){$scope.clearLoading()})};var clearPassCodeFields=function(){$scope.item.oldCode=$scope.item.newCode=$scope.item.newCodeConfirmation=""};$scope.passCodeCancel=function(){clearPassCodeFields(),$scope.currentError=!1},$scope.passcodeType="passcode",$scope.passcodeResetType="passcode",$scope.changePassCode=function(passcodeType){$scope.currentError=!1,fdvJsonApi.voiceMailboxAuthPost($scope.selectedPhoneLine.number,$scope.selectedMailbox.id,$scope.item.oldCode).then(function(){$scope.currentError=!1,"metaswitch"===$scope.selectedPhoneLine.provider?"pin"===passcodeType?($scope.item.settings.newPin=$scope.item.newCode,$scope.item.settings.current=$scope.item.oldCode,$scope.item.settings.passcodeChangeType="pin"):"passcode"===passcodeType&&($scope.item.settings.newPasscode=$scope.item.newCode,$scope.item.settings.current=$scope.item.oldCode,$scope.item.settings.passcodeChangeType="passcode"):($scope.item.settings.newPin=$scope.item.newCode,$scope.item.settings.current=$scope.item.oldCode,$scope.item.settings.newPasscode=$scope.item.newCode,$scope.item.settings.passcodeChangeType="pinpass"),clearPassCodeFields(),fdvLog.debug("Settings","update options for "+$scope.item.model),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-voicemail-options-saved"})})["catch"](function(){$scope.clearLoading()})})["catch"](function(){$scope.currentError=!0,clearPassCodeFields(),fdvAlertManager.error("fdv.settings-incorrect-passcode"),fdvLog.error($scope.componentName,"Wrong passcode.")})},$scope.notificationSettingsSave=function(){$scope.item.settings.targets.mobileNumber&&!$scope.item.settings.targets.mobileNumber.enabled&&($scope.item.settings.targets.mobileNumber.number=""),$scope.item.settings.targets.pagerNumber&&!$scope.item.settings.targets.pagerNumber.enabled&&($scope.item.settings.targets.pagerNumber.number=""),$scope.item.settings.targets.email&&!$scope.item.settings.targets.email.enabled&&($scope.item.settings.targets.email.address=""),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-voicemail-options-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.showDeleteMailboxModal=function(mailbox){$scope.showModal(fdvLocaleManager.getString("fdv.settings-delete-mailbox",{mailbox:mailbox.label}),fdvLocaleManager.getString("fdv.settings-delete-mailbox-description",{mailbox:mailbox.label}),{item:$scope.item,model:$scope.item.model,mailbox:mailbox,mailboxes:$scope.mailboxes},fdvConstant.MODAL.DELETE_MAILBOX)},$scope.resetMailbox=function(mailbox){$scope.setLoading();var index=$scope.mailboxes.map(function(x){return x.id}).indexOf(mailbox.id);fdvJsonApi.voiceMailboxPasscodeResetPost($scope.selectedPhoneLine.number,mailbox.id).then(function(model){$scope.clearLoading(),$scope.item.settings.resetCompletedArray[index]=!0,$scope.item.settings.passCodeArray[index]=model.newPasscode,fdvSettingsItem.toast({str:"Use your new Passcode "+model.newPasscode})}.bind(this))["catch"](function(){$scope.clearLoading(),fdvLog.warn($scope.componentName,"failed to reset passcode."),$scope.item.settings.resetFailedArray[index]=!0,$scope.item.settings.resetCompletedArray[index]=!1,$scope.item.settings.passCodeArray[index]=""}.bind(this))},$scope.resetPinMailbox=function(mailbox){$scope.setLoading();var index=$scope.mailboxes.map(function(x){return x.id}).indexOf(mailbox.id);fdvJsonApi.voiceMailboxPincodeResetPost($scope.selectedPhoneLine.number,mailbox.id).then(function(model){$scope.clearLoading(),$scope.item.settings.resetPinCompletedArray[index]=!0,$scope.item.settings.pinCodeArray[index]=model.newPasscode,$scope.passcodeResetType="pin",fdvSettingsItem.toast({str:"Use your new PIN "+model.newPasscode})}.bind(this))["catch"](function(){$scope.clearLoading(),fdvLog.warn($scope.componentName,"failed to reset pincode."),$scope.item.settings.resetPinFailedArray[index]=!0,$scope.item.settings.resetPinCompletedArray[index]=!1,$scope.item.settings.pinCodeArray[index]=""}.bind(this))},$scope.saveTimeZone=function(){var msg=fdvLocaleManager.getString("fdv.settings-save-timezone-confirmation",{timezone:$scope.item.settings.timezone});fdvLog.debug("Settings","update options for "+$scope.item.model),$scope.prevTimezone=$scope.item.settings,$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:msg})})["catch"](function(){$scope.clearLoading()})},$scope.cancelTimeZone=function(){$scope.item.settings=$scope.prevTimezone},$scope.toggleBackupEditMode=function(){$scope.backupEditMode=!0},$scope.saveBackupNumbers=function(){$scope.item.settings.number=fdvValidation.onlyDigits($scope.item.settings.number),$scope.backupEditMode=!1,$scope.item.settings.enabled=""!==$scope.item.settings.number,$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.cancelBackupNumbers=function(){$scope.backupEditMode=!1,$scope.cancel()},$scope.saveCallBlock=function(){$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.cancelCallBlock=function(){$scope.item.settings.numbers.forEach(function(val){val.blocked=!1})},$scope.toggleCallBlock=function(){$timeout(function(){$scope.item.settings===!0&&$scope.showModal("fdv.settings-international-call-block-confirmation","fdv.settings-international-call-block-confirmation-description",null,fdvConstant.MODAL.CALL_BLOCK)})},$scope.showModal=function(title,text,model,modal){var type=modal||fdvConstant.MODAL.SETTINGS,localModel=model||$scope.item,stateOn=''+fdvLocaleManager.getString("fdv.label-on")+"",stateOff=''+fdvLocaleManager.getString("fdv.label-off")+"",message=fdvLocaleManager.getString("fdv.settings-turn",{state:localModel.value?stateOff:stateOn,feature:fdvLocaleManager.getString(title)});if(type===fdvConstant.MODAL.SETTINGS&&"blockIncomingAnonymousOrPrivate"!==localModel.model){var dndSettingItem="simultaneousRing"===localModel.model||"voiceMail"===localModel.model?localModel.root.dnd:{},turnOnSimultaneousRingWhenDndOn=!localModel.value&&"simultaneousRing"===localModel.model&&dndSettingItem.value,turnOnVoiceMailWithDndOn=localModel.value&&"voiceMail"===localModel.model&&"voicemail"===dndSettingItem.settings.action&&dndSettingItem.settings.enabled;turnOnVoiceMailWithDndOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-voicemail-when-dnd-on")),turnOnSimultaneousRingWhenDndOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-simultaneous-ring-when-dnb-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff}));var SimultaneousRingSettingItem=localModel.root.simultaneousRing,turnOnDndWhenSimultaneousRingOn=!localModel.value&&"dnd"===localModel.model&&SimultaneousRingSettingItem.value;turnOnDndWhenSimultaneousRingOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-dnd-when-simultaneous-ring-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff}))}fdvModalManager.show(type,{title:title,message:message,text:text,model:localModel}).then(function(result){fdvLog.debug("Settings","update options for "+result.model),"mailboxes"===result.model?($scope.setLoading(),fdvSettingsItem.deleteMailbox(result,$scope.selectedPhoneLine.number,result.mailbox.id,function(){var index=$scope.mailboxes.map(function(x){return x.id}).indexOf(result.mailbox.id);$scope.mailboxes.splice(index,1),$scope.clearLoading(),fdvSettingsItem.toast(fdvLocaleManager.getString("fdv.settings-delete-mailbox-confirmation",{mailbox:result.mailbox.label}))},function(){$scope.clearLoading(),fdvAlertManager.error("fdv.settings-delete-mailbox-failed")})):modal!==fdvConstant.MODAL.CALL_BLOCK&&modal!==fdvConstant.MODAL.STANDARD_PROMPTS&&($scope.setLoading(),fdvSettingsItem.update(result,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){type===fdvConstant.MODAL.SETTINGS?turnOnSimultaneousRingWhenDndOn?(dndSettingItem.value=!1,fdvSettingsItem.update(dndSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):turnOnDndWhenSimultaneousRingOn?(SimultaneousRingSettingItem.value=!1,fdvSettingsItem.update(SimultaneousRingSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):turnOnVoiceMailWithDndOn?(dndSettingItem.settings.action="system_greeting",dndSettingItem.settings.exceptions.enabled=!0,fdvSettingsItem.update(dndSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):($scope.clearLoading(),$scope.refresh(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})):($scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})),result.change=!1}))})},$scope.$watch("item.value",function(){$scope.onoff=$scope.item.value?"fdv.label-on":"fdv.label-off",$scope.caption=$scope.item.value?"fdv.setting-turn-off-capitalized":"fdv.setting-turn-on-capitalized"}),$scope.isForwardingValid=function(){var number=$scope.item.settings.destNumber||$scope.item.destNumber;return(!$scope.item.settings.bySourceNumbers.enabled||fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.bySourceNumbers.numbers))&&fdvValidation.validateLocalPhoneNumber(number)},$scope.isCallNotificationValid=function(){return(!$scope.item.settings.bySourceNumbers.enabled||fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.bySourceNumbers.numbers))&&$scope.item.settings.email&&fdvValidation.validateEmail($scope.item.settings.email)},$scope.isSimultaneousRingValid=function(){if(!($scope.item.settings.numbers&&$scope.item.settings.numbers instanceof Array))return!1;var isValid=!0;return $scope.item.settings.numbers.forEach(function(value){isValid=isValid&&(""===value||fdvValidation.validateLocalPhoneNumber(value))}),$scope.item.value||(isValid=isValid&&fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.numbers)),isValid&&fdvValidation.validateUniquePhoneNumber($scope.item.settings.numbers)},$scope.isLocateMeValid=function(){if(!($scope.item.settings.targets&&$scope.item.settings.targets instanceof Array))return!1;var isValid=!0;return $scope.item.settings.targets.forEach(function(value){isValid=isValid&&(""===value.number||fdvValidation.validateLocateNumber(value))}),$scope.item.value||(isValid=isValid&&fdvValidation.validateAtLeastOneLocateNumber($scope.item.settings.targets)),isValid&&fdvValidation.validateUniqueLocateNumber($scope.item.settings.targets)},$scope.isDndValid=function(){return!0},$scope.isIncomingBlockValid=function(){return!$scope.item.settings.enabled||fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.numbers)},$scope.isPassCodeValid=function(type){return"metaswitch"===$scope.selectedPhoneLine.provider&&"passcode"===type?$scope.item.oldCode&&$scope.item.oldCode.length>0&&$scope.item.newCode&&$scope.item.newCode.length>0&&$scope.item.newCodeConfirmation&&$scope.item.newCodeConfirmation.length>0&&fdvValidation.validateOldMetaPasscode($scope.item.oldCode)&&fdvValidation.validateNewPasscodeMetaLength($scope.item.newCode)&&fdvValidation.validateNewPasscodeMismatch({code:$scope.item.newCode,confirm:$scope.item.newCodeConfirmation})&&fdvValidation.validateNewPasscodeRepeated($scope.item.newCode)&&fdvValidation.validateNewPasscodeConsecutive($scope.item.newCode)&&fdvValidation.validateNewPasscodeContained({code:$scope.item.newCode,number:$scope.selectedPhoneLine.number}):"metaswitch"===$scope.selectedPhoneLine.provider&&"pin"===type?$scope.item.oldCode&&$scope.item.oldCode.length>0&&$scope.item.newCode&&$scope.item.newCode.length>0&&$scope.item.newCodeConfirmation&&$scope.item.newCodeConfirmation.length>0&&fdvValidation.validateOldMetaPasscode($scope.item.oldCode)&&fdvValidation.validateNewPasscode($scope.item.newCode)&&fdvValidation.validateNewPasscode($scope.item.newCodeConfirmation)&&fdvValidation.validateNewPasscodeMismatch({code:$scope.item.newCode,confirm:$scope.item.newCodeConfirmation})&&fdvValidation.validateNewPasscodeRepeated($scope.item.newCode)&&fdvValidation.validateNewPasscodeConsecutive($scope.item.newCode)&&fdvValidation.validateNewPasscodeContained({code:$scope.item.newCode,number:$scope.selectedPhoneLine.number}):fdvValidation.validateOldPasscode($scope.item.oldCode)&&fdvValidation.validateNewPasscode($scope.item.newCode)&&fdvValidation.validateNewPasscode($scope.item.newCodeConfirmation)&&fdvValidation.validateNewPasscodeMismatch({code:$scope.item.newCode,confirm:$scope.item.newCodeConfirmation})&&fdvValidation.validateNewPasscodeRepeated($scope.item.newCode)&&fdvValidation.validateNewPasscodeConsecutive($scope.item.newCode)&&fdvValidation.validateNewPasscodeContained({code:$scope.item.newCode,number:$scope.selectedPhoneLine.number})},$scope.isVoicemailNotificationsValid=function(){var isValid=!0;return $scope.item.settings.targets.mobileNumber&&$scope.item.settings.targets.mobileNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.mobileNumber.number)),$scope.item.settings.targets.pagerNumber&&$scope.item.settings.targets.pagerNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.pagerNumber.number)),$scope.item.settings.targets.email&&$scope.item.settings.targets.email.enabled&&(isValid=isValid&&$scope.item.settings.targets.email.address&&fdvValidation.validateEmail($scope.item.settings.targets.email.address)),$scope.item.settings.targets.forwardToNumber&&$scope.item.settings.targets.forwardToNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.forwardToNumber.number)),isValid},$scope.isBackupNumberValid=function(){return""===$scope.item.settings.number||fdvValidation.validateLocalPhoneNumber($scope.item.settings.number)},$scope.settingOff=function(){$scope.item.settings.enabled=!1,$scope.save()},$scope.settingOn=function(){$scope.item.settings.enabled=!0,$scope.save()},$scope.isSpanish=function(){return"es"===$scope.item.settings.prompts.language}}],link:function(scope,element){"dnd"===scope.item.model&&scope.$watch("item.settings.exceptions.enabled",function(newValue){scope.item.settings.action=newValue?"system_greeting":"voicemail"}),"settings"===scope.item.model&&(scope.languages=[{id:"en",label:"fdv.label-english"},{id:"es",label:"fdv.label-spanish"}],scope.voices={male:"fdv.label-male",female:"fdv.label-female"},scope.$watch("item.settings.prompts.language",function(){scope.item.settings.prompts.standardPrompts="es"===scope.item.settings.prompts.language?!0:scope.item.settings.prompts.standardPrompts})),"backupNumber"===scope.item.model&&(scope.backupEditMode=!1),"voicemailNotifications"===scope.item.model&&(scope.voicemailNotifications=[{description:"fdv.settings-voicemail-notifications-cell",state:!1},{description:"fdv.settings-voicemail-notifications-pager",state:!1},{description:"fdv.settings-voicemail-notifications-email",state:!1},{description:"fdv.settings-voicemail-notifications-this",state:!1}],scope.notifyNumberError=!1,scope.cellProviders=["Alltel Wireless","AT&T","Boost Mobile","MetroPCS Wireless","Sprint Nextel","T-Mobile Wireless","U.S. Cellular","Verizon Wireless","Virgin Mobile"],scope.pagerProviders=["American Messaging","Aquis Communications","Arch Wireless","Clearnet","Cook Paging","Digicom","GCS Paging","Metrocall","Skytel","Sprint Paging","Suncom Wireless","USA Mobility","Western Wireless"]),"timeOffset"===scope.item.model&&(scope.timezones=[{id:"UTC-05:00",label:"fdv.settings-timezones-eastern"},{id:"UTC-06:00",label:"fdv.settings-timezones-central"},{id:"UTC-07:00",label:"fdv.settings-timezones-mountain"},{id:"UTC-08:00",label:"fdv.settings-timezones-pacific"}],scope.prevTimezone=scope.timezones.filter(function(v){return v.id===scope.item.settings})[0]),scope.doNotPropagate=function(event){event.stopPropagation()},$timeout(function(){element.find('[data-toggle="tooltip"]').tooltip()},500),scope.item.note=""}}}]),angular.module("fdvService.directives").directive("fdvSettings",["$timeout","$q","fdvLog","fdvConfig","fdvConstant","fdvJsonApi","fdvUserData","fdvActionManager","fdvSettingsItem","fdvLocaleManager","fdvAlertManager","fdvOptionsModel","fdvMailboxOptionsModel","fdvAnalytics",function($timeout,$q,fdvLog,fdvConfig,fdvConstant,fdvJsonApi,fdvUserData,fdvActionManager,fdvSettingsItem,fdvLocaleManager,fdvAlertManager,fdvOptionsModel,fdvMailboxOptionsModel,fdvAnalytics){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("settings/settings.html"),controller:["$scope","$element",function($scope,$element){$scope.loading=!0,$scope.lines=fdvUserData.getUserPhoneLines(),$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox(),$scope.componentName="SETTINGS";var callSettings=[{id:"callWaiting",label:"fdv.settings-call-settings-call-waiting",value:!1,toggled:!1,model:"callWaiting",settings:{},icon:"fdv-call-waiting",platforms:[fdvConstant.PLATFORM.WEB]},{id:"callForwarding",label:"fdv.settings-call-settings-call-forwarding",value:!1,toggled:!1,model:"forwarding",settings:{},icon:"fdv-call-forwarding",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{id:"callNotifications",label:"fdv.settings-call-settings-call-notification",value:!1,toggled:!1,model:"notifications",settings:{},icon:"fdv-call-notification",platforms:[fdvConstant.PLATFORM.WEB]},{id:"simultaneousRing",label:"fdv.settings-call-settings-simultaneous-ring",value:!1,toggled:!1,model:"simultaneousRing",settings:{},icon:"fdv-simultaneous-ring",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{id:"doNotDisturb",label:"fdv.settings-call-settings-do-not-disturb",value:!1,toggled:!1,model:"dnd",settings:{},icon:"fdv-do-not-disturb",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{id:"locateMe",label:"fdv.settings-call-settings-locate-me",value:!1,toggled:!1,model:"locateMe",settings:{},icon:"fdv-locate-me",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"incomingCallBlock",label:"fdv.settings-call-settings-incoming-call-block",value:!1,toggled:!1,model:"blockIncomingAnonymousOrPrivate",settings:{},icon:"fdv-incoming-call-block",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{id:"outgoingCallBlock",label:"fdv.settings-call-settings-outgoing-caller-id-block",value:!1,toggled:!1,model:"blockOutgoingCallerId",settings:{},icon:"fdv-outgoing-call-block",platforms:[fdvConstant.PLATFORM.WEB]},{id:"virtualNumbers",label:"fdv.settings-call-settings-virtual-numbers",value:!1,toggled:!1,settings:{},model:"virtualNumbers",icon:"fdv-distinctive-ring",platforms:[fdvConstant.PLATFORM.WEB]},{id:"voicemailNumberRings",label:"",value:!1,toggled:!1,settings:{},model:"voicemailNumberRings",icon:"",platforms:[fdvConstant.PLATFORM.WEB]}],voicemailSettings=[{id:"authenticateMailbox",label:"",value:!1,toggled:!1,settings:{},model:"authenticateMailbox",icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"callNow",label:"",value:!1,toggled:!1,link:fdvConstant.LINKS.USER_GUIDE,settings:{},model:"callNow",icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"greeting",label:"fdv.settings-voicemail-settings-greeting",value:!1,toggled:!1,settings:{},model:"greeting",icon:"fdv-greetings",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"telephoneSettings",label:"fdv.settings-voicemail-settings-telephone-settings",value:!1,toggled:!1,settings:{},model:"settings",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"changePasscode",label:"fdv.settings-voicemail-settings-voicemail-passcode",value:!1,toggled:!1,settings:{},model:"validation",icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"resetPasscode",label:"fdv.settings-voicemail-settings-reset-passcode",value:!1,toggled:!1,settings:{},model:"resetPasscode",icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]},{id:"screening",label:"fdv.settings-voicemail-settings-voicemail-screening",value:!1,toggled:!1,settings:{},model:"screening",hideIfAbsent:!0,icon:"fdv-voicemail-screening",platforms:[fdvConstant.PLATFORM.WEB]},{id:"voicemailNotifications",label:"fdv.settings-voicemail-settings-voicemail-notification",value:!1,toggled:!1, settings:{},model:"voicemailNotifications",icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE]}];"metaswitch"!==$scope.selectedPhoneLine.provider&&voicemailSettings.push({id:"mailboxes",label:"fdv.settings-voicemail-settings-mailboxes-access",value:!1,toggled:!1,settings:{},model:"mailboxes",icon:"fdv-mailbox",platforms:[fdvConstant.PLATFORM.WEB]});var accountSettings=[{id:"timeOffset",label:"fdv.settings-account-settings-timezones",value:!1,toggled:!1,settings:{},model:"timeOffset",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"backupNumber",label:"fdv.settings-account-settings-backup-numbers",value:!1,toggled:!1,settings:{},model:"backupNumber",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"internationalCallBlock",label:"fdv.settings-account-settings-international-call-block",value:!1,toggled:!1,settings:{},model:"blockOutgoingInternational",icon:"",platforms:[fdvConstant.PLATFORM.WEB]}];accountSettings=accountSettings.concat("Business"!==$scope.account.accountType?[{id:"faq",label:"fdv.settings-account-settings-faq",value:fdvConstant.LINKS.FAQ,toggled:!1,settings:{},model:"faq",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"userGuide",label:"fdv.settings-account-settings-guide",value:fdvConstant.LINKS.USER_GUIDE,toggled:!1,settings:{},model:"guide",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"fiosPlan",label:"fdv.settings-account-settings-plans",value:fdvConstant.LINKS.PLANS,toggled:!1,settings:{},model:"plan",icon:"",tooltip:"fdv.settings-account-settings-plans-descriptions",platforms:[fdvConstant.PLATFORM.WEB]},{id:"internationalCallRates",label:"fdv.settings-account-settings-rates",value:fdvConstant.LINKS.RATES,toggled:!1,settings:{},model:"rates",icon:"",tooltip:"fdv.settings-account-settings-rates-descriptions",platforms:[fdvConstant.PLATFORM.WEB]},{id:"terms",label:"fdv.fios-tos-label",value:fdvConstant.LINKS.voiceTOS,toggled:!1,settings:{},model:"terms",icon:"",platforms:[fdvConstant.PLATFORM.WEB]}]:[{id:"faq",label:"fdv.settings-account-settings-faq-fbv",value:fdvConstant.LINKS_FBV.FAQ,toggled:!1,settings:{},model:"faq",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"userGuide",label:"fdv.settings-account-settings-guide-fbv",value:fdvConstant.LINKS_FBV.USER_GUIDE,toggled:!1,settings:{},model:"guide",icon:"",platforms:[fdvConstant.PLATFORM.WEB]},{id:"internationalCallRates",label:"fdv.settings-account-settings-rates-fbv",value:fdvConstant.LINKS_FBV.RATES,toggled:!1,settings:{},model:"rates",icon:"",platforms:[fdvConstant.PLATFORM.WEB]}]);var networkErrorItem={label:"fdv.settings-service-error-settings",value:!1,toggled:!1,model:"networkError",settings:{},icon:"",platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},washingtonOregonZipcodes=["206","253","360","425","509","564","503","541","971","458"],nwUser=washingtonOregonZipcodes.includes($scope.selectedPhoneLine.number.substring(0,3));$scope.description={callWaiting:"fdv.settings-description-call-waiting",forwarding:"fdv.settings-description-call-forwarding",notifications:"fdv.settings-description-call-notifications",simultaneousRing:"fdv.settings-description-simultaneous-ring",dnd:"fdv.settings-description-do-not-disturb",locateMe:"fdv.settings-description-locate-me",blockIncomingAnonymousOrPrivate:"fdv.settings-description-incoming-call-block",blockOutgoingCallerId:"fdv.settings-description-outgoing-caller-id-block",virtualNumbers:"fdv.settings-description-virtual-numbers",greeting:"metaswitch"==$scope.selectedPhoneLine.provider?nwUser?"fdv.settings-description-greeting-metaswitch-WA-OR":"fdv.settings-description-greeting-metaswitch":"fdv.settings-description-greeting",validation:"fdv.settings-description-voicemail-passcode",voicemailNotifications:"fdv.settings-description-voicemail-notifications",screening:"fdv.settings-description-voicemail-screening",mailboxes:nwUser?"fdv.settings-description-individual-mailboxes-access-WA-OR":"fdv.settings-description-individual-mailboxes-access",profile:"fdv.settings-description-profile-information",timeOffset:"fdv.settings-description-timezones",backupNumber:"fdv.settings-description-backup-numbers",blockOutgoingInternational:"fdv.settings-description-international-call-block",voiceMail:"fdv.settings-description-voicemail"},$scope.callSettings=[],$scope.voicemailSettings=[],$scope.accountSettings=[],$scope.currentItem,$scope.currentDescription,$scope.canReset=fdvConfig.getAccount().hasBillingAccessPermission,$scope.networkError=!1;var platform=fdvConfig.getPlatform();$scope.tabs=[{id:"0",name:"fdv.settings-call-settings",array:$scope.callSettings},{id:"1",name:"fdv.settings-voicemail-settings",array:$scope.voicemailSettings}],$scope.selectedTab=$scope.tabs[0];var deepLinkData=$scope.routeManager.getCurrentRoute().getParamsData();fdvLog.debug($scope.componentName,"selectedTab: "+$scope.selectedTab.name+"; selectedIndex: "+$scope.selectedIndex),platform===fdvConstant.PLATFORM.WEB&&$scope.tabs.push({id:"2",name:"fdv.settings-account-settings",array:$scope.accountSettings}),$scope.embeddedUserGuide=fdvLocaleManager.getString("fdv.settings-reactivate-voicemail-4",{link:''+fdvLocaleManager.getString("fdv.settings-account-settings-guide")+""}),$scope.trackPageView=function(tab){var pageName="callsettings";"1"===tab?pageName="voicemailsettings":"2"===tab&&(pageName="accountsettings"),fdvAnalytics.enterPage("settings:"+pageName)},$scope.trackPageView(null!=deepLinkData?deepLinkData.tabId:"0"),$scope.openDeepLink=function(deepLinkData){if(null!=deepLinkData)if("0"===deepLinkData.tabId){$scope.selectedTab=$scope.tabs[0];var i;for(i=0;i<$scope.callSettings.length;i++)if(deepLinkData.indexLabel===$scope.callSettings[i].label){$scope.selectedIndex=i;break}}else if("1"===deepLinkData.tabId){$scope.selectedTab=$scope.tabs[1];var i;for(i=0;i<$scope.voicemailSettings.length;i++)if(deepLinkData.indexLabel===$scope.voicemailSettings[i].label){$scope.selectedIndex=i;break}}},$scope.refreshOptions=function(number,mailbox){var errorHandler=function(){$scope.networkError=!0;var optionsModel=new fdvOptionsModel,mailboxOptionsModel=new fdvMailboxOptionsModel;$scope.callSettings=[networkErrorItem],$scope.voicemailSettings=[networkErrorItem],$scope.accountSettings=[networkErrorItem];var message="0"===$scope.selectedTab.id?"fdv.settings-service-error-call-settings":"1"===$scope.selectedTab.id?"fdv.settings-service-error-voicemail-settings":"fdv.settings-service-error-account-settings";fdvAlertManager.error(message),fdvSettingsItem.defaultSettings($scope.selectedTab.id,$scope.callSettings,$scope.voicemailSettings,optionsModel,mailboxOptionsModel,[]),fdvLog.warn($scope.componentName,"failed to retrieve mailboxes options.")},successHandler=function(callOptions,voicemailOptions,mailboxes,virtualNumbers){$scope.mailboxes=mailboxes;var authenticated=$scope.selectedMailbox&&$scope.selectedMailbox.authenticated;callOptions.voicemailEnabled=!0;var enabled=callOptions.voicemailEnabled,provisioned=$scope.selectedMailbox&&$scope.mailboxes&&$scope.mailboxes.length>0;fdvSettingsItem.setMailboxes(mailboxes),$scope.loading=!1,$scope.networkError=!1,fdvSettingsItem.options2Settings($scope.selectedTab.id,callSettings,voicemailSettings,accountSettings,callOptions,voicemailOptions,mailboxes,virtualNumbers),$scope.populateCallSettings(callSettings,callOptions,platform),$scope.populateAccountSettings(accountSettings,platform),$scope.populateVoicemailOptions(voicemailSettings,voicemailOptions,provisioned,enabled,authenticated),$scope.openDeepLink(deepLinkData)};$scope.loading=!0;var promises=[fdvJsonApi.voiceOptionsGet(number)];mailbox&&promises.push(fdvJsonApi.voiceMailboxOptionsGet(number,mailbox)),promises.push(fdvUserData.getMailboxes($scope.selectedPhoneLine.number)),promises.push(fdvJsonApi.voiceVirtualNumbersGet(number)),$q.all(promises).then(function(results){$scope.loading=!1,mailbox?successHandler(results[0],results[1],results[2],results[3]):successHandler(results[0],new fdvMailboxOptionsModel,results[1],results[2])})["catch"](function(e){$scope.loading=!1,e&&401===e.status||!mailbox?($scope.loading=!0,$q.all([fdvJsonApi.voiceOptionsGet(number),fdvUserData.getMailboxes($scope.selectedPhoneLine.number),fdvJsonApi.voiceVirtualNumbersGet(number)]).then(function(results){$scope.loading=!1,successHandler(results[0],new fdvMailboxOptionsModel,results[1],results[2])})["catch"](function(e){$scope.loading=!1,errorHandler(e)})):($scope.loading=!1,errorHandler(e))})},$scope.tabChanged=function(tab){$scope.selectedIndex=-1,$scope.selectedTab=tab,$timeout(function(){$element.find('[data-toggle="tooltip"]').tooltip()},500),$scope.trackPageView(tab.id)},$scope.authenticate=function(){fdvActionManager.accessVoicemails().then(function(){$scope.populateVoicemailOptions(voicemailSettings,!0,fdvSettingsItem.getActive(),!0),$scope.refresh(),$scope.selectedTab=$scope.tabs[1]})["catch"](function(){fdvLog.info($scope.componentName,"Did not access mailbox.")})},$scope.refresh=function(){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox(),angular.isDefined($scope.selectedMailbox)?$scope.refreshOptions($scope.selectedPhoneLine.number,$scope.selectedMailbox.id):$scope.refreshOptions($scope.selectedPhoneLine.number,null)},$scope.isSelected=function(index){return $scope.selectedIndex===index},$scope.select=function(index,event){$scope.selectedIndex=$scope.selectedIndex===index?-1:index,event.stopPropagation(),event.preventDefault()},$scope.toggleCustom=function(index){$scope.tabs[$scope.selectedTab.id.toString()].array.map(function(item,i){item.toggled=i===index?!item.toggled:!1})},$scope.nonClickable=function(item){return"voiceMail"===item.model&&!$scope.canReset||$scope.isLink(item)},$scope.isLink=function(item){return"faq"===item.model||"guide"===item.model||"plan"===item.model||"rates"===item.model||"terms"===item.model},$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue){angular.isDefined(newValue)&&($scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox(),$scope.refresh())}),$scope.$watch(function(){return fdvUserData.getSelectedMailbox()},function(newValue,oldValue){angular.isDefined(newValue)?($scope.selectedMailbox=newValue,newValue!==oldValue&&fdvUserData.getMailboxes($scope.selectedPhoneLine.number).then(function(model){$scope.mailboxes=model,$scope.refresh()})["catch"](function(){$scope.refresh()})):fdvLog.error("SETTINGS","new selected maibox is empty")}),$scope.populateAccountSettings=function(accountSettings,platform){$scope.accountSettings=[],accountSettings.forEach(function(item){item.platforms.indexOf(platform)>=0&&$scope.accountSettings.push(item)})},$scope.populateCallSettings=function(callSettings,callOptions,platform){$scope.callSettings=[],callSettings.forEach(function(item){item.platforms.indexOf(platform)>=0&&void 0!==callOptions[item.model]&&$scope.callSettings.push(item)})},$scope.populateVoicemailOptions=function(voicemailSettings,voicemailOptions,provisioned,active,authenticated){$scope.voicemailSettings=[],voicemailSettings.forEach(function(item){if(item.platforms.indexOf(platform)>=0)if(provisioned)if(active)if(authenticated){if(item.hideIfAbsent&&voicemailOptions&&void 0==voicemailOptions[item.model])return;("resetPasscode"!==item.model&&"mailboxes"!==item.model||$scope.canReset)&&"authenticateMailbox"!==item.model&&"callNow"!==item.model&&$scope.voicemailSettings.push(item)}else("resetPasscode"===item.model&&$scope.canReset||"voiceMail"===item.model||"authenticateMailbox"===item.model)&&$scope.voicemailSettings.push(item);else("resetPasscode"===item.model&&$scope.canReset||"validation"===item.model&&$scope.canReset||"voiceMail"===item.model)&&$scope.voicemailSettings.push(item);else"callNow"===item.model&&$scope.voicemailSettings.push(item)})},$scope.clearLoading=function(){$scope.loading=!1},$scope.setLoading=function(){$scope.loading=!0}}],link:function(){}}}]),angular.module("fdvService.directives").directive("fdvSubsettings",["fdvLog","fdvConfig","fdvConstant","fdvModalManager","fdvJsonApi","fdvUserData","fdvSettingsItem","fdvLocaleManager","fdvValidation","fdvNativeApi","fdvAlertManager","fdvRoute","fdvAnalytics",function(fdvLog,fdvConfig,fdvConstant,fdvModalManager,fdvJsonApi,fdvUserData,fdvSettingsItem,fdvLocaleManager,fdvValidation,fdvNativeApi,fdvAlertManager,fdvRoute,fdvAnalytics){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("settings/sub-settings.html"),scope:!0,controller:["$scope","$timeout","$filter",function($scope,$timeout,$filter){$scope.locateMeNumber="";var params=$scope.routeManager.getCurrentRoute().getParamsData();$scope.item=params&¶ms.item?params.item:fdvSettingsItem.getSettingsItem(),params&¶ms.item||$scope.routeManager.getCurrentRoute().setParamsData({item:$scope.item}),fdvSettingsItem.setSettingsItem($scope.item),params&¶ms.description?($scope.description=params.description,fdvSettingsItem.setDescription($scope.description)):($scope.description="",fdvSettingsItem.setDescription("")),$scope.selectedTab=params&¶ms.selectedTab?params.selectedTab:fdvSettingsItem.getSettingsTab(),fdvSettingsItem.setSettingsTab($scope.selectedTab);var pageName="callsettings";angular.isObject($scope.selectedTab)&&"1"===$scope.selectedTab.id?pageName="voicemailsettings":angular.isObject($scope.selectedTab)&&"2"===$scope.selectedTab.id&&(pageName="accountsettings");var subPageName="";angular.isObject($scope.item)&&angular.isString($scope.item.id)&&(subPageName=$scope.item.id.toLowerCase()),fdvAnalytics.enterPage("settings:"+pageName+":"+subPageName),$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox()||{id:null},fdvConfig.isStb()&&"forwarding"===$scope.item.model&&($scope.forwardingLabel=fdvLocaleManager.getString("fdv.settings-forwarding-all-calls-text",{number:$filter("phoneNumber")($scope.item.settings.destNumber)})),$scope.simultaneousRingLabel=fdvLocaleManager.getString("fdv.settings-stb-simultaneous-ring-label",{number:$filter("phoneNumber")($scope.selectedPhoneLine.number)}),$scope.incomingBlockLabel=fdvLocaleManager.getString("fdv.settings-stb-incoming-block-label",{number:$filter("phoneNumber")($scope.selectedPhoneLine.number)}),$scope.mailboxes=fdvSettingsItem.getMailboxes(),$scope.resetCompletedArray=[],$scope.resetFailedArray=[],$scope.passCodeArray=[],$scope.editCallForwardingNumber=function(){$scope.previous=$scope.item.settings.destNumber,$scope.callForwardingNumbersEdit=!0},$scope.saveCallForwardingNumber=function(value){if($scope.isForwardingValid(value)){$scope.callForwardingNumbersEdit=!1;var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";$scope.item.settings.destNumber=sanitizedValue,$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})}else $scope.item.settings.destNumber=$scope.previous,fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.cancelCallForwardingNumber=function(){$scope.callForwardingNumbersEdit=!1,$scope.item.settings.destNumber=$scope.previous},$scope.saveDestNumber=function(title){$scope.item.destNumber&&""!==$scope.item.destNumber&&($scope.item.settings.destNumber=$scope.item.destNumber),fdvConfig.isStb()?$scope.item.settings.destNumber&&($scope.forwardingLabel=fdvLocaleManager.getString("fdv.settings-forwarding-all-calls-text",{number:$filter("phoneNumber")($scope.item.settings.destNumber)}),$scope.showContextualModal($scope.item)):$scope.showModal(title)},$scope.editSimultaneousRingNumber=function(index){$scope.simultaneousRingNumbersEdits[index]?$scope.saveSimultaneousRingNumber(index,$scope.item.currentSimultaneousRingNumber):($scope.item.currentSimultaneousRingNumber=$scope.item.settings.numbers[index]||"",$scope.simultaneousRingNumbersEdits[index]=!0)},$scope.saveSimultaneousRingNumber=function(index,value){var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";fdvValidation.validateLocalPhoneNumber(value)&&$scope.item.settings.numbers.indexOf(sanitizedValue)<0?($scope.item.settings.numbers[index]=value,$scope.simultaneousRingNumbersEdits[index]=!1,$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.cancelSimultaneousRingNumber=function(index){$scope.simultaneousRingNumbersEdits[index]=!1},$scope.deleteSimultaneousRingNumber=function(index){$scope.item.settings.numbers.splice(index,1),$scope.simultaneousRingNumbersEdits[index]=!1,fdvSettingsItem.toast({str:"fdv.settings-deleted"})},$scope.editLocateMeNumber=function(index){$scope.locateMeNumber=$scope.item.settings.targets[index].number||"",$scope.locateMeNumbersEdits[index]=!0},$scope.createLocateMeTargetList=function(currentNumber){var list=[];return list.push(currentNumber),"undefined"!=typeof $scope.item.settings.targets&&$scope.item.settings.targets.forEach(function(target){"undefined"!=typeof target.number&&list.push(target.number)}),list},$scope.saveLocateMeNumber=function(index,value){var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";fdvValidation.validateLocalPhoneNumber(value)&&0===$scope.item.settings.targets.filter(function(i){return i.number===sanitizedValue}).length?($scope.item.settings.targets[index].number=sanitizedValue,$scope.locateMeNumbersEdits[index]=!1,$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.deleteLocateMeNumber=function(index){fdvSettingsItem.toast({str:"fdv.settings-deleted"}),$scope.item.settings.targets.splice(index,1),$scope.locateMeNumbersEdits[index]=!1},$scope.cancelLocateMeNumber=function(index){$scope.locateMeNumbersEdits[index]=!1},$scope.greetingOptionsSave=function(){$scope.item.settings.type="fdv.settings-greeting-options-extended"===$scope.item.greetingOption?"extended":"fdv.settings-greeting-options-personal"===$scope.item.greetingOption?"personal":"fdv.settings-greeting-options-system"===$scope.item.greetingOption?"fdv.settings-greeting-options-system-name"===$scope.item.systemGreetingOption?"system_name":"fdv.settings-greeting-options-system-number"===$scope.item.systemGreetingOption?"system_number":"system":"system",$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-greetings-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.toggleItem=function(){"forwarding"===$scope.item.model?(fdvValidation.validateLocalPhoneNumber($scope.item.settings.destNumber)||$scope.item.value)&&$scope.showModal($scope.item.label):"simultaneousRing"===$scope.item.model?$scope.isSimultaneousRingValid()&&$scope.showModal($scope.item.label):"blockIncomingAnonymousOrPrivate"!==$scope.item.model?$scope.showModal($scope.item.label):$scope.showModal("fdv.settings-call-settings-incoming-call-block","fdv.settings-call-settings-incoming-call-block-save",$scope.item,fdvConstant.MODAL.CALL_BLOCK)},$scope.notificationSettingsSave=function(){$scope.item.settings.targets.mobileNumber&&!$scope.item.settings.targets.mobileNumber.enabled&&($scope.item.settings.targets.mobileNumber.number=""),$scope.item.settings.targets.pagerNumber&&!$scope.item.settings.targets.pagerNumber.enabled&&($scope.item.settings.targets.pagerNumber.number=""),$scope.item.settings.targets.email&&!$scope.item.settings.targets.email.enabled&&($scope.item.settings.targets.email.address=""),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-voicemail-options-saved"})})["catch"](function(){$scope.clearLoading()})},$scope.selectForwardingOption=function(value){$scope.item.settings.bySourceNumbers.enabled=value===$scope.item.forwardingOptions[1],$scope.item.settings.bySourceNumbers.enabled&&(fdvConfig.isStb()||$scope.showSelectedNumberModal())},$scope.showSelectedNumberModal=function(){$scope.selectedNumbersModal($scope.item.forwardingOptions[1],"fdv.settings-phone-numbers-list",!1)},$scope.selectBlockOption=function(value){fdvConfig.isStb()?value===$scope.incomingCallBlockNotifications[0]?$scope.item.settings.blockIncomingAnonymousOrPrivate=!$scope.item.settings.blockIncomingAnonymousOrPrivate:$scope.item.settings.enabled=!$scope.item.settings.enabled:$scope.selectedNumbersModal($scope.incomingCallBlockNotifications[1],"fdv.settings-phone-numbers-list",value)},$scope.checkBlockOption=function(value){return value===$scope.incomingCallBlockNotifications[0]?$scope.item.settings.blockIncomingAnonymousOrPrivate:$scope.item.settings.enabled},$scope.selectDndOption=function(value){$scope.item.settings.exceptions.enabled=$scope.item.settings.voicemailEnabled?value===$scope.item.dndOptions[1]:!0,$scope.item.choice=$scope.item.settings.voicemailEnabled?$scope.item.choice:$scope.item.dndOptions[1],$scope.item.settings.action=$scope.item.settings.exceptions.enabled?"system_greeting":"voicemail",$scope.item.settings.exceptions.enabled&&!fdvConfig.isStb()&&$scope.selectedNumbersModal("fdv.settings-except","fdv.settings-except-ring-through",!1)},$scope.checkDndOption=function(value){return $scope.item.settings.voicemailEnabled?!$scope.item.settings.exceptions.enabled&&value===$scope.item.dndOptions[0]||$scope.item.settings.exceptions.enabled&&value===$scope.item.dndOptions[1]:value===$scope.item.dndOptions[1]},$scope.showForwardSelectedNumbers=function(){fdvModalManager.show(fdvConstant.MODAL.SELECTED_NUMBERS,{title:"fdv.settings-forwarding-options-selected",text:"fdv.settings-phone-numbers-list",model:$scope.item,showEdit:!1,showAdd:!1,showDelete:!1}).then(function(result){fdvLog.debug("Settings",result)})},$scope.selectedNumbersModal=function(title,text,showEdit){"blockIncomingAnonymousOrPrivate"!==$scope.item.model?$scope.item.value||fdvModalManager.show(fdvConstant.MODAL.SELECTED_NUMBERS,{title:title,text:text,model:$scope.item,showEdit:showEdit,showAdd:!0,showDelete:!0}).then(function(result){fdvLog.debug("Settings",result)}):$timeout(function(){($scope.item.settings.enabled||showEdit)&&fdvModalManager.show(fdvConstant.MODAL.SELECTED_NUMBERS,{title:title,text:text,model:$scope.item,showEdit:showEdit,showAdd:!0,showDelete:!0}).then(function(result){fdvLog.debug("Settings",result)})})},$scope.showModal=function(title,text,model,modal){var type=modal||fdvConstant.MODAL.SETTINGS,localModel=model||$scope.item,stateOn=''+fdvLocaleManager.getString("fdv.label-on")+"",stateOff=''+fdvLocaleManager.getString("fdv.label-off")+"",message=fdvLocaleManager.getString("fdv.settings-turn",{state:localModel.value?stateOff:stateOn,feature:fdvLocaleManager.getString(title)}),dndSettingItem=localModel.root.dnd,simultaneousRingSettingItem=localModel.root.simultaneousRing,turnOnSimultaneousRingWhenDndOn=!localModel.value&&"simultaneousRing"===localModel.model&&dndSettingItem.value,turnOnDndWhenSimultaneousRingOn=!localModel.value&&"dnd"===localModel.model&&simultaneousRingSettingItem.value;"simultaneousRing"===localModel.model&&turnOnSimultaneousRingWhenDndOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-simultaneous-ring-when-dnb-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff})),"dnd"===localModel.model&&turnOnDndWhenSimultaneousRingOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-dnd-when-simultaneous-ring-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff})),fdvModalManager.show(type,{title:title,text:text,message:message,model:localModel}).then(function(result){modal!==fdvConstant.MODAL.STANDARD_PROMPTS&&($scope.setLoading(),fdvSettingsItem.update(result,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){type===fdvConstant.MODAL.SETTINGS?turnOnSimultaneousRingWhenDndOn?(dndSettingItem.value=!1,fdvSettingsItem.update(dndSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):turnOnDndWhenSimultaneousRingOn?(simultaneousRingSettingItem.value=!1,fdvSettingsItem.update(simultaneousRingSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):($scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})):($scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"}))})["catch"](function(){$scope.clearLoading()}))})},$scope.showContextualModal=function(item){var stateOn=''+fdvLocaleManager.getString("fdv.label-on")+"",stateOff=''+fdvLocaleManager.getString("fdv.label-off")+"",message=fdvLocaleManager.getString("fdv.settings-turn",{state:item.value?stateOff:stateOn,feature:fdvLocaleManager.getString(item.label)}),dndSettingItem=item.root.dnd,simultaneousRingSettingItem=item.root.simultaneousRing,turnOnSimultaneousRingWhenDndOn=!item.value&&"simultaneousRing"===item.model&&dndSettingItem.value,turnOnDndWhenSimultaneousRingOn=!item.value&&"dnd"===item.model&&simultaneousRingSettingItem.value;"simultaneousRing"===item.model&&turnOnSimultaneousRingWhenDndOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-simultaneous-ring-when-dnb-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff})),"dnd"===item.model&&turnOnDndWhenSimultaneousRingOn&&(message=fdvLocaleManager.getString("fdv.settings-turn-on-dnd-when-simultaneous-ring-on",{state1:stateOn,state2:stateOn,state3:stateOn,state4:stateOn,state5:stateOff})),fdvModalManager.show(fdvConstant.MODAL.SETTINGS,{title:item.label,message:message,item:$scope.item,model:[{id:fdvConstant.ACTION.CANCEL,label:"fdv.action-cancel"},{id:fdvConstant.ACTION.OK,label:"fdv.action-ok"}]}).then(function(result){$scope.contextualActionItemClicked(result,item,turnOnSimultaneousRingWhenDndOn,turnOnDndWhenSimultaneousRingOn,dndSettingItem,simultaneousRingSettingItem)})},$scope.contextualActionItemClicked=function(actionItem,item,turnOnSimultaneousRingWhenDndOn,turnOnDndWhenSimultaneousRingOn,dndSettingItem,simultaneousRingSettingItem){if(fdvConfig.isStb())switch(actionItem.id){case fdvConstant.ACTION.OK:"blockIncomingAnonymousOrPrivate"!==item.model&&(item.value=!item.value),$scope.setLoading(),fdvSettingsItem.update(item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){turnOnSimultaneousRingWhenDndOn?(dndSettingItem.value=!1,fdvSettingsItem.update(dndSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):turnOnDndWhenSimultaneousRingOn?(simultaneousRingSettingItem.value=!1,fdvSettingsItem.update(simultaneousRingSettingItem,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"})})["catch"](function(){$scope.clearLoading()})):($scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-options-saved"}))})["catch"](function(){$scope.clearLoading()});break;case fdvConstant.ACTION.CANCEL:fdvLog.debug("Settings","cancel updating option")}else actionItem.id===fdvConstant.ACTION.OK&&($scope.item.value=!$scope.item.value);return!0};var clearPassCodeFields=function(){$scope.item.oldCode=$scope.item.newCode=$scope.item.newCodeConfirmation=""};$scope.passCodeCancel=function(){clearPassCodeFields(),$scope.currentError=!1},$scope.changePassCode=function(){$scope.currentError=!1,fdvJsonApi.voiceMailboxAuthPost($scope.selectedPhoneLine.number,$scope.selectedMailbox.id,$scope.item.oldCode).then(function(){$scope.currentError=!1,$scope.item.settings["new"]=$scope.item.newCode,$scope.item.settings.current=$scope.item.oldCode,clearPassCodeFields(),fdvLog.debug("Settings","update options for "+$scope.item.model),$scope.setLoading(),fdvSettingsItem.update($scope.item,$scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.clearLoading(),fdvSettingsItem.toast({str:"fdv.settings-voicemail-options-saved"})})["catch"](function(){$scope.clearLoading()})})["catch"](function(){$scope.currentError=!0,clearPassCodeFields(),fdvAlertManager.error("fdv.settings-incorrect-passcode"),fdvLog.error($scope.componentName,"Wrong passcode.")})},$scope.isPassCodeValid=function(){return fdvValidation.validateOldPasscode($scope.item.oldCode)&&fdvValidation.validateNewPasscode($scope.item.newCode)&&fdvValidation.validateNewPasscode($scope.item.newCodeConfirmation)&&fdvValidation.validateNewPasscodeMismatch({code:$scope.item.newCode,confirm:$scope.item.newCodeConfirmation})&&fdvValidation.validateNewPasscodeRepeated($scope.item.newCode)&&fdvValidation.validateNewPasscodeConsecutive($scope.item.newCode)&&fdvValidation.validateNewPasscodeContained({code:$scope.item.newCode,number:$scope.selectedPhoneLine.number})},$scope.keyHandler=function(keyEvent,value){fdvLog.debug(keyEvent.keyCode,value),13===keyEvent.keyCode&&$scope.add(value)},$scope.editKeyHandler=function(keyEvent,value,index){if(13===keyEvent.keyCode){$scope.simultaneousRingNumbersEdits[index]=!1;var sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";""!==sanitizedValue&&$scope.item.settings.numbers.indexOf(sanitizedValue)<0&&($scope.item.settings.numbers[index]=sanitizedValue,fdvSettingsItem.toast({str:"fdv.settings-saved"}))}else 100===keyEvent.keyCode&&(fdvSettingsItem.toast({str:"fdv.settings-deleted"}),$scope.item.settings.numbers.splice(index,1),$scope.simultaneousRingNumbersEdits[index]=!1)},$scope.add=function(value,number){var arr="dnd"===$scope.item.model?$scope.item.settings.exceptions.numbers:"locateMe"===$scope.item.model?$scope.item.settings.targets:$scope.item.settings.numbers,sanitizedValue="undefined"!=typeof value?fdvValidation.onlyDigits(value):"";arr&&""!==sanitizedValue&&arr.indexOf(sanitizedValue)<0?("simultaneousRing"!==$scope.item.model&&"locateMe"!==$scope.item.model||arr.length<3)&&("locateMe"===$scope.item.model?0===$scope.item.settings.targets.filter(function(i){return i.number===sanitizedValue}).length&&number>0?arr.push({number:sanitizedValue,numberRings:number}):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"}):fdvValidation.validateLocalPhoneNumber(value)?arr.push(sanitizedValue):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})):fdvSettingsItem.toast({str:"fdv.validation-phone-number-invalid"})},$scope.uniqueLocateMeNumber=function(value){return value&&1===$scope.item.settings.targets.filter(function(i){return i.number===value}).length},$scope.recordGreeting=function(){fdvModalManager.show(fdvConstant.MODAL.RECORD_GREETINGS,{title:"fdv.settings-voicemail-settings-greetiing-record-new",text:"metaswitch"==$scope.selectedPhoneLine.provider?"fdv.settings-voicemail-settings-greetiing-record-metaswitch":"fdv.settings-voicemail-settings-greetiing-record",buttons:[{id:"cancel",label:"fdv.action-cancel" },{id:"confirm",label:"fdv.action-call"}],model:{}}).then(function(result){return fdvLog.debug("MOBILE SETTINGS","Calling : "+result.greetingNumber),fdvNativeApi.nativeOpenDialPad(result.greetingNumber)}.bind(this))},$scope.showPasscodeInfo=function(){$scope.showModal("fdv.access-mailbox-passcode-requirements","fdv.access-mailbox-passcode-tip",null,fdvConstant.MODAL.STANDARD_PROMPTS)},$scope.resetMailbox=function(mailbox){var index=$scope.mailboxes.map(function(x){return x.id}).indexOf(mailbox.id);$scope.setLoading(),fdvJsonApi.voiceMailboxPasscodeResetPost($scope.selectedPhoneLine.number,mailbox.id).then(function(model){$scope.clearLoading(),$scope.resetCompletedArray[index]=!0,$scope.passCodeArray[index]=model.newPasscode}.bind(this))["catch"](function(){$scope.clearLoading(),fdvLog.warn($scope.componentName,"failed to reset passcode."),$scope.resetFailedArray[index]=!0,$scope.resetCompletedArray[index]=!1,$scope.passCodeArray[index]=""}.bind(this))},$scope.isForwardingValid=function(){var number=$scope.item.settings.destNumber||$scope.item.destNumber;return(!$scope.item.settings.bySourceNumbers.enabled||fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.bySourceNumbers.numbers))&&fdvValidation.validateLocalPhoneNumber(number)},$scope.isSimultaneousRingValid=function(){if(!($scope.item.settings.numbers&&$scope.item.settings.numbers instanceof Array))return!1;var isValid=!0;return $scope.item.settings.numbers.forEach(function(value){isValid=isValid&&(""===value||fdvValidation.validateLocalPhoneNumber(value))}),isValid&&fdvValidation.validateAtLeastOnePhoneNumber($scope.item.settings.numbers)&&fdvValidation.validateUniquePhoneNumber($scope.item.settings.numbers)},$scope.forgotPasscode=function(){fdvRoute.gotoSubSettings({item:$scope.item.root.resetPasscode,selectedTab:$scope.selectedTab,selectedPhoneLine:$scope.selectedPhoneLine,selectedMailbox:$scope.selectedMailbox,description:""},!0)},$scope.isVoicemailNotificationsValid=function(){var isValid=!0;return $scope.item.settings.targets.mobileNumber&&$scope.item.settings.targets.mobileNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.mobileNumber.number)),$scope.item.settings.targets.pagerNumber&&$scope.item.settings.targets.pagerNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.pagerNumber.number)),$scope.item.settings.targets.email&&$scope.item.settings.targets.email.enabled&&(isValid=isValid&&$scope.item.settings.targets.email.address&&fdvValidation.validateEmail($scope.item.settings.targets.email.address)),$scope.item.settings.targets.forwardToNumber&&$scope.item.settings.targets.forwardToNumber.enabled&&(isValid=isValid&&fdvValidation.validateLocalPhoneNumber($scope.item.settings.targets.forwardToNumber.number)),isValid},$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox()||{id:null},fdvUserData.getMailboxes(newValue.number).then(function(model){$scope.mailboxes=model,fdvSettingsItem.setMailboxes(model),$scope.loading=!1})["catch"](function(){$scope.loading=!1,fdvLog.error($scope.componentName,"Error: loading mailboxes faied")})}),$scope.clearLoading=function(){$scope.loading=!1},$scope.setLoading=function(){$scope.loading=!0}}],link:function(scope,element){scope.phoneLinesSelectorVisible=!1,element.on("$destroy",function(){scope.phoneLinesSelectorVisible=!0}),"forwarding"===scope.item.model&&(scope.currentAddedForwardingNumber="",scope.callForwardingNumbersEdit=!1,fdvConfig.isStb()||(scope.forwardingOptionsInit=!1,scope.$watch("item.choice",function(newValue){scope.forwardingOptionsInit?scope.selectForwardingOption(newValue):scope.forwardingOptionsInit=!0}))),"dnd"===scope.item.model&&(fdvConfig.isStb()||(scope.dndOptionsInit=!1,scope.$watch("item.choice",function(newValue){scope.dndOptionsInit?scope.selectDndOption(newValue):scope.dndOptionsInit=!0}))),"locateMe"===scope.item.model&&(scope.locateMeNumbersEdits=[!1,!1,!1],scope.ringNumer=3,scope.locateMeNumber=""),"simultaneousRing"===scope.item.model&&(scope.simultaneousRingNumbersEdits=[!1,!1,!1],fdvConfig.isStb()&&scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){for(var focusCurrent,activePage=$("#fdv-view"),index=-1,focusableElements=activePage.find(".fdv-focusable"),i=0;i0?$scope.loadVoicemails():$scope.loading=!1})["catch"](function(reason){fdvLog.error($scope.componentName,reason)})},$scope.loadVoicemails=function(){$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),$scope.selectedMailbox=fdvUserData.getSelectedMailbox(),$scope.voicemailAccess=!1,$scope.voicemails=void 0,$scope.showVoicemail=!0,angular.isDefined($scope.selectedPhoneLine)&&angular.isDefined($scope.selectedMailbox)?(fdvLog.debug($scope.componentName,"Getting totalUnread for mailbox: "+$scope.selectedMailbox.label),fdvJsonApi.voiceMailboxTotalUnreadGet($scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(model){$scope.totalUnread=model.totalUnread},function(){$scope.totalUnread=0,fdvLog.debug($scope.componentName,"Can't get totalUnread")}),fdvLog.debug($scope.componentName,"Checking access to mailbox: "+$scope.selectedMailbox.label),fdvUserData.getVoicemailAccess($scope.selectedPhoneLine.number,$scope.selectedMailbox.id).then(function(){$scope.loading=!0,$scope.voicemailAccess=!0,fdvLog.debug($scope.componentName,"Loading voicemails for phone line:"+$scope.selectedPhoneLine.number+", mailbox:"+$scope.selectedMailbox.label),fdvJsonApi.voiceMailboxMessagesPagedGet($scope.selectedPhoneLine.number,$scope.selectedMailbox.id,0,fdvConstant.PAGINATION.MAX_PER_PAGE).then(function(model){$scope.voicemails=model,angular.isDefined($scope.voicemails)&&fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages),$scope.loading=!1}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: Loading voicemail messages faied"),$scope.loading=!1}.bind(this))},function(){$scope.loading=!1,fdvLog.debug($scope.componentName,"No access to mailbox:"+$scope.selectedMailbox.label)})):($scope.loading=!1,fdvLog.error($scope.componentName,angular.isDefined($scope.selectedPhoneLine)?"No mailbox selected":"No phone line selected"))},$scope.gotoVoicemails=function(voicemail){$scope.triggerEvent(fdvConstant.ROUTE.VOICEMAILS,voicemail)},$scope.gotoRecentCalls=function(){$scope.triggerEvent(fdvConstant.ROUTE.CALLS)},$scope.gotoCall=function(call){$scope.triggerEvent(fdvConstant.ROUTE.CALL,call)},$scope.triggerEvent=function(route,data){var sendEvent=function(){$scope.eventTriggered({event:{type:fdvConstant.EVENT.SUMMARY_CARD_CLICKED,data:{route:route,data:data}}})};route===fdvConstant.ROUTE.VOICEMAILS?$scope.actionManager.accessVoicemails().then(function(){sendEvent()}):sendEvent()},$scope.loadSummary()}],link:function(){}}}]),angular.module("fdvService.directives").directive("fdvTimepicker",["fdvConfig",function(fdvConfig){return{restrict:"EA",scope:{timeSelected:"&",model:"="},templateUrl:fdvConfig.getTemplateUrl("timepicker/timepicker.html"),controller:["$scope","$element",function($scope){$scope.show=!1,$scope.timePickerTimes=[];for(var timePickerTime=moment().startOf("day"),i=0;48>i;i++)$scope.timePickerTimes.push({time:timePickerTime.format("HH:mm A"),model:moment(timePickerTime)}),timePickerTime.add(30,"m");$scope.itemSelected=function(time){$scope.model=moment($scope.model).minute(time.model.minute()),$scope.model=moment($scope.model).hour(time.model.hour()),"undefined"!=typeof $scope.timeSelected&&$scope.timeSelected(time.model),$scope.show=!1},$scope.toggle=function(){$scope.show=!$scope.show}}],link:function(){}}}]),angular.module("fdvService.utils").service("fdvActionManager",["$q","$filter","$timeout","fdvLog","fdvConfig","fdvConstant","fdvModalManager","fdvUserData","fdvJsonApi","fdvAlertManager","locale","fdvMailboxMessageForwardModel",function($q,$filter,$timeout,fdvLog,fdvConfig,fdvConstant,fdvModalManager,fdvUserData,fdvJsonApi,fdvAlertManager,locale,fdvMailboxMessageForwardModel){var componentName="Action Manager",promptForDeviceContacts=!0,actionTitle=[];actionTitle[fdvConstant.ACTION.CALL_BACK]="Call Back",this.getActionTitle=function(action){return actionTitle[action]},this.placeACall=function(phoneLines){var self=this;"metaswitch"==fdvUserData.getSelectedPhoneLine().provider?self.accessVoicemails().then(function(){self._placeACall(phoneLines)}):self._placeACall(phoneLines)},this._placeACall=function(phoneLines){fdvModalManager.show(fdvConstant.MODAL.PLACE_A_CALL,{title:"fdv.place-a-call-title",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-call"}],model:{phoneLines:phoneLines,callFrom:fdvUserData.getSelectedPhoneLine()}}).then(function(result){return this.callBack(result.callTo)}.bind(this))},this.callBack=function(phoneNumber){var self=this;"metaswitch"==fdvUserData.getSelectedPhoneLine().provider?self.accessVoicemails().then(function(){self._callBack(phoneNumber)}):self._callBack(phoneNumber)},this._callBack=function(phoneNumber){var deferred=$q.defer(),selectedPhoneLine=fdvUserData.getSelectedPhoneLine();return!fdvConfig.getAccount().isAgent&&angular.isDefined(selectedPhoneLine)?fdvJsonApi.voiceCallPost(selectedPhoneLine.number,phoneNumber).then(function(){var message=locale.getString("fdv.action-message-callback-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-callback-fail",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this)):fdvLog.debug(componentName,"Can not place a call because no phone line selected or current user is Agent"),deferred.promise},this.textBack=function(){var deferred=$q.defer(),selectedPhoneLine=fdvUserData.getSelectedPhoneLine();return angular.isDefined(selectedPhoneLine)&&fdvConfig.isMobile(),deferred.promise},this.viewContact=function(phoneNumber,model){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.VIEW_CONTACT,{buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],title:"fdv.action-title-view-contact",model:model}).then(function(contactModel){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&fdvJsonApi.voiceContactPost(selectedPhoneLine.number,contactModel.id,contactModel.saveableCopy()).then(function(){var message=locale.getString("fdv.action-message-contact-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve(model)}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-contact-fail",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.addContact=function(model){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.VIEW_CONTACT,{buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],title:"fdv.action-title-add-contact",model:model}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&fdvJsonApi.voiceContactsPost(selectedPhoneLine.number,result.saveableCopy()).then(function(){var message=locale.getString("fdv.action-message-contact-added-success",{phoneNumber:$filter("phoneNumber")(selectedPhoneLine.number)});fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve(fdvConstant.ACTION_RESULT.CONTACT_SAVED)}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-contact-added-failed",{phoneNumber:$filter("phoneNumber")(selectedPhoneLine.number)});fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.unblockCaller=function(phoneNumber,options){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-unblock-caller",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-unblock"}],model:{question:locale.getString("fdv.action-message-unblock-caller-question",{phoneNumber:$filter("phoneNumber")(phoneNumber)}),description:"fdv.action-message-unblock-caller-description"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();if(angular.isDefined(selectedPhoneLine)&&angular.isObject(options)){var ret=options.unblockCaller(phoneNumber);ret?(fdvAlertManager.showLoading(),fdvJsonApi.voiceOptionsPost(selectedPhoneLine.number,{blockIncomingSelectedNumbers:options.blockIncomingSelectedNumbers}).then(function(){var message=locale.getString("fdv.action-message-unblock-caller-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.close(),fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-unblock-caller-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.close(),fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this))):(fdvLog.debug(componentName,"Service warning: This number has been unblocked."),deferred.resolve())}else{var message=locale.getString("fdv.action-message-unblock-caller-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,"Service error: Phone line's options is not available."),deferred.reject()}}.bind(this)),deferred.promise},this.blockCaller=function(phoneNumber,options){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-block-caller",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-block"}],model:{question:locale.getString("fdv.action-message-block-caller-question",{phoneNumber:$filter("phoneNumber")(phoneNumber)}),description:"fdv.action-message-block-caller-description"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();if(angular.isDefined(selectedPhoneLine)&&angular.isObject(options)){var ret=options.blockCaller(phoneNumber);ret?(fdvAlertManager.showLoading(),fdvJsonApi.voiceOptionsPost(selectedPhoneLine.number,{blockIncomingSelectedNumbers:options.blockIncomingSelectedNumbers}).then(function(){var message=locale.getString("fdv.action-message-block-caller-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.close(),fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-block-caller-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.close(),fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this))):(fdvLog.debug(componentName,"Service warning: This number has been blocked."),deferred.resolve())}else{var message=locale.getString("fdv.action-message-block-caller-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,"Service error: Phone line's options is not available."),deferred.reject()}}.bind(this)),deferred.promise},this.callNotification=function(phoneNumber,options){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.ADD_CALL_NOTIFICATION,{title:"fdv.action-title-call-notifications",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-notify"}],model:{question:locale.getString("fdv.action-message-call-notifications-question",{phoneNumber:$filter("phoneNumber")(phoneNumber)}),description:"fdv.action-message-call-notifications-description",email:options.notifications.email}}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();if(angular.isDefined(selectedPhoneLine)&&angular.isObject(options)){var ret=options.addCallNotification(phoneNumber,result.email);ret?fdvJsonApi.voiceOptionsPost(selectedPhoneLine.number,{notifications:options.notifications}).then(function(){var message=locale.getString("fdv.action-message-call-notifications-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-call-notifications-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this)):(fdvLog.debug(componentName,"Service warning: This number has been added to notification list."),deferred.resolve())}else{var message=locale.getString("fdv.action-message-call-notifications-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,"Service error: Phone line's options is not available."),deferred.reject()}}.bind(this)),deferred.promise},this.removeCallNotification=function(phoneNumber,options){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.REMOVE_CALL_NOTIFICATION,{title:"fdv.action-title-remove-call-notification",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-ok"}],model:{question:locale.getString("fdv.action-message-remove-call-notification-question",{phoneNumber:$filter("phoneNumber")(phoneNumber)}),description:"fdv.action-message-remove-call-notification-description"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();if(angular.isDefined(selectedPhoneLine)&&angular.isObject(options)){var ret=options.removeCallNotification(phoneNumber);ret?fdvJsonApi.voiceOptionsPost(selectedPhoneLine.number,{notifications:options.notifications}).then(function(){var message=locale.getString("fdv.action-message-remove-call-notification-success",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message=locale.getString("fdv.action-message-remove-call-notification-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,message),deferred.reject()}.bind(this)):(fdvLog.debug(componentName,"Service warning: This number has removed from notification list."),deferred.resolve())}else{var message=locale.getString("fdv.action-message-remove-call-notification-failure",{phoneNumber:$filter("phoneNumber")(phoneNumber)});fdvAlertManager.error(message),fdvLog.debug(componentName,"Service error: Phone line's options is not available."),deferred.reject()}}.bind(this)),deferred.promise},this.deleteACall=function(call){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-delete-a-call",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-message-delete-a-call-question"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceCallHistoryDeleteEntry(selectedPhoneLine.number,call.id).then(function(){fdvAlertManager.success("fdv.action-message-delete-a-call-success"),fdvLog.debug(componentName,"calls deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-a-call-failure"),fdvLog.debug(componentName,"call not deleted"),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.deleteCalls=function(selectedCalls){var deferred=$q.defer();if(angular.isArray(selectedCalls)&&selectedCalls.length>0)fdvModalManager.showConfirm({title:"fdv.action-title-delete-selected-calls",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-message-delete-selected-calls-question"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),requests=[];selectedCalls.forEach(function(item){requests.push(fdvJsonApi.voiceCallHistoryDeleteEntry(selectedPhoneLine.number,item.id))}),$q.all(requests).then(function(){fdvAlertManager.success("fdv.action-message-delete-selected-calls-success"),fdvLog.debug(componentName,"selected calls deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-selected-calls-failure"),fdvLog.debug(componentName,"selected calls not deleted"),deferred.reject()}.bind(this))});else{var error="deleteCalls(): no calls selected";fdvLog.debug(componentName,error),deferred.reject(error)}return deferred.promise},this.deleteAllCalls=function(filterId){var deferred=$q.defer();return fdvModalManager.showConfirm({title:filterId===fdvConstant.CALL.INCOMING_MISSED?"fdv.action-title-delete-all-missed-calls":"fdv.action-title-delete-all-calls",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:filterId===fdvConstant.CALL.INCOMING_MISSED?"fdv.action-message-delete-missed-calls-question":"fdv.action-message-delete-all-calls-question"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();if(filterId===fdvConstant.CALL.INCOMING_MISSED){var deleteMissedCalls=function(){fdvLog.debug(componentName,"Loading missed calls to delete..."),fdvJsonApi.voiceCallHistoryPagedGet(selectedPhoneLine.number,0,100,fdvConstant.CALL.INCOMING_MISSED).then(function(model){if(angular.isArray(model.callLog)){var missedCalls=model.callLog,requests=[];missedCalls.forEach(function(item){requests.push(fdvJsonApi.voiceCallHistoryDeleteEntry(selectedPhoneLine.number,item.id))}),$q.all(requests).then(function(){missedCalls.length<100?(fdvLog.debug(componentName,"All missed calls deleted"),fdvAlertManager.success("fdv.action-message-delete-missed-calls-success"),deferred.resolve()):(fdvLog.debug(componentName,"Loaded missed calls deleted"),deleteMissedCalls())}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-missed-calls-failure"),fdvLog.debug(componentName,"Loaded missed calls not deleted"),deferred.reject()}.bind(this))}else fdvLog.debug(componentName,"Couldn't load missed calls to delete, invalid response"),fdvAlertManager.error("fdv.action-message-delete-missed-calls-failure"),deferred.reject()})["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-missed-calls-failure"),fdvLog.debug(componentName,"Couldn't load missed calls to delete"),deferred.reject()})};deleteMissedCalls()}else fdvJsonApi.voiceCallHistoryDelete(selectedPhoneLine.number).then(function(){fdvAlertManager.success("fdv.action-message-delete-all-calls-success"),fdvLog.debug(componentName,"all calls deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-all-calls-failure"),fdvLog.debug(componentName,"calls not deleted"),deferred.reject()}.bind(this))}),deferred.promise},this.deleteAVoicemail=function(voicemail){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-delete-voicemail",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-message-delete-voicemail-question"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox();fdvJsonApi.voiceMailboxMessageDelete(selectedPhoneLine.number,selectedMailbox.id,voicemail.id).then(function(){fdvAlertManager.success("fdv.action-message-delete-voicemail-success"),fdvLog.debug(componentName,"Voicemail deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-voicemail-failure"),fdvLog.debug(componentName,"Service Error: Voicemail not deleted"),deferred.reject()}.bind(this))}),deferred.promise},this.forwardAVoicemail=function(voicemail){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.FORWARD_VOICEMAIL,{title:"fdv.action-title-forward-voicemail",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-send"}],model:{recipients:"",comment:""}}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox(),targets=[];result.recipients.replace(/\s|,/g,";").replace(/;+/g,";").split(";").forEach(function(email){targets.push({type:"email",address:email})});var data=new fdvMailboxMessageForwardModel({targets:targets,comment:result.comment});fdvJsonApi.voiceMailboxMessageForward(selectedPhoneLine.number,selectedMailbox.id,voicemail.id,data).then(function(){fdvAlertManager.success("fdv.action-message-forward-voicemail-success"),fdvLog.debug(componentName,"Voicemail forwarded to the recipients"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-forward-voicemail-failure"),fdvLog.debug(componentName,"Service Error: Voicemail not forwarded to the recipients"),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.renewAVoicemail=function(){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-renew-voicemail",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-renew"}],model:{question:"fdv.action-message-renew-voicemail-question"}}).then(function(){fdvLog.debug(componentName,"Voicemail is renewed"),deferred.resolve()}),deferred.promise},this.deleteVoicemails=function(selectedVoicemails){var deferred=$q.defer();if(angular.isArray(selectedVoicemails)&&selectedVoicemails.length>0)fdvModalManager.showConfirm({title:"fdv.action-title-delete-selected-voicemail",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-message-delete-selected-voicemail-question"}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox(),requests=[];selectedVoicemails.forEach(function(item){requests.push(fdvJsonApi.voiceMailboxMessageDelete(selectedPhoneLine.number,selectedMailbox.id,item.id))}),$q.all(requests).then(function(){fdvAlertManager.success("fdv.action-message-delete-selected-voicemail-success"),fdvLog.debug(componentName,"Selected voicemails deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-selected-voicemail-failure"),fdvLog.debug(componentName,"Service Error: not all selected voicemails deleted"),deferred.reject()}.bind(this))});else{var error="deleteVoicemail(): no voicemails selected";fdvLog.debug(componentName,error),deferred.reject(error)}return deferred.promise},this.deleteAllVoicemails=function(){var deferred=$q.defer(),selectedMailbox=fdvUserData.getSelectedMailbox();return fdvModalManager.showConfirm({title:"fdv.action-title-delete-all-voicemail",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:locale.getString("fdv.action-message-delete-all-voicemail-question",{mailbox:selectedMailbox.label})}}).then(function(){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceMailboxMessagesDelete(selectedPhoneLine.number,selectedMailbox.id).then(function(){ fdvAlertManager.success("fdv.action-message-delete-all-voicemail-success"),fdvLog.debug(componentName,"All entries deleted from voicemails"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-message-delete-all-voicemail-failure"),fdvLog.debug(componentName,'Service Error: All entries are not deleted from voicemails"'),deferred.reject()}.bind(this))}),deferred.promise},this.deleteAContact=function(contactId,deleteStartedCallback){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-contact-delete",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-delete-this-contact-question"}}).then(function(){"undefined"!=typeof deleteStartedCallback&&deleteStartedCallback();var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceContactDelete(selectedPhoneLine.number,contactId).then(function(){fdvAlertManager.success("fdv.action-delete-this-contact-success"),fdvLog.debug(componentName,"Contact entry deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-delete-this-contact-failure"),fdvLog.debug(componentName,"Service Error: Contact could not be deleted"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.deleteContacts=function(contactList,deleteStartedCallback){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-contact-delete-many",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-delete-contact-many-message"}}).then(function(){"undefined"!=typeof deleteStartedCallback&&deleteStartedCallback();var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),requests=[];contactList.forEach(function(contactId){requests.push(fdvJsonApi.voiceContactDelete(selectedPhoneLine.number,contactId))}.bind(this)),$q.all(requests).then(function(){fdvAlertManager.success("fdv.action-delete-contact-many-success"),fdvLog.debug(componentName,"Contact entry deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-delete-contact-many-failure"),fdvLog.debug(componentName,"Service Error: Not all contacts could be deleted"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.deleteAllContacts=function(deleteStartedCallback){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-contact-delete-all",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-delete-all-contacts-question"}}).then(function(){"undefined"!=typeof deleteStartedCallback&&deleteStartedCallback();var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceContactsDeleteAll(selectedPhoneLine.number).then(function(){fdvAlertManager.success("fdv.action-delete-all-contacts-success"),fdvLog.debug(componentName,"All contact deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-delete-all-contacts-failure"),fdvLog.debug(componentName,"Service Error: Not all contacts could be deleted"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.showNotification=function(level,message){fdvAlertManager.show(level,message)},this.viewCalendarEvent=function(model){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.ADD_CALENDAR_EVENT,{title:"fdv.view-edit-calendar-event-label-title",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],model:model}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&fdvJsonApi.voiceCalendarEventPut(selectedPhoneLine.number,result.id,result.saveableCopy()).then(function(){fdvAlertManager.success("fdv.action-update-calendar-event-generic"),fdvLog.debug(componentName,"event updated"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-add-calendar-event-failure"),fdvLog.debug(componentName,"Service Error: Event has not been saved"),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.addCalendarEvent=function(model){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.ADD_CALENDAR_EVENT,{title:"fdv.add-calendar-event-label-title",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],model:model}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&fdvJsonApi.voiceCalendarEventPost(selectedPhoneLine.number,result.saveableCopy()).then(function(){var message="";switch(result.getReminderType()){case"sms":message="fdv.action-add-calendar-event-sms";break;case"email":message="fdv.action-add-calendar-event-email";break;default:message="fdv.action-add-calendar-event-generic"}fdvAlertManager.success(message),fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-add-calendar-event-failure"),fdvLog.debug(componentName,"Service Error: Event has not been saved"),deferred.reject()}.bind(this))}.bind(this)),deferred.promise},this.deleteCalenarEvent=function(calendarEvent){var deferred=$q.defer();return fdvModalManager.showConfirm({title:"fdv.action-title-delete-event",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-delete"}],model:{question:"fdv.action-event-delete-question"}}).then(function(){"undefined"!=typeof deleteStartedCallback&&deleteStartedCallback();var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceCalendarEventDelete(selectedPhoneLine.number,calendarEvent.id).then(function(){fdvAlertManager.success("fdv.action-event-delete-success"),fdvLog.debug(componentName,"Event deleted"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-event-delete-failure"),fdvLog.debug(componentName,"Service Error: Event not deleted"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.viewScheduleCall=function(calendarEvent){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.SCHEDULE_CALL,{title:"fdv.action-view-edit-schedule-call",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],model:calendarEvent}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceCalendarEventPut(selectedPhoneLine.number,result.id,result.saveableCopy()).then(function(){fdvAlertManager.success("fdv.action-edit-schedule-call-success"),fdvLog.debug(componentName,"Call scheduled updated"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-schedule-call-failure"),fdvLog.debug(componentName,"Service Error: Call not scheduled"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.scheduleCall=function(calendarEvent){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.SCHEDULE_CALL,{title:"fdv.action-schedule-call",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-save"}],model:calendarEvent}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();fdvJsonApi.voiceCalendarEventPost(selectedPhoneLine.number,result.saveableCopy()).then(function(){fdvAlertManager.success("fdv.action-schedule-call-success"),fdvLog.debug(componentName,"Call scheduled"),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.action-schedule-call-failure"),fdvLog.debug(componentName,"Service Error: Call not scheduled"),deferred.reject()}.bind(this))}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.showContextualModal=function(contextualActionItems,contextualData){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.CONTEXTUAL,{title:"",buttons:[],model:{contextualActionItems:contextualActionItems,contextualData:contextualData}}).then(function(result){deferred.resolve(result.actionItem)}.bind(this))["catch"](function(){deferred.reject()}),deferred.promise},this.updateVoicemail=function(voicemail){var deferred=$q.defer(),selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox();return fdvJsonApi.voiceMailboxMessagePost(selectedPhoneLine.number,selectedMailbox.id,voicemail.id,voicemail).then(function(){var message="Voicemail is updated";fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){var message="Service Error: Voicemail isn't updated";fdvLog.debug(componentName,message),deferred.reject()}.bind(this)),deferred.promise},this.accessVoicemails=function(){var deferred=$q.defer(),selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox();return angular.isDefined(selectedMailbox)?(fdvLog.debug(componentName,"Checking access to mailbox: "+selectedMailbox.label),fdvUserData.getVoicemailAccess(selectedPhoneLine.number,selectedMailbox.id).then(function(){var message="Access authenticated";fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){fdvModalManager.show(fdvConstant.MODAL.ACCESS_MAILBOX,{title:"fdv.access-mailbox-title",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-ok"}],canReset:fdvConfig.getAccount().hasBillingAccessPermission,model:{enterPasscode:""}}).then(function(result){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),selectedMailbox=fdvUserData.getSelectedMailbox();fdvJsonApi.voiceMailboxAuthPost(selectedPhoneLine.number,selectedMailbox.id,result.enterPasscode).then(function(){fdvUserData.setVoicemailAccess(selectedPhoneLine.number,selectedMailbox.id,!0);var message="Passcode is correct";fdvLog.debug(componentName,message),deferred.resolve()}.bind(this))["catch"](function(){fdvAlertManager.error("fdv.access-mailbox-passcode-wrong"),fdvLog.debug(componentName,"Error: Passcode is wrong"),deferred.reject()}.bind(this))},function(){deferred.reject()})}.bind(this))):(fdvLog.debug(componentName,"No mailbox selected"),deferred.resolve()),deferred.promise},this.enterUnitAddress=function(unitAddress){var deferred=$q.defer();return fdvModalManager.show(fdvConstant.MODAL.ENTER_UNIT_ADDRESS,{title:"Enter unit address",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-ok"}],model:{unitAddress:unitAddress}}).then(function(result){deferred.resolve(result)},function(){deferred.reject()}),deferred.promise},this.saveToDeviceContacts=function(){var deferred=$q.defer();return promptForDeviceContacts?(promptForDeviceContacts=!1,fdvModalManager.showConfirm({title:"fdv.action-title-save-to-native-contacts",buttons:[{id:"cancel",label:"fdv.action-cancel"},{id:"confirm",label:"fdv.action-ok"}],model:{question:"",description:"fdv.action-message-save-to-native-contacts-description"}}).then(function(){deferred.resolve()})["catch"](function(){deferred.reject()})):deferred.resolve(),deferred.promise}}]),angular.module("fdvService.utils").service("fdvAnalytics",function(){}),angular.module("fdvService.directives").directive("fdvDebugOptions",["$q","fdvConfig","fdvAlertManager","fdvHTTPClient","locale","fdvVoiceNumberListModel","fdvUserData","$timeout","fdvRoute",function($q,fdvConfig,fdvAlertManager,fdvHTTPClient,locale,fdvVoiceNumberListModel,fdvUserData,$timeout){return{restrict:"E",templateUrl:fdvConfig.getTemplateUrl("debug/debug-options.html"),scope:!0,controller:["$scope",function($scope){"undefined"!=typeof fdvServiceAppConstants&&"object"==typeof fdvServiceAppConstants.DEBUG_OPTIONS&&($scope.debugOptions=fdvServiceAppConstants.DEBUG_OPTIONS,$scope.debugOptions.showDbNameInput=!1,$scope.debugOptions.showDbUploadInput=!1,$scope.debugOptions.showLogin=!1,$scope.debugOptions.loginUsername="agmob999@gmail.com",$scope.debugOptions.password="Password123",$scope.debugOptions.dbname="",$scope.debugOptions.selectedOption={},$scope.debugOptions.checkDbName=function(){var deferred=$q.defer();return fdvHTTPClient.get($scope.debugOptions.selectedOption.url+"/api/voice/").then(function(ret){deferred.resolve(ret.headers("x-voice-db-override"))}.bind(this))["catch"](function(){deferred.reject()}.bind(this)),deferred.promise},$scope.debugOptionClicked=function(debugOption){switch($scope.debugOptions.selectedOption=debugOption,debugOption.action){case"login":$scope.debugOptions.showLogin=!0;break;case"checkdb":$scope.debugOptions.checkDbName().then(function(dbname){if("string"!=typeof dbname)throw"database name could not be resolved";fdvAlertManager.error("database: "+dbname+" is currently configured")}.bind(this))["catch"](function(){fdvAlertManager.error("current database is not known")});break;case"selectdb":$scope.debugOptions.showDbNameInput=!0;break;case"uploaddb":$scope.debugOptions.showDbUploadInput=!0;break;case"patchlocale":"undefined"==typeof $scope.debugOptions.patchedGetString&&($scope.debugOptions.patchedGetString=locale.getString,locale.getString=function(txt){return txt},fdvAlertManager.error("All locale strings are now monkey patched. Future calls to local.getString will be recognizable. Refresh the browser to return to normal."));break;case"patchlocalelight":"undefined"==typeof $scope.debugOptions.patchedGetString&&($scope.debugOptions.patchedGetString=locale.getString,locale.getString=function(txt,subs){var result=$scope.debugOptions.patchedGetString.call(locale,txt,subs);return result!==txt||locale.isToken(txt)?"☺"+result+"☺":result},fdvAlertManager.error("All locale strings are now monkey patched. Future calls to local.getString will be recognizable. Refresh the browser to return to normal."))}},$scope.debugSelectDb=function(){$scope.debugOptions.showDbNameInput=!1,fdvHTTPClient.post($scope.debugOptions.selectedOption.url+"/api/voice/debug/settings",{dbname:$scope.debugOptions.dbname}).then(function(){return $scope.debugOptions.checkDbName()}.bind(this)).then(function(dbname){if("undefined"==typeof dbname||dbname!==$scope.debugOptions.dbname)throw"could not configure db";fdvAlertManager.info("database: "+dbname+" configured, refresh the browser to see!")}.bind(this))["catch"](function(){fdvAlertManager.error("database: "+$scope.debugOptions.dbname+" could not be configured")}.bind(this))},$scope.debugUploadDb=function(){if("undefined"!=typeof $scope.debugOptions.uploadFile&&"undefined"!=typeof $scope.debugOptions.uploadFile[0]&&$scope.debugOptions.dbname.length>0){$scope.debugOptions.showDbUploadInput=!1;var fd=new FormData;fd.append("dbfile",$scope.debugOptions.uploadFile[0]),fdvHTTPClient.upload($scope.debugOptions.selectedOption.url+"/api/voice/debug/testdb/"+$scope.debugOptions.dbname,fd).then(function(){fdvAlertManager.info("database: "+$scope.debugOptions.dbname+" uploaded, refresh the browser to see!")}.bind(this))["catch"](function(){fdvAlertManager.error("error uploading file")}.bind(this))}else fdvAlertManager.error("all fields must be valid")},$scope.debugLogin=function(){var url=$scope.debugOptions.selectedOption.url+"/api/login";fdvHTTPClient.post(url,{keepMeLoggedIn:!0,loginId:$scope.debugOptions.loginUsername,password:$scope.debugOptions.password}).then(function(){return fdvAlertManager.info("you have logged in, getting accounts"),fdvHTTPClient.get($scope.debugOptions.selectedOption.url+"/api/accounts")}).then(function(accountInfo){"undefined"!=typeof accountInfo.id||fdvAlertManager.error("error getting account info")}.bind(this))["catch"](function(){fdvAlertManager.error("error logging in, faking account!"),fdvUserData.getPhoneLines=function(){var deferred=$q.defer();return"undefined"!=typeof phoneLines&&phoneLinesAccountNumber===accountNumber?$timeout(function(){deferred.resolve(voiceList)}.bind(this)):deferred.resolve(voiceList),deferred.promise},$scope.account.id="26048348090101655";var voiceList=new fdvVoiceNumberListModel([{id:"5035964518",label:"5035964518 (test)",number:"5035964518",provider:"broadsoftGenband"}]);$scope.phoneLines=voiceList,fdvUserData.setPhoneLines(voiceList),$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine()}.bind(this))})}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.utils").service("fdvLocaleManager",["$q","fdvLog","locale",function($q,fdvLog,locale){this.init=function(){var deferred=$q.defer(),componentName="Locale Manager";return locale.ready("fdv").then(function(){fdvLog.debug(componentName,"Translations is loaded"),deferred.resolve()},function(){fdvLog.error(componentName,"Service Error: Translations is loaded"),deferred.reject()}),deferred.promise},this.getString=function(id,args){return locale.getString(id,args)}}]),angular.module("fdvService.utils").service("fdvLog",["$log",function(){var debugWindow=void 0;this.setDebugWindow=function(element){angular.isDefined(element)&&element.css({"background-color":"black",color:"white","overflow-y":"auto"}),debugWindow=element},this.printToDebugWindow=function(message){if(angular.isDefined(debugWindow)){var html=debugWindow.html();html.length>1e4?html=message:html+=message+"
",debugWindow.html(html),debugWindow.scrollTop(debugWindow.get(0).scrollHeight-debugWindow.get(0).clientHeight)}},this.debug=function(){},this.warn=function(){},this.info=function(){},this.error=function(){}}]),angular.module("fdvService.video").service("fdvVideoManager",function(){var videoConfig=void 0;this.showVideo=function(id){videoConfig=id},this.getVideoConfig=function(){return videoConfig}}).directive("fdvVideoDialog",["$sce","fdvConfig","fdvVideoManager",function($sce,fdvConfig,fdvVideoManager){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("video/video.html"),scope:!0,controller:["$scope","$element",function($scope){$scope.dismissVideo=function(){$scope.showVideoModal=!1,fdvVideoManager.showVideo(void 0)},$scope.videoId="",$scope.showVideoModal=!1,$scope.videoClick=function(id){$scope.showVideoModal=!0,$scope.videoId="https://www.youtube.com/embed/"+id+"?autoplay=1"},$scope.trustSrc=function(src){return $sce.trustAsResourceUrl(src)}}],compile:function(){return{pre:function(){},post:function(scope){scope.$watch(function(){return fdvVideoManager.getVideoConfig()},function(newValue){angular.isUndefined(newValue)||scope.videoClick(newValue)})}}}}}]),angular.module("fdvService.directives").directive("fdvVoicemail",["fdvLog","fdvConfig","fdvNativeApi","fdvActionManager","fdvUserData","fdvJsonApi",function(fdvLog,fdvConfig,fdvNativeApi,fdvActionManager,fdvUserData,fdvJsonApi){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("voicemails/voicemail.html"),controller:["$scope",function($scope){$scope.componentName="Voicemail Page",$scope.voicemail=$scope.routeManager.getCurrentRoute().getParamsData(),$scope.loading=!0,fdvNativeApi.registerWebViewResume(function(){$scope.getTelephonyAvaiability()}.bind(this)),$scope.deleteVoicemail=function(){$scope.actionManager.deleteAVoicemail($scope.voicemail).then(function(){$scope.routeManager.goBack()})},$scope.addToExistingContactNative=function(){fdvActionManager.saveToDeviceContacts().then(function(){fdvNativeApi.nativeEditContactInContactView($scope.voicemail.contactName,$scope.voicemail.from).then(function(){fdvLog.debug($scope.componentName,"Number is saved to device contacts")}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: Number is not saved to device contacts")}.bind(this))})},$scope.createNewContactNative=function(){fdvActionManager.saveToDeviceContacts().then(function(){fdvNativeApi.nativeCreateNewContactInContactView($scope.voicemail.contactName,$scope.voicemail.from).then(function(){fdvLog.debug($scope.componentName,"Number is added to device contacts")}.bind(this))["catch"](function(){fdvLog.error($scope.componentName,"Error: Number is not added to device contacts")}.bind(this))})},$scope.viewContactNative=function(){fdvNativeApi.nativeViewContactInContactView($scope.voicemail.from).then(function(){})["catch"](function(){})},$scope.blockCaller=function(){$scope.actionManager.blockCaller($scope.voicemail.from,$scope.options).then(function(){$scope.voicemail.isBlocked=!0})},$scope.unblockCaller=function(){$scope.actionManager.unblockCaller($scope.voicemail.from,$scope.options).then(function(){$scope.voicemail.isBlocked=!1})},$scope.textBack=function(){fdvNativeApi.nativeOpenSMSApp($scope.voicemail.from,"")},$scope.callBack=function(){$scope.isTelephonyAvailable?fdvNativeApi.nativeOpenDialPad($scope.voicemail.from):$scope.actionManager.callBack($scope.voicemail.from)},$scope.getContactStatus=function(){angular.isUndefined($scope.voicemail)||fdvNativeApi.nativeGetContactsByPhoneNumber($scope.voicemail.from).then(function(){$scope.isNumberOnNativeContacts=!0,fdvLog.debug($scope.componentName,"Number is already in native contacts")}.bind(this))["catch"](function(){$scope.isNumberOnNativeContacts=!1,fdvLog.debug($scope.componentName,"Number is not in native contacts")}.bind(this))},$scope.getTelephonyAvaiability=function(){$scope.isTelephonyAvailable=!1,fdvNativeApi.nativeIsTelephonyAvailable().then(function(){$scope.isTelephonyAvailable=!0,fdvLog.debug($scope.componentName,"Telephony is available"),$scope.getContactStatus()},function(){$scope.getContactStatus(),fdvLog.debug($scope.componentName,"Telephony is not available")})},$scope.getTelephonyAvaiability(),$scope.loadOptions=function(){return $scope.options=void 0,$scope.isNumberOnNativeContacts=!1,$scope.isTelephonyAvailable=!1,$scope.selectedPhoneLine=fdvUserData.getSelectedPhoneLine(),angular.isUndefined($scope.selectedPhoneLine)?void fdvLog.error($scope.componentName,"No phone line selected"):($scope.loading=!0,void fdvJsonApi.voiceOptionsGet($scope.selectedPhoneLine.number).then(function(model){$scope.options=model,$scope.loading=!1})["catch"](function(){fdvLog.error($scope.componentName,"Error: loading options faied")}))},$scope.loadOptions()}],link:function(scope){scope.$on("$destroy",function(){fdvNativeApi.unregisterWebViewResume()})}}}]),angular.module("fdvService.directives").directive("fdvVoicemails",["$timeout","$q","$filter","fdvLog","fdvConfig","fdvConstant","fdvJsonApi","fdvUserData","fdvContactModel","fdvAlertManager","fdvActionManager","fdvNativeApi","fdvLocaleManager","fdvAudioPlayer",function($timeout,$q,$filter,fdvLog,fdvConfig,fdvConstant,fdvJsonApi,fdvUserData,fdvContactModel,fdvAlertManager,fdvActionManager,fdvNativeApi,fdvLocaleManager,fdvAudioPlayer){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("voicemails/voicemails.html"),controller:["$scope","$element",function($scope,$element){$scope.componentName="Voicemails Page",$scope.editMode=!1,$scope.isAll=!1,$scope.isAllSelected=!1,$scope.selectedPage=0,$scope.selectedVoicemails=[],fdvNativeApi.registerWebViewResume(function(){$scope.getTelephonyAvaiability()}.bind(this)),fdvNativeApi.registerWebviewBackground(function(){fdvAudioPlayer.pause()}),$scope.activeItem=null===$scope.routeManager.getCurrentRoute().getParamsData()?void 0:$scope.routeManager.getCurrentRoute().getParamsData(),angular.isDefined($scope.activeItem)&&($scope.activeItem.autoplay=!0),$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue,oldValue){angular.isDefined(newValue)&&newValue!=oldValue&&($scope.selectedPage=0,$scope.loadMailboxes())}),$scope.$watch(function(){return fdvUserData.getSelectedMailbox()},function(newValue,oldValue){angular.isDefined(newValue)&&newValue!==oldValue&&newValue!==$scope.selectedMailbox?($scope.selectedPage=0,$scope.loadVoicemails()):$scope.showVoicemail=!1}),$scope.paginationSelectionChanged=function(page){$scope.editMode=!1,$scope.isAllSelected=!1,$scope.selectedVoicemails=[],$scope.selectedPage=page,$scope.loadVoicemails()},$element.find(".fdv-page-content").on("scroll",function(){if(angular.isDefined($scope.pageData)&&this.scrollTop>=this.scrollHeight-this.clientHeight-20){var pageCount=$scope.pageData.maxItems/$scope.pageData.maxItemsPerPage;$scope.selectedPage=0&&($scope.contacts.contacts[index]=result),fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages)});break;case fdvConstant.ACTION.UNBLOCK_CALLER:$scope.actionManager.unblockCaller(voicemail.from,$scope.options).then(function(){actionItem.id=fdvConstant.ACTION.BLOCK_CALLER,actionItem.label="fdv.action-caller-block",fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages)});break;case fdvConstant.ACTION.BLOCK_CALLER:$scope.actionManager.blockCaller(voicemail.from,$scope.options).then(function(){actionItem.id=fdvConstant.ACTION.UNBLOCK_CALLER,actionItem.label="fdv.action-caller-unblock",fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages)});break;case fdvConstant.ACTION.ADD_CALL_NOTIFICATION:$scope.actionManager.callNotification(voicemail.from,$scope.options).then(function(){actionItem.id=fdvConstant.ACTION.REMOVE_CALL_NOTIFICATION,actionItem.label="fdv.action-notification-remove",fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages)});break;case fdvConstant.ACTION.REMOVE_CALL_NOTIFICATION:$scope.actionManager.removeCallNotification(voicemail.from,$scope.options).then(function(){actionItem.id=fdvConstant.ACTION.ADD_CALL_NOTIFICATION,actionItem.label="fdv.action-notification-add",fdvUserData.processVoiceData($scope.contacts,$scope.options,$scope.voicemails.mailboxMessages)});break;case fdvConstant.ACTION.DELETE_VOICEMAIL:$scope.actionManager.deleteAVoicemail(voicemail).then(function(){$scope.activeItem=void 0,$scope.loadVoicemails(!0)});break;case fdvConstant.ACTION.FORWARD_VOICEMAIL:$scope.actionManager.forwardAVoicemail(voicemail);break;case fdvConstant.ACTION.RENEW_VOICEMAIL:$scope.actionManager.renewAVoicemail(voicemail)}return!0},$scope.selectAVoicemail=function(selected,voicemail){if(voicemail.isSelected=selected,selected===!1){$scope.isAllSelected=!1;for(var i=0;i<$scope.selectedVoicemails.length;i++)if($scope.selectedVoicemails[i].id===voicemail.id){$scope.selectedVoicemails.splice(i,1);break}}else $scope.selectedVoicemails.push(voicemail)},$scope.selectAllVoicemails=function(selected){$scope.selectedVoicemails=[],$scope.isAllSelected=selected,angular.isDefined($scope.voicemails)&&angular.isArray($scope.voicemails.mailboxMessages)&&$scope.voicemails.mailboxMessages.forEach(function(voicemail){voicemail.isSelected=$scope.isAllSelected,voicemail.isSelected&&$scope.selectedVoicemails.push(voicemail)})},$scope.enableEditMode=function(){$scope.activeItem=void 0,$scope.editMode=!0,fdvAudioPlayer.pause()},$scope.disableEditMode=function(){$scope.editMode=!1},$scope.deleteVoicemails=function(){$scope.actionManager.deleteVoicemails($scope.selectedVoicemails).then(function(){$scope.selectedPage=0,$scope.loadVoicemails(!0),$scope.selectedVoicemails=[],$scope.isAllSelected=!1})},$scope.deleteAllVoicemails=function(){$scope.actionManager.deleteAllVoicemails().then(function(){$scope.isAllSelected=!1,$scope.editMode=!1,$scope.selectedPage=0,$scope.voicemails=void 0,$scope.currentRoute.setContext({dataLength:0})})},$scope.$on(fdvConstant.EVENT.OPTIONS_MENU_CLICKED,function(event,data){data.id===fdvConstant.ACTION.DELETE_ALL&&$scope.deleteAllVoicemails()}),$scope.loadMailboxes(),$scope.getTelephonyAvaiability=function(){$scope.isTelephonyAvailable=!1,fdvNativeApi.nativeIsTelephonyAvailable().then(function(){fdvLog.debug($scope.componentName,"Telephony is available"),$scope.isTelephonyAvailable=!0},function(){fdvLog.debug($scope.componentName,"Telephony is not available")})},$scope.getTelephonyAvaiability()}],link:function(scope){scope.$on("$destroy",function(){fdvNativeApi.unregisterWebViewResume(),fdvNativeApi.unregisterWebviewBackground()}),scope.expiryIconClicked=function(event){event.stopPropagation()},scope.$onclose=function(){return scope.editMode===!0?($timeout(function(){scope.disableEditMode(),scope.selectAllVoicemails(!1)}),!0):!1},scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){switch(eventData.keyCode){case fdvConstant.KEY.KEY_C:case fdvConstant.KEY.REMOTE_KEY_C:scope.loadVoicemails()}})}}}]),angular.module("fdvService.widgets").directive("fdvAddNumber",["$timeout","fdvConfig","fdvLog","fdvUserData","fdvJsonApi","fdvValidation","fdvSettingsItem","fdvLocaleManager","fdvConstant",function($timeout,fdvConfig,fdvLog,fdvUserData,fdvJsonApi,fdvValidation,fdvSettingsItem,fdvLocaleManager,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/add-number.html"),scope:{phones:"=",item:"="},controller:["$scope","$filter",function($scope){$scope.currentSourceNumber=null,$scope.add=function(number){var sanitizedValue="undefined"!=typeof number&&number?fdvValidation.onlyDigits(number):"";""!==sanitizedValue&&$scope.phones.indexOf(sanitizedValue)<0?($scope.phones.unshift(sanitizedValue),$scope.currentSourceNumber=null,$scope.selectedPage=0,$scope.pageData={maxItems:$scope.phones.length,maxItemsPerPage:$scope.pageData.maxItemsPerPage,page:$scope.selectedPage}):fdvSettingsItem.toast({str:"fdv.validation-phone-number-unique-invalid"})},$scope.deleteNumber=function(number){var index=$scope.phones.indexOf(number);index>-1&&($scope.phones.splice(index,1),$scope.pageData={maxItems:$scope.phones.length,maxItemsPerPage:$scope.pageData.maxItemsPerPage})},$scope.unique=function(number){var sanitizedValue="undefined"!=typeof number&&number?fdvValidation.onlyDigits(number):"";return""!==sanitizedValue&&$scope.phones.indexOf(sanitizedValue)<0};var contacts=void 0;$scope.reloadSuggestions=function(value){var selectedPhoneLine=fdvUserData.getSelectedPhoneLine();angular.isDefined(selectedPhoneLine)&&angular.isUndefined(contacts)?fdvJsonApi.voiceContactsPagedGet(selectedPhoneLine.number,0,1e3).then(function(model){contacts=model,$scope.suggestions=fdvUserData.searchContacts(contacts,value)}):$scope.suggestions=fdvUserData.searchContacts(contacts,value)},$scope.isCurrentNumberValid=function(value){return fdvValidation.validateLocalPhoneNumber(value)},$scope.selectedPage=0,$scope.pageData={maxItems:$scope.phones.length,maxItemsPerPage:fdvConstant.PAGINATION.MAX_PER_PAGE},$scope.paginationSelectionChanged=function(page){$scope.selectedPage=page}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvAddEvent",["fdvConfig","fdvScheduleModel","$timeout",function(fdvConfig,fdvScheduleModel){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/add-scheduled-event.html"),scope:!1,controller:["$scope",function($scope){$scope.schedule=new fdvScheduleModel,$scope.schedule.startDate=Date.now(),$scope.schedule.endDate=Date.now(),$scope.getIsoMoment=function(time){return moment(new Date(time).toISOString())},$scope.startDate=$scope.startTime=$scope.getIsoMoment($scope.schedule.startDate),$scope.endDate=$scope.endTime=$scope.getIsoMoment($scope.schedule.endDate),$scope.startDateISO=$scope.startTimeISO=$scope.startTime.toISOString(),$scope.endDateISO=$scope.endTimeISO=$scope.endTime.toISOString(),$scope.toggleStartDatePicker=function(){$scope.showStartDatePicker=!$scope.showStartDatePicker},$scope.toggleEndDatePicker=function(){$scope.showEndDatePicker=!$scope.showEndDatePicker},$scope.update=function(time,event,unit){$scope[event+unit]=$scope.getIsoMoment(time),$scope[event+"Date"].hours($scope[event+"Time"].hours()),$scope[event+"Date"].minutes($scope[event+"Time"].minutes()),$scope.schedule[event+"Date"]=$scope[event+"Date"].toISOString()},$scope.$watch("startDateISO",function(newValue){$scope.update(newValue,"start","Date")}),$scope.$watch("endDateISO",function(newValue){$scope.update(newValue,"end","Date")}),$scope.$watch("startTimeISO",function(newValue){$scope.update(newValue,"start","Time")}),$scope.$watch("endTimeISO",function(newValue){$scope.update(newValue,"end","Time")}),$scope.$watch("repeat",function(){$scope.repeat?($scope.schedule.repeat.frequency="weekly",$scope.schedule.repeat.interval=1):(delete $scope.schedule.repeat.frequency,delete $scope.schedule.repeat.interval,delete $scope.schedule.repeat.dayOfMonth)})}],link:function(scope,element){scope.repeat=scope.schedule&&!!scope.schedule.repeat&&!!scope.schedule.repeat.frequency,element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").service("fdvAlertManager",["fdvLog","$timeout","fdvConstant","locale","fdvConfig",function(fdvLog,$timeout,fdvConstant,locale,fdvConfig){this.altertOptions={alerts:fdvConstant.ALERT,visible:!1,type:"",message:""},this.show=function(type,message){this.altertOptions.visible=!0,this.altertOptions.type=type,this.altertOptions.message=message;var duration=fdvConfig.isWeb()?1e4:3e3;$timeout(function(){this.altertOptions.visible=!1}.bind(this),duration)},this.showLoading=function(){this.altertOptions.visible=!0,this.altertOptions.type=fdvConstant.ALERT.INFO,this.altertOptions.message=locale.getString("fdv.message-loading")},this.close=function(){this.altertOptions.visible=!1},this.error=function(message){this.show(fdvConstant.ALERT.DANGER,locale.getString(message))},this.info=function(message){this.show(fdvConstant.ALERT.INFO,locale.getString(message))},this.success=function(message){this.show(fdvConstant.ALERT.SUCCESS,locale.getString(message))},this.warning=function(message){this.show(fdvConstant.ALERT.WARNING,locale.getString(message))},this.getVisibility=function(){return this.altertOptions.visible},this.getAlertOptions=function(){return this.altertOptions}}]).directive("fdvAlert",["fdvLog","fdvConfig","fdvRoute","fdvAlertManager",function(fdvLog,fdvConfig,fdvRoute,fdvAlertManager){return{restrict:"EC",templateUrl:fdvConfig.getTemplateUrl("widgets/alert.html"),scope:{},controller:["$scope","$element",function($scope){$scope.altertOptions=fdvAlertManager.getAlertOptions(),$scope.$watch(function(){return fdvAlertManager.getVisibility()},function(){$scope.altertOptions=fdvAlertManager.getAlertOptions()})}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvCallSelection",["fdvConfig","fdvLog","$timeout",function(fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/call-selection-radio.html"),scope:{note:"=",notifications:"=",voicemails:"=",item:"=",phones:"=",show:"="},controller:["$scope",function($scope){"blockIncomingAnonymousOrPrivate"===$scope.item.model&&($scope.$watch("item.settings.enabled",function(){$scope.item.value=$scope.item.settings.enabled||$scope.item.settings.blockIncomingAnonymousOrPrivate}),$scope.$watch("item.settings.blockIncomingAnonymousOrPrivate",function(){$scope.item.value=$scope.item.settings.enabled||$scope.item.settings.blockIncomingAnonymousOrPrivate})),"dnd"!==$scope.item.model||$scope.voicemails||($scope.show=!0)}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvCheckbox",["$filter","fdvLog","fdvConfig",function($filter,fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:function(element,attrs){return fdvConfig.getTemplateUrl("undefined"!=typeof attrs.checkboxStyle&&"square"!==attrs.checkboxStyle?"widgets/checkbox.html":"widgets/checkboxsquare.html")},scope:{ngModel:"=",fdvDisable:"=",ngChange:"&",checkboxStyle:"@"},controller:["$scope",function($scope){$scope.componentName="Checkbox",$scope.change=function(event){$scope.fdvDisable||($scope.ngModel=!$scope.ngModel,$scope.ngChange({value:$scope.ngModel}),event.stopPropagation())}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvContactsDropdown",["$filter","fdvLog","fdvConfig",function($filter,fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/contactsdropdown.html"),scope:{placeholder:"@",items:"=",value:"=",valueChanged:"&",labelName:"@",phoneNumber:"@",valueName:"@",filterName:"@?",dropdownDisabled:"="},controller:["$scope",function($scope){$scope.componentName="Dropdown Box",$scope.itemClicked=function(index){$scope.value=$scope.items[index],$scope.valueChanged({value:$scope.value})},$scope.filter=function(data){return angular.isUndefined($scope.filterName)?data:$filter($scope.filterName)(data)},$scope.$watch("value",function(newValue){$scope.selectedIndex=-1,angular.forEach($scope.items,function(value,key){value===newValue&&($scope.selectedIndex=key)})})}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvContextualMenu",["fdvConfig","fdvLog",function(fdvConfig,fdvLog){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/contextual-menu.html"),scope:{showIcon:"@",onClick:"&",onClose:"&",menuItems:"=",validateMenuAppearance:"&"},controller:["$scope","$element",function($scope,$element){$scope.select=function(index,event){void 0===$scope.onClick({menuItem:$scope.menuItems[index]})&&fdvLog.debug("ContextualMenu","No default handler"),$element.hide(),event.stopPropagation()},$scope.someCall=function(){}}],compile:function(){return{pre:function(){},post:function(scope,iElement){$(".fdv-contextual-container").on("click",function(event){if(void 0!==scope.menuItems&&0!==scope.menuItems.length){var ok=scope.validateMenuAppearance();if(ok===!1)return iElement.hide(),void scope.onClose();var width=iElement.width(),height=iElement.height(),left=event.pageX;event.pageX+width>window.innerWidth&&(left=window.innerWidth-width);var top=event.pageY;event.pageY+height>window.innerHeight&&(top=window.innerHeight-height),iElement.css({left:left+"px",top:top+"px"}).show()}}),$(document).click(function(event){$(event.target).closest(".fdv-contextual-container").length||(iElement.hide(),scope.onClose())})}}}}}]),angular.module("fdvService.widgets").directive("fdvDropdown",["$filter","fdvLog","fdvConfig",function($filter,fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/dropdown.html"),require:"ngModel",scope:{placeholder:"@",prefixString:"@",items:"=",valueChanged:"&",labelName:"@",valueName:"@",filterName:"@?",errorMessage:"@",dropdownDisabled:"="},controller:["$scope",function($scope){$scope.componentName="Dropdown Box",$scope.filter=function(data){return angular.isUndefined($scope.filterName)?data:$filter($scope.filterName)(data)}}],link:function(scope,element,attrs,ngModelCtrl){scope.ngModelCtrl=ngModelCtrl;var validateRequired=function(value){return angular.isDefined(attrs.required)&&(angular.isUndefined(value)||null===value||""===value)?ngModelCtrl.$setValidity("required",!1):ngModelCtrl.$setValidity("required",!0),value};ngModelCtrl.$parsers.unshift(validateRequired),scope.itemClicked=function(index){scope.valueChanged({value:scope.items[index]}),scope.selectedIndex=index,ngModelCtrl.$setViewValue(scope.items[index])},element.find(".dropdown").on("hidden.bs.dropdown",function(){scope.$apply(function(){scope.touched=!0})}),element.find("button").on("click",function(){scope.$apply(function(){scope.touched=!1})}),ngModelCtrl.$render=function(){validateRequired(ngModelCtrl.$viewValue),scope.value=ngModelCtrl.$viewValue,scope.selectedIndex=-1,angular.forEach(scope.items,function(value,key){value===scope.value&&(scope.selectedIndex=key)})}}}}]),angular.module("fdvService.widgets").directive("fdvMailboxSelector",["$timeout","$q","fdvLog","fdvConfig","fdvRoute","fdvUserData",function($timeout,$q,fdvLog,fdvConfig,fdvRoute,fdvUserData){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/mailbox-selector.html"),scope:{mailboxes:"="},controller:["$scope",function($scope){$scope.$watch(function(){return fdvUserData.getSelectedMailbox()},function(newValue){$timeout(function(){$scope.selectedMailbox=newValue})}),$scope.mailboxChanged=function(mailbox){fdvUserData.setSelectedMailbox(mailbox)}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvMenu",["fdvConfig","fdvLog","fdvConstant","fdvRoute",function(fdvConfig,fdvLog,fdvConstant,fdvRoute){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/menu.html"),scope:{showIcon:"@",onClick:"&"},controller:["$scope",function($scope){var menuItems=[{iconClass:"fdv-icon fdv-menu-icon-home",route:fdvConstant.ROUTE.HOME,platforms:[fdvConstant.PLATFORM.WEB]},{iconClass:"fdv-icon fdv-menu-icon-voicemails",route:fdvConstant.ROUTE.VOICEMAILS,platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{iconClass:"fdv-icon fdv-menu-icon-calls",route:fdvConstant.ROUTE.CALLS,platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{iconClass:"fdv-icon fdv-menu-icon-contacts",route:fdvConstant.ROUTE.CONTACTS,platforms:[fdvConstant.PLATFORM.WEB]},{iconClass:"fdv-icon fdv-menu-icon-calendar",route:fdvConstant.ROUTE.CALENDAR,platforms:[]},{iconClass:"fdv-icon fdv-menu-icon-settings",route:fdvConstant.ROUTE.SETTINGS,platforms:[fdvConstant.PLATFORM.WEB,fdvConstant.PLATFORM.MOBILE,fdvConstant.PLATFORM.STB]},{iconClass:"fdv-icon fdv-menu-icon-faqs",route:fdvConstant.ROUTE.FAQS,platforms:[fdvConstant.PLATFORM.MOBILE]}];$scope.selectedIndex=0,$scope.menuItems=[],menuItems.forEach(function(item){var platform=fdvConfig.getPlatform();item.platforms.indexOf(platform)>=0&&$scope.menuItems.push(angular.extend({},item,{label:item.route===fdvConstant.ROUTE.HOME?"fdv.route-summary":fdvRoute.getRouteTitle(item.route)}))}),$scope.select=function(index){$scope.selectedIndex=index,void 0===$scope.onClick({menuItem:$scope.menuItems[index]})&&fdvRoute.goTo($scope.menuItems[index].route)},$scope.$watch(function(){return fdvRoute.getCurrentRoute()},function(newValue){angular.isUndefined(newValue)||$scope.menuItems.forEach(function(item,index){item.route===newValue.path&&($scope.selectedIndex=index)})})}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvOptionsMenu",["$filter","fdvLog","fdvConfig","fdvConstant","fdvUserData","fdvLocaleManager","fdvRoute",function($filter,fdvLog,fdvConfig,fdvConstant,fdvUserData,fdvLocaleManager,fdvRoute){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/options-menu.html"),scope:{optionSelected:"&"},controller:["$scope","$element",function($scope,$element){var popped;$scope.componentName="Options Menu",$scope.itemsStack=[],$scope.loading=!1,$scope.$watchCollection("itemsStack",function(newValue){angular.isArray(newValue)&&newValue.length>0&&($scope.activeIndex=0,$scope.items=newValue[newValue.length-1],$scope.items.forEach(function(item,index){angular.isDefined(popped)&&item.subOptionItems===popped&&($scope.activeIndex=index)}))}),$scope.itemClicked=function(item){item.id===fdvConstant.ACTION.CANCEL?$scope.itemsStack.length>1?popped=$scope.itemsStack.pop():$element.find(".dropdown").removeClass("open"):item.id===fdvConstant.ACTION.OPEN_SUB_OPTIONS?(popped=void 0,$scope.itemsStack.push(item.subOptionItems)):($scope.optionSelected({optionItem:item}),$element.find(".dropdown").removeClass("open"))},$scope.show=function(){$scope.getOptionItems(),$element.find(".dropdown").addClass("open")},$scope.getOptionItems=function(){var label="",optionItems=[];optionItems.push({id:fdvConstant.ACTION.CANCEL,label:"fdv.action-cancel"});var phoneLines=fdvUserData.getUserPhoneLines();if(angular.isArray(phoneLines)){if(2===phoneLines.length){var unSelectedPhoneLine=fdvUserData.getUnselectedPhoneLines()[0],phoneNumber=$filter("phoneNumber")(unSelectedPhoneLine.number);fdvRoute.isHome()?label=fdvLocaleManager.getString("fdv.option-show-menu-for")+" "+phoneNumber:fdvRoute.isVoicemails()?label=fdvLocaleManager.getString("fdv.option-show-voicemails-for")+" "+phoneNumber:fdvRoute.isCalls()?label=fdvLocaleManager.getString("fdv.option-show-calls-for")+" "+phoneNumber:fdvRoute.isSettings()&&(label=fdvLocaleManager.getString("fdv.option-show-settings-for")+" "+phoneNumber),optionItems.push({id:fdvConstant.ACTION.CHANGE_PHONE_LINE,label:label,value:unSelectedPhoneLine})}else if(phoneLines.length>2){fdvRoute.isHome()?label=fdvLocaleManager.getString("fdv.option-show-menu-for"):fdvRoute.isVoicemails()?label=fdvLocaleManager.getString("fdv.option-show-voicemails-for"):fdvRoute.isCalls()?label=fdvLocaleManager.getString("fdv.option-show-calls-for"):fdvRoute.isSettings()&&(label=fdvLocaleManager.getString("fdv.option-show-settings-for"));var subOptionItems=[];subOptionItems.push({id:fdvConstant.ACTION.CANCEL,label:"fdv.action-cancel"}),angular.forEach(phoneLines,function(value){subOptionItems.push({id:fdvConstant.ACTION.CHANGE_PHONE_LINE,label:$filter("phoneNumber")(value.number),selectedPhoneLine:$scope.selectedPhoneLine,value:value})}),optionItems.push({id:fdvConstant.ACTION.OPEN_SUB_OPTIONS,label:label,subOptionItems:subOptionItems})}var context=fdvRoute.getCurrentRoute().getContext();context.dataLength>0&&(fdvRoute.isVoicemails()||fdvRoute.isCalls())&&optionItems.push({id:fdvConstant.ACTION.DELETE_ALL,label:fdvLocaleManager.getString("fdv.action-delete-all")})}else fdvLog.debug($scope.componentName,"User has no valid Phone Lines");$scope.itemsStack.splice(0,$scope.itemsStack.length),$scope.itemsStack.push(optionItems)}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()}),element.find(".dropdown").on("hide.bs.dropdown",function(event){event.preventDefault()}),scope.$on(fdvConstant.EVENT.KEY_PRESSED,function(event,eventData){if(0!==element.find(".dropdown.open").length){for(var focusCurrent,index=-1,focusableElements=element.find(".fdv-focusable"),i=0;i0&&focusCurrent.click();break;case fdvConstant.KEY.ENTER:focusCurrent.click();break;case fdvConstant.KEY.UP:if(0>index)focusableElements.eq(0).addClass("active");else if(0===index);else{var focusPrev=focusableElements.eq(--index);focusCurrent.removeClass("active"),focusPrev.addClass("active")}break;case fdvConstant.KEY.DOWN:if(0>index)focusableElements.eq(0).addClass("active");else if(index===focusableElements.length-1);else{var focusPrev=focusableElements.eq(++index);focusCurrent.removeClass("active"),focusPrev.addClass("active")}}}})}}}]),angular.module("fdvService.widgets").directive("fdvPagination",["$timeout","fdvLog","fdvConfig",function($timeout,fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/pagination.html"),scope:{pageData:"=",paginationSelectedPage:"=",paginationSelectionChanged:"&",prevButtonVisible:"@",nextButtonVisible:"@"},controller:["$scope",function($scope){var havePagedData=!1;$scope.paginationPrevButtonEnabled=!0,$scope.paginationNextButtonEnabled=!0,$scope.paginationVisibility=!0,$scope.paginationButtons=[],$scope.beginPage=function(){fdvLog.debug("changed page"),$scope.paginationSelectedPage=0,$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons(),$timeout(function(){$scope.paginationSelectionChanged()})},$scope.nextPage=function(){fdvLog.debug("changed page"),$scope.paginationSelectedPage++,$scope.paginationSelectedPage>=$scope.paginationMaxPages&&($scope.paginationSelectedPage=$scope.paginationMaxPages-1),$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons(),$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})},$scope.prevPage=function(){fdvLog.debug("changed page"),$scope.paginationSelectedPage--,$scope.paginationSelectedPage<0&&($scope.paginationSelectedPage=0),$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons(),$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})},$scope.endPage=function(){fdvLog.debug("changed page"),$scope.paginationSelectedPage=$scope.paginationMaxPages-1,$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons(),$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})},$scope.pageClicked=function(model){$scope.paginationSelectedPage=model.page,$scope.refresh()},$scope.refresh=function(){$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons(),$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})},$scope.calcPaginationButtons=function(){if(0===$scope.pageData.maxItems)return void($scope.paginationButtons=[]);for(var needed=4,search=1,found=[$scope.paginationSelectedPage];found.length<$scope.paginationMaxPages&&needed>0;)$scope.paginationSelectedPage-search>=0&&needed>0&&(found.push($scope.paginationSelectedPage-search),needed--),$scope.paginationSelectedPage+search<$scope.paginationMaxPages&&needed>0&&(found.push($scope.paginationSelectedPage+search),needed--),search++;found.sort(function(a,b){return a-b}),$scope.paginationButtons=[];for(var i=0;i=$scope.paginationMaxPages-1&&($scope.paginationNextButtonEnabled=!1))},$scope.$watch("pageData",function(){"undefined"!=typeof $scope.pageData&&(havePagedData=!0,$scope.paginationMaxPages=Math.ceil($scope.pageData.maxItems/$scope.pageData.maxItemsPerPage),$scope.paginationSelectedPage===$scope.paginationMaxPages?($scope.paginationSelectedPage-=1,$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})):angular.isDefined($scope.pageData.page)&&isFinite($scope.pageData.page)&&($scope.paginationSelectedPage=$scope.pageData.page,$timeout(function(){$scope.paginationSelectionChanged({page:$scope.paginationSelectedPage})})),$scope.calcPaginationButtonVisibility(),$scope.calcPaginationButtons())})}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvPhoneLineSelector",["$filter","$q","fdvLog","fdvConfig","fdvRoute","fdvUserData",function($filter,$q,fdvLog,fdvConfig,fdvRoute,fdvUserData){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/phone-line-selector.html"),scope:{phoneLines:"=",showPrefix:"@"},controller:["$scope","$element",function($scope,$element){var route=fdvRoute.getCurrentRoute();$scope.isSubSettings="subsettings"===route.path,$scope.showPrefix&&($scope.prefixString="fdv.label-phone-no"),$scope.$watch(function(){return fdvUserData.getSelectedPhoneLine()},function(newValue){$scope.selectedPhoneLine=newValue}),$scope.phoneLineChanged=function(phoneLine){$element.find(".multiple-lines").removeClass("open"),fdvUserData.setSelectedPhoneLine(phoneLine)},$scope.togglePhoneLinesList=function(){$element.find(".multiple-lines").hasClass("open")?$element.find(".multiple-lines").removeClass("open"):$element.find(".multiple-lines").addClass("open")}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvPopup",["fdvLog","fdvConfig","fdvRoute",function(fdvLog,fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/popup.html"),scope:{phoneLineChanged:"&"},controller:["$scope",function(){}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvRadio",["$filter","fdvLog","fdvConfig",function($filter,fdvLog,fdvConfig){return{restrict:"E",templateUrl:fdvConfig.getTemplateUrl("widgets/radio.html"),scope:{ngModel:"=",ngChange:"&",value:"="},controller:["$scope",function($scope){$scope.disabled=!1,$scope.componentName="Radio",$scope.change=function(event){$scope.disabled||($scope.ngModel=$scope.value,$scope.ngChange({value:$scope.ngModel})),event.stopPropagation()}}],link:function(scope,element,attrs){scope.$watch(function(){return attrs.disabled},function(){scope.disabled=attrs.disabled}),element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvSpinner",["fdvConfig","fdvLocaleManager",function(fdvConfig,fdvLocaleManager){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/spinner.html"),scope:{text:"@"},controller:["$scope",function($scope){$scope.text=void 0==$scope.text||0==$scope.text.length?fdvLocaleManager.getString("fdv.message-loading"):$scope.text}],link:function(scope,element){var center=function(){var left=element.offset().left,width=element.width();element.css({width:width+"px",left:left+"px",bottom:0})};center(),angular.element(window).on("resize",function(){center()})}}}]).directive("fdvInlineSpinner",["fdvConfig",function(fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/inline-spinner.html"),controller:["$scope",function(){}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvSubPaneHeader",["fdvConfig","fdvLog","$timeout",function(fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/settings-subpane-heading.html"),scope:{item:"=",onoff:"=",show:"=",description:"="},controller:["$scope",function($scope){$scope.desc=$scope.description[$scope.item.model]}],link:function(){}}}]),angular.module("fdvService.widgets").directive("fdvTextField",["$filter","fdvLog","fdvConfig","fdvConstant",function($filter,fdvLog,fdvConfig,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/text-field.html"),require:"ngModel",scope:{placeholder:"@",type:"@",maxlength:"@",minlength:"@",pattern:"@",errorMessage:"@",helperMessage:"@",lines:"@"},controller:["$scope",function($scope){$scope.clicked=function(event){event.stopPropagation()}}],link:function(scope,element,attrs,ngModelCtrl){var inputElement=element.find("input");scope.ngModelCtrl=ngModelCtrl,scope.multilines=angular.isDefined(attrs.multilines),scope.onChange=function(value){ngModelCtrl.$setViewValue(value)},ngModelCtrl.$render=function(){scope.value=ngModelCtrl.$viewValue},scope["delete"]=function(){inputElement.val(inputElement.val().substr(0,inputElement.val().length-1)).trigger("change")},scope.onFocus=function(){scope.touched=!1},scope.onBlur=function(){scope.touched=!0},scope.onKeydown=function(event){var keyCode=event.keyCode||event.which;return fdvConfig.isStb()?keyCode===fdvConstant.KEY.KEY_1||keyCode===fdvConstant.KEY.KEY_2||keyCode===fdvConstant.KEY.KEY_3||keyCode===fdvConstant.KEY.KEY_4||keyCode===fdvConstant.KEY.KEY_5||keyCode===fdvConstant.KEY.KEY_6||keyCode===fdvConstant.KEY.KEY_7||keyCode===fdvConstant.KEY.KEY_8||keyCode===fdvConstant.KEY.KEY_9||keyCode===fdvConstant.KEY.KEY_0?!0:(event.preventDefault(),!1):void 0}}}}]),angular.module("fdvService.widgets").directive("fdvToggleButton",["fdvConfig","fdvLog","$timeout",function(fdvConfig){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/toggle-button.html"),scope:{iconClass:"=",label:"=",value:"=?",showIcon:"@"},controller:["$scope","$element",function($scope){$scope.onText="fdv.label-on",$scope.offText="fdv.label-off",$scope.toggle=function(event){$scope.value=event.offsetX>event.currentTarget.clientWidth/2}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy(); })}}}]),angular.module("fdvService.widgets").directive("fdvTurnOnOffToggleButton",["fdvConfig","fdvLog","$timeout",function(fdvConfig){return{restrict:"E",templateUrl:fdvConfig.getTemplateUrl("widgets/turn-on-off-toggle-button.html"),scope:{iconClass:"=",item:"=",value:"=?",showIcon:"@",disabled:"="},controller:["$scope","$element",function($scope){$scope.toggle=function(event){$scope.value=event.offsetX>event.currentTarget.clientWidth/2}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").directive("fdvTypeAhead",["$filter","$timeout","fdvLog","fdvConfig","fdvConstant",function($filter,$timeout,fdvLog,fdvConfig,fdvConstant){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/type-ahead.html"),require:"ngModel",scope:{suggestions:"=",valueChanged:"&",placeholder:"@",maxlength:"@",minlength:"@",pattern:"@",errorMessage:"@",helperMessage:"@",labelName:"@",valueName:"@",filterName:"@"},controller:["$scope","$element",function($scope){$scope.filter=function(data){return angular.isString($scope.filterName)?data:$filter($scope.filterName)(data)}}],link:function(scope,element,attrs,ngModelCtrl){var inputElement=element.find("input"),ulElement=element.find("ul");element.on("$destroy",function(){scope.$destroy()}),scope.ngModelCtrl=ngModelCtrl,scope.selectedIndex=-1,scope.showSuggestions=!1,scope.canHide=!0,scope.keyPress=function(event){switch(event.keyCode){case fdvConstant.KEY.ENTER:scope.showSuggestions=!1,scope.onChange(scope.value);break;case fdvConstant.KEY.UP:if(angular.isArray(scope.suggestions)&&scope.suggestions.length>0&&scope.selectedIndex>0){scope.selectedIndex--,scope.value=scope.suggestions[scope.selectedIndex].number;var liHeight=ulElement.find("li:first-child").height();ulElement.scrollTop()>0&&ulElement.scrollTop(ulElement.scrollTop()-liHeight)}break;case fdvConstant.KEY.DOWN:if(scope.showSuggestions=!0,angular.isArray(scope.suggestions)&&scope.suggestions.length>0&&scope.selectedIndex4&&ulElement.scrollTop(liHeight*(scope.selectedIndex-4))}}},scope.onChange=function(value){scope.selectedIndex=-1,angular.isDefined(value)&&value.length>0?(scope.showSuggestions=!0,scope.valueChanged({model:value})):scope.showSuggestions=!1,ngModelCtrl.$setViewValue(value)},ngModelCtrl.$render=function(){scope.value=ngModelCtrl.$viewValue,angular.isDefined(scope.filterName)&&"phoneNumber"===scope.filterName&&(scope.value=$filter(scope.filterName)(scope.value))},scope.onFocus=function(){scope.touched=!1},scope.onBlur=function(){angular.isDefined(scope.filterName)&&"phoneNumber"===scope.filterName&&(scope.value=$filter(scope.filterName)(scope.value)),scope.canHide&&(scope.touched=!0,scope.showSuggestions=!1)},scope.onItemClicked=function(index){scope.showSuggestions=!1,scope.value=scope.suggestions[index].number,ngModelCtrl.$setViewValue(scope.value),inputElement.trigger("change"),angular.isDefined(scope.filterName)&&"phoneNumber"===scope.filterName&&(scope.value=$filter(scope.filterName)(scope.value))}}}}]),angular.module("fdvService.widgets").directive("fdvValidationMessage",["fdvConfig","fdvValidation","fdvUserData","$timeout",function(fdvConfig,fdvValidation,fdvUserData,$timeout){return{restrict:"E",template:function(element,attrs){return'
'},require:"^fdvValidationCollection",scope:{validationType:"@",value:"=",valueFunc:"&",secondValue:"=",contact:"=",selfValidate:"="},controller:["$scope",function($scope){$scope.isValid=!0,$scope.checkValidity=function(){$scope.invalidTypes=[];var value;value="undefined"!=typeof $scope.value?$scope.value:$scope.valueFunc();var validationList=$scope.validationType.split(",");validationList.forEach(function(validationType){var isValid=!0;switch(validationType){case"phone-number":isValid=fdvValidation.validatePhoneNumber(value);break;case"local-phone-number":isValid=fdvValidation.validateLocalPhoneNumber(value);break;case"phone-number-used":if("string"==typeof $scope.value&&$scope.value.length>0){var isValidPhoneNumber=fdvValidation.validatePhoneNumber(value);if(isValidPhoneNumber){var contacts=fdvUserData.getAllMatchingContacts(value);$scope.contact&&contacts.length>0&&contacts.forEach(function(){isValid=!1}.bind(this))}else isValid=!0}break;case"phone-number-unique":isValid=fdvValidation.validateUniquePhoneNumber(value);break;case"phone-number-at-least-one":isValid=fdvValidation.validateAtLeastOnePhoneNumber(value);break;case"name":isValid=fdvValidation.validateName(value);break;case"calendar-event-name":isValid=fdvValidation.validateCalendarEventName(value);break;case"calendar-event-location-name":isValid=fdvValidation.validateCalendarEventName(value);break;case"date-start-end-times":isValid=fdvValidation.validateDateStartEndTimes(value,$scope.secondValue);break;case"locate-phone-number":isValid=fdvValidation.validateLocateNumber(value);break;case"unique-locate-phone-number":isValid=fdvValidation.validateUniqueLocateNumber(value);break;case"at-least-one-locate-phone-number":isValid=fdvValidation.validateAtLeastOneLocateNumber(value);break;case"old-passcode":isValid=fdvValidation.validateOldPasscode(value);break;case"old-meta-passcode":isValid=fdvValidation.validateOldMetaPasscode(value);break;case"new-passcode":isValid=fdvValidation.validateNewPasscode(value);break;case"new-passcode-mismatch":isValid=fdvValidation.validateNewPasscodeMismatch(value);break;case"new-passcode-repeated":isValid=fdvValidation.validateNewPasscodeRepeated(value);break;case"new-passcode-meta-length":isValid=fdvValidation.validateNewPasscodeMetaLength(value);break;case"new-passcode-consecutive":isValid=fdvValidation.validateNewPasscodeConsecutive(value);break;case"new-passcode-contained":isValid=fdvValidation.validateNewPasscodeContained(value);break;case"email":isValid=fdvValidation.validateEmail(value);break;case"contact-has-minimal-properties":isValid=$scope.value.hasAtLeastOneNameAndPhoneNumber()}isValid===!1&&$scope.invalidTypes.push(validationType)}.bind(this)),$timeout(function(){$scope.isValid=0===$scope.invalidTypes.length}.bind(this),200)},$scope.sanitizeIfValid=function(){"undefined"!=typeof $scope.value&&"phone-number"===$scope.validationType&&fdvValidation.validatePhoneNumber($scope.value)&&($scope.value=$scope.value.replace(/([\D]*)/g,""))}}],link:function(scope,element,attrs,parentCtrl){"undefined"!=typeof parentCtrl&&("undefined"!=typeof attrs.value?parentCtrl.initValidation(scope,element,attrs.value):parentCtrl.initValidation(scope,element,attrs.valueFunc)),"undefined"!=typeof scope.value&&attrs.selfValidate&&scope.$watch(function(){return scope.value},function(){scope.checkValidity()}),scope.$on("$destroy",function(){"undefined"!=typeof parentCtrl&&parentCtrl.releaseValidation(scope)}),element.on("$destroy",function(){scope.$destroy()}.bind(this))}}}]),angular.module("fdvService.widgets").directive("fdvValidationCollection",["$parse","fdvConfig","fdvValidation","fdvUserData",function($parse,fdvConfig){return{restrict:"E",transclude:!0,templateUrl:fdvConfig.getTemplateUrl("widgets/generic-validation.html"),controller:["$scope",function($scope){$scope.validationCollection=[],$scope.validateSingleType=function(){},$scope.validateCollection=function(){return $scope.validateFocusChange(),$scope.getValidationState()},$scope.validationClear=function(propertyExpression,messageScope){"undefined"==typeof messageScope&&(messageScope=this);for(var index=0;index<$scope.validationCollection.length;index++)$scope.validationCollection[index].scope.$parent==messageScope&&$scope.validationCollection[index].valueExpression===propertyExpression&&($scope.validationCollection[index].scope.isValid=!0)},$scope.validationSanitizeIfValid=function(){for(var index=0;index<$scope.validationCollection.length;index++)$scope.validationCollection[index].scope.sanitizeIfValid()},$scope.validateFocusChange=function(){$scope.validationCollection.forEach(function(child){child.scope.checkValidity()})},this.initValidation=function(childScope,element,valueExpression){$scope.validationCollection.push({scope:childScope,element:element,valueExpression:valueExpression})},this.releaseValidation=function(childScope){for(var index=0;index<$scope.validationCollection.length;index++)if($scope.validationCollection[index].scope.$id===childScope.$id){$scope.validationCollection.splice(index,1);break}},$scope.getValidationState=function(){for(var index=0;index<$scope.validationCollection.length;index++)if(!$scope.validationCollection[index].scope.isValid)return!1;return!0}}],link:function(scope,element){element.on("$destroy",function(){scope.$destroy()})}}}]),angular.module("fdvService.widgets").service("fdvPullAudioPlayer",["$interval","$timeout","fdvLog","fdvConfig","fdvConstant","fdvAlertManager",function($interval,$timeout,fdvLog,fdvConfig,fdvConstant){var componentName="Voicemail Player",playerListener=void 0,intervalCheckState=void 0,intervalTimeUpdate=void 0;this.voicemail=void 0;var sendEvent=function(event){angular.isFunction(playerListener)&&$timeout(function(){playerListener(event)})},cleanup=function(){angular.isDefined(intervalCheckState)&&($interval.cancel(intervalCheckState),intervalCheckState=void 0),angular.isDefined(intervalTimeUpdate)&&($interval.cancel(intervalTimeUpdate),intervalTimeUpdate=void 0)};this.seek=function(position){return this.initialized===!1?void fdvLog.debug(componentName,"Audio Player is not found"):(this.player.currentTime=position,void sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.POSITION_CHANGED,data:this.player.currentTime}))},this.setListener=function(listener){playerListener=listener},this.play=function(voicemail){if(angular.isUndefined(voicemail))return void fdvLog.debug(componentName,"Invalid vociemail object");this.voicemail=voicemail,voicemail.ended===!0&&(voicemail.currentTime=0,voicemail.ended=!1);var player=this.player,duration=voicemail.durationInSeconds,audioFile=voicemail.mediaUrl,currentTime=voicemail.currentTime;if(fdvConfig.getAccount().isAgent)return void fdvLog.debug(componentName,"Agent can't listen customer's voicemail");if(this.initialized===!1)return void fdvLog.debug(componentName,"Audio Player is not found");if(!angular.isString(audioFile)||0===audioFile.length)return void fdvLog.debug(componentName,"Invalid audio file: "+audioFile);fdvLog.debug(componentName,"Start to play file: "+audioFile),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADING}),player.src!==audioFile&&(player.src=audioFile,player.load()),player.onabort=function(){fdvLog.debug(componentName,"OnAbort: "+player.error),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ERROR}),cleanup()},player.onerror=function(){fdvLog.debug(componentName,"OnError: "+player.error),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ERROR}),cleanup()};var tries=0;intervalCheckState=$interval(function(){if(fdvLog.debug(componentName,"Checking Player State, readyState="+player.readyState),tries++,player.readyState>0){$interval.cancel(intervalCheckState),intervalCheckState=void 0,player.currentTime=currentTime,player.play();var durationFetched=!1,updateTime=function(){isFinite(player.duration)&&duration>player.duration&&player.duration>0&&100!==player.duration&&!durationFetched&&(durationFetched=!0,duration=Math.round(player.duration),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.DURATION_CHANGED,data:duration}),fdvLog.debug(componentName,"OnDurationChanged: duration="+duration)),duration-player.currentTime<.5?(player.pause(),fdvLog.debug(componentName,"OnPaused"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PAUSED,data:duration}),fdvLog.debug(componentName,"OnEnded"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ENDED}),cleanup()):(fdvLog.debug(componentName,"OnTimeUpdate: current="+player.currentTime),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.POSITION_CHANGED,data:player.currentTime}))};angular.isDefined(intervalTimeUpdate)&&$interval.cancel(intervalTimeUpdate),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADED}),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PLAYING}),intervalTimeUpdate=$interval(function(){updateTime()},250)}else tries>=40&&(intervalCheckState=void 0,fdvLog.debug(componentName,"Voicemail couldn't be played"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ERROR}))},250,40)},this.pause=function(){return this.initialized===!1?void fdvLog.debug(componentName,"Audio Player is not found"):(this.player.pause(),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PAUSED,data:this.player.currentTime}),void cleanup())}}]).service("fdvPushAudioPlayer",["$timeout","fdvLog","fdvConfig","fdvConstant",function($timeout,fdvLog,fdvConfig,fdvConstant){var componentName="Voicemail Player",playerListener=void 0;this.voicemail=void 0;var sendEvent=function(event){angular.isFunction(playerListener)&&$timeout(function(){playerListener(event)})};this.seek=function(position){return this.initialized===!1?void fdvLog.debug(componentName,"Audio Player is not found"):(this.player.currentTime=position,void sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.POSITION_CHANGED,data:this.player.currentTime}))},this.setListener=function(listener){playerListener=listener},this.play=function(voicemail){if(angular.isUndefined(voicemail))return void fdvLog.debug(componentName,"Invalid vociemail object");this.voicemail=voicemail,voicemail.ended===!0&&(voicemail.currentTime=0,voicemail.ended=!1);var player=this.player,duration=voicemail.durationInSeconds,audioFile=voicemail.mediaUrl,currentTime=voicemail.currentTime;return fdvConfig.getAccount().isAgent?void fdvLog.debug(componentName,"Agent can't listen customer's voicemail"):this.initialized===!1?void fdvLog.debug(componentName,"Audio Player is not found"):angular.isString(audioFile)&&0!==audioFile.length?(fdvLog.debug(componentName,"Start to play file: "+audioFile+" from "+currentTime),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADING}),player.src!==audioFile&&(player.src=audioFile,player.load()),player.onabort=function(){fdvLog.debug(componentName,"OnAbort: "+player.error),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ERROR})},player.onerror=function(){fdvLog.debug(componentName,"OnError: "+player.error),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ERROR})},player.onloadstart=function(){fdvLog.debug(componentName,"OnLoadStart"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADING})},player.ondurationchange=function(){isFinite(player.duration)?(duration=player.duration,fdvLog.debug(componentName,"OnDurationChange "+duration+" seconds"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.DURATION_CHANGED,data:duration})):fdvLog.debug($scope.componentName,"OnDurationChange duration is not known, most likely audio will be played via streaming")},player.onloadedmetadata=function(){fdvLog.debug(componentName,"OnLoadedMetadata"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.METADATA_LOADED})},player.onloadeddata=function(){fdvLog.debug(componentName,"OnLoadedData"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.DATA_LOADED}),player.readyState>0&&(player.play(),player.currentTime=currentTime)},player.oncanplay=function(){fdvLog.debug(componentName,"OnCanPlay")},player.oncanplaythrough=function(){fdvLog.debug(componentName,"OnCanPlayThrough")},player.onseeking=function(){fdvLog.debug(componentName,"OnSeeking"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.SEEKING})},player.onseeked=function(){fdvLog.debug(componentName,"OnSeeked"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.SEEKED})},player.onplaying=function(){fdvLog.debug(componentName,"OnPlaying"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PLAYING})},player.onplay=function(){fdvLog.debug(componentName,"OnPlay"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PLAYING})},player.onpause=function(){fdvLog.debug(componentName,"OnPause"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.PAUSED,data:player.currentTime})},player.onended=function(){fdvLog.debug(componentName,"OnEnded"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.ENDED})},player.onwaiting=function(){fdvLog.debug(componentName,"OnWaiting"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADING})},player.onprogress=function(){fdvLog.debug(componentName,"OnProgress"),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.LOADING})},player.ontimeupdate=function(){fdvLog.debug(componentName,"OnTimeUpdate: current="+player.currentTime),sendEvent({type:fdvConstant.EVENT.AUDIOPLAYER.POSITION_CHANGED,data:player.currentTime})},void(player.readyState>0&&(player.play(),player.currentTime=currentTime))):void fdvLog.debug(componentName,"Invalid audio file: "+audioFile)},this.pause=function(){return this.initialized===!1?void fdvLog.debug(componentName,"Audio Player is not found"):void this.player.pause()}}]).service("fdvAudioPlayer",["fdvConfig","fdvPushAudioPlayer","fdvPullAudioPlayer",function(fdvConfig,fdvPushAudioPlayer,fdvPullAudioPlayer){this.initialized=!1,this.player=void 0,this.init=function(){this.initialized===!1&&(this.player=$("audio#fdv-audio-player").get(0),this.initialized=angular.isDefined(this.player),fdvConfig.isMobile()?angular.extend(this,fdvPullAudioPlayer):angular.extend(this,fdvPushAudioPlayer))}}]).directive("fdvVoicemailPlayer",["$filter","fdvLog","fdvConfig","fdvConstant","fdvAudioPlayer","fdvActionManager","fdvAlertManager","fdvLocaleManager",function($filter,fdvLog,fdvConfig,fdvConstant,fdvAudioPlayer,fdvActionManager,fdvAlertManager,fdvLocaleManager){return{restrict:"ACE",templateUrl:fdvConfig.getTemplateUrl("widgets/voicemail-player.html"),scope:{voicemail:"=?",duration:"=?",currentTime:"=?",paused:"=?",timeOffset:"=?",eventTriggered:"&"},controller:["$scope","$element",function($scope){$scope.componentName="Voicemail Player",$scope.audioFile=$scope.voicemail.mediaUrl,$scope.timestamp=$scope.voicemail.timestamp,$scope.autoplay=$scope.voicemail.autoplay,$scope.currentTime=0,$scope.progress=0,$scope.paused=!0,$scope.error="",fdvAudioPlayer.init();var listener=function(event){switch(event.type){case fdvConstant.EVENT.AUDIOPLAYER.ERROR:$scope.loading=!1,$scope.paused=!0,$scope.error="fdv.message-play-voicemail-error",fdvAlertManager.error($scope.error);break;case fdvConstant.EVENT.AUDIOPLAYER.DURATION_CHANGED:$scope.duration=event.data;break;case fdvConstant.EVENT.AUDIOPLAYER.POSITION_CHANGED:$scope.updateProgressBar(event.data);break;case fdvConstant.EVENT.AUDIOPLAYER.PLAYING:$scope.paused=!1;break;case fdvConstant.EVENT.AUDIOPLAYER.PAUSED:$scope.updateProgressBar(event.data),$scope.paused=!0;break;case fdvConstant.EVENT.AUDIOPLAYER.ENDED:$scope.voicemail.ended=!0,$scope.paused=!0;break;case fdvConstant.EVENT.AUDIOPLAYER.LOADING:$scope.loading=!0;break;case fdvConstant.EVENT.AUDIOPLAYER.LOADED:$scope.loading=!1}};$scope.$watch(function(){return fdvAudioPlayer.voicemail},function(newValue){newValue===$scope.voicemail?fdvAudioPlayer.setListener(listener):$scope.paused=!0}),$scope.updateProgressBar=function(currentTime){angular.isDefined($scope.voicemail)&&$scope.voicemail.unread===!0&&($scope.voicemail.unread=!1,fdvLog.debug($scope.componentName,"Updating... Voicemail from 'unread' to 'read'"),fdvActionManager.updateVoicemail($scope.voicemail).then(function(){fdvLog.debug($scope.componentName,"Updating... Voicemail from 'unread' to 'read', DONE")})),isFinite(currentTime)&&isFinite($scope.duration)&&$scope.duration>0&&($scope.voicemail.currentTime=currentTime,$scope.currentTime=currentTime,$scope.progress=100*$scope.currentTime/$scope.duration,$scope.progress=$scope.progress.toFixed(3))},$scope.play=function(){fdvAudioPlayer.setListener(listener),fdvAudioPlayer.play($scope.voicemail)},$scope.pause=function(){fdvAudioPlayer.pause()},$scope.changePosition=function(event){fdvAudioPlayer.seek($scope.duration*event.offsetX/event.currentTarget.clientWidth)},$scope.togglePlay=function(){$scope.paused===!0?$scope.play():$scope.pause()};var isAnonymous=!0;angular.isString($scope.voicemail.from)&&$scope.voicemail.from.replace(/([\D]*)/g,"").length>0&&(isAnonymous=!1);var phoneNumber=isAnonymous?fdvLocaleManager.getString("fdv.label-anonymous"):$filter("phoneNumber")($scope.voicemail.from);$scope.statePaused=fdvLocaleManager.getString("fdv.action-play",{phoneNumber:phoneNumber}),$scope.statePlaying=fdvLocaleManager.getString("fdv.action-stop",{phoneNumber:phoneNumber})}],link:function(scope,element){scope.autoplay&&scope.play(),element.on("$destroy",function(){fdvAudioPlayer.voicemail===scope.voicemail&&scope.pause(),scope.$destroy()})}}}]),angular.module("fdvService").run(["$templateCache",function($templateCache){$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendar.html",'
'),$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarDayView.html",'
All Day
{{\'fdv.calendar-event\' | i18n}}{{event.title}}
{{\'fdv.calendar-event\' | i18n}}{{event.title}}
{{\'fdv.calendar-location\' | i18n}}{{event.model.location}}
{{\'fdv.calendar-starttime\' | i18n}}{{event.tempStartsAt || event.startsAt | calendarDate:\'time\':true}}
{{\'fdv.calendar-endtime\' | i18n}}{{event.tempEndAt || event.endsAt | calendarDate:\'time\':true}}
{{\'fdv.calendar-call-to\' | i18n}}{{event.callTarget}}
{{\'fdv.calendar-call-time\' | i18n}}{{event.tempStartsAt || event.startsAt | calendarDate:\'time\':true}}
'),$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarHourList.html",'
'),$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarMonthView.html",'
{{event.title}}
'),$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarSlideBox.html",''),$templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarWeekView.html",'

All Day
{{\'fdv.calendar-event\' | i18n}}{{event.title}}
{{\'fdv.calendar-event\' | i18n}}{{event.title}}
{{event.callTarget}}
'), $templateCache.put("fdv/templates/calendar/angular-bootstrap-calendar/calendarYearView.html",'
'),$templateCache.put("fdv/templates/calendar/calendar.html",'
{{calendarTitle}}
'),$templateCache.put("fdv/templates/calls/calls.html",'

{{call.contactName}}
{{call.getRelevantPhoneNumber() | phoneNumber}}
{{call.timestamp | xdate: "MM/DD/YYYY": "hh:mm A" : options.timeOffset}}
'),$templateCache.put("fdv/templates/contacts/contacts.html",'

{{item.model.getName()}}
{{item.model.getFirstName()}}
{{item.model.getFamilyName()}}
{{item.selectedNumber.number | phoneNumber}}
'),$templateCache.put("fdv/templates/datepicker/datepicker.html",'
'),$templateCache.put("fdv/templates/datepicker/day.html",'
{{title}}
{{titleYear}}
{{label.abbr}}
{{ weekNumbers[$index] }}
'),$templateCache.put("fdv/templates/datepicker/month.html",'
'),$templateCache.put("fdv/templates/datepicker/popup.html",''),$templateCache.put("fdv/templates/datepicker/year.html",'
'),$templateCache.put("fdv/templates/debug/debug-options.html",'
'),$templateCache.put("fdv/templates/home/home.html",'
'),$templateCache.put("fdv/templates/main/main.html",'
{{fdvLabel}}
'), $templateCache.put("fdv/templates/modals/access-mailbox-modal.html",'
'),$templateCache.put("fdv/templates/modals/add-calendar-event-modal.html",'
'),$templateCache.put("fdv/templates/modals/add-call-notification-modal.html",'
'),$templateCache.put("fdv/templates/modals/add-contact-modal.html",' '),$templateCache.put("fdv/templates/modals/call-block-modal.html",' '),$templateCache.put("fdv/templates/modals/confirm-modal.html",'
'),$templateCache.put("fdv/templates/modals/delete-mailbox-modal.html",' '),$templateCache.put("fdv/templates/modals/forward-voicemail-modal.html",'
'),$templateCache.put("fdv/templates/modals/modal-dialog.html",''),$templateCache.put("fdv/templates/modals/place-a-call-modal.html",'
'),$templateCache.put("fdv/templates/modals/remove-call-notification-modal.html",' '), $templateCache.put("fdv/templates/modals/schedule-call.html",'
'),$templateCache.put("fdv/templates/modals/settings-modal.html",' '),$templateCache.put("fdv/templates/modals/standard-prompts-modal.html",' '),$templateCache.put("fdv/templates/modals/view-contact-modal.html",' '),$templateCache.put("fdv/templates/settings/settings-pane.html",'
{{\'fdv.settings-forwarding-all-calls-label\' | i18n }}
{{\'fdv.settings-selected-option\' |i18n}} {{(item.settings.bySourceNumbers.enabled ? forwardingOptions[1] : forwardingOptions[0]) | i18n}}
{{simultaneousRingLabel}}
{{(item.settings.numbers[i] | phoneNumber) || (\'fdv.settings-number-not-assigned\' | i18n)}}
{{\'fdv.settings-selected-option\' |i18n}}
{{$index + 1}} {{(phone.number | phoneNumber) || (\'fdv.settings-number-not-assigned\' | i18n)}} {{phone.numberRings}}
{{$index + 1}}
{{\'fdv.settings-message-virtual-numbers-purchase\' | i18n}}
{{phone.number | phoneNumber}}
{{phone.number | phoneNumber}} {{getRingOption(phone.distinctiveRing.setting) | i18n}}

{{mailbox.label}}

{{item.settings.name}}

{{item.settings.address}}

{{description[item.model] | i18n}}
{{line.label}} {{line.number | phoneNumber}}
{{selectedPhoneLine.number | phoneNumber}}
{{item.settings.number | phoneNumber}}
Edit
{{selectedPhoneLine.number | phoneNumber}}
'), $templateCache.put("fdv/templates/settings/settings.html",'

{{item.label | i18n}}
{{item.value ? (\'fdv.label-on\' | i18n) : (\'fdv.label-off\' | i18n)}}
'),$templateCache.put("fdv/templates/timepicker/timepicker.html",''),$templateCache.put("fdv/templates/video/video.html",'
'),$templateCache.put("fdv/templates/voicemails/voicemails.html",'

{{voicemail.durationInSeconds | duration}}
{{voicemail.contactName}}
{{voicemail.from | phoneNumber}}
{{voicemail.timestamp | xdate: "MM/DD/YYYY": "hh:mm A" : options.timeOffset}}
'),$templateCache.put("fdv/templates/widgets/add-number.html",'
{{phone | phoneNumber}}
'),$templateCache.put("fdv/templates/widgets/add-scheduled-event.html",''),$templateCache.put("fdv/templates/widgets/alert.html",'
{{altertOptions.message}}
'),$templateCache.put("fdv/templates/widgets/call-selection-radio.html",'
{{notifications[1] | i18n}}
{{(notifications[0] + \'_active\') | i18n}}
{{(notifications[1] + \'_active\') | i18n}}
{{note | i18n}}
{{notifications[0] | i18n}}
{{notifications[1] | i18n}}
{{phone | phoneNumber}}
'),$templateCache.put("fdv/templates/widgets/checkbox.html",''),$templateCache.put("fdv/templates/widgets/checkboxsquare.html",''),$templateCache.put("fdv/templates/widgets/contactsdropdown.html",''),$templateCache.put("fdv/templates/widgets/contextual-menu.html",''),$templateCache.put("fdv/templates/widgets/dropdown.html",''),$templateCache.put("fdv/templates/widgets/generic-validation.html","
"),$templateCache.put("fdv/templates/widgets/inline-spinner.html",'
'),$templateCache.put("fdv/templates/widgets/mailbox-selector.html",'
{{prefixString + \' \' + selectedMailbox.label}}
'),$templateCache.put("fdv/templates/widgets/menu.html",''),$templateCache.put("fdv/templates/widgets/pagination.html",'
'),$templateCache.put("fdv/templates/widgets/phone-line-selector.html",'
{{(prefixString | i18n) + (selectedPhoneLine.number | phoneNumber)}}
{{selectedPhoneLine.number | phoneNumber}}
'),$templateCache.put("fdv/templates/widgets/radio.html",''),$templateCache.put("fdv/templates/widgets/settings-subpane-heading.html",'
{{desc | i18n }}

{{item.label | i18n }} {{onoff | i18n}}
'),$templateCache.put("fdv/templates/widgets/spinner.html",'
'),$templateCache.put("fdv/templates/widgets/text-field.html",'
'),$templateCache.put("fdv/templates/widgets/type-ahead.html",'
'),$templateCache.put("fdv/templates/widgets/voicemail-player.html",'
{{currentTime | duration}}
-{{( duration - currentTime) | duration}}
')}]);