text: /**
   * @ngdoc directive
   * @name ionTab
   * @module ionic
   * @restrict E
   * @parent ionic.directive:ionTabs
   *
   * @description
   * Contains a tab's content.  The content only exists while the given tab is selected.
   *
   * Each ionTab has its own view history.
   *
   * @usage
   * ```html
   * <ion-tab
   *   title="Tab!"
   *   icon="my-icon"
   *   href="#/tab/tab-link"
   *   on-select="onTabSelected()"
   *   on-deselect="onTabDeselected()">
   * </ion-tab>
   * ```
   * For a complete, working tab bar example, see the {@link ionic.directive:ionTabs} documentation.
   *
   * @param {string} title The title of the tab.
   * @param {string=} href The link that this tab will navigate to when tapped.
   * @param {string=} icon The icon of the tab. If given, this will become the default for icon-on and icon-off.
   * @param {string=} icon-on The icon of the tab while it is selected.
   * @param {string=} icon-off The icon of the tab while it is not selected.
   * @param {expression=} badge The badge to put on this tab (usually a number).
   * @param {expression=} badge-style The style of badge to put on this tab (eg tabs-positive).
   * @param {expression=} on-select Called when this tab is selected.
   * @param {expression=} on-deselect Called when this tab is deselected.
   * @param {expression=} ng-click By default, the tab will be selected on click. If ngClick is set, it will not.  You can explicitly switch tabs using {@link ionic.service:$ionicTabsDelegate#select $ionicTabsDelegate.select()}.
   */
  IonicModule
  .directive('ionTab', [
    '$rootScope',
    '$animate',
    '$ionicBind',
    '$compile',
  function($rootScope, $animate, $ionicBind, $compile) {
  
    //Returns ' key="value"' if value exists
    function attrStr(k,v) {
      return angular.isDefined(v) ? ' ' + k + '="' + v + '"' : '';
    }
    return {
      restrict: 'E',
      require: ['^ionTabs', 'ionTab'],
      replace: true,
      controller: '$ionicTab',
      scope: true,
      compile: function(element, attr) {
  
        //We create the tabNavTemplate in the compile phase so that the
        //attributes we pass down won't be interpolated yet - we want
        //to pass down the 'raw' versions of the attributes
        var tabNavTemplate = '<ion-tab-nav' +
          attrStr('ng-click', attr.ngClick) +
          attrStr('title', attr.title) +
          attrStr('icon', attr.icon) +
          attrStr('icon-on', attr.iconOn) +
          attrStr('icon-off', attr.iconOff) +
          attrStr('badge', attr.badge) +
          attrStr('badge-style', attr.badgeStyle) +
          attrStr('class', attr['class']) +
          '></ion-tab-nav>';
  
        //Remove the contents of the element so we can compile them later, if tab is selected
        //We don't use regular transclusion because it breaks element inheritance
        var tabContent = jqLite('<div class="pane">')
          .append( element.contents().remove() );
  
        return function link($scope, $element, $attr, ctrls) {
          var childScope;
          var childElement;
          var tabsCtrl = ctrls[0];
          var tabCtrl = ctrls[1];
  
          var navView = tabContent[0].querySelector('ion-nav-view') ||
            tabContent[0].querySelector('data-ion-nav-view');
          var navViewName = navView && navView.getAttribute('name');
  
          $ionicBind($scope, $attr, {
            animate: '=',
            onSelect: '&',
            onDeselect: '&',
            title: '@',
            uiSref: '@',
            href: '@',
          });
  
          tabsCtrl.add($scope);
          $scope.$on('$destroy', function() {
            tabsCtrl.remove($scope);
            tabNavElement.isolateScope().$destroy();
            tabNavElement.remove();
          });
  
          //Remove title attribute so browser-tooltip does not apear
          $element[0].removeAttribute('title');
  
          if (navViewName) {
            tabCtrl.navViewName = navViewName;
          }
          $scope.$on('$stateChangeSuccess', selectIfMatchesState);
          selectIfMatchesState();
          function selectIfMatchesState() {
            if (tabCtrl.tabMatchesState()) {
              tabsCtrl.select($scope);
            }
          }
  
          var tabNavElement = jqLite(tabNavTemplate);
          tabNavElement.data('$ionTabsController', tabsCtrl);
          tabNavElement.data('$ionTabController', tabCtrl);
          tabsCtrl.$tabsElement.append($compile(tabNavElement)($scope));
  
          $scope.$watch('$tabSelected', function(value) {
            childScope && childScope.$destroy();
            childScope = null;
            childElement && $animate.leave(childElement);
            childElement = null;
            if (value) {
              childScope = $scope.$new();
              childElement = tabContent.clone();
              $animate.enter(childElement, tabsCtrl.$element);
              $compile(childElement)(childScope);
            }
          });
  
        };
      }
    };
  }]);
  