<?php

/**
 * Classe qui gère la modification à partir de PHP du DOM côté client.
 * 
 * @author Olivier Arteau
 */

class DOMAutoInsert implements Output {
	private static $prevInstance = null;
	private static $lstModification = array();
	
	/**
	 * Affecte une modification qui sera envoyé en même temps que la requête
	 * 
	 * @param (String)	$id			ID côté client de l'élément DOM
	 * @param (String)	$attribute	Attribut qui est modifié de l'élément avec le id mentionné
	 * @param (String)	$value		Valeur assigné à l'attribut
	 */
	
	public static function addModification($id, $attribute, $value) {
		self::setHasMainInstance();
		array_push(self::$lstModification, array(
			'id' => $id,
			'attribute' => $attribute,
			'value' => $value
		));
	}
	
	private static function setHasMainInstance() {
		if (get_class(PAFServer::getInstance()->getOutputInstance()) != 'DOMAutoInsert') {
			if (PAFServer::getInstance()->getOutputInstance() == null)
				throw new Exception('Instance de output non défini');
				
			self::$prevInstance = PAFServer::getInstance()->getOutputInstance();
			PAFServer::getInstance()->setOutputInstance(new DOMAutoInsert());
		}
		
	}
	
	/**
	 * Output les données envoyés en paramètre
	 * 
	 * @param (Mixed) $output
	 */
	 
	public static function output($output) {
		self::$prevInstance->output($output);
	}
	
	/**
	 * Ajoute un entête. 
	 * 
	 * @param (String) $header
	 */
	
	public static function addHeader($nom, $contenu) {
		self::$prevInstance->addHeader($nom, $contenu);
	}
	
	/**
	 * Retourne l'encodage utilisé dans la page
	 * 
	 * @return (String)
	 */
	
	public static function getCharset() {
		self::$prevInstance->getCharset();
	}
	
	/**
	 * Définit l'encodage utilisé dans la page
	 * 
	 * @param (String)
	 */
	
	public static function setCharset($charset) {
		self::$prevInstance->setCharset($charset);
	}
	
	/**
	 * Fonction appelé par la classe principale quand la page est fini d'être exécuté
	 */
	 
	public static function finish(){
		if (count(self::$lstModification) > 0) {
			$headerValue = '[';
			for ($i=0; $i<count(self::$lstModification); $i++) {
				if ($i != 0)
					$headerValue .= ',';				
				$headerValue .= self::recurParseToJSON(self::$lstModification[$i]);
			}
			$headerValue .= ']';
			self::addHeader('DOMInsert', $headerValue);
		}
		
		self::$prevInstance->finish();
	}
	
	/**
	 * 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 = '{';
		
		foreach ($arr as $key=>$value) {
			if ($i != 0)
				$resultat .= ',';
			
			$resultat .= '"' . $key . '":';
			
			if (is_array($value)) {
				$resultat .= self::recurParseToJSON($value);
			} else {
				$resultat .= '"' . addslashes($value) . '"';
			} 
			
			$i++;
		}
		
		$resultat .= '}';
		return $resultat;
	}
	
	/**
	 * Fonction à utiliser pour définir le mode de sortie.
	 * 
	 * Ne pas utiliser pour cette classe.
	 */
	 
	public static function touch() {
		
	}
}
?>