<?php

class JSONOutput implements Output {
	private static $encodeType = 'UTF-8';
	private static $CONTENT_TYPE = 'text/plain';
	private static $output = array();
    
    private static $isRegister = false;
    
    /**
	 * Output les données envoyés en paramètre
	 * 
	 * @param (Mixed) $output
	 */
	 
	public static function output($output) {
		if (!is_array($output))
			throw new Exception('Variable $output must be an array.');
		
		array_push(self::$output, self::recurParseToJSON($output));
		self::register();
	}
	
	/**
	 * Parcours de façon récursive un tableau pour le transformer en JSON
	 * 
	 * @param (Array) $arr Tableau
	 */
	
	public static function recurParseToJSON(array $arr) {
		//if (function_exists('json_encode'))
		//	return json_encode($arr);
		
		$i = 0;
		$resultat = (isset($arr[0])) ? '[' : '{';
		
		foreach ($arr as $key=>$value) {
			if ($i != 0)
				$resultat .= ',';
			
			if (!isset($arr[0]))
				$resultat .= '"' . $key . '":';
			
			if (is_array($value)) {
				$resultat .= self::recurParseToJSON($value);
			} else {
				$resultat .= '"' .
					str_replace(
						array("\n", "\r"),
						array('\n', '\r'),
					addslashes($value)) . '"';
			} 
			
			$i++;
		}
		
		$resultat .= (isset($arr[0])) ? ']' : '}';
		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);
		
		if (count(self::$output) == 1) {
			echo utf8_encode(self::$output[0]);
		} else if (count(self::$output) > 1) {
			$resultat = '[';
			
			for ($i=0,$limit=count(self::$output); $i<$limit; $i++) {
				if ($i != 0)
					$resultat .= ',';
				$resultat .= self::$output[$i];
			}
			
			$resultat .= ']';
			echo utf8_encode($resultat);
		} else {
			echo utf8_encode('{}');
		}
	}
	
	/**
	 * 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 JSONOutput());
			self::$isRegister = true;
		}
	}
	
	/**
	 * Fonction à utiliser pour définir le mode de sortie
	 * (S'assure que c'est JSONOutput qui est utilisé)
	 */
	 
	public static function touch() {
		self::register();
	}
}
?>