<?php
/*
Copyright (C) 2008 by oscim   Project lossim  [ 15.09.2009, 09:17:59] @oscim
// kate: replace-trailing-space-save true; space-indent on; indent-width 2; mixedindent off; indent-mode cstyle; word-wrap-marker-color #41C2A4
ENCODE UTF-8
*/
/**
  Constructeur de page et ordonanceur. Class primaire
  Prend en charge l'appel
    - des extensions
    - des object
    - des tableau php

  @package lossim <web http://www.lossim.org>
  @author oscim <mail dom@oscim.fr > <web http://www.oscim.fr>
  @class constructeur

  NOTE:


  Class enfant, extension
    chargement d'une extension
      ex: $cstr->_add_ext('dsrte','editeur/');
    Appel init top de l'extension
      ex: echo $cstr->_call('dsrte','_top',[option]);
    Appel script extension
      ex: echo $cstr->_call('dsrte','_head',[option]);
    Appel / exe extension
      ex: echo $cstr->_call('dsrte','_draw',[option]);

  Tableau php
    Chargement d'un tableau php
      ex: $tableau = $cstr->add_tbl_php(TBL_MODULE_RUBRIQUE_INC,'rubrique');
    Force rechargement d'un tableau
      ex: $tableau = $cstr->add_tbl_php(TBL_MODULE_RUBRIQUE_INC,'rubrique', true);


*/

class constructeur {
  /**
  public object ; element a chargée dans le header
  */
//   var b_head;

  /**
    Permamence du dernier object appelé
  */
  var $objet_open;
  /**
    Tableau php place ds object
  */
  var $tbl_php;
  /**
    le nom de la page en cours (nom_ss_ext)
  */
  var $page_content;


  /**
  */
  function constructeur($page_content){
      $this->vars=array();
      $this->globals=array();
      $this->page_content=$page_content;
  }



  /**
    Add constructeur
  */
  /*private*/ function add_obj($class){
    global $cstr;
    $vars='';
    if(func_num_args()>1) {
      for($i=1;$i<(func_num_args()-1);$i++){
        $t[$i] = func_get_arg($i);
        $vars.="\$t[$i],";
      }
      $t[$i] = func_get_arg($i);
      $vars.="\$t[$i]";
      }

    if (class_exists($class)) {
      if ($vars !='')eval("\$this->$class = new $class ($vars);");
      else $this->$class = new $class();
    }else die(_('Error class introuvable: '.(string)$class));
  }


  /**
    Add table php
    include + retour content array in object
    ou chargement du tableau a la place du fichier
    @param
      @a string/array/null  path.name ou tableau ou null pour retour tableau deja chargée
      @a string key, name var php
      @a boolean force le rechargement d'un tableau (apres up in page)
    @return le tableau chargée
  */
  /*public*/ function add_tbl_php($value,$key,$force=false){
    if (is_string($value) && file_exists($value) && ($force  || (!isset($this->tbl_php[(string)$key])) ) ){
      require($value);
      return $this->tbl_php[(string)$key]=(isset($$key) && is_array($$key)) ? $$key : array();
    }
    elseif (is_array($value) && (!isset($this->tbl_php[(string)$key]))){
      return $this->tbl_php[(string)$key]=  $value;
    }
    else return $this->tbl_php[(string)$key];
  }


  /**
    Ajout d'element a l'object precisé
  @param
    @p object $object nom du sous l'object a qui ajoute l'element
    @p string nom de var ajouté
    @p string type de var
    @p array/string/int/... valeur
  */
  /*public*/ function _add_in($object, $name, $value){
    global $cstr;
    if (!isset($this->$object) && !$this->add_obj($object) ){
      die(_('pas d\'oject de ce nom: '.(string)$object)) ;
    }

    //! operator
    $obj=$this->$object;
    if(is_object($value)){
      $this->$name=$value;
    }elseif(is_array($value)) {
      $obj[$name]=$value;
      $this->$object=$obj;
    }
    elseif(is_string($value)){
      $obj[$name]=addslashes($value);
      $this->$object=$obj;
    }
  }

  /**
    init d'un object
    @p string nom de l'object
  */
  /*public*/ function _add_init($object){
    global $cstr;
     if (!isset($this->$object) && !$this->add_obj($object) ){
      die(_('pas d\'oject de ce nom: '.(string)$object)) ;
    }
    return $this->$object;
  }


  /**
    Init d'un plugin via un fichier lossim_init
    Les functions seront aouté aux sous object
    @p string path generic (ex:DIR_WS_PLUGIN) (terminé par /)
    @p string $name_object nom de l'object
  */
  /*public*/ function _add_ext($name_object, $path){
    global $cstr;
// error_reporting(E_ALL);
    if(is_dir($path) && file_exists($path.$name_object.'/lossim_init.php') ) {
      include($path.$name_object.'/lossim_init.php');
      $this->add_obj($name_object.'_lossim');
    } else die(_('Error extenion introuvable: '.(string)$name_object));
  }


  /**
    Ajout d'une class au constructeur
  */
  /*public*/ function _add_class($name_object, $path){
    global $cstr;
        $vars='';
error_reporting(E_ALL);
    if(file_exists($path) ) {
      include_once($path);
      if(func_num_args()>2) {
        for($i=2, $max=(func_num_args()-1);$i<$max;$i++){
          $t[$i] = func_get_arg($i);
          $vars.="\$t[$i],";
        }
        $t[$i] = func_get_arg($i);
        $vars.="\$t[$i]";
      }
      if ($vars !='') eval("\$ret=\$this->add_obj('$name_object',$vars);");
      else $this->add_obj($name_object);

    } else die(_('Error class introuvable: '.(string)$name_object));
  }


  /**
    Appel public des function de chargeur des extensions
    @p string object key de l'obj (ex 'dsrte' pour la class 'dsrte_oscss' )
      *Cet arguement peut être hommis dans la mesure ou il est identique à l'appel précédent (permanence du dernier object appelé)
    @p string $function de construction block (_top, _head, _draw)
    @p all tous les arguement a passer à la function
  */
  /*public*/ function _call($key_object='', $funct){
error_reporting(E_ALL);
    $oscss=$this;
    $object=(tep_not_null($this->objet_open) && empty($key_object)) ? $this->objet_open : $key_object;
    if(!isset($this->$object)) die(_('Error class introuvable: '.(string)$key_object));

    $this->obj_open($object);// objet_open=$object;
    $vars='';
    if(func_num_args()>2) {
      for($i=2;$i<(func_num_args()-1);$i++){
        $t[$i] = func_get_arg($i);
        $vars.="\$t[$i],";
      }
      $t[$i] = func_get_arg($i);
      $vars.="\$t[$i]";
      }
    if ($vars !='') {
      eval("\$ret = \$this->\$object->$funct($vars);");
      return  $ret;
    }
    else return $this->$object->$funct();
  }

  /**
    Function de permanence du dernier object en cours.
    @a string nom de l'obejct a chargée en "objet_open". Si vide, retourne le nom de l'obejct en cours
    @return (string)nom object en cours / (boolean) true  success/ (boolean) false erreur
  */
  /*public*/ function obj_open($key_object=''){
    global $cstr;
    if(empty($key_object)) return $this->objet_open;
    if (!isset($this->$key_object) && !$this->add_obj($key_object) ){
      //die(_('pas d\'oject de ce nom')) ;
      return false;
    } else {
      $this->objet_open=$key_object;
      return true;
    }

  }


  /**
    stock var in array
    key => value
  */
  /*public*/ function _add_var($key,$value){
      $this->vars[(string)$key]=$value;
  }

  /**
    Retour du contenu var
  */
  /*public*/ function the_var($key){
      if(isset($this->vars[(string)$key])) return $this->vars[(string)$key];
      else return false;
  }
//   public function

  /*public*/ function debugg(){
    print_r( $this);
  }
}

?>