Source: site/wizard.js

/**
 * Wizard
 * @module
 */

 /* globals Event */
'use strict';

app.directive('wizard', [
  '$location', 'tooltipService', 'messageService',
  function ($location, tooltips, messages) {
    return {
      restrict: 'E',
      templateUrl: 'site/wizard.html',
      transclude: true,
      controller: ['$scope', '$attrs', function ($scope, $attrs) {
        this.name = $scope.wizardName = $attrs.name;
        $scope.steps = [];
        $scope.step = {};
        $scope.activeStep = undefined;

        var target = $location.search().page;
        this.addStep = function (step) {
          $scope.steps.push(step);
          $scope.step[step.name] = step;

          if ($scope.registerStep)
            $scope.registerStep(step);

          if (!$scope.activeStep && !step.complete || target === step.name)
            $scope.activateStep(step);
        };

        $scope.activateStep = function (newStep) {
          if (newStep.disabled || $scope.activeStep === newStep || $scope.switchStep && !$scope.switchStep(newStep))
            return;

          if ($scope.activeStep)
            $scope.activeStep.active = false;
          $location.replace().search('page', newStep.name);
          $scope.activeStep = newStep;
          newStep.active = true;
          tooltips.clear();
          messages.clear();
        };

        this.activateStep = function(s) {
          $scope.activateStep($scope.step[s]);
        };

        $scope.$on('wizard-activate', function (event, s) {
          var step = $scope.step[s];
          if (step)
            $scope.activateStep(step);
        });
      }],
    };
  }
]);