index.run.js 4.49 KB
/* globals document:true*/
(function() {
  'use strict';

  angular
    .module('dialoga')
    .run(runAuth)
    .run(runAccessibility)
    .run(runHistory)
    .run(runPath)
    .run(runColorUtils)
    .run(runUtils)
    .run(runBlock);

  /** @ngInject */
  function runAuth($rootScope, $cookies, USER_ROLES, AUTH_EVENTS, AuthService, $log) {

    // Listner url/state changes, and check permission
    $rootScope.$on('$stateChangeStart', function(event, next) {

      if (!next.data || !next.data.authorizedRoles) {
        $log.debug('[RUN] Auth: public url/state');
        return;
      }

      var authorizedRoles = next.data.authorizedRoles;
      if (!AuthService.isAuthorized(authorizedRoles)) {
        event.preventDefault();
        if (AuthService.isAuthenticated()) {
          // user is not allowed
          $log.debug('user is not allowed');
          $rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
        } else {
          // user is not logged in
          $log.debug('user is not logged in');
          $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
        }
      }
    });

    $log.debug('[RUN] Auth end.');
  }

  /** @ngInject */
  function runAccessibility($rootScope, $timeout, $cookies, $log) {

    var contrast = $cookies.get('dialoga_contraste') === 'true';
    adjustContrast(contrast);

    function adjustContrast(state) {
      var bodyEl = angular.element(document).find('body');
      angular.element(bodyEl).toggleClass('contraste', !!state);
    }

    $rootScope.skipToContent = function() {
      angular.element('#content').attr('tabIndex', -1).focus();
    };

    $rootScope.skipToNavigation = function() {
      angular.element('#navigation').attr('tabIndex', -1).focus();
    };

    $rootScope.skipToSearch = function() {
      // angular.element('#search').attr('tabIndex', -1).focus();
      angular.element('#articleQueryFilter').attr('tabIndex', -1).focus();
    };

    $rootScope.skipToFooter = function() {
      angular.element('#footer').attr('tabIndex', -1).focus();
    };

    $rootScope.actionContrast = function() {
      // toggle contrast
      contrast = !contrast;
      $cookies.put('dialoga_contraste', contrast);
      adjustContrast(contrast);
    };

    $rootScope.focusMainContent = function($event) {

      // prevent skip link from redirecting
      if ($event) { $event.preventDefault(); }

      var mainContentArea = document.querySelector('[role="main"]');

      if (mainContentArea) {
        $timeout(function() {
          var $el = angular.element(mainContentArea);

          angular.element('body').animate({scrollTop: $el.offset().top}, 'slow');
        }, 90);
      } else {
        $log.warn('role="main" not found.');
      }
    };

    $log.debug('[RUN] Accessibility end.');
  }

  /** @ngInject */
  function runHistory($rootScope) {
    var MAX_HISTORY = 20;
    $rootScope.$previousState = $rootScope.$previousState || [];
    $rootScope.$on('$stateChangeSuccess', function(event, toState, toStateParams, fromState, fromStateParams) {
      $rootScope.$previousState.push({ state: fromState, params: fromStateParams});
      $rootScope.$previousState.splice(-MAX_HISTORY, MAX_HISTORY);
    });

    $rootScope.goBack = $rootScope.goBack || function () {
      return $rootScope.$previousState.pop();
    };
  }

  /** @ngInject */
  function runPath($rootScope, API, $window, $log) {
    var isProd = (/^http:\/\/dialoga\.gov\.br\//.test($window.location.href));
    var isHom = (/^http:\/\/hom.dialoga\.gov\.br\//.test($window.location.href));
    $rootScope.basePath = isProd ? API.hostProd : (isHom ? API.hostHom : API.hostDev);

    $log.debug('[RUN] Path end.');
  }

  /** @ngInject */
  function runColorUtils($window) {

    $window.ColorLuminance = function(hex, lum) {

      // validate hex string
      hex = String(hex).replace(/[^0-9a-f]/gi, '');
      if (hex.length < 6) {
        hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
      }
      lum = lum || 0;

      // convert to decimal and change luminosity
      var rgb = '#';
      var c;
      var i;

      for (i = 0; i < 3; i++) {
        c = parseInt(hex.substr(i * 2, 2), 16);
        c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
        rgb += ('00' + c).substr(c.length);
      }

      return rgb;
    };
  }

  /** @ngInject */
  function runUtils($rootScope) {
    $rootScope.stripHtml = function (text) {
      return String(text).replace(/<[^>]+>/gm, '');
    };
  }

  /** @ngInject */
  function runBlock($log) {
    $log.debug('[RUN] Block end.');
  }

})();