<?php

class NavigationView {

  private static $introductionCount = 0;

  private function __construct() {}

  public static function create( $version ) {
    $paths = DevGuideUtils::$versions[ $version ];
    $filePath = $paths[ 'rootUrl' ] . $paths[ 'tocPath' ];
    $result = '<ul id="dev-guide-nav">';
    $xmlIterator = new SimpleXMLIterator( $filePath, null, true );
    $result .= self::createNavigationFromXml( $xmlIterator, $version );
    $result .= '</ul>';
    return $result;
  }

  private static function createNavigationFromXml( $xmlIterator, $version, $depth = 0 ) {
    $result = '';
    foreach( $xmlIterator as $element ) {
      $label = $element[ 'label' ];
      if( !self::navEntryIsExcluded( $label ) ) {
        $hasChildren = $element -> count() > 0 ? true : false;
        if( $hasChildren && $depth == 0 ) {
          $result .= '<li class="category-group"><span><span class="arrow"></span>' . $label . '</span><ul>';
          $result .= self::createNavigationFromXml( $element, $version, $depth + 1 );
          $result .= '</ul></li>';
        } else {
          $url = self::createLinkUrl( self::getHref( $element ), $version );
          $result .= self::createLinkItem( $url, $label );
        }
      }
    }
    return $result;
  }

  private static function getHref( $element ) {
    $result;
    if( $element[ 'href' ] ) {
      $result = $element[ 'href' ];
    } else if( $element->link[ 0 ] ) {
      $toc = $element->link[ 0 ][ 'toc' ];
      $result = str_replace( 'toc.xml', 'index.html', $toc );
    }
    return $result;
  }

  private static function createLinkUrl( $href, $version ) {
    $topicPath = DevGuideUtils::$versions[ $version ][ 'topicPath' ];
    $apiUrl = DevGuideUtils::$versions[ $version ][ 'apiUrl' ];
    $topicUrl = str_replace( $topicPath, '', $href );
    if( self::startsWith( $topicUrl, 'reference/' ) ) {
      $url = $apiUrl . substr( $topicUrl, 10 );
    } else if( self::startsWith( $topicUrl, 'guide/reference/' ) ) {
      $url = $apiUrl . substr( $topicUrl, 16 );
    } else {
      $url = 'devguide.php?topic=' . $topicUrl . '&amp;version=' . $version;
    }
    return $url;
  }

  private static function createLinkItem( $url, $label ) {
    $active = '';
    $style = self::createLinkStyle( $url );
    if( isset( $_GET[ 'topic' ] ) ) {
      $active = strrpos( $url, $_GET[ 'topic' ] ) != false ? ' class="active"' : '';
    }
    $result =   '<li><a'
               . $active
               . $style
               . ' href="'
               . $url
               . '">'
               . $label
               . '</a></li>';
    return $result;
  }

  private static function createLinkStyle( $url ) {
    $result = '';
    if( self::startsWith( $url, 'http' ) ) {
      $result = ' style="padding-right:13px;background:url(../images/external.png) center right no-repeat"';
    }
    return $result;
  }

  private static function navEntryIsExcluded( $navEntry ) {
    $result = false;
    switch( $navEntry ) {
      case 'Legal':
        $result = true;
        break;
      case 'Introduction':
        if( self::$introductionCount < 1 ) {
          self::$introductionCount++;
          $result = true;
          break;
        }
    }
    return $result;
  }

  private static function startsWith( $haystack, $needle ) {
    return !strncmp( $haystack, $needle, strlen( $needle ) );
  }

}

?>
