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("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)}}}),angular.module("fluro").directive("menuLink",function(){return{restrict:"E",replace:!0,template:'<span class=menu-link ng-switch=model.type><a ui-sref={{getSref(model)}} ui-sref-opts=model.stateRefOptions class={{menuItem.class}} ng-switch-when=state ui-sref-active=active><span compile-html=model.title></span></a> <a ng-attr-target="{{(model.target.length) ? model.target : undefined}}" class={{menuItem.class}} ng-href={{model.url}} ng-switch-default><span compile-html=model.title></span></a></span>',scope:{model:"=ngModel"},link:function($scope,$element,$attrs){$scope.getSref=function(menuItem){return menuItem.stateParams?menuItem.state+"("+JSON.stringify(menuItem.stateParams)+")":menuItem.state}}}}),angular.module("fluro").directive("contentSearch",function($filter,$timeout){return{restrict:"E",transclude:!0,scope:{model:"=ngModel"},template:"<div class=content-search ng-transclude></div>",link:function($scope,$element,$attrs,$ctrl,$transclude){function updateFilters(){var filteredItems=$filter("filter")($scope.model,$scope.search.terms);$scope.search.realms.length&&(filteredItems=_.filter(filteredItems,function(item){return _.some(item.realms,function(realm){if(realm)return _.some($scope.search.realms,{_id:realm._id})})})),$scope.filtered=filteredItems,$scope.availableRealms=_.chain(filteredItems).map(function(item){return item.realms}).flatten().compact().uniq(function(realm){return realm._id}).compact().value(),$scope.pageChanged()}$transclude($scope,function(clone,$scope){$element.empty().append(clone)}),$scope.outer=$scope.$parent,$scope.filtered=[],$scope.search={terms:"",realms:[]},$scope.realmIsSelected=function(realm){if(realm)return _.some($scope.search.realms,{_id:realm._id})},$scope.selectRealm=function(realm){$scope.realmIsSelected(realm)||$scope.search.realms.push(realm)},$scope.toggleRealm=function(realm){$scope.realmIsSelected(realm)?$scope.deselectRealm(realm):$scope.selectRealm(realm)},$scope.isolateRealm=function(realm){$scope.realmIsSelected(realm)?$scope.deselectRealm(realm):$scope.search.realms=[realm]},$scope.deselectRealm=function(realm){_.pull($scope.search.realms,realm)},$scope.$watch("search.terms",updateFilters),$scope.$watch("search.realms",updateFilters,!0),$scope.$watch("model",updateFilters),$scope.pager={limit:12,currentPage:1},$scope.pageChanged=function(){if($scope.filtered){var itemsPerPage=$scope.pager.limit,currentPageIndex=$scope.pager.currentPage,totalItems=$scope.filtered.length,startIndex=itemsPerPage*(currentPageIndex-1);if(startIndex||(startIndex=0),totalItems<startIndex)return $scope.pager.currentPage=1;var pageItems=$scope.filtered;pageItems=$filter("startFrom")(pageItems,startIndex),pageItems=$filter("limitTo")(pageItems,itemsPerPage),console.log("Length pager",pageItems,startIndex,"-",startIndex+itemsPerPage,"of",totalItems),$scope.pageItems=pageItems}}}}}),angular.module("fluro").directive("slider",function(){return{restrict:"E",transclude:!0,replace:!0,template:"<div class=slider><div class=slider-contents ng-transclude></div></div>"}}),angular.module("fluro").directive("menu",function(){return{restrict:"E",replace:!0,template:'<ul class="basic-menu basic-menu-{{trigger}}"><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={{getSref(menuItem)}} ui-sref-opts=menuItem.stateRefOptions 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={{getSref(subMenuItem)}} ui-sref-opts=subMenuItem.stateRefOptions 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={{getSref(menuItem)}} ui-sref-opts=menuItem.stateRefOptions 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={{getSref(subMenuItem)}} ui-sref-opts=subMenuItem.stateRefOptions 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){$scope.trigger||($scope.trigger="hover"),$scope.expanded=[],$scope.getSref=function(menuItem){return menuItem.stateParams?menuItem.state+"("+JSON.stringify(menuItem.stateParams)+")":menuItem.state},$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)},$rootScope.$on("$stateChangeSuccess",function(){$scope.collapseAll()}),$scope.collapseAll=function(){$scope.expanded.length=0},$scope.collapse=function(menuItem){_.contains($scope.expanded,menuItem)&&_.pull($scope.expanded,menuItem)}}}}),angular.module("fluro").directive("infinitePager",function($timeout){return{restrict:"A",link:function($scope,$element,$attr){var perPage=16;$attr.perPage&&(perPage=parseInt($attr.perPage)),$scope.pager={currentPage:0,limit:perPage},$scope.pages=[],$scope.$watch($attr.items,function(items){$scope.allItems=items,$scope.allItems&&($scope.pages.length=0,$scope.pager.currentPage=0,$scope.totalPages=Math.ceil($scope.allItems.length/$scope.pager.limit)-1,$scope.updateCurrentPage())}),$scope.updateCurrentPage=function(){$scope.allItems.length<$scope.pager.limit*($scope.pager.currentPage-1)&&($scope.pager.currentPage=0);var start=$scope.pager.currentPage*$scope.pager.limit,end=start+$scope.pager.limit,sliced=_.slice($scope.allItems,start,end);$scope.pages.push(sliced)};var timer;$scope.nextPage=function(){$scope.pager.currentPage<$scope.totalPages?($timeout.cancel(timer),timer=$timeout(function(){$scope.pager.currentPage=$scope.pager.currentPage+1,$scope.updateCurrentPage()})):$scope.updateCurrentPage()}}}}),angular.module("fluro").directive("hamburger",function(){return{restrict:"E",replace:!0,template:"<div class=hamburger><span></span> <span></span> <span></span> <span></span></div>",link:function($scope,$elem,$attr){}}}),angular.module("fluro").directive("googleMap",function($window,$timeout){return{restrict:"E",replace:!0,template:"<div class=map-outer><div class=map-inner></div></div>",scope:{model:"=ngModel",selectCallback:"=ngSelectCallback",styleOptions:"=ngStyleOptions"},link:function($scope,$element,$attrs){function fitMap(){var bounds=new google.maps.LatLngBounds;_.each(markers,function(marker){var lat=marker.position.lat(),lng=marker.position.lng(),myLatLng=new google.maps.LatLng(lat,lng);bounds.extend(myLatLng)}),map.fitBounds(bounds)}var mapOptions,map,marker,geocoder,markers=[];styleOptions=[],$scope.styleOptions&&(styleOptions=$scope.styleOptions);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)})}),markers.push(marker)}};$scope.$watch("model",function(model){model&&_.each(model,function(model){createMarker(model)}),fitMap()}),function(){console.log("Map starting"),mapOptions={zoom:15,mapTypeId:google.maps.MapTypeId.ROADMAP,disableDefaultUI:!1,maxZoom:15,scrollwheel:!1,draggable:!0,styles:styleOptions},map=new google.maps.Map($element.find(".map-inner").get(0),mapOptions),geocoder=new google.maps.Geocoder,angular.element($window).bind("resize",fitMap)}()}}}),app.directive("fluroPreloader",function(){return{restrict:"E",replace:!0,scope:{},template:'<div class="preloader {{preloader.class}}"><div class=preloader-bg></div><div class=preloader-fg><div class=spinner><svg version=1.1 id=loader-1 xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink x=0px y=0px width=40px height=40px viewBox="0 0 50 50" style="enable-background:new 0 0 50 50" xml:space=preserve><path fill=#000 d=M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z transform="rotate(170 25 25)"><animateTransform attributeType=xml attributeName=transform type=rotate from="0 25 25" to="360 25 25" dur=0.6s repeatCount=indefinite></animateTransform></path></svg></div></div></div>',controller:"FluroPreloaderController",link:function(scope,element,attrs){}}}),app.controller("FluroPreloaderController",function($scope,$state,$rootScope,$timeout){function hidePreloader(event,toState,toParams,fromState,fromParams,error){preloadTimer&&($timeout.cancel(preloadTimer),preloadTimer=null),"loading"==$scope.preloader.class&&$timeout(function(){$scope.preloader.class="loaded"},600)}var preloadTimer;$scope.preloader={class:"reset"},$rootScope.$on("$stateChangeStart",function(event,toState,toParams,fromState,fromParams,error){if($rootScope.noPreloader)return void($rootScope.noPreloader=!1);event.preventDefault(),$scope.preloader.class="reset",preloadTimer=$timeout(function(){$scope.preloader.class="loading"},0),$timeout(function(){$rootScope.noPreloader=!0,$state.go(toState,toParams)},200)}),$rootScope.$on("$stateChangeError",function(event,toState,toParams,fromState,fromParams,error){preloadTimer&&($timeout.cancel(preloadTimer),preloadTimer=null),$scope.preloader.class="reset"}),$rootScope.$on("$preloaderHide",hidePreloader),$rootScope.$on("$stateChangeSuccess",hidePreloader)}),angular.module("fluro").directive("audioMediaPlayer",function($timeout){return{restrict:"E",replace:!0,template:'<div class=audio-media-player><audio><source ng-src="{{$root.asset.getUrl(model._id, {extension:model.extension}) | trustedResource}}" type={{model.mimetype}}></audio></div>',scope:{model:"=ngModel",params:"=?ngParams"},link:function($scope,$elem,$attr){$scope.params||($scope.params={}),$timeout(function(){var audioelement=$elem.find("audio");audioelement.mediaelementplayer($scope.params),console.log("Init Audio",audioelement,$scope.params)})}}}),angular.module("fluro").controller("AppController",function($scope,$rootScope){$rootScope.$on("$stateChangeStart",function(){$rootScope.sidebarExpanded=!1})}),angular.module("fluro").controller("UpNextController",function($scope){$scope.slug._id;$scope.$watch("results",function(results,slugID){_.sortBy(results,function(item){return item.data.recordingDate}),results.indexOf(slugID)})}),angular.module("fluro").filter("readableEventDate",function($filter){return function(event){if(event){var startDate,endDate,filter=$filter("formatDate");startDate=new Date(event.startDate),startDate.setSeconds(0,0),endDate=new Date(event.endDate),endDate.setSeconds(0,0);if(endDate.getTime()==startDate.getTime())return filter(event.startDate,"g:ia 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,"j")+" - "+filter(event.endDate,"l j M Y"):filter(event.startDate,"j M")+" - "+filter(event.endDate,"l j M Y")}}});