text: app.directive('perfectScrollbar', ['$parse', '$window',
  function ($parse, $window) {
      var psOptions = ['wheelSpeed', 'wheelPropagation', 'minScrollbarLength', 'useBothWheelAxes', 'useKeyboard', 'suppressScrollX', 'suppressScrollY', 'scrollXMarginOffset', 'scrollYMarginOffset', 'includePadding'//, 'onScroll', 'scrollDown'
      ];
  
      return {
          restrict: 'EA',
          transclude: true,
          template: '<div><div ng-transclude></div></div>',
          replace: true,
          link: function ($scope, $elem, $attr) {
              var jqWindow = angular.element($window);
              var options = {};
              if (!$scope.app.isMobile) {
                  for (var i = 0, l = psOptions.length; i < l; i++) {
                      var opt = psOptions[i];
                      if ($attr[opt] !== undefined) {
                          options[opt] = $parse($attr[opt])();
                      }
                  }
  
                  $scope.$evalAsync(function () {
                      $elem.perfectScrollbar(options);
                      var onScrollHandler = $parse($attr.onScroll);
                      $elem.scroll(function () {
                          var scrollTop = $elem.scrollTop();
                          var scrollHeight = $elem.prop('scrollHeight') - $elem.height();
                          $scope.$apply(function () {
                              onScrollHandler($scope, {
                                  scrollTop: scrollTop,
                                  scrollHeight: scrollHeight
                              });
                          });
                      });
                  });
  
                  function update(event) {
                      $scope.$evalAsync(function () {
                          if ($attr.scrollDown == 'true' && event != 'mouseenter') {
                              setTimeout(function () {
                                  $($elem).scrollTop($($elem).prop("scrollHeight"));
                              }, 100);
                          }
                          $elem.perfectScrollbar('update');
                      });
                  }
  
                  // This is necessary when you don't watch anything with the scrollbar
                  $elem.bind('mousemove', update);
  
                  // Possible future improvement - check the type here and use the appropriate watch for non-arrays
                  if ($attr.refreshOnChange) {
                      $scope.$watchCollection($attr.refreshOnChange, function () {
                          update();
                      });
                  }
  
                  // this is from a pull request - I am not totally sure what the original issue is but seems harmless
                  if ($attr.refreshOnResize) {
                      jqWindow.on('resize', update);
                  }
  
                  $elem.bind('$destroy', function () {
                      jqWindow.off('resize', update);
                      $elem.perfectScrollbar('destroy');
                  });
              }
          }
      };
  }]);
  