/**
  * @param array referentiel array from xml tree
  * @return object import_referentiel object
  * modifie la base de donnees
  */
 function import_referentiel($xmlreferentiel)
 {
     // recupere le fichier xml
     // selon les parametres soit cree une nouvelle occurence
     // soit modifie une occurrence courante de referentiel
     global $SESSION;
     global $USER;
     global $CFG;
     $nbdomaines = 0;
     // compteur
     $nbcompetences = 0;
     // compteur
     $nbitems = 0;
     // compteur
     // print_r($xmlreferentiel);
     if (!isset($this->action) || isset($this->action) && $this->action != "selectreferentiel" && $this->action != "importreferentiel") {
         if (!(isset($this->course->id) && $this->course->id > 0) || !(isset($this->rreferentiel->id) && $this->rreferentiel->id > 0) || !(isset($this->coursemodule->id) && $this->coursemodule->id > 0)) {
             $this->error(get_string('incompletedata', 'referentiel'));
             return false;
         }
     } else {
         if (isset($this->action) && $this->action == "selectreferentiel") {
             if (!(isset($this->course->id) && $this->course->id > 0)) {
                 $this->error(get_string('incompletedata', 'referentiel'));
                 return false;
             }
         } else {
             if (isset($this->action) && $this->action == "importreferentiel") {
                 if (!(isset($this->course->id) && $this->course->id > 0)) {
                     $this->error(get_string('incompletedata', 'referentiel'));
                     return false;
                 }
             }
         }
     }
     $risque_ecrasement = false;
     // get some error strings
     $error_noname = get_string('xmlimportnoname', 'referentiel');
     $error_nocode = get_string('xmlimportnocode', 'referentiel');
     $error_override = get_string('overriderisk', 'referentiel');
     // this routine initialises the import object
     $re = $this->defaultreferentiel();
     //
     // $re->id = $this->getpath( $xmlreferentiel, array('#','id',0,'#'), '', false, '');
     $re->name = $this->getpath($xmlreferentiel, array('#', 'name', '0', '#'), '', true, $error_noname);
     $re->code_referentiel = $this->getpath($xmlreferentiel, array('#', 'code_referentiel', 0, '#'), '', true, $error_nocode);
     $re->description_referentiel = $this->getpath($xmlreferentiel, array('#', 'description_referentiel', 0, '#', 'text', 0, '#'), '', true, '');
     $re->url_referentiel = $this->getpath($xmlreferentiel, array('#', 'url_referentiel', 0, '#'), '', true, '');
     $re->seuil_certificat = $this->getpath($xmlreferentiel, array('#', 'seuil_certificat', 0, '#'), '', false, '');
     $re->minima_certificat = $this->getpath($xmlreferentiel, array('#', 'minima_certificat', 0, '#'), '', false, '');
     $re->timemodified = $this->getpath($xmlreferentiel, array('#', 'timemodified', 0, '#'), '', false, '');
     $re->nb_domaines = $this->getpath($xmlreferentiel, array('#', 'nb_domaines', 0, '#'), '', false, '');
     $re->liste_codes_competence = $this->getpath($xmlreferentiel, array('#', 'liste_codes_competence', 0, '#'), '', true, '');
     $re->liste_empreintes_competence = $this->getpath($xmlreferentiel, array('#', 'liste_empreintes_competence', 0, '#'), '', true, '');
     $re->logo_referentiel = $this->getpath($xmlreferentiel, array('#', 'logo_referentiel', 0, '#'), '', true, '');
     // $re->local = $this->getpath( $xmlreferentiel, array('#','course',0,'#'), '', false, '');
     /*
     // traitement d'une image associee
     // non implante
             $image = $this->getpath( $xmlreferentiel, array('#','image',0,'#'), $re->image );
             $image_base64 = $this->getpath( $xmlreferentiel, array('#','image_base64','0','#'),'' );
             if (!empty($image_base64)) {
                 $re->image = $this->importimagefile( $image, stripslashes($image_base64) );
             }
     */
     $re->export_process = false;
     $re->import_process = true;
     // le referentiel est toujours place dans le cours local d'appel
     $re->course = $this->course->id;
     $risque_ecrasement = false;
     if (!isset($this->action) || $this->action != "importreferentiel") {
         // importer dans le cours courant en remplacement du referentiel courant
         // Verifier si ecrasement referentiel local
         if (isset($re->name) && $re->name != "" && isset($re->code_referentiel) && $re->code_referentiel != "" && isset($re->id) && $re->id > 0 && isset($re->course) && $re->course > 0) {
             // sauvegarder ?
             if ($this->course->id == $re->course) {
                 if (isset($this->rreferentiel->id) && $this->rreferentiel->id == $re->id || isset($this->rreferentiel->name) && $this->rreferentiel->name == $re->name && (isset($this->rreferentiel->code_referentiel) && $this->rreferentiel->code_referentiel == $re->code_referentiel)) {
                     $risque_ecrasement = true;
                 }
             }
         }
     }
     if ($risque_ecrasement == false || $this->newinstance == 1) {
         // Enregistrer dans la base comme un nouveau referentiel_referentiel du cours courant
         $new_referentiel_id = referentiel_add_referentiel($re);
         $this->setReferentielId($new_referentiel_id);
         // DEBUG
         // echo "<br />DEBUG xml/format.php ligne 572<br />NEW REFERENTIEL ID ENREGISTRE : ".$this->new_referentiel_id."\n";
     } else {
         if ($risque_ecrasement == true && $this->override == 1) {
             // Enregistrer dans la base en remplaçant la version courante (update)
             // NE FAUDRAIT IL PAS SUPPRIMER LE REFERENTIEL AVANT DE LA RECHARGER ?
             $re->instance = $this->rreferentiel->id;
             // en realite instance est ici occurrence
             $re->referentiel_id = $this->rreferentiel->id;
             $ok = referentiel_update_referentiel($re);
             $new_referentiel_id = $this->rreferentiel->id;
         } else {
             // ni nouvelle instance ni recouvrement
             $this->error($error_override);
             return false;
         }
     }
     // MODIF JF 2012/03/09
     // importer le protocole
     $pindex = 0;
     $nbprotocoles = 0;
     // compteur
     $re->protocole = array();
     if (!empty($xmlreferentiel['#']['protocole'])) {
         $xmlprotocole = $xmlreferentiel['#']['protocole'];
         foreach ($xmlprotocole as $protocole) {
             // PROTOCOLE
             // print_r($protocole);
             $pindex++;
             $new_protocole = array();
             $new_protocole = $this->defaultprotocole();
             // $new_protocole->id=$this->getpath( $protocole, array('#','p_id',0,'#'), '', false, '');
             // $new_protocole->ref_occurrence=$this->getpath( $protocole, array('#','p_ref_occurrence',0,'#'), '', false, '');
             $new_protocole->seuil_referentiel = $this->getpath($protocole, array('#', 'p_seuil_referentiel', 0, '#'), '', false, '');
             $new_protocole->minima_referentiel = $this->getpath($protocole, array('#', 'p_minima_referentiel', 0, '#'), '', false, '');
             // La suite initialise en chargeant les domaines / compétences / items
             // $new_protocole->l_domaines_oblig=$this->getpath( $protocole, array('#','p_domaines_oblig',0,'#','text',0,'#'), '', true, '');
             // $new_protocole->l_seuils_domaines=$this->getpath( $protocole, array('#','p_seuils_domaines',0,'#','text',0,'#'), '', true, '');
             // $new_protocole->l_competences_oblig=$this->getpath( $protocole, array('#','p_competences_oblig',0,'#','text',0,'#'), '', true, '');
             // $new_protocole->l_seuils_competences=$this->getpath( $protocole, array('#','p_seuils_competences',0,'#','text',0,'#'), '', true, '');
             // $new_protocole->l_minimas_competences=$this->getpath( $protocole, array('#','p_minimas_competences',0,'#','text',0,'#'), '', true, '');
             // $new_protocole->l_items_oblig=$this->getpath( $protocole, array('#','p_items_oblig',0,'#','text',0,'#'), '', true, '');
             $new_protocole->timemodified = $this->getpath($protocole, array('#', 'p_timemodified', 0, '#'), '', false, '');
             $new_protocole->actif = $this->getpath($protocole, array('#', 'p_actif', 0, '#'), '', false, '');
             $new_protocole->commentaire = $this->getpath($protocole, array('#', 'p_commentaire', 0, '#', 'text', 0, '#'), '', true, '');
             // enregistrer
             $re->protocoles[$pindex] = $new_protocole;
             // sauvegarder dans la base
             // remplacer l'id du referentiel importe par l'id du referentiel cree
             // trafiquer les donnees pour appeler la fonction ad hoc
             $new_protocole->ref_occurrence = $new_referentiel_id;
             // DEBUG
             // echo "<br />DEBUG ./format/xml/format.php :: 710<br />\n";
             // print_object($new_protocole);
             if (referentiel_add_protocol($new_protocole)) {
                 $nbprotocoles++;
             }
         }
     } else {
         $new_protocole = $this->defaultprotocole();
         $new_protocole->ref_occurrence = $new_referentiel_id;
         $re->protocoles[1] = $new_protocole;
         if (referentiel_add_protocol($new_protocole)) {
             $nbprotocoles++;
         }
     }
     // importer les domaines
     $xmldomaines = $xmlreferentiel['#']['domaine'];
     $dindex = 0;
     $re->domaines = array();
     $nbdomaines = 0;
     // compteur
     foreach ($xmldomaines as $domaine) {
         // DOMAINES
         // print_r($domaine);
         $dindex++;
         $new_domaine = $this->defaultdomaine();
         // $new_domaine->id=$this->getpath( $domaine, array('#','id',0,'#'), '', false, '');
         $new_domaine->code_domaine = $this->getpath($domaine, array('#', 'code_domaine', 0, '#'), '', true, $error_nocode);
         $new_domaine->description_domaine = $this->getpath($domaine, array('#', 'description_domaine', 0, '#', 'text', 0, '#'), '', true, '');
         // MODIF JF 2012/05/22
         // retablir des sauts de ligne
         $new_domaine->description_domaine = preg_replace("/\\|\\|\\|/", "\r\n", $new_domaine->description_domaine);
         $new_domaine->num_domaine = $this->getpath($domaine, array('#', 'num_domaine', 0, '#'), '', false, '');
         $new_domaine->nb_competences = $this->getpath($domaine, array('#', 'nb_competences', 0, '#'), '', false, '');
         // $new_domaine->ref_referentiel=$this->getpath( $domaine, array('#','ref_referentiel',0,'#'), '', false, '');
         // MODIF 2012/03/08
         $new_domaine->type_domaine = $this->getpath($domaine, array('#', 'type_domaine', 0, '#'), '', false, '');
         if (empty($new_domaine->type_domaine)) {
             $new_domaine->type_domaine = 0;
         }
         $new_domaine->seuil_domaine = $this->getpath($domaine, array('#', 'seuil_domaine', 0, '#'), '', false, '');
         if (empty($new_domaine->seuil_domaine)) {
             $new_domaine->seuil_domaine = '0.0';
         }
         // MODIF 2012/03/26
         $new_domaine->minima_domaine = $this->getpath($domaine, array('#', 'minima_domaine', 0, '#'), '', false, '');
         if (empty($new_domaine->minima_domaine)) {
             $new_domaine->minima_domaine = '0';
         }
         // enregistrer
         $re->domaines[$dindex] = $new_domaine;
         // sauvegarder dans la base
         // remplacer l'id du referentiel importe par l'id du referentiel cree
         // trafiquer les donnees pour appeler la fonction ad hoc
         $new_domaine->ref_referentiel = $new_referentiel_id;
         $new_domaine->instance = $new_referentiel_id;
         // pour que ca marche
         $new_domaine->new_code_domaine = $new_domaine->code_domaine;
         $new_domaine->new_description_domaine = $new_domaine->description_domaine;
         $new_domaine->new_num_domaine = $new_domaine->num_domaine;
         $new_domaine->new_nb_competences = $new_domaine->num_domaine;
         // MODIF 2012/03/08
         $new_domaine->new_type_domaine = $new_domaine->type_domaine;
         $new_domaine->new_seuil_domaine = $new_domaine->seuil_domaine;
         // MODIF 2012/03/26
         $new_domaine->new_minima_domaine = $new_domaine->minima_domaine;
         $new_domaine_id = referentiel_add_domaine($new_domaine);
         if ($new_domaine_id) {
             $nbdomaines++;
         }
         // importer les competences
         $xmlcompetences = $domaine['#']['competence'];
         $cindex = 0;
         $re->domaines[$dindex]->competences = array();
         $nbcompetences = 0;
         // compteur
         foreach ($xmlcompetences as $competence) {
             $cindex++;
             $new_competence = array();
             $new_competence = $this->defaultcompetence();
             // $new_competence->id = $this->getpath( $competence, array('#','id',0,'#'), '', false, '');
             $new_competence->code_competence = $this->getpath($competence, array('#', 'code_competence', 0, '#'), '', true, $error_nocode);
             $new_competence->description_competence = $this->getpath($competence, array('#', 'description_competence', 0, '#', 'text', 0, '#'), '', true, '');
             // MODIF JF 2012/05/22
             // retablir des sauts de ligne
             $new_competence->description_competence = preg_replace("/\\|\\|\\|/", "\r\n", $new_competence->description_competence);
             $new_competence->num_competence = $this->getpath($competence, array('#', 'num_competence', 0, '#'), '', false, '');
             $new_competence->nb_item_competences = $this->getpath($competence, array('#', 'nb_item_competences', 0, '#'), '', false, '');
             // $new_competence->ref_domaine=$this->getpath( $competence, array('#','ref_domaine',0,'#'), '', false, '');
             // MODIF 2012/03/08
             $new_competence->type_competence = $this->getpath($competence, array('#', 'type_competence', 0, '#'), '', false, '');
             $new_competence->seuil_competence = $this->getpath($competence, array('#', 'seuil_competence', 0, '#'), '', false, '');
             if (empty($new_competence->type_competence)) {
                 $new_competence->type_competence = 0;
             }
             if (empty($new_competence->seuil_competence)) {
                 $new_competence->seuil_competence = '0.0';
             }
             // MODIF 2012/03/26
             $new_competence->minima_competence = $this->getpath($competence, array('#', 'minima_competence', 0, '#'), '', false, '');
             if (empty($new_competence->minima_competence)) {
                 $new_competence->minima_competence = 0;
             }
             // enregistrer
             $re->domaines[$dindex]->competences[$cindex] = $new_competence;
             // sauvegarder dans la base
             // remplacer l'id du referentiel importe par l'id du referentiel cree
             $new_competence->ref_domaine = $new_domaine_id;
             // trafiquer les donnees pour appeler la fonction ad hoc
             $new_competence->instance = $new_referentiel_id;
             // pour que ca marche
             $new_competence->new_code_competence = $new_competence->code_competence;
             $new_competence->new_description_competence = $new_competence->description_competence;
             $new_competence->new_ref_domaine = $new_competence->ref_domaine;
             $new_competence->new_num_competence = $new_competence->num_competence;
             $new_competence->new_nb_item_competences = $new_competence->nb_item_competences;
             // MODIF 2012/03/08
             $new_competence->new_type_competence = $new_competence->type_competence;
             $new_competence->new_seuil_competence = $new_competence->seuil_competence;
             // MODIF 2012/03/26
             $new_competence->new_minima_competence = $new_competence->minima_competence;
             // creation
             $new_competence_id = referentiel_add_competence($new_competence);
             if ($new_competence_id) {
                 $nbcompetences++;
                 // compteur
             }
             // importer les items
             $xmlitems = $competence['#']['item'];
             $iindex = 0;
             $re->domaines[$dindex]->competences[$cindex]->items = array();
             $nbitems = 0;
             // compteur
             foreach ($xmlitems as $item) {
                 $iindex++;
                 $new_item = array();
                 $new_item = $this->defaultitem();
                 // $new_item->id = $this->getpath( $item, array('#','id',0,'#'), '', false, '');
                 $new_item->code_item = $this->getpath($item, array('#', 'code', 0, '#'), '', true, $error_nocode);
                 $new_item->description_item = $this->getpath($item, array('#', 'description_item', 0, '#', 'text', 0, '#'), '', true, '');
                 // MODIF JF 2012/05/22
                 // retablir des sauts de ligne
                 $new_item->description_item = preg_replace("/\\|\\|\\|/", "\r\n", $new_item->description_item);
                 $new_item->num_item = $this->getpath($item, array('#', 'num_item', 0, '#'), '', false, '');
                 $new_item->type_item = $this->getpath($item, array('#', 'type_item', 0, '#'), '', true, '');
                 $new_item->poids_item = $this->getpath($item, array('#', 'poids_item', 0, '#'), '', false, '');
                 // $new_item->ref_competence=$this->getpath( $item, array('#','ref_competence',0,'#'), '', false, '');
                 // $new_item->ref_referentiel=$this->getpath( $item, array('#','ref_referentiel',0,'#'), '', false, '');
                 $new_item->empreinte_item = $this->getpath($item, array('#', 'empreinte_item', 0, '#'), '', false, '');
                 // enregistrer
                 $re->domaines[$dindex]->competences[$cindex]->items[$iindex] = $new_item;
                 // sauvegarder dans la base
                 // remplacer l'id du referentiel importe par l'id du referentiel cree
                 $new_item->ref_referentiel = $new_referentiel_id;
                 $new_item->ref_competence = $new_competence_id;
                 // trafiquer les donnees pour pouvoir appeler la fonction ad hoc
                 $new_item->instance = $new_item->ref_referentiel;
                 $new_item->new_ref_competence = $new_item->ref_competence;
                 $new_item->new_code_item = $new_item->code_item;
                 $new_item->new_description_item = $new_item->description_item;
                 $new_item->new_num_item = $new_item->num_item;
                 $new_item->new_type_item = $new_item->type_item;
                 $new_item->new_poids_item = $new_item->poids_item;
                 $new_item->new_empreinte_item = $new_item->empreinte_item;
                 // creer
                 $new_item_id = referentiel_add_item($new_item);
                 if ($new_item_id) {
                     $nbitems++;
                 }
                 // that's all folks
             }
             // items
             if ($nbitems > 0) {
                 // mettre a jour
                 referentiel_set_competence_nb_item($new_competence_id, $nbitems);
             }
         }
         // competences
         if ($nbcompetences > 0) {
             // mettre a jour
             referentiel_set_domaine_nb_competence($new_domaine_id, $nbcompetences);
         }
     }
     // mettre a jour
     if ($nbdomaines > 0) {
         // mettre a jour
         referentiel_set_referentiel_nb_domaine($new_referentiel_id, $nbdomaines);
     }
     return $re;
 }
 /**
  * @param array referentiel array from xml tree
  * @return object import_referentiel object
  * modifie la base de donnees
  */
 function import_referentiel($lines)
 {
     // recupere le tableau de lignes
     // selon les parametres soit cree une nouvelle instance
     // soit modifie une instance courante de referentiel
     global $SESSION;
     global $USER;
     global $CFG;
     if (!$this->importation_referentiel_possible()) {
         exit;
     }
     // initialiser les variables
     // id du nouveau referentiel si celui ci doit être cree
     $new_referentiel_id = 0;
     $auteur = "";
     $l_id_referentiel = "id_referentiel";
     $l_code_referentiel = "code_referentiel";
     $l_description_referentiel = "description_referentiel";
     $l_date_creation = "date_creation";
     $l_nb_domaine = "nb_domaine";
     $l_seuil_certification = "seuil_certificat";
     $l_local = "local";
     $l_name = "name";
     $l_url_referentiel = "url_referentiel";
     $l_liste_competences = "liste_competences";
     $l_liste_empreintes = "liste_empreintes";
     $l_logo = "logo_referentiel";
     $ok_referentiel_charge = false;
     // MODIF JF 2012/03/09
     $ok_protocole_charge = false;
     $ok_domaine_charge = false;
     $ok_competence_charge = false;
     $ok_item_charge = false;
     $risque_ecrasement = false;
     // get some error strings
     $error_noname = get_string('xmlimportnoname', 'referentiel');
     $error_nocode = get_string('xmlimportnocode', 'referentiel');
     $error_override = get_string('overriderisk', 'referentiel');
     // DEBUT
     // Decodage
     $line = 0;
     // TRAITER LA LIGNE D'ENTETE
     $nbl = count($lines);
     if ($nbl > 0) {
         // premiere ligne entete fichier csv
         // echo "<br />DEBUG :: forme/csv/format.php :: 424\n";
         // echo "<br />LIGNE $line --------------<br />\n".$lines[$line]."<br />\n";
         // "#Moodle Referentiel CSV Export;latin1;Prénom NOM\n";
         $fields = explode($this->sep, str_replace("\r", "", $lines[$line]));
         $line++;
         if (substr($lines[$line], 0, 1) == '#') {
             // labels
             /// If a line is incorrectly formatted
             if (count($fields) < 3) {
                 if (count($fields) > 1 or strlen($fields[0]) > 1) {
                     // no error for blank lines
                     $this->error("ERROR " . $lines[$line] . ": Line " . $line . "incorrectly formatted - ignoring\n");
                 }
             }
             if (isset($fields[1]) && $fields[1] != "") {
                 $this->table_caractere_input = trim($fields[1]);
             }
             $auteur = trim($fields[2]);
         }
     } else {
         $this->error("ERROR : CSV File incorrect\n");
     }
     // echo "<br />DEBUG :: 991 : $this->table_caractere_input\n";
     if ($nbl > 1) {
         // deuxieme ligne : entete referentiel
         // echo "<br />$line : ".$lines[$line]."\n";
         // #code_referentiel;name;description_referentiel;url_referentiel;date_creation;
         // nb_domaines;seuil_certification;liste_competences
         $fields = explode($this->sep, str_replace("\r", "", $lines[$line]));
         /// If a line is incorrectly formatted
         if (count($fields) < 3) {
             if (count($fields) > 1 or strlen($fields[0]) > 1) {
                 // no error for blank lines
                 $this->error("ERROR " . $lines[$line] . ": Line " . $line . "incorrectly formatted");
             }
         }
         if (substr($lines[$line], 0, 1) == '#') {
             // labels
             $l_code_referentiel = trim($fields[0]);
             $l_name = trim($fields[1]);
             $l_description_referentiel = trim($fields[2]);
             if (isset($fields[3])) {
                 $l_url_referentiel = trim($fields[3]);
             } else {
                 $l_url_referentiel = "";
             }
             if (isset($fields[4])) {
                 $l_date_creation = trim($fields[4]);
             } else {
                 $l_date_creation = "";
             }
             if (isset($fields[5])) {
                 $l_nb_domaines = trim($fields[5]);
             } else {
                 $l_nb_domaines = "";
             }
             if (isset($fields[6])) {
                 $l_seuil_certificat = trim($fields[6]);
             } else {
                 $l_seuil_certificat = "";
             }
             if (isset($fields[7])) {
                 $l_liste_competences = trim($fields[7]);
             } else {
                 $l_liste_competences = "";
             }
             if (isset($fields[8])) {
                 $l_liste_empreintes = trim($fields[8]);
             } else {
                 $l_liste_empreintes = "";
             }
             if (isset($fields[9])) {
                 $l_logo = trim($fields[9]);
             } else {
                 $l_logo = "";
             }
             // MODIF JF 2012/03/26
             if (isset($fields[10])) {
                 $l_minima_certificat = trim($fields[10]);
             } else {
                 $l_minima_certificat = "";
             }
         } else {
             // data  : referentiel
             $code_referentiel = $this->input_codage_caractere(trim($fields[0]));
             $name = $this->input_codage_caractere(trim($fields[1]));
             $description_referentiel = $this->input_codage_caractere(trim($fields[2]));
             if (isset($fields[3])) {
                 $url_referentiel = trim($fields[3]);
             } else {
                 $url_referentiel = "";
             }
             if (isset($fields[4])) {
                 $date_creation = trim($fields[4]);
             } else {
                 $date_creation = "";
             }
             if (isset($fields[5])) {
                 $nb_domaines = trim($fields[5]);
             } else {
                 $nb_domaines = "";
             }
             if (isset($fields[6])) {
                 $seuil_certificat = trim($fields[6]);
             } else {
                 $seuil_certificat = 0.0;
             }
             if (isset($fields[7])) {
                 $liste_competences = $this->input_codage_caractere(trim($fields[7]));
             } else {
                 $liste_competences = "";
             }
             if (isset($fields[8])) {
                 $liste_empreintes = $this->input_codage_caractere(trim($fields[8]));
             } else {
                 $liste_empreintes = "";
             }
             if (isset($fields[9])) {
                 $logo_referentiel = trim($fields[9]);
             } else {
                 $logo_referentiel = "";
             }
             // MODIF JF 2012/03/26
             if (isset($fields[10])) {
                 $minima_certificat = trim($fields[10]);
             } else {
                 $minima_certificat = 0;
             }
             $ok_referentiel_charge = true;
         }
         $line++;
     }
     // maintenant les données indispensables
     while ($line < $nbl && $ok_referentiel_charge == false) {
         // data : referentiel
         // echo "<br />$line : ".$lines[$line]."\n";
         // #referentiel_id;code_referentiel;description_referentiel;date_creation;
         // nb_domaines;seuil_certificat;local;name;url_referentiel;liste_competences
         $fields = explode($this->sep, str_replace("\r", "", $lines[$line]));
         /// If a line is incorrectly formatted
         if (count($fields) < 3) {
             if (count($fields) > 1 or strlen($fields[0]) > 1) {
                 // no error for blank lines
                 $this->error("ERROR " . $lines[$line] . ": Line " . $line . "incorrectly formatted");
             }
             continue;
         }
         // DEBUG
         // echo "<br />DEBUG : ./mod/refrentiel/format/csv/format.php :: 560<br >\n";
         // print_r($fields);
         // data  : referentiel
         $code_referentiel = $this->input_codage_caractere(trim($fields[0]));
         $name = $this->input_codage_caractere(trim($fields[1]));
         $description_referentiel = $this->input_codage_caractere(trim($fields[2]));
         if (isset($fields[3])) {
             $url_referentiel = trim($fields[3]);
         } else {
             $url_referentiel = "";
         }
         if (isset($fields[4])) {
             $date_creation = trim($fields[4]);
         } else {
             $date_creation = "";
         }
         if (isset($fields[5])) {
             $nb_domaines = trim($fields[5]);
         } else {
             $nb_domaines = "";
         }
         if (isset($fields[6])) {
             $seuil_certificat = trim($fields[6]);
         } else {
             $seuil_certificat = 0.0;
         }
         if (isset($fields[7])) {
             $liste_competences = $this->input_codage_caractere(trim($fields[7]));
         } else {
             $liste_competences = "";
         }
         if (isset($fields[8])) {
             $liste_empreintes = $this->input_codage_caractere(trim($fields[8]));
         } else {
             $liste_empreintes = "";
         }
         if (isset($fields[9])) {
             $logo_referentiel = trim($fields[9]);
         } else {
             $logo_referentiel = "";
         }
         // MODIF JF 2012/03/26
         if (isset($fields[10])) {
             $minima_certificat = trim($fields[10]);
         } else {
             $minima_certificat = 0;
         }
         $ok_referentiel_charge = true;
         $line++;
     }
     if (!$ok_referentiel_charge) {
         $this->error(get_string('incompletedata', 'referentiel'));
     }
     // this routine initialises the import object
     $re = $this->defaultreferentiel();
     $re->name = str_replace("'", " ", $name);
     // $re->name=addslashes($name);
     $re->code_referentiel = $code_referentiel;
     $re->description_referentiel = str_replace("'", "`", $description_referentiel);
     // $re->description_referentiel=addslashes($description_referentiel);
     $re->url_referentiel = $url_referentiel;
     $re->seuil_certificat = $seuil_certificat;
     $re->minima_certificat = $minima_certificat;
     $re->timemodified = $date_creation;
     $re->nb_domaines = $nb_domaines;
     $re->liste_codes_competence = $liste_competences;
     $re->liste_empreintes_competence = $liste_empreintes;
     $re->logo_referentiel = $logo_referentiel;
     /*
     // GROS BUG
     if ($id_referentiel!=""){
     	$re->id=$id_referentiel;
     }
     */
     $re->id = 0;
     // DEBUG
     // print_r($re);
     // RISQUE ECRASEMENT ?
     $risque_ecrasement = false;
     //
     if ($this->rreferentiel && $this->rreferentiel->id > 0) {
         // charger le referentiel associé à l'instance
         $this->rreferentiel = referentiel_get_referentiel_referentiel($this->rreferentiel->id);
         if ($this->rreferentiel) {
             $risque_ecrasement = $this->rreferentiel->name == $re->name && $this->rreferentiel->code_referentiel == $re->code_referentiel;
         }
     }
     // SI OUI arrêter
     if ($risque_ecrasement == true) {
         if ($this->override != 1) {
             $this->error($error_override);
         } else {
             // le referentiel courant est remplace
             $new_referentiel_id = $this->rreferentiel->id;
             $re->id = $new_referentiel_id;
         }
     }
     $re->export_process = false;
     $re->import_process = true;
     // le referentiel est toujours place dans le cours local d'appel
     $re->course = $this->course->id;
     $risque_ecrasement = false;
     if (!isset($this->action) || $this->action != "importreferentiel") {
         // importer dans le cours courant en remplacement du referentiel courant
         // Verifier si ecrasement referentiel local
         if (isset($re->name) && $re->name != "" && isset($re->code_referentiel) && $re->code_referentiel != "" && isset($re->id) && $re->id > 0 && isset($re->course) && $re->course > 0) {
             // sauvegarder ?
             if ($this->course->id == $re->course) {
                 if (isset($this->rreferentiel->id) && $this->rreferentiel->id == $re->id || isset($this->rreferentiel->name) && $this->rreferentiel->name == $re->name && (isset($this->rreferentiel->code_referentiel) && $this->rreferentiel->code_referentiel == $re->code_referentiel)) {
                     $risque_ecrasement = true;
                 }
             }
         }
     }
     // DEBUG
     /*
     if ($risque_ecrasement)
     	echo "<br />DEBUG : 607 : Risque d'ecrasement N:$this->newinstance O:$this->override\n";
     else
     	echo "<br />DEBUG : 607 : Pas de risque d'ecrasement N:$this->newinstance O:$this->override\n";
     */
     if ($risque_ecrasement == false || $this->newinstance == 1) {
         // Enregistrer dans la base comme un nouveau referentiel du cours courant
         // DEBUG
         // echo "<br />DEBUG csv/format.php ligne 704<br />\n";
         // print_object($re);
         // exit;
         $new_referentiel_id = referentiel_add_referentiel($re);
         // retourne un id de la table refrentiel_referentiel
         $this->setReferentielId($new_referentiel_id);
     } else {
         if ($risque_ecrasement == true && $this->override == 1) {
             // Enregistrer dans la base en remplaçant la version courante (update)
             // NE FAUDRAIT IL PAS SUPPRIMER LE REFERENTIEL AVANT DE LA RECHARGER ?
             $re->instance = $this->rreferentiel->id;
             $re->referentiel_id = $this->rreferentiel->id;
             // DEBUG
             // echo "<br />DEBUG csv/format.php ligne 638<br />MISE A JOUR  : ".$r->rreferentiel_id."\n";
             $ok = referentiel_update_referentiel($re);
             // retourne un id de la table referentiel_referentiel
             $new_referentiel_id = $this->rreferentiel->id;
         } else {
             // ni nouvelle instance ni recouvrement
             $this->error("ERREUR 2 " . $error_override);
             return false;
         }
     }
     if (isset($new_referentiel_id) && $new_referentiel_id > 0) {
         // IMPORTER LE RESTE DU REFERENTIEL
         $dindex = 0;
         $cindex = 0;
         $iindex = 0;
         $re->domaines = array();
         $new_domaine_id = 0;
         $new_competence_id = 0;
         $numero_domaine = 0;
         // compteur pour suppleer le numero si non importe
         $numero_competence = 0;
         $numero_item = 0;
         $num_domaine = 0;
         $num_competence = 0;
         $type_domaine = 0;
         $seuil_domaine = 0.0;
         $type_competence = 0;
         $seuil_competence = 0.0;
         $minima_domaine = 0.0;
         $minima_competence = 0;
         $num_item = 0;
         $is = "";
         $pindex = 0;
         $is_protocole = false;
         $ok_protocole_charge = false;
         $nbprotocoles = 0;
         $is_domaine = false;
         $is_competence = false;
         $is_item = false;
         $mode = "add";
         while ($line < $nbl) {
             // echo "<br />DEBUG 652 :: <br />".$lines[$line]."\n";
             $fields = explode($this->sep, str_replace("\r", "", $lines[$line]));
             if (count($fields) < 2) {
                 if (count($fields) > 1 or strlen($fields[0]) > 1) {
                     // no error for blank lines
                     $this->error("ERROR " . $lines[$line] . ": Line " . $line . "incorrectly formatted");
                 }
                 continue;
             }
             // print_r($fields);
             // Label ou data ?
             // echo "<br />".substr($fields[0],0,1)."\n";
             if (substr($fields[0], 0, 1) == '#') {
                 // labels
                 // on s'en sert pour construire l'arbre
                 $is = trim($fields[0]);
                 $is_protocole = false;
                 $is_domaine = false;
                 $is_competence = false;
                 $is_item = false;
                 switch ($is) {
                     case '#protocole_seuil':
                         // #protocole_seuil;l_domaines_oblig;l_seuils_domaines;l_competences_oblig;l_seuils_competences;l_items_oblig;timemodified;actif;commentaire
                         $is_protocole = true;
                         break;
                     case '#code_domaine':
                         // #code_domaine;description_domaine;num_domaine;nb_competences;type_domaine;seuil_domaine
                         $is_domaine = true;
                         break;
                     case '#code_competence':
                         // #code_competence;description_competence;num_competence;nb_item_competences;type_competence;seuil_competence
                         $is_competence = true;
                         break;
                     case '#code_item':
                         // #code_item;description_item;type_item;poids_item;num_item
                         $is_item = true;
                         break;
                     default:
                         $this->error("ERROR : CSV File incorrect line number:" . $line . "\n");
                         break;
                 }
             } else {
                 if (isset($is) && $is != "") {
                     // data
                     switch ($is) {
                         // MODIF JF 2012/03/09
                         case '#protocole_seuil':
                             // Protocole
                             // data
                             $seuil_referentiel = trim($fields[0]);
                             $minima_referentiel = trim($fields[1]);
                             $l_domaines_oblig = addslashes($this->input_codage_caractere(trim($fields[2])));
                             $l_seuils_domaines = addslashes($this->input_codage_caractere(trim($fields[3])));
                             $l_minimas_domaines = addslashes($this->input_codage_caractere(trim($fields[4])));
                             $l_competences_oblig = addslashes($this->input_codage_caractere(trim($fields[5])));
                             $l_seuils_competences = addslashes($this->input_codage_caractere(trim($fields[6])));
                             $l_minimas_competences = addslashes($this->input_codage_caractere(trim($fields[7])));
                             $l_items_oblig = addslashes($this->input_codage_caractere(trim($fields[8])));
                             $timemodified = trim($fields[9]);
                             $actif = trim($fields[10]);
                             $commentaire = addslashes($this->input_codage_caractere(trim($fields[11])));
                             // Creer un enregistrement
                             $new_protocole = $this->defaultprotocole();
                             // sauvegarder dans la base
                             // remplacer l'id du referentiel importe par l'id du referentiel cree
                             // trafiquer les donnees pour appeler la fonction ad hoc
                             $new_protocole->ref_occurrence = $new_referentiel_id;
                             // $new_protocole->id=$this->getpath( $protocole, array('#','p_id',0,'#'), '', false, '');
                             // $new_protocole->ref_occurrence;
                             $new_protocole->seuil_referentiel = $seuil_referentiel;
                             $new_protocole->minima_referentiel = $minima_referentiel;
                             // A recreer a partir des domaines et competences pourr eviter incoherences
                             // La suite initialise en chargeant les domaines / compétences / items
                             // $new_protocole->l_domaines_oblig=$l_competences_oblig;
                             // $new_protocole->l_seuils_domaines= $l_seuils_domaines;
                             // $new_protocole->l_competences_oblig=$l_competences_oblig;
                             // $new_protocole->l_seuils_competences=$l_seuils_competences;
                             // $new_protocole->l_minimas_competences=$l_minimas_competences;
                             // $new_protocole->l_items_oblig= $l_items_oblig;
                             $new_protocole->timemodified = $timemodified;
                             $new_protocole->actif = $actif;
                             $new_protocole->commentaire = $commentaire;
                             // sauvegarder dans la base
                             // remplacer l'id du referentiel importe par l'id du referentiel cree
                             // trafiquer les donnees pour appeler la fonction ad hoc
                             $new_protocole->ref_occurrence = $new_referentiel_id;
                             // DEBUG
                             // echo "<br />DEBUG ./format/csv/format.php :: 710<br />\n";
                             // print_object($new_protocole);
                             if (referentiel_add_protocol($new_protocole)) {
                                 $nbprotocoles++;
                             }
                             // enregistrer
                             $pindex++;
                             $re->protocoles[$pindex] = $new_protocole;
                             $ok_protocole_charge = true;
                             break;
                         case '#code_domaine':
                             // $code_domaine;$description_domaine;$num_domaine;$nb_competences
                             // Domaines
                             // data
                             $code_domaine = addslashes($this->input_codage_caractere(trim($fields[0])));
                             $description_domaine = addslashes($this->input_codage_caractere(trim($fields[1])));
                             $num_domaine = trim($fields[2]);
                             $nb_competences = trim($fields[3]);
                             if (isset($fields[4])) {
                                 $type_domaine = trim($fields[4]);
                             } else {
                                 $type_domaine = 0;
                             }
                             if (isset($fields[5])) {
                                 $seuil_domaine = trim($fields[5]);
                             } else {
                                 $seuil_domaine = 0;
                             }
                             if (isset($fields[6])) {
                                 $minima_domaine = trim($fields[6]);
                             } else {
                                 $minima_domaine = 0;
                             }
                             if ($code_domaine != "") {
                                 // Creer un domaine
                                 $numero_domaine++;
                                 $new_domaine = array();
                                 $new_domaine = $this->defaultdomaine();
                                 $new_domaine->code_domaine = $code_domaine;
                                 if ($description_domaine != "") {
                                     $new_domaine->description_domaine = $description_domaine;
                                 }
                                 if ($num_domaine != "") {
                                     $new_domaine->num_domaine = $num_domaine;
                                 } else {
                                     $new_domaine->num_domaine = $numero_domaine;
                                 }
                                 if ($nb_competences != "") {
                                     $new_domaine->nb_competences = $nb_competences;
                                 } else {
                                     $new_domaine->nb_competences = 0;
                                 }
                                 if ($type_domaine != "") {
                                     $new_domaine->type_domaine = $type_domaine;
                                 } else {
                                     $new_domaine->type_domaine = 0;
                                 }
                                 if ($seuil_domaine != "") {
                                     $new_domaine->seuil_domaine = $seuil_domaine;
                                 } else {
                                     $new_domaine->seuil_domaine = 0.0;
                                 }
                                 if ($minima_domaine != "") {
                                     $new_domaine->minima_domaine = $minima_domaine;
                                 } else {
                                     $new_domaine->minima_domaine = 0;
                                 }
                                 $new_domaine->ref_referentiel = $new_referentiel_id;
                                 // sauvegarder dans la base
                                 // remplacer l'id du referentiel importe par l'id du referentiel cree
                                 // trafiquer les donnees pour appeler la fonction ad hoc
                                 $new_domaine->ref_referentiel = $new_referentiel_id;
                                 $new_domaine->instance = $new_referentiel_id;
                                 // pour que ca marche
                                 $new_domaine->new_code_domaine = $new_domaine->code_domaine;
                                 $new_domaine->new_description_domaine = $new_domaine->description_domaine;
                                 $new_domaine->new_num_domaine = $new_domaine->num_domaine;
                                 $new_domaine->new_nb_competences = $new_domaine->num_domaine;
                                 $new_domaine->new_type_domaine = $new_domaine->type_domaine;
                                 $new_domaine->new_seuil_domaine = $new_domaine->seuil_domaine;
                                 $new_domaine->new_minima_domaine = $new_domaine->minima_domaine;
                                 $new_domaine_id = referentiel_add_domaine($new_domaine);
                                 if (isset($new_domaine_id) && $new_domaine_id > 0) {
                                     $new_domaine->id = $new_domaine_id;
                                 } else {
                                     $new_domaine->id = 0;
                                 }
                                 // enregistrer
                                 $dindex++;
                                 $re->domaines[$dindex] = $new_domaine;
                                 $cindex = 0;
                                 $re->domaines[$dindex]->competences = array();
                                 $numero_competence = 0;
                                 $ok_domaine_charge = true;
                             } else {
                                 $ok_domaine_charge = false;
                             }
                             break;
                         case '#code_competence':
                             // $competence_id;$code_competence;$description_competence;$ref_domaine;
                             // $num_competence;$nb_item_competences
                             $code_competence = addslashes($this->input_codage_caractere(trim($fields[0])));
                             $description_competence = addslashes($this->input_codage_caractere(trim($fields[1])));
                             $num_competence = trim($fields[2]);
                             $nb_item_competences = trim($fields[3]);
                             if (isset($fields[4])) {
                                 $type_competence = trim($fields[4]);
                             } else {
                                 $type_competence = 0;
                             }
                             if (isset($fields[5])) {
                                 $seuil_competence = trim($fields[5]);
                             } else {
                                 $seuil_competence = 0;
                             }
                             if (isset($fields[6])) {
                                 $minima_competence = trim($fields[6]);
                             } else {
                                 $minima_competence = 0;
                             }
                             if ($code_competence != "" && $ok_domaine_charge && $new_domaine_id > 0) {
                                 // Creer une competence
                                 $new_competence_id = 0;
                                 $numero_competence++;
                                 $new_competence = array();
                                 $new_competence = $this->defaultcompetence();
                                 $new_competence->id = 0;
                                 $new_competence->code_competence = $code_competence;
                                 if ($description_competence != "") {
                                     $new_competence->description_competence = $description_competence;
                                 }
                                 if ($num_competence != "") {
                                     $new_competence->num_competence = $num_competence;
                                 } else {
                                     $new_competence->num_competence = $numero_competence;
                                 }
                                 if ($nb_item_competences != "") {
                                     $new_competence->nb_item_competences = $nb_item_competences;
                                 } else {
                                     $new_competence->nb_item_competences = 0;
                                 }
                                 if ($type_competence != "") {
                                     $new_competence->type_competence = $type_competence;
                                 } else {
                                     $new_competence->type_competence = 0;
                                 }
                                 if ($seuil_competence != "") {
                                     $new_competence->seuil_competence = $seuil_competence;
                                 } else {
                                     $new_competence->seuil_competence = 0.0;
                                 }
                                 if ($minima_competence != "") {
                                     $new_competence->minima_competence = $minima_competence;
                                 } else {
                                     $new_competence->minima_competence = 0;
                                 }
                                 if (isset($new_domaine_id) && $new_domaine_id > 0) {
                                     $new_competence->ref_domaine = $new_domaine_id;
                                 } else {
                                     $new_competence->ref_domaine = 0;
                                 }
                                 // sauvegarder dans la base
                                 // remplacer l'id du referentiel importe par l'id du referentiel cree
                                 $new_competence->ref_domaine = $new_domaine_id;
                                 // trafiquer les donnees pour appeler la fonction ad hoc
                                 $new_competence->instance = $new_referentiel_id;
                                 // pour que ca marche
                                 $new_competence->new_code_competence = $new_competence->code_competence;
                                 $new_competence->new_description_competence = $new_competence->description_competence;
                                 $new_competence->new_ref_domaine = $new_domaine_id;
                                 $new_competence->new_num_competence = $new_competence->num_competence;
                                 $new_competence->new_nb_item_competences = $new_competence->nb_item_competences;
                                 $new_competence->new_type_competence = $new_competence->type_competence;
                                 $new_competence->new_seuil_competence = $new_competence->seuil_competence;
                                 $new_competence->new_minima_competence = $new_competence->minima_competence;
                                 // creation
                                 $new_competence_id = referentiel_add_competence($new_competence);
                                 $new_competence->id = $new_competence_id;
                                 // enregistrer
                                 $cindex++;
                                 $re->domaines[$dindex]->competences[$cindex] = $new_competence;
                                 $iindex = 0;
                                 // nouveaux items à suivre
                                 $re->domaines[$dindex]->competences[$cindex]->items = array();
                                 $numero_item = 0;
                                 $ok_competence_charge = true;
                             } else {
                                 $ok_competence_charge = false;
                             }
                             break;
                         case '#code_item':
                             // $code_item;$description_item;$type_item;$poids_item;$num_item;$empreinte_item
                             $code_item = $this->input_codage_caractere(addslashes(trim($fields[0])));
                             $description_item = $this->input_codage_caractere(addslashes(trim($fields[1])));
                             $type_item = $this->input_codage_caractere(addslashes(trim($fields[2])));
                             $poids_item = trim($fields[3]);
                             $num_item = trim($fields[4]);
                             if (isset($fields[5]) && trim($fields[5]) != "") {
                                 $empreinte_item = trim($fields[5]);
                             } else {
                                 $empreinte_item = "1";
                             }
                             if ($code_item != "" && $ok_competence_charge && $new_competence_id > 0) {
                                 // Creer un domaine
                                 $numero_item++;
                                 $new_item = array();
                                 $new_item = $this->defaultitem();
                                 $new_item->code_item = $code_item;
                                 if ($description_item != "") {
                                     $new_item->description_item = $description_item;
                                 }
                                 $new_item->ref_referentiel = $new_referentiel_id;
                                 $new_item->ref_competence = $new_competence_id;
                                 $new_item->type_item = $type_item;
                                 $new_item->poids_item = $poids_item;
                                 if ($num_item != "") {
                                     $new_item->num_item = $num_item;
                                 } else {
                                     $new_item->num_item = $numero_item;
                                 }
                                 $new_item->empreinte_item = $empreinte_item;
                                 // sauvegarder dans la base
                                 // remplacer l'id du referentiel importe par l'id du referentiel cree
                                 $new_item->ref_referentiel = $new_referentiel_id;
                                 $new_item->ref_competence = $new_competence_id;
                                 // trafiquer les donnees pour pouvoir appeler la fonction ad hoc
                                 $new_item->instance = $new_item->ref_referentiel;
                                 $new_item->new_ref_competence = $new_item->ref_competence;
                                 $new_item->new_code_item = $new_item->code_item;
                                 $new_item->new_description_item = $new_item->description_item;
                                 $new_item->new_num_item = $new_item->num_item;
                                 $new_item->new_type_item = $new_item->type_item;
                                 $new_item->new_poids_item = $new_item->poids_item;
                                 $new_item->new_empreinte_item = $new_item->empreinte_item;
                                 // creer
                                 $new_item_id = referentiel_add_item($new_item);
                                 $new_item->id = $new_item_id;
                                 $iindex++;
                                 $re->domaines[$dindex]->competences[$cindex]->items[$iindex] = $new_item;
                                 $ok_item_charge = true;
                             } else {
                                 $ok_item_charge = false;
                             }
                             break;
                         default:
                             $this->error("ERROR : CSV File incorrect line number:" . $line . "\n");
                             break;
                     }
                 }
             }
             // that's all folks
             $line++;
         }
         // end of while loop
         if ($mode == "add") {
             // rien de special ici ?
         }
         return $re;
     }
     return false;
 }