<?php

/**
 * Classe qui gère les sorties de type XML
 * 
 * @author Olivier Arteau
 */

class XMLOutput implements Output {
	private static $encodeType = 'UTF-8';
	private static $CONTENT_TYPE = 'text/xml';
	private static $ROOT_NODE_NAME = 'root';
	private static $output = '';
    
    private static $isRegister = false;
    
    /**
	 * Converti les données envoyées en paramètre en code XML et les affiche.
	 * 
	 * @param (Mixed) $output
	 */
	 
	public static function output($output) {
		if (is_array($output)) {
			self::$output .= self::recurParseArray($output);
		} else {
			// Paramètre autre que array ... à venir //
		}
		
		self::register();
	}
	
	/**
	 * Parcours de façon récursive un tableau pour le transformer en XML
	 * 
	 * @param (Array) $arr Tableau
	 */
	
	private static function recurParseArray(array $arr) {
		$resultat = '';
		
		foreach ($arr as $key=>$value) {
			if (is_array($value) && isset($value[0])) {
				for ($i=0; $i<count($value); $i++) {
					$resultat .= '<' . $key . '>';
					if (is_array($value[$i])) {
						$resultat .= self::recurParseArray($value[$i]);
					} else {
						$resultat .= htmlspecialchars($value[$i]);
					}
					$resultat .= '</' . $key . '>';
				}
			} else if (is_array($value)) {
				$resultat .= '<' . $key . '>';
				$resultat .= self::recurParseArray($value);
				$resultat .= '</' . $key . '>';
			} else {
				$resultat .= '<' . $key . '>' . $value . '</' . $key . '>';
			}
		}
		
		return $resultat;
	}
	
	/**
	 * Ajoute un entête. 
	 * 
	 * @param (String) $header
	 */
	
	public static function addHeader($nom, $contenu) {
		header($nom . ': ' . $contenu);
		self::register();
	}
	
	/**
	 * Retourne l'encodage utilisé dans la page
	 * 
	 * @return (String)
	 */
	
	public static function getCharset() {
		return self::$encodeType;
	}
	
	/**
	 * Définit l'encodage utilisé dans la page
	 * 
	 * @param (String)
	 */
	
	public static function setCharset($charset) {
		self::$encodeType = $charset;
		self::register();
	}
	
	/**
	 * Fonction appelé par la classe principale quand la page est fini d'être exécuté
	 */
	 
	public static function finish() {
		self::addHeader('Content-Type', self::$CONTENT_TYPE . '; ' . 'charset=' . self::$encodeType);
		
		echo utf8_encode('<' . self::$ROOT_NODE_NAME . '>' . self::$output . '</' . self::$ROOT_NODE_NAME . '>'); 
	}
	
	/**
	 * S'assure que la classe PAFServer détecte cette classe de sortie comme celle utilisé.
	 */
	
	private static function register() {
		if (!self::$isRegister) {
			PAFServer::getInstance()->setOutputInstance(new XMLOutput());
			self::$isRegister = true;
		}
	}
	
	/**
	 * Fonction à utiliser pour définir le mode de sortie
	 * (S'assure que c'est XMLOutput qui est utilisé)
	 */
	 
	public static function touch() {
		self::register();
	}
}
?>