'use strict';
/**
 * @ngdoc directive
 * @name ng.directive:ngView
 * @restrict ECA
 *
 * @description
 * # Overview
 * `ngView` is a directive that complements the {@link ng.$route $route} service by
 * including the rendered template of the current route into the main layout (`index.html`) file.
 * Every time the current route changes, the included view changes with it according to the
 * configuration of the `$route` service.
 *
 * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter**
 * and **leave** effects.
 *
 * @animations
 * enter - happens just after the ngView contents are changed (when the new view DOM element is inserted into the DOM)
 * leave - happens just after the current ngView contents change and just before the former contents are removed from the DOM
 *
 * @scope
 * @example
    
      
        
          Choose:
          
Moby |
          
Moby: Ch1 |
          
Gatsby |
          
Gatsby: Ch4 |
          
Scarlet Letter
          
          
          $location.path() = {{$location.path()}}
          $route.current.templateUrl = {{$route.current.templateUrl}}
          $route.current.params = {{$route.current.params}}
          $route.current.scope.name = {{$route.current.scope.name}}
          $routeParams = {{$routeParams}}
         
      
      
        
          controller: {{name}}
          Book Id: {{params.bookId}}
        
      
      
        
          controller: {{name}}
          Book Id: {{params.bookId}}
          Chapter Id: {{params.chapterId}}
        
      
      
        .example-leave-setup, .example-enter-setup {
          -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
          -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
          -ms-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
          -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
        }
        .example-animate-container {
          position:relative;
          height:100px;
        }
        .example-animate-container > * {
          display:block;
          width:100%;
          border-left:1px solid black;
          position:absolute;
          top:0;
          left:0;
          right:0;
          bottom:0;
          padding:10px;
        }
        .example-enter-setup {
          left:100%;
        }
        .example-enter-setup.example-enter-start {
          left:0;
        }
        .example-leave-setup { }
        .example-leave-setup.example-leave-start {
          left:-100%;
        }
      
      
        angular.module('ngView', [], function($routeProvider, $locationProvider) {
          $routeProvider.when('/Book/:bookId', {
            templateUrl: 'book.html',
            controller: BookCntl
          });
          $routeProvider.when('/Book/:bookId/ch/:chapterId', {
            templateUrl: 'chapter.html',
            controller: ChapterCntl
          });
          // configure html5 to get links working on jsfiddle
          $locationProvider.html5Mode(true);
        });
        function MainCntl($scope, $route, $routeParams, $location) {
          $scope.$route = $route;
          $scope.$location = $location;
          $scope.$routeParams = $routeParams;
        }
        function BookCntl($scope, $routeParams) {
          $scope.name = "BookCntl";
          $scope.params = $routeParams;
        }
        function ChapterCntl($scope, $routeParams) {
          $scope.name = "ChapterCntl";
          $scope.params = $routeParams;
        }
      
      
        it('should load and compile correct template', function() {
          element('a:contains("Moby: Ch1")').click();
          var content = element('.doc-example-live [ng-view]').text();
          expect(content).toMatch(/controller\: ChapterCntl/);
          expect(content).toMatch(/Book Id\: Moby/);
          expect(content).toMatch(/Chapter Id\: 1/);
          element('a:contains("Scarlet")').click();
          content = element('.doc-example-live [ng-view]').text();
          expect(content).toMatch(/controller\: BookCntl/);
          expect(content).toMatch(/Book Id\: Scarlet/);
        });
      
    
 */
/**
 * @ngdoc event
 * @name ng.directive:ngView#$viewContentLoaded
 * @eventOf ng.directive:ngView
 * @eventType emit on the current ngView scope
 * @description
 * Emitted every time the ngView content is reloaded.
 */
var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile',
                       '$controller', '$animator',
               function($http,   $templateCache,   $route,   $anchorScroll,   $compile,
                        $controller,  $animator) {
  return {
    restrict: 'ECA',
    terminal: true,
    link: function(scope, element, attr) {
      var lastScope,
          onloadExp = attr.onload || '',
          animate = $animator(scope, attr);
      scope.$on('$routeChangeSuccess', update);
      update();
      function destroyLastScope() {
        if (lastScope) {
          lastScope.$destroy();
          lastScope = null;
        }
      }
      function clearContent() {
        animate.leave(element.contents(), element);
        destroyLastScope();
      }
      function update() {
        var locals = $route.current && $route.current.locals,
            template = locals && locals.$template;
        if (template) {
          clearContent();
          animate.enter(jqLite('
').html(template).contents(), element);
          var link = $compile(element.contents()),
              current = $route.current,
              controller;
          lastScope = current.scope = scope.$new();
          if (current.controller) {
            locals.$scope = lastScope;
            controller = $controller(current.controller, locals);
            element.children().data('$ngControllerController', controller);
          }
          link(lastScope);
          lastScope.$emit('$viewContentLoaded');
          lastScope.$eval(onloadExp);
          // $anchorScroll might listen on event...
          $anchorScroll();
        } else {
          clearContent();
        }
      }
    }
  };
}];