Source: directives/calendario-olimpico/calendario-olimpico.js

    /**
     * @ngdoc directives
     * @name calendarioOlimpico
     * @module s4c.directives.calendarioOlimpico.calendarioOlimpico
     *
     * @description
     * `calendarioOlimpicoController` Controller do Calendário Olímpico
     * 
     *
     * @example
     *   <s4c-calendario-olimpico>
     *   </s4c-calendario-olimpico>
     */
(function () {
    'use strict';

    calendarioOlimpicoController.$inject = [
        '$scope',
        '$filter',
        '$anchorScroll',
        'ngTableParams',
        'Base',
        'CalendarioOlimpicoFilter'
    ];

    function calendarioOlimpicoController(
        $scope,
        $filter,
        $anchorScroll,
        ngTableParams,
        Base,
        CalendarioOlimpicoFilter) {
        $scope.res = $scope.$root.dataCalendarioOlimpico;

        CalendarioOlimpicoFilter.getInstance('calendario-olimpico-filter').on('filterChanged', filter);

        $scope.data = [];
        $scope.search;

        Base.obterCob('calendarioOlimpico/', {}).then(function (resp) {
            $scope.data = resp;
            $scope.$root.dataCalendarioOlimpico = resp;
            angular.extend($scope.tableParams.data, resp);
        });

        $scope.tableParams = new ngTableParams({
            page: 1,
            count: 10
        }, {
            total: $scope.data.length,
            getData: function ($defer, params) {
                $scope.data = params.sorting() ? $filter('orderBy')($scope.data, params.orderBy()) : $scope.data;
                $defer.resolve($scope.data);
            }
        });


       /**
        * Aplica o filtro na listagem  
        *
        * @method filter
		*        
        * @param args {String} Argumentos
		*               
        */ 
        function filter(args) {
            if (!args) {
                return false;
            }

            var dates = args.dateRange;
            var genero = _.chain(args.sexo).filter(function (o) { return o.value; }).map('label').value();
            var modalidade = _.chain(args.modalidadesOlimpicas).filter(function (o) { return o.value; }).map('label').value();
            var fases = _.chain(args.fases).filter(function (o) { return o.value; }).map('label').value();

            // zera o filtro
            var search = $scope.$root.dataCalendarioOlimpico;

            if (genero.length) {
                search = _.chain(search).filter(item => genero.indexOf(item.ds_Genero) > -1).value();
            }

            if (modalidade.length) {
                search = _.chain(search).filter(item => modalidade.indexOf(item.nm_Modalidade) > -1).value();
            }

            if (fases.length) {
                search = _.chain(search).filter(item => fases.indexOf(item.ds_Prova_Fase) > -1).value();
            }

            if (dates.dataInicial) {

                var date = new Date();
                date.setDate(dates.dataInicial.split("/")[0]);
                date.setMonth(dates.dataInicial.split("/")[1] - 1);
                date.setYear(2015);
                date.setHours(0);
                date.setMinutes(0);
                date.setSeconds(0);

                search = _.chain(search).filter(function (item) { var dt_Programacao = new Date(item.dt_Programacao); return dt_Programacao.getTime() >= date.getTime(); }).value();
            }

            if (dates.dataFinal) {

                var date = new Date();
                date.setDate(dates.dataFinal.split("/")[0]);
                date.setMonth(dates.dataFinal.split("/")[1] - 1);
                date.setYear(2016);
                date.setHours(23);
                date.setMinutes(59);
                date.setSeconds(59);

                search = _.chain(search).filter(function (item) { var dt_Programacao = new Date(item.dt_Programacao); return dt_Programacao.getTime() <= date.getTime(); }).value();
            }

            $scope.data = search;
            $scope.tableParams.data = search;
            $scope.tableParams.reload();

            $scope.$parent.filtroAtivo = !$scope.$parent.filtroAtivo;
        }
    }

    function s4cCalendarioOlimpico() {
        return {
            restrict: 'EA',
            templateUrl: 'app/directives/calendario-olimpico/calendario-olimpico.html',
            scope: {},
            controller: calendarioOlimpicoController
        };
    }

    function bullet() {
        return function (value) {

            var today = moment();
            var dt_Programacao = moment(value);

            var diff = today.diff(dt_Programacao) * -1;

            if (dt_Programacao.dayOfYear() === today.dayOfYear()) {
                return "bullet-progress"
            }
            if (diff < 0) {
                return "bullet-complete"
            }
            if (diff > 0) {
                return "bullet-scheduled"
            }


        }
    }

    angular.module('s4c.components.calendario')
        .directive('s4cCalendarioOlimpico', s4cCalendarioOlimpico)
        .filter('bullet', bullet);
})();