angular.module("fluro").directive("listMap",function($window,$timeout){return{restrict:"E",replace:!0,template:"<div class=map-outer><div class=map-inner></div></div>",scope:{model:"=ngModel",selectCallback:"=ngSelectCallback",params:"&ngParams"},link:function($scope,$element,$attrs){var mapOptions,map,marker,mapOptions={zoom:15,mapTypeId:google.maps.MapTypeId.ROADMAP,maxZoom:15,scrollwheel:!1,draggable:!1};$scope.ngParams&&(mapOptions=$scope.ngParams());var createMarker=function(location){if(location.latitude&&location.longitude){var position=new google.maps.LatLng(location.latitude,location.longitude);map.setCenter(position),marker=new google.maps.Marker({map:map,position:position,title:location.title}),google.maps.event.addListener(marker,"click",function(){$timeout(function(){$scope.selectCallback&&$scope.selectCallback(location)})})}};$scope.$watch("model",function(model){model&&_.each(model,createMarker),fitMap()});var fitMap=function(){var bounds=new google.maps.LatLngBounds;_.each($scope.model,function(location){if(location.latitude&&location.longitude){var myLatLng=new google.maps.LatLng(location.latitude,location.longitude);bounds.extend(myLatLng)}}),map.fitBounds(bounds)};!function(){map=new google.maps.Map($element.find(".map-inner").get(0),mapOptions),angular.element($window).bind("resize",fitMap)}()}}}),angular.module("fluro").directive("menu",function(){return{restrict:"E",replace:!0,template:'<ul class="nav nav-menu" ng-class="{\'nav-justified\':justified}"><li ng-if="trigger != \'click\'" ng-repeat="menuItem in model" ng-class="{\'dropdown\':menuItem.items.length, \'open\':isExpanded(menuItem)}"><a ng-class="{\'hidden-xs\':menuItem.items.length}" class={{menuItem.class}} ui-sref={{menuItem.state}} ng-if="menuItem.type == \'state\'" ui-sref-active=active><span compile-html=menuItem.title></span> <span ng-if=menuItem.items.length class=caret></span></a> <a ng-class="{\'hidden-xs\':menuItem.items.length}" class={{menuItem.class}} ng-attr-target="{{(menuItem.target.length) ? menuItem.target : undefined}}" ng-href={{menuItem.url}} ng-if="menuItem.type != \'state\'"><span compile-html=menuItem.title></span> <span ng-if=menuItem.items.length class=caret></span></a> <a ng-click=isolateToggle(menuItem) class="visible-xs-block {{menuItem.class}}" ng-if=menuItem.items.length><span compile-html=menuItem.title></span><span class=caret></span></a><ul class=dropdown-menu ng-if=menuItem.items.length><li ng-repeat="subMenuItem in menuItem.items" ng-switch=subMenuItem.type><a ui-sref={{subMenuItem.state}} class={{menuItem.class}} ng-switch-when=state ui-sref-active=active><span compile-html=subMenuItem.title></span></a> <a ng-attr-target="{{(subMenuItem.target.length) ? subMenuItem.target : undefined}}" class={{menuItem.class}} ng-href={{subMenuItem.url}} ng-switch-default><span compile-html=subMenuItem.title></span></a></li></ul></li><li ng-if="trigger == \'click\'" ng-repeat="menuItem in model" ng-class="{\'dropdown\':menuItem.items.length, \'open\':isExpanded(menuItem)}"><a ui-sref={{menuItem.state}} ng-if="menuItem.type == \'state\' && !menuItem.items.length" class={{menuItem.class}} ui-sref-active=active><span compile-html=menuItem.title></span> <span ng-if=menuItem.items.length class=caret></span></a> <a ng-attr-target="{{(menuItem.target.length) ? menuItem.target : undefined}}" ng-href={{menuItem.url}} class={{menuItem.class}} ng-if="menuItem.type != \'state\' && !menuItem.items.length"><span compile-html=menuItem.title></span> <span ng-if=menuItem.items.length class=caret></span></a> <a ng-click=isolateToggle(menuItem) ng-if=menuItem.items.length class={{menuItem.class}}><span compile-html=menuItem.title></span> <span class=caret></span></a><ul class=dropdown-menu ng-if=menuItem.items.length><li ng-repeat="subMenuItem in menuItem.items" ng-switch=subMenuItem.type><a ui-sref={{subMenuItem.state}} ng-switch-when=state class={{menuItem.class}} ui-sref-active=active><span compile-html=subMenuItem.title></span></a> <a ng-attr-target="{{(subMenuItem.target.length) ? subMenuItem.target : undefined}}" class={{menuItem.class}} ng-href={{subMenuItem.url}} ng-switch-default><span compile-html=subMenuItem.title></span></a></li></ul></li></ul>',scope:{model:"=ngModel",trigger:"=?"},link:function(scope,element,attrs){scope.justified=!!angular.isDefined(attrs.justified)&&scope.$parent.$eval(attrs.justified)},controller:function($scope,$rootScope){console.log("Menu component"),$scope.trigger||($scope.trigger="hover"),$scope.expanded=[],$scope.isExpanded=function(menuItem){return _.contains($scope.expanded,menuItem)},$scope.expand=function(menuItem){if(!_.contains($scope.expanded,menuItem))return $scope.expanded.push(menuItem)},$scope.isolateToggle=function(menuItem){_.contains($scope.expanded,menuItem)?$scope.collapse(menuItem):$scope.expanded=[menuItem]},$scope.toggleExpanded=function(menuItem){$scope.isExpanded(menuItem)?$scope.collapse(menuItem):$scope.expand(menuItem)},$scope.collapse=function(menuItem){_.contains($scope.expanded,menuItem)&&_.pull($scope.expanded,menuItem)}}}}),angular.module("fluro").directive("preloadImage",function(){return{restrict:"A",link:function(scope,element,attrs){var aspect=angular.isDefined(attrs.aspect)?scope.$parent.$eval(attrs.aspect):0;aspect||(aspect=0),scope.aspect=aspect,aspect?element.wrap('<div class="preload-image-outer aspect-ratio" style="padding-bottom:'+scope.aspect+'%"></div>'):element.wrap('<div class="preload-image-outer"></div>');var preloader=angular.element('<span class="image-preloader"><i class="fa fa-spinner fa-spin"/></span>');element.on("load",function(){element.removeClass("preload-hide"),element.addClass("preload-show"),preloader.remove()}),scope.$watch("ngSrc",function(){element.addClass("preload-hide"),element.parent().append(preloader)})}}}),angular.module("fluro").directive("eventsCalendarView",function(){return{restrict:"E",replace:!0,template:'<div class=events-calendar-view><h4>{{ calendarTitle }}</h4><div class=row><div class=col-sm-6><div class=btn-group><button class="btn btn-default" mwl-date-modifier date=calendarDay decrement=calendarView>Previous {{ calendarView }}</button> <button class="btn btn-default" mwl-date-modifier date=calendarDay set-to-today>Today</button> <button class="btn btn-default" mwl-date-modifier date=calendarDay increment=calendarView>Next {{ calendarView }}</button></div></div><div class="col-sm-6 hidden-xs"><div class="btn-group pull-right"><label class="btn btn-default" ng-model=calendarView btn-radio="\'year\'">Year</label><label class="btn btn-default" ng-model=calendarView btn-radio="\'month\'">Month</label><label class="btn btn-default" ng-model=calendarView btn-radio="\'week\'">Week</label></div></div></div><mwl-calendar view=calendarView view-date=calendarDay events=events view-title=calendarTitle on-event-click=eventClicked(calendarEvent) auto-open=true></mwl-calendar></div>',controller:"eventsCalendarController",scope:{em:"=eventsmodel",state:"=?state"},link:function($scope,$element,$attributes){}}}),angular.module("fluro").controller("eventsCalendarController",function($scope,$state){$scope.calendarView="month",$scope.calendarDay=new Date,$scope.events=[];for(var i=0;i<$scope.em.length;i++)$scope.events.push({title:$scope.em[i].title,type:"inverse",startsAt:new Date($scope.em[i].startDate),endsAt:new Date($scope.em[i].endDate),editable:!1,deletable:!1,dragable:!1,resizable:!1,incrementsBadgeTotal:!0,cssClass:"calendar-event-entry",slug:$scope.em[i].slug});$scope.eventClicked=function(calendarEvent){$scope.state.length?$state.go($scope.state,{slug:calendarEvent.slug},{reload:!0}):$state.go("event",{slug:calendarEvent.slug})}}),angular.module("fluro").directive("parallaxImage",function(FluroScrollService,$timeout){return{restrict:"E",replace:!0,transclude:!0,scope:{url:"=ngImageUrl",speed:"@ngSpeed",offset:"@offset"},template:'<div class=parallax><div class="parallax-background preload-hide" style="background-image:url({{url}}); transform: translate3d(-50%, {{offset}}px, 0); -moz-transform: translate3d(-50%, {{offset}}px, 0); -webkit-transform: translate3d(-50%, {{offset}}px, 0)"><img ng-src={{url}}></div><div class=parallax-foreground ng-transclude></div></div>',link:function($scope,$element,$attr){function updateParentScroll(){updateFromMainScroll(parent.scrollTop())}function updateFromMainScroll(scroll){var halfPoint=FluroScrollService.getHalfPoint(),actualPositionTrack=0,topPosition=element.offsetTop;actualPositionTrack=topPosition<halfPoint?scroll:scroll+halfPoint;var height=$element.outerHeight(),backgroundHeight=background.outerHeight(),startPosition=(actualPositionTrack-topPosition)*parseFloat($scope.speed),maxOffset=backgroundHeight-height;startPosition>maxOffset&&(startPosition=maxOffset),startPosition<0&&(startPosition=0),$scope.offset=-parseFloat(startPosition).toFixed(2)}$scope.speed||($scope.speed=.3);var background=$element.find(".parallax-background");$scope.$watch("url",function(){var image=document.createElement("img");image.src=$scope.url,image.onload=function(){console.log("loaded"),background.removeClass("preload-hide")}});var parent=angular.element("[scroll-active-parent]"),element=$element.get(0);parent.length?(parent.on("scroll",function(){$timeout(updateParentScroll)}),updateFromMainScroll(0)):$scope.$watch(function(){return FluroScrollService.getScroll()},function(scrollValue){$timeout(function(){updateFromMainScroll(scrollValue)})})}}}),angular.module("fluro").directive("eventWeekView",function(){return{restrict:"E",transclude:!0,replace:!0,scope:{model:"=ngModel",dayCount:"@days"},template:'<div class=event-week-view><ng-transclude><table class="table table-striped" ng-if="$parent.model.temp.viewType == \'list\'"><tr ng-repeat="day in days" ng-if=day.events.length><td class="col-sm-3 hidden-xs"><strong>{{day.date | formatDate:\'l j M\'}}</strong></td><td class="col-xs-1 hidden-xs"><span ng-repeat="realm in event.realms"><i class="fa fa-circle" style="color: {{realm.bgColor}}"></i></span></td><td class=col-sm-9><strong class=visible-xs-block style="margin-bottom: 10px">{{day.date | formatDate:\'l j M\'}}</strong><div class=row ng-repeat="event in day.events"><div class="col-xs-3 col-sm-2">{{event.startDate | formatDate:\'g:ia\'}}</div><div class="col-sm-1 hidden-xs text-center"><span ng-repeat="realm in event.realms"><i class="fa fa-circle" style="color: {{realm.bgColor}}"></i></span></div><div class="col-xs-9 col-sm-9"><a ui-sref=calendar.detail({slug:event.slug})><strong>{{event.title}}</strong><br><em class=text-muted>{{event.firstLine}}</em></a></div></div></td></tr></table><div class=panel ng-if="$parent.model.temp.viewType != \'list\'"><tabset justified=true><tab ng-repeat="day in days" active=day.active><tab-heading class=text-center ng-class="{\'has-events\':day.events.length}"><h4 ng-class="{\'text-muted\':!day.events.length}">{{day.date | formatDate:\'j\'}}</h4><h6 ng-class="{\'text-muted\':!day.events.length}">{{day.date | formatDate:\'l\'}}</h6></tab-heading><div ng-if=day.active><table class=table><tr ng-repeat="event in day.events"><td class=col-xs-3>{{event.startDate | formatDate:\'g:ia\'}}</td><td class="col-xs-1 text-center"><span ng-repeat="realm in event.realms"><i class="fa fa-circle" style="color: {{realm.bgColor}}"></i></span></td><td class=col-xs-8><a ui-sref=calendar.detail({slug:event.slug})><strong>{{event.title}}</strong><br><em class=text-muted>{{event.firstLine}}</em></a></td><td class="col-xs-1 text-center" style=vertical-align:middle><a ui-sref=calendar.detail({slug:event.slug})><i class="lnr lnr-chevron-right-circle color"></i></a></td></tr></table></div></tab></tabset></div></ng-transclude></div>',link:function($scope,$element,$attrs,$ctrl,$transclude){$transclude($scope,function(clone,$scope){$element.find("ng-transclude").replaceWith(clone)})},controller:function($scope,$filter){function update(){console.log("update week view");for(var array=[],i=0;i<Number($scope.dayCount);i++)array.push(i);var items=$scope.model;$scope.days=_.map(array,function(i){var date=new Date;date.setDate(startDate.getDate()+i),date.setHours(0),date.setMinutes(0),date.setSeconds(0),date.setMilliseconds(0);var day={};return day.date=date,day.events=_.chain(items).filter(function(item){var itemDate=new Date(item.startDate);return itemDate.setHours(0),itemDate.setMinutes(0),itemDate.setSeconds(0),itemDate.setMilliseconds(0),itemDate.getTime()==date.getTime()}).sortBy(function(item){return new Date(item.startDate).getTime()}).value(),day});var first=_.find($scope.days,function(day){return day.events.length});first&&(first.active=!0)}$scope.outer=$scope.$parent,$scope.dayCount||($scope.dayCount=7),$scope.viewMode||($scope.viewMode="days");var startDate=new Date;$scope.$watch("dayCount",update),$scope.$watch("model",update)}}}),app.run(function($rootScope,$state){$rootScope.$on("$stateChangeStart",function(event,toState,toParams,fromState,fromParams){$rootScope.menuExpanded=!1})}),angular.module("fluro").controller("CoachingDetailController",function($scope,$state){"coaching"!=$state.$current.name||$scope.slug||($scope.updateSlug=function(){$state.go("coaching.detail",{slug:$scope.collections[0].items[0].slug},{reload:!0})})}),angular.module("fluro").filter("eventDate",function($filter){return function(event){if(event){var startDate,endDate,filter=$filter("formatDate");startDate=new Date(event.startDate),startDate.setHours(0,0,0,0),endDate=new Date(event.endDate),endDate.setHours(0,0,0,0);if(endDate.getTime()==startDate.getTime())return filter(event.startDate,"g:ia l j M Y");var startDay=String(startDate.getDate()),startMonth=String(startDate.getMonth()),startString=startDay+startMonth,endDay=String(endDate.getDate()),endMonth=String(endDate.getMonth());return startString==endDay+endMonth?filter(event.startDate,"g:ia")+" - "+filter(event.endDate,"g:ia l j M Y"):startMonth==endMonth?filter(event.startDate,"g:ia l j")+" - "+filter(event.endDate,"g:ia l j M Y"):filter(event.startDate,"g:ia l j M")+" - "+filter(event.endDate,"g:ia l j M Y")}}}),angular.module("fluro").filter("directions",function($filter){return function(location){if(location)return"https://www.google.com/maps/dir/Current+Location/"+location.addressLine1+"+"+location.suburb+"+"+location.state+"+"+location.postalCode+"+"+location.country}});