<?php

class insiteNavGenerator {

	private $subject          = false;
	private $output           = false;
	private $menue            = false;
	private $insertNavMenue   = false;
	private $navID            = false;
	private $navClass         = false;
	private $insertNavBefore  = false;
	private $insertNavAfter   = false;
	
	private $pattern          = '/(<[hH][1-6])(.*)(>.*)(<\/[hH][1-6]>)/';
	private $idFormat		  = '_%06d';
	private $i                = 0;
	private $navStart         = '';
	private $navEnd           = '';
	

	function __construct ( $subject, $idFormat='_%03d', $insertNavMenue=false, $insertNavAfter=false, $insertNavBefore=false, $navID=false, $navClass=false ) {
		
		if ( $subject ) {
			$this -> subject = $subject;
		} else {
			return false;
		}
		
		if ( $idFormat && 'default' != $idFormat ) {
			$this -> idFormat = $idFormat;
		}
		
		if ( $insertNavAfter )   {
			if ( ! $insertNavMenue )  {
				$this -> insertNavMenue = false;
				trigger_error( '$insertNavAfter wurde ignoriert, weil Navigation-Tag nicht eingefügt werden soll.', E_USER_Notice );
			}
			if ( $insertNavBefore )  {
				trigger_error( 'insertNavAfter und insertNavBefore können nicht gleichzeitig gesetzt werden.', E_USER_ERROR );
			}
			if ( false === strpos ($subject, $insertNavAfter ) ) {
				trigger_error( '$insertNavAfter wurde in $subjekt nicht gefunden.', E_USER_ERROR );					
			}
			$this -> insertNavAfter = $insertNavAfter;
			if ( $insertNavMenue ) $this -> insertNavMenue = true;
		}
		
		
		if ( $insertNavBefore )   {
			if ( ! $insertNavMenue )  {
				$this -> insertNavMenue = false;
				trigger_error( '$insertNavAfter wurde ignoriert, weil Navigation-Tag nicht eingefügt werden soll.', E_USER_NOTICE );
			}
			if ( $insertNavAfter )  {
				trigger_error( 'insertNavAfter und insertNavBefore können nicht gleichzeitig gesetzt werden.', E_USER_ERROR );
			}
			if ( false === strpos ($subject, $insertNavBefore ) ) {
				trigger_error( '$insertNavAfter wurde in $subjekt nicht gefunden.', E_USER_ERROR );					
			}
			$this -> insertNavBefore = $insertNavBefore;
			if ( $insertNavMenue ) $this -> insertNavMenue = true;
		}
		
		if ( $subject ) {
			$this -> subject = $subject;
		}
		
		if ( $this -> insertNavMenue ) {
		
			if ( $navClass ) {
				$classStr = ' class="' . $navClass . '"';
			} else {
				$classStr = '';
			}
			
			if ( $navID ) {
				$idStr    = ' id="' .    $navID . '"';
			} else {
				$idStr    = '';
			}
			
			$this -> navStart = "\n<nav" . $idStr . $classStr . ">\n\t<ul>\n";
			$this -> navEnd = "\t</ul>\n<nav>\n";
		} else {
			$this -> navStart = "\n<ul>\n";
			$this -> navEnd = "</ul>";				
		}
		
		$this -> output  = preg_replace_callback ( $this-> pattern , 'insiteNavGenerator::replFunkt' , $this-> subject , -1 , $count );
		$this -> menue  = $this -> navStart . $this -> menue . $this -> navEnd . "\n";
		
		if ( $this ->  insertNavBefore ) {
			$this -> output = str_replace ( $this ->  insertNavBefore, $this -> menue . $this -> insertNavBefore,  $this -> output );
		} else if ( $this ->  insertNavAfter ) {
			$this -> output = str_replace ( $this ->  insertNavAfter,  $this ->  insertNavAfter . $this -> menue,  $this -> output );			
		}
		
	}

	function replFunkt($ar) {
		#print_r($ar);
		$this -> i++;
		$this -> menue .= "\t\t" . '<li><a href="#'. sprintf( $this -> idFormat , $this -> i ) . '"' . strip_tags( $ar[3] ) . '</a></li>' . "\n";
		return $ar[1] . ' id="' . sprintf( $this -> idFormat , $this -> i ) . '"' . $ar[2] . $ar[3] . $ar[4];
	}	

	function getMenue() {
		return $this -> menue;
	}
	
	function getOutput() {
		return $this -> output;
	}
	
}