Subversion Repositories eFlore/Applications.cel

Rev

Rev 1746 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1746 Rev 1765
1
<?php
1
<?php
2
// In : utf8
2
// In : utf8
3
// Out : utf8
3
// Out : utf8
4
 
4
 
5
// TODO : doublons
5
// TODO : doublons
6
 
6
 
7
/**
7
/**
8
Octobre 2010 David Delon.
8
Octobre 2010 David Delon.
9
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
9
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
10
et liaison d'images déjà chargee aux observations ainsi crées.
10
et liaison d'images déjà chargee aux observations ainsi crées.
11
 
11
 
12
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
12
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
13
Aucune valeur dans les colonnes n'est obligatoire
13
Aucune valeur dans les colonnes n'est obligatoire
14
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
14
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
15
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
15
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
16
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
16
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
17
**/
17
**/
18
 
18
 
19
// Nom des colonnes
19
// Nom des colonnes
20
 
20
 
21
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
21
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
22
define('LIEUDIT','lieu-dit'); // Texte libre
22
define('LIEUDIT','lieu-dit'); // Texte libre
23
define('STATION','station'); // Texte libre
23
define('STATION','station'); // Texte libre
24
define('MILIEU','milieu'); // Texte libre
24
define('MILIEU','milieu'); // Texte libre
25
define('LATITUDE','latitude'); // En decimal systeme WGS84
25
define('LATITUDE','latitude'); // En decimal systeme WGS84
26
define('LONGITUDE','longitude'); // En decimal systeme WGS84 
26
define('LONGITUDE','longitude'); // En decimal systeme WGS84 
27
define('NOTES','notes'); // Texte libre
27
define('NOTES','notes'); // Texte libre
28
define('DATEOBS','date'); // date au format jj/mm/aaaa
28
define('DATEOBS','date'); // date au format jj/mm/aaaa
29
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
29
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
30
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
30
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
31
define('DEPARTEMENT','departement'); //  Texte libre
31
define('DEPARTEMENT','departement'); //  Texte libre
32
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
32
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
33
 
33
 
34
 
34
 
35
// Resultat de l'analyse d'une ligne
35
// Resultat de l'analyse d'une ligne
36
define('LIGNE_VIDE',1); //  
36
define('LIGNE_VIDE',1); //  
37
define('LIGNE_NORMALE',2); //  
37
define('LIGNE_NORMALE',2); //  
38
define('LIGNE_IMAGE_SEULEMENT',3); //  
38
define('LIGNE_IMAGE_SEULEMENT',3); //  
39
 
39
 
40
 
40
 
41
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
41
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
42
// la sortie est binaire (xls), mais OLE n'est pas compatible E_ALL en PHP-5.4
42
// la sortie est binaire (xls), mais OLE n'est pas compatible E_ALL en PHP-5.4
43
error_reporting(-1); //error_reporting() ^ E_STRICT);
43
error_reporting(-1); //error_reporting() ^ E_STRICT);
44
require_once("ExcelReader/excel_reader2.php");
44
require_once("ExcelReader/excel_reader2.php");
45
 
45
 
46
//TODO: refactoriser entièrement cette classe
46
//TODO: refactoriser entièrement cette classe
47
class InventoryImportExcel extends Cel  {
47
class InventoryImportExcel extends Cel  {
48
 
48
 
49
	// Element constituant une observation 
49
	// Element constituant une observation 
50
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
50
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
51
 
51
 
52
	// Dernier numero d'ordre utilise
52
	// Dernier numero d'ordre utilise
53
	var $dernier_ordre = 1;
53
	var $dernier_ordre = 1;
54
	
54
	
55
	var $cpt_images_liees = 0;
55
	var $cpt_images_liees = 0;
56
	
56
	
57
	var $utilisateur = array();
57
	var $utilisateur = array();
58
	
58
	
59
	var $chercheur_infos_taxon;
59
	var $chercheur_infos_taxon;
60
 
60
 
61
	/**
61
	/**
62
	 Constructeur
62
	 Constructeur
63
	**/
63
	**/
64
	function InventoryImportExcel($config) {
64
	function InventoryImportExcel($config) {
65
 
65
 
66
		parent::__construct($config);	
66
		parent::__construct($config);	
67
		$this->chercheur_infos_taxon = new RechercheInfosTaxonBeta($config);
67
		$this->chercheur_infos_taxon = new RechercheInfosTaxonBeta($config);
68
	}
68
	}
69
 
69
 
70
	/**
70
	/**
71
	 Sur post
71
	 Sur post
72
	**/
72
	**/
73
	function createElement($pairs) {
73
	function createElement($pairs) {
74
 
74
 
75
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
75
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
76
			echo '0'; exit;
76
			echo '0'; exit;
77
		}
77
		}
78
		
78
		
79
		if(!isset($_SESSION)) {session_start();}
79
		if(!isset($_SESSION)) {session_start();}
80
        $this->controleUtilisateur($pairs['utilisateur']);
80
        $this->controleUtilisateur($pairs['utilisateur']);
81
        
81
        
82
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($pairs['utilisateur']);
82
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($pairs['utilisateur']);
83
 
83
 
84
        foreach($_FILES as $file) { // C'est le plus simple
84
        foreach($_FILES as $file) { // C'est le plus simple
85
            $infos_fichier = $file ;
85
            $infos_fichier = $file ;
86
        }
86
        }
87
        
87
        
88
		// Chargement tableau en memoire
88
		// Chargement tableau en memoire
89
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], true); // false : pour menager la memoire.
89
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], true); // false : pour menager la memoire.
90
		$arr = array();
90
		$arr = array();
91
 
91
 
92
		$rowcount=$data->rowcount(0);
92
		$rowcount=$data->rowcount(0);
93
		$colcount=$data->colcount(0);
93
		$colcount=$data->colcount(0);
94
 
94
 
95
		if ($rowcount<=1) { // TODO : retour erreur
95
		if ($rowcount<=1) { // TODO : retour erreur
96
			print "Tableau vide";
96
			print "Tableau vide";
97
			exit;
97
			exit;
98
		}
98
		}
99
 
99
 
100
		// Chargement tableau 
100
		// Chargement tableau 
101
        for($row=1;$row<=$rowcount;$row++) 
101
        for($row=1;$row<=$rowcount;$row++) 
102
            for($col=1;$col<=$colcount;$col++) 
102
            for($col=1;$col<=$colcount;$col++) 
103
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
103
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
104
              
104
              
105
		// 1 : Traitement intitules
105
		// 1 : Traitement intitules
106
		$line = array();
106
		$line = array();
107
 
107
 
108
		/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */	
108
		/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */	
109
        for($col=1;$col<=$colcount;$col++) {
109
        for($col=1;$col<=$colcount;$col++) {
110
            $colonne=strtolower($arr[$col][1]);
110
            $colonne=strtolower($arr[$col][1]);
111
            $colonne=trim($colonne);
111
            $colonne=trim($colonne);
112
            $colonne=iconv('UTF-8', 'ASCII//TRANSLIT', $colonne);
112
            $colonne=iconv('UTF-8', 'ASCII//TRANSLIT', $colonne);
113
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
113
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
114
                case COMMUNE:
114
                case COMMUNE:
115
                case LIEUDIT:
115
                case LIEUDIT:
116
                case STATION:
116
                case STATION:
117
                case MILIEU:
117
                case MILIEU:
118
                case DEPARTEMENT:
118
                case DEPARTEMENT:
119
                case LATITUDE:
119
                case LATITUDE:
120
                case LONGITUDE:
120
                case LONGITUDE:
121
                case NOTES:
121
                case NOTES:
122
                case DATEOBS:
122
                case DATEOBS:
123
                case ESPECE:
123
                case ESPECE:
124
                case TRANSMETTRE:
124
                case TRANSMETTRE:
125
                case IMAGE:
125
                case IMAGE:
126
                    $selection=array_values($arr[$col]);
126
                    $selection=array_values($arr[$col]);
127
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
127
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
128
                    $line[$colonne]=$selection;
128
                    $line[$colonne]=$selection;
129
                    break;
129
                    break;
130
 
130
 
131
            }
131
            }
132
        }
132
        }
133
		// 1 : Traitement lignes
133
		// 1 : Traitement lignes
134
		$cpt_obs=0;
134
		$cpt_obs=0;
135
		$cpt_img=0;
135
		$cpt_img=0;
136
 
136
 
137
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
137
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
138
        $requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($pairs['utilisateur'])." ";
138
        $requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".Cel::db()->proteger($pairs['utilisateur'])." ";
139
		$resultat = $this->requeter($requete);
139
		$resultat = Cel::db()->requeter($requete);
140
 
140
 
141
        if(is_array($resultat) && count($resultat) > 0) {
141
        if(is_array($resultat) && count($resultat) > 0) {
142
            $this->dernier_ordre = $resultat[0]['ordre']; // 1  par defaut
142
            $this->dernier_ordre = $resultat[0]['ordre']; // 1  par defaut
143
        }
143
        }
144
 
144
 
145
		for ($i=0;$i<=$rowcount-1;$i++) {
145
		for ($i=0;$i<=$rowcount-1;$i++) {
146
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
146
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
147
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
147
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
148
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
148
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
149
					// image non rattachée à une observation
149
					// image non rattachée à une observation
150
				}
150
				}
151
				else {
151
				else {
152
					// ligne vide
152
					// ligne vide
153
				}
153
				}
154
				$i++;
154
				$i++;
155
			}
155
			}
156
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
156
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
157
				$id_obs = $this->traiterLigne($line,$i,$pairs['utilisateur']);
157
				$id_obs = $this->traiterLigne($line,$i,$pairs['utilisateur']);
158
				if ($this->dernier_ordre > 0) {
158
				if ($this->dernier_ordre > 0) {
159
					$cpt_obs++; // Compteur d'observations crees
159
					$cpt_obs++; // Compteur d'observations crees
160
				}
160
				}
161
				$i++;
161
				$i++;
162
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
162
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
163
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
163
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
164
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
164
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
165
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$id_obs); // images supplementaires
165
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$id_obs); // images supplementaires
166
					}
166
					}
167
					else {
167
					else {
168
						// print "vide";
168
						// print "vide";
169
					}
169
					}
170
					$i++;
170
					$i++;
171
				}	
171
				}	
172
			}
172
			}
173
		}
173
		}
174
		$message = '';
174
		$message = '';
175
		
175
		
176
		if($this->cpt_images_liees > 0) {
176
		if($this->cpt_images_liees > 0) {
177
			$message = $this->cpt_images_liees.' images liees pour ';
177
			$message = $this->cpt_images_liees.' images liees pour ';
178
		}
178
		}
179
		
179
		
180
		$message .= $cpt_obs;
180
		$message .= $cpt_obs;
181
		print $message;
181
		print $message;
182
	}
182
	}
183
 
183
 
184
	function analyserLigne($line,$i) {
184
	function analyserLigne($line,$i) {
185
		
185
		
186
		$ligne_vide=true;
186
		$ligne_vide=true;
187
		$ligne_image_seulement=true;
187
		$ligne_image_seulement=true;
188
		$ligne_normale=true;
188
		$ligne_normale=true;
189
		
189
		
190
		$ligne_identique_sauf_image = true;
190
		$ligne_identique_sauf_image = true;
191
		
191
		
192
		foreach ($this->format_observation as $colonne) {
192
		foreach ($this->format_observation as $colonne) {
193
			
193
			
194
			if($i < 1) {
194
			if($i < 1) {
195
				$ligne_identique_sauf_image = false;
195
				$ligne_identique_sauf_image = false;
196
			} else {
196
			} else {
197
				
197
				
198
				if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i]) 
198
				if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i]) 
199
					&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
199
					&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
200
					$ligne_identique_sauf_image = false;
200
					$ligne_identique_sauf_image = false;
201
				}
201
				}
202
			} 
202
			} 
203
			
203
			
204
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
204
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
205
				if ($colonne!=IMAGE) {
205
				if ($colonne!=IMAGE) {
206
					$ligne_image_seulement=false;
206
					$ligne_image_seulement=false;
207
					$ligne_vide=false;
207
					$ligne_vide=false;
208
				}		
208
				}		
209
				$ligne_vide=false;
209
				$ligne_vide=false;
210
			}		
210
			}		
211
		}
211
		}
212
		
212
		
213
		if ($ligne_vide) {
213
		if ($ligne_vide) {
214
			return LIGNE_VIDE;
214
			return LIGNE_VIDE;
215
		}
215
		}
216
		else {
216
		else {
217
			if ($ligne_image_seulement || $ligne_identique_sauf_image) {
217
			if ($ligne_image_seulement || $ligne_identique_sauf_image) {
218
				return LIGNE_IMAGE_SEULEMENT;
218
				return LIGNE_IMAGE_SEULEMENT;
219
			}
219
			}
220
			else {
220
			else {
221
				return LIGNE_NORMALE;
221
				return LIGNE_NORMALE;
222
			}
222
			}
223
		}
223
		}
224
	}
224
	}
225
 
225
 
226
	function traiterLigne($line,$i,$utilisateur) { 
226
	function traiterLigne($line,$i,$utilisateur) { 
227
		// Controle donnee et insertion
227
		// Controle donnee et insertion
228
		$info_image=array();
228
		$info_image=array();
229
		$info_transmettre = "0";
229
		$info_transmettre = "0";
230
		$info_espece = array(
230
		$info_espece = array(
231
			'nom_sel' => '',
231
			'nom_sel' => '',
232
			'nom_sel_nn' => '',
232
			'nom_sel_nn' => '',
233
			'nom_ret' => '',
233
			'nom_ret' => '',
234
			'nom_ret_nn' => '',
234
			'nom_ret_nn' => '',
235
			'nt' => '',
235
			'nt' => '',
236
			'famille' => ''
236
			'famille' => ''
237
		);
237
		);
238
		$info_commune = array('nom' => '', 'code' => '');
238
		$info_commune = array('nom' => '', 'code' => '');
239
		
239
		
240
		foreach ($this->format_observation as $colonne) {
240
		foreach ($this->format_observation as $colonne) {
241
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
241
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
242
				switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
242
				switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
243
					case COMMUNE:
243
					case COMMUNE:
244
						$info_commune = $this->traiterCommune($line[COMMUNE][$i]);
244
						$info_commune = $this->traiterCommune($line[COMMUNE][$i]);
245
						break;
245
						break;
246
					case LIEUDIT:
246
					case LIEUDIT:
247
						$info_lieudit = $this->traiterLieudit($line[LIEUDIT][$i]);
247
						$info_lieudit = $this->traiterLieudit($line[LIEUDIT][$i]);
248
						break;
248
						break;
249
					case STATION:
249
					case STATION:
250
						$info_station = $this->traiterStation($line[STATION][$i]);
250
						$info_station = $this->traiterStation($line[STATION][$i]);
251
						break;
251
						break;
252
					case MILIEU:
252
					case MILIEU:
253
						$info_milieu = $this->traiterMilieu($line[MILIEU][$i]);
253
						$info_milieu = $this->traiterMilieu($line[MILIEU][$i]);
254
						break;
254
						break;
255
	                case DEPARTEMENT:
255
	                case DEPARTEMENT:
256
	                	$dpt = $this->traiterDepartement($line[DEPARTEMENT][$i]);
256
	                	$dpt = $this->traiterDepartement($line[DEPARTEMENT][$i]);
257
	                	if(is_numeric($dpt) && strlen($dpt == 5) && $info_commune['code'] == 'NULL') {          		
257
	                	if(is_numeric($dpt) && strlen($dpt == 5) && $info_commune['code'] == 'NULL') {          		
258
	                		$info_commune['code'] = $dpt;
258
	                		$info_commune['code'] = $dpt;
259
	                	}
259
	                	}
260
						break;
260
						break;
261
					case LATITUDE:
261
					case LATITUDE:
262
						$info_latitude = $this->traiterLatitude($line[LATITUDE][$i]);
262
						$info_latitude = $this->traiterLatitude($line[LATITUDE][$i]);
263
						break;
263
						break;
264
					case LONGITUDE:
264
					case LONGITUDE:
265
						$info_longitude = $this->traiterLongitude($line[LONGITUDE][$i]);
265
						$info_longitude = $this->traiterLongitude($line[LONGITUDE][$i]);
266
						break;
266
						break;
267
					case NOTES:
267
					case NOTES:
268
						$info_notes = $this->traiterNotes($line[NOTES][$i]);
268
						$info_notes = $this->traiterNotes($line[NOTES][$i]);
269
						break;
269
						break;
270
					case DATEOBS:
270
					case DATEOBS:
271
						$info_dateobs = $this->traiterDateObs($line[DATEOBS][$i]);
271
						$info_dateobs = $this->traiterDateObs($line[DATEOBS][$i]);
272
						break;
272
						break;
273
					case TRANSMETTRE:
273
					case TRANSMETTRE:
274
						$info_transmettre = $this->traiterTransmettre($line[TRANSMETTRE][$i]);
274
						$info_transmettre = $this->traiterTransmettre($line[TRANSMETTRE][$i]);
275
					break;
275
					break;
276
					case ESPECE:
276
					case ESPECE:
277
						// suppression des accents éventuels
277
						// suppression des accents éventuels
278
						$line[ESPECE][$i] = iconv('UTF-8', 'ASCII//TRANSLIT', $line[ESPECE][$i]);
278
						$line[ESPECE][$i] = iconv('UTF-8', 'ASCII//TRANSLIT', $line[ESPECE][$i]);
279
						$resultat_recherche_espece = $this->chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax(utf8_encode(trim($line[ESPECE][$i])));
279
						$resultat_recherche_espece = $this->chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax(utf8_encode(trim($line[ESPECE][$i])));
280
	                    if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom'] != '') {
280
	                    if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom'] != '') {
281
	                    	$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
281
	                    	$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
282
	                    	$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
282
	                    	$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
283
	                        $complement = $this->chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
283
	                        $complement = $this->chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
284
	                        $info_espece['nom_ret'] = $complement['Nom_Retenu'];
284
	                        $info_espece['nom_ret'] = $complement['Nom_Retenu'];
285
	                        $info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
285
	                        $info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
286
	                        $info_espece['nt'] = $complement['Num_Taxon'];
286
	                        $info_espece['nt'] = $complement['Num_Taxon'];
287
	                        $info_espece['famille'] = $complement['Famille'];
287
	                        $info_espece['famille'] = $complement['Famille'];
288
	                    } else {
288
	                    } else {
289
	                    	$info_espece['nom_sel'] = $line[ESPECE][$i];
289
	                    	$info_espece['nom_sel'] = $line[ESPECE][$i];
290
	                    }
290
	                    }
291
					case IMAGE:
291
					case IMAGE:
292
						if(isset($line[IMAGE])) {
292
						if(isset($line[IMAGE])) {
293
							$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
293
							$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
294
						}
294
						}
295
					break;
295
					break;
296
				}
296
				}
297
			}
297
			}
298
			else {	
298
			else {	
299
			 	switch($colonne) {
299
			 	switch($colonne) {
300
					case COMMUNE:
300
					case COMMUNE:
301
						$info_commune['nom']="";
301
						$info_commune['nom']="";
302
						break;
302
						break;
303
					case LIEUDIT:
303
					case LIEUDIT:
304
						$info_lieudit="";
304
						$info_lieudit="";
305
						break;
305
						break;
306
					case STATION:
306
					case STATION:
307
						$info_station="";
307
						$info_station="";
308
						break;
308
						break;
309
					case MILIEU:
309
					case MILIEU:
310
						$info_milieu="";
310
						$info_milieu="";
311
						break;
311
						break;
312
					case DEPARTEMENT:
312
					case DEPARTEMENT:
313
			            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
313
			            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
314
						    $info_commune['code']="";
314
						    $info_commune['code']="";
315
	                    }
315
	                    }
316
						break;
316
						break;
317
					case LATITUDE:
317
					case LATITUDE:
318
						$info_latitude = "";
318
						$info_latitude = "";
319
						break;
319
						break;
320
					case LONGITUDE:
320
					case LONGITUDE:
321
						$info_longitude = "";
321
						$info_longitude = "";
322
						break;
322
						break;
323
					case NOTES:
323
					case NOTES:
324
						$info_notes='';
324
						$info_notes='';
325
						break;
325
						break;
326
					case TRANSMETTRE:
326
					case TRANSMETTRE:
327
						$info_transmettre = "0";
327
						$info_transmettre = "0";
328
					break;
328
					break;
329
				}
329
				}
330
			}
330
			}
331
		}
331
		}
332
	
332
	
333
        $this->dernier_ordre++;
333
        $this->dernier_ordre++;
334
        list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
334
        list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
335
        $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
335
        $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
336
        $requete  = "INSERT INTO cel_obs (".
336
        $requete  = "INSERT INTO cel_obs (".
337
	        "ce_utilisateur,prenom_utilisateur,nom_utilisateur,courriel_utilisateur,".
337
	        "ce_utilisateur,prenom_utilisateur,nom_utilisateur,courriel_utilisateur,".
338
	        "ordre,".
338
	        "ordre,".
339
	        "nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
339
	        "nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
340
	        "zone_geo,ce_zone_geo,".
340
	        "zone_geo,ce_zone_geo,".
341
	        "date_observation,".
341
	        "date_observation,".
342
	        "lieudit,station, milieu, commentaire, transmission, ".
342
	        "lieudit,station, milieu, commentaire, transmission, ".
343
	        "date_creation,date_modification,latitude,longitude) ".
343
	        "date_creation,date_modification,latitude,longitude) ".
344
	        " VALUES(".$this->proteger($utilisateur).",".
344
	        " VALUES(".Cel::db()->proteger($utilisateur).",".
345
	        $this->proteger($this->utilisateur['prenom']).",".
345
	        Cel::db()->proteger($this->utilisateur['prenom']).",".
346
	        $this->proteger($this->utilisateur['nom']).",".
346
	        Cel::db()->proteger($this->utilisateur['nom']).",".
347
	        $this->proteger($this->utilisateur['courriel']).",".
347
	        Cel::db()->proteger($this->utilisateur['courriel']).",".
348
	        $this->proteger($this->dernier_ordre).",".
348
	        Cel::db()->proteger($this->dernier_ordre).",".
349
	        $this->proteger($info_espece['nom_sel']).",".
349
	        Cel::db()->proteger($info_espece['nom_sel']).",".
350
	        $this->proteger($info_espece['nom_sel_nn']).",".
350
	        Cel::db()->proteger($info_espece['nom_sel_nn']).",".
351
	        $this->proteger($info_espece['nom_ret']).",".
351
	        Cel::db()->proteger($info_espece['nom_ret']).",".
352
	        $this->proteger($info_espece['nom_ret_nn']).",".
352
	        Cel::db()->proteger($info_espece['nom_ret_nn']).",".
353
	        $this->proteger($info_espece['nt']).",".
353
	        Cel::db()->proteger($info_espece['nt']).",".
354
	        $this->proteger($info_espece['famille']).",".
354
	        Cel::db()->proteger($info_espece['famille']).",".
355
	        $this->proteger($info_commune['nom']).",".
355
	        Cel::db()->proteger($info_commune['nom']).",".
356
	        $this->proteger('INSEE-C:'.$info_commune['code']).",".
356
	        Cel::db()->proteger('INSEE-C:'.$info_commune['code']).",".
357
	        $this->proteger($info_dateobs).",".
357
	        Cel::db()->proteger($info_dateobs).",".
358
	        $this->proteger($info_lieudit).",".
358
	        Cel::db()->proteger($info_lieudit).",".
359
	        $this->proteger($info_station).",".
359
	        Cel::db()->proteger($info_station).",".
360
	        $this->proteger($info_milieu).",".
360
	        Cel::db()->proteger($info_milieu).",".
361
	        $this->proteger($info_notes).",".
361
	        Cel::db()->proteger($info_notes).",".
362
	        $this->proteger($info_transmettre).",".
362
	        Cel::db()->proteger($info_transmettre).",".
363
	        "now() , now(),".
363
	        "now() , now(),".
364
	        $this->proteger($info_latitude).",".
364
	        Cel::db()->proteger($info_latitude).",".
365
	        $this->proteger($info_longitude).")";
365
	        Cel::db()->proteger($info_longitude).")";
366
	
366
	
367
		$insertion = $this->executer($requete);
367
		$insertion = Cel::db()->executer($requete);
368
		
368
		
369
		$requete_id_obs = 'SELECT id_observation FROM cel_obs WHERE ordre = '.$this->proteger($this->dernier_ordre).' AND ce_utilisateur = '.$this->proteger($utilisateur);
369
		$requete_id_obs = 'SELECT id_observation FROM cel_obs WHERE ordre = '.Cel::db()->proteger($this->dernier_ordre).' AND ce_utilisateur = '.Cel::db()->proteger($utilisateur);
370
		$resultat_id_obs = $this->requeter($requete_id_obs);
370
		$resultat_id_obs = Cel::db()->requeter($requete_id_obs);
371
			
371
			
372
		$id_obs = $resultat_id_obs[0]['id_observation'];
372
		$id_obs = $resultat_id_obs[0]['id_observation'];
373
		
373
		
374
		// creation lien image
374
		// creation lien image
375
		foreach ($info_image as $pic) {
375
		foreach ($info_image as $pic) {
376
				
376
				
377
			$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_observation ) VALUES ('.$this->proteger($pic['id_image']).', '.$id_obs.') ON DUPLICATE KEY UPDATE id_image = id_image ';	
377
			$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_observation ) VALUES ('.Cel::db()->proteger($pic['id_image']).', '.$id_obs.') ON DUPLICATE KEY UPDATE id_image = id_image ';	
378
			$liaison = $this->executer($requete_liaison);
378
			$liaison = Cel::db()->executer($requete_liaison);
379
            if ($liaison !== false) {
379
            if ($liaison !== false) {
380
            	$this->cpt_images_liees++;
380
            	$this->cpt_images_liees++;
381
            } else {
381
            } else {
382
            	return false;    	
382
            	return false;    	
383
            }
383
            }
384
		}
384
		}
385
	
385
	
386
		return $id_obs;
386
		return $id_obs;
387
	}
387
	}
388
 
388
 
389
	function traiterLigneComplement($line,$i,$utilisateur, $id_obs = null) {
389
	function traiterLigneComplement($line,$i,$utilisateur, $id_obs = null) {
390
		if(isset($line[IMAGE])) {
390
		if(isset($line[IMAGE])) {
391
			$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur	
391
			$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur	
392
			// creation lien image
392
			// creation lien image
393
			foreach ($info_image as $pic) {	
393
			foreach ($info_image as $pic) {	
394
				$requete = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES ('.$this->proteger($pic['id_image']).', '.$this->proteger($id_obs).') ON DUPLICATE KEY UPDATE id_image = id_image' ;	
394
				$requete = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES ('.Cel::db()->proteger($pic['id_image']).', '.Cel::db()->proteger($id_obs).') ON DUPLICATE KEY UPDATE id_image = id_image' ;	
395
				$resultat_liaison = $this->executer($requete);
395
				$resultat_liaison = Cel::db()->executer($requete);
396
		    	if ($resultat_liaison !== false) {
396
		    	if ($resultat_liaison !== false) {
397
		    		$this->cpt_images_liees++;
397
		    		$this->cpt_images_liees++;
398
		    	} else {
398
		    	} else {
399
		    		return false;
399
		    		return false;
400
		    	}
400
		    	}
401
			}
401
			}
402
		}
402
		}
403
	}
403
	}
404
	
404
	
405
	function traiterCommune($identifiant_commune) {  
405
	function traiterCommune($identifiant_commune) {  
406
		// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
406
		// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
407
	    $identifiant_commune=trim($identifiant_commune);
407
	    $identifiant_commune=trim($identifiant_commune);
408
	
408
	
409
		preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
409
		preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
410
	
410
	
411
		if (isset($elements[1])) { // commune + departement : montpellier (34)
411
		if (isset($elements[1])) { // commune + departement : montpellier (34)
412
			$nom_commune=$elements[1];
412
			$nom_commune=$elements[1];
413
			$code_commune=$elements[2];
413
			$code_commune=$elements[2];
414
	 	    $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
414
	 	    $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom = ".Cel::db()->proteger($nom_commune)." AND code LIKE ".Cel::db()->proteger($code_commune.'%');
415
		}
415
		}
416
		else { // Code insee seul 
416
		else { // Code insee seul 
417
	        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
417
	        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
418
	        if (isset($elements[1])) { // code insee  commune
418
	        if (isset($elements[1])) { // code insee  commune
419
	            $code_insee_commune=$elements[1];
419
	            $code_insee_commune=$elements[1];
420
	            $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
420
	            $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE code = ".Cel::db()->proteger($code_insee_commune);
421
	        }	
421
	        }	
422
	        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
422
	        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
423
	               // Commune
423
	               // Commune
424
	            preg_match('/(.*)/',$identifiant_commune,$elements);
424
	            preg_match('/(.*)/',$identifiant_commune,$elements);
425
	            if (isset($elements[1])) { // commune 
425
	            if (isset($elements[1])) { // commune 
426
	                $nom_commune=$elements[1];
426
	                $nom_commune=$elements[1];
427
	                $nom_commune=trim($nom_commune);
427
	                $nom_commune=trim($nom_commune);
428
	                $nom_commune=iconv('UTF-8', 'ASCII//TRANSLIT', $nom_commune);
428
	                $nom_commune=iconv('UTF-8', 'ASCII//TRANSLIT', $nom_commune);
429
	                $nom_commune=preg_replace("/ /","%",$nom_commune);
429
	                $nom_commune=preg_replace("/ /","%",$nom_commune);
430
	                $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
430
	                $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom like ".Cel::db()->proteger($nom_commune.'%');
431
	            }
431
	            }
432
	        }
432
	        }
433
		}
433
		}
434
	
434
	
435
		$resultat_commune = $this->requeter($requete);
435
		$resultat_commune = Cel::db()->requeter($requete);
436
		
436
		
437
		// cas de la commune introuvable dans le référentiel
437
		// cas de la commune introuvable dans le référentiel
438
		if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
438
		if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
439
			$resultat_commune['nom'] = $identifiant_commune;
439
			$resultat_commune['nom'] = $identifiant_commune;
440
			$resultat_commune['code'] = 'NULL';
440
			$resultat_commune['code'] = 'NULL';
441
		} else {
441
		} else {
442
			$resultat_commune = $resultat_commune[0];
442
			$resultat_commune = $resultat_commune[0];
443
		}
443
		}
444
			
444
			
445
		return $resultat_commune;
445
		return $resultat_commune;
446
	}
446
	}
447
 
447
 
448
	function traiterLieudit($lieudit) { 
448
	function traiterLieudit($lieudit) { 
449
		// texte libre
449
		// texte libre
450
		return trim($lieudit);
450
		return trim($lieudit);
451
	}
451
	}
452
 
452
 
453
	function traiterStation($station) { 
453
	function traiterStation($station) { 
454
		// texte libre
454
		// texte libre
455
		return trim($station);
455
		return trim($station);
456
	}
456
	}
457
 
457
 
458
	function traiterMilieu($milieu) { 
458
	function traiterMilieu($milieu) { 
459
		// texte libre
459
		// texte libre
460
		return trim($milieu);
460
		return trim($milieu);
461
	}
461
	}
462
 
462
 
463
	function traiterDepartement($departement) { 
463
	function traiterDepartement($departement) { 
464
		// texte libre
464
		// texte libre
465
		if(is_numeric($departement) && strlen($departement) == 4) {
465
		if(is_numeric($departement) && strlen($departement) == 4) {
466
			$departement = "0"+$departement;
466
			$departement = "0"+$departement;
467
		}
467
		}
468
	
468
	
469
		if(is_numeric($departement) && $departement <= 9) {
469
		if(is_numeric($departement) && $departement <= 9) {
470
			$departement = "0"+$departement;
470
			$departement = "0"+$departement;
471
		}
471
		}
472
		
472
		
473
		return trim($departement);
473
		return trim($departement);
474
	}
474
	}
475
 
475
 
476
	function traiterLatitude($latitude) {	
476
	function traiterLatitude($latitude) {	
477
		//  verifier formal decimal + limite france ? TODO 
477
		//  verifier formal decimal + limite france ? TODO 
478
		return trim($latitude);
478
		return trim($latitude);
479
	}
479
	}
480
	
480
	
481
	function traiterLongitude($longitude) { 
481
	function traiterLongitude($longitude) { 
482
		// verifier format decimal + limite france ? TODO 
482
		// verifier format decimal + limite france ? TODO 
483
		return trim($longitude);
483
		return trim($longitude);
484
	}
484
	}
485
	
485
	
486
	function traiterNotes($notes) { 
486
	function traiterNotes($notes) { 
487
		// texte libre
487
		// texte libre
488
		return trim($notes);
488
		return trim($notes);
489
	}
489
	}
490
	
490
	
491
	function traiterDateObs($dateobs) { 
491
	function traiterDateObs($dateobs) { 
492
		// verifier jj/mm/aaaa sinon date vide TODO 
492
		// verifier jj/mm/aaaa sinon date vide TODO 
493
		$date = trim($dateobs);
493
		$date = trim($dateobs);
494
		if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
494
		if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
495
			$date = '00/00/0000';
495
			$date = '00/00/0000';
496
		}
496
		}
497
		return $date;
497
		return $date;
498
	}
498
	}
499
 
499
 
500
	function traiterTransmettre($transmettre) {		
500
	function traiterTransmettre($transmettre) {		
501
		$transmission = '0';		
501
		$transmission = '0';		
502
		if (trim($transmettre) == "1" || trim($transmettre) == "oui") {	
502
		if (trim($transmettre) == "1" || trim($transmettre) == "oui") {	
503
			$transmission = '1';
503
			$transmission = '1';
504
		}			
504
		}			
505
		return $transmission;
505
		return $transmission;
506
	}
506
	}
507
	
507
	
508
	function traiterImage($images,$utilisateur) { // recherche id image de ce nom 	
508
	function traiterImage($images,$utilisateur) { // recherche id image de ce nom 	
509
		$liste_images = explode("/",$images) ;
509
		$liste_images = explode("/",$images) ;
510
		$row =array();
510
		$row =array();
511
	   	foreach($liste_images as $image) {
511
	   	foreach($liste_images as $image) {
512
			$image = iconv('UTF-8', 'ASCII//TRANSLIT', $image);
512
			$image = iconv('UTF-8', 'ASCII//TRANSLIT', $image);
513
			$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
513
			$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".Cel::db()->proteger($utilisateur)." AND nom_original= ".Cel::db()->proteger($image);
514
			$ligne = $this->requeter($requete);
514
			$ligne = Cel::db()->requeter($requete);
515
		    if(is_array($ligne) && !empty($ligne)) {
515
		    if(is_array($ligne) && !empty($ligne)) {
516
		    	$row[] = $ligne[0];
516
		    	$row[] = $ligne[0];
517
		    }
517
		    }
518
		}
518
		}
519
		return $row;
519
		return $row;
520
	}
520
	}
521
}
521
}
522
 
522
 
523
function init_byte_map(){
523
function init_byte_map(){
524
    $byte_map = array();
524
    $byte_map = array();
525
    for($x=128;$x<256;++$x){
525
    for($x=128;$x<256;++$x){
526
        $byte_map[chr($x)]=utf8_encode(chr($x));
526
        $byte_map[chr($x)]=utf8_encode(chr($x));
527
    }
527
    }
528
    $cp1252_map=array(
528
    $cp1252_map=array(
529
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
529
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
530
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
530
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
531
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
531
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
532
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
532
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
533
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
533
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
534
            "\x86" => "\xE2\x80\xA0",  // DAGGER
534
            "\x86" => "\xE2\x80\xA0",  // DAGGER
535
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
535
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
536
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
536
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
537
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
537
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
538
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
538
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
539
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
539
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
540
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
540
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
541
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
541
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
542
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
542
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
543
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
543
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
544
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
544
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
545
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
545
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
546
            "\x95" => "\xE2\x80\xA2",  // BULLET
546
            "\x95" => "\xE2\x80\xA2",  // BULLET
547
            "\x96" => "\xE2\x80\x93",  // EN DASH
547
            "\x96" => "\xE2\x80\x93",  // EN DASH
548
            "\x97" => "\xE2\x80\x94",  // EM DASH
548
            "\x97" => "\xE2\x80\x94",  // EM DASH
549
            "\x98" => "\xCB\x9C",      // SMALL TILDE
549
            "\x98" => "\xCB\x9C",      // SMALL TILDE
550
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
550
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
551
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
551
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
552
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
552
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
553
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
553
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
554
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
554
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
555
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
555
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
556
                );
556
                );
557
    foreach($cp1252_map as $k=>$v){
557
    foreach($cp1252_map as $k=>$v){
558
        $byte_map[$k]=$v;
558
        $byte_map[$k]=$v;
559
    }
559
    }
560
    
560
    
561
    return $byte_map;
561
    return $byte_map;
562
}
562
}
563
 
563
 
564
function fix_latin($instr){
564
function fix_latin($instr){
565
    
565
    
566
    $byte_map = init_byte_map();
566
    $byte_map = init_byte_map();
567
    
567
    
568
    $ascii_char='[\x00-\x7F]';
568
    $ascii_char='[\x00-\x7F]';
569
    $cont_byte='[\x80-\xBF]';
569
    $cont_byte='[\x80-\xBF]';
570
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
570
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
571
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
571
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
572
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
572
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
573
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
573
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
574
    
574
    
575
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
575
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
576
 
576
 
577
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
577
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
578
    $outstr='';
578
    $outstr='';
579
    $char='';
579
    $char='';
580
    $rest='';
580
    $rest='';
581
    while((strlen($instr))>0){
581
    while((strlen($instr))>0){
582
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
583
            $char=$match[1];
583
            $char=$match[1];
584
            $rest=$match[2];
584
            $rest=$match[2];
585
            $outstr.=$char;
585
            $outstr.=$char;
586
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
586
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
587
            $char=$match[1];
587
            $char=$match[1];
588
            $rest=$match[2];
588
            $rest=$match[2];
589
            $outstr.=$byte_map[$char];
589
            $outstr.=$byte_map[$char];
590
        }
590
        }
591
        $instr=$rest;
591
        $instr=$rest;
592
    }
592
    }
593
    return $outstr;
593
    return $outstr;
594
}
594
}
595
 
595
 
596
function remove_accent($str) {
596
function remove_accent($str) {
597
  return supprimerAccents($str);
597
  return supprimerAccents($str);
598
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
598
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
599
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
599
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
600
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
600
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
601
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
601
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
602
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
602
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
603
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
603
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
604
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
604
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
605
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
605
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
606
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
606
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
607
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
607
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
608
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
608
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
609
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
609
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
610
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
610
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
611
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
611
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
612
             
612
             
613
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
613
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
614
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
614
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
615
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
615
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
616
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
616
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
617
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
617
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
618
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
618
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
619
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
619
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
620
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
620
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
621
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
621
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
622
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
622
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
623
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
623
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
624
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
624
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
625
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
625
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
626
  return str_replace($a, $b, $str);
626
  return str_replace($a, $b, $str);
627
}
627
}
628
 
628
 
629
//TODO: déplacer les fonctions ci dessus et dessous dans une classe
629
//TODO: déplacer les fonctions ci dessus et dessous dans une classe
630
// utilitaire
630
// utilitaire
631
function supprimerAccents($str, $charset = 'UTF-8')
631
function supprimerAccents($str, $charset = 'UTF-8')
632
{
632
{
633
	$str = htmlentities($str, ENT_NOQUOTES, $charset);
633
	$str = htmlentities($str, ENT_NOQUOTES, $charset);
634
	$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
634
	$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
635
	$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
635
	$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
636
	$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
636
	$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
637
 
637
 
638
	return $str;
638
	return $str;
639
}
639
}
640
 
640
 
641
function cp1252_to_utf8($str) {
641
function cp1252_to_utf8($str) {
642
	$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
642
	$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
643
		"\xc2\x82" => "\xe2\x80\x9a",
643
		"\xc2\x82" => "\xe2\x80\x9a",
644
		"\xc2\x83" => "\xc6\x92",    
644
		"\xc2\x83" => "\xc6\x92",    
645
		"\xc2\x84" => "\xe2\x80\x9e",
645
		"\xc2\x84" => "\xe2\x80\x9e",
646
		"\xc2\x85" => "\xe2\x80\xa6",
646
		"\xc2\x85" => "\xe2\x80\xa6",
647
		"\xc2\x86" => "\xe2\x80\xa0",
647
		"\xc2\x86" => "\xe2\x80\xa0",
648
		"\xc2\x87" => "\xe2\x80\xa1",
648
		"\xc2\x87" => "\xe2\x80\xa1",
649
		"\xc2\x88" => "\xcb\x86",
649
		"\xc2\x88" => "\xcb\x86",
650
		"\xc2\x89" => "\xe2\x80\xb0",
650
		"\xc2\x89" => "\xe2\x80\xb0",
651
		"\xc2\x8a" => "\xc5\xa0",
651
		"\xc2\x8a" => "\xc5\xa0",
652
		"\xc2\x8b" => "\xe2\x80\xb9",
652
		"\xc2\x8b" => "\xe2\x80\xb9",
653
		"\xc2\x8c" => "\xc5\x92",
653
		"\xc2\x8c" => "\xc5\x92",
654
		"\xc2\x8e" => "\xc5\xbd",
654
		"\xc2\x8e" => "\xc5\xbd",
655
		"\xc2\x91" => "\xe2\x80\x98",
655
		"\xc2\x91" => "\xe2\x80\x98",
656
		"\xc2\x92" => "\xe2\x80\x99",
656
		"\xc2\x92" => "\xe2\x80\x99",
657
		"\xc2\x93" => "\xe2\x80\x9c",
657
		"\xc2\x93" => "\xe2\x80\x9c",
658
		"\xc2\x94" => "\xe2\x80\x9d",
658
		"\xc2\x94" => "\xe2\x80\x9d",
659
		"\xc2\x95" => "\xe2\x80\xa2",
659
		"\xc2\x95" => "\xe2\x80\xa2",
660
		"\xc2\x96" => "\xe2\x80\x93",
660
		"\xc2\x96" => "\xe2\x80\x93",
661
		"\xc2\x97" => "\xe2\x80\x94",
661
		"\xc2\x97" => "\xe2\x80\x94",
662
		
662
		
663
		"\xc2\x98" => "\xcb\x9c",
663
		"\xc2\x98" => "\xcb\x9c",
664
		"\xc2\x99" => "\xe2\x84\xa2",
664
		"\xc2\x99" => "\xe2\x84\xa2",
665
		"\xc2\x9a" => "\xc5\xa1",
665
		"\xc2\x9a" => "\xc5\xa1",
666
		"\xc2\x9b" => "\xe2\x80\xba",
666
		"\xc2\x9b" => "\xe2\x80\xba",
667
		"\xc2\x9c" => "\xc5\x93",
667
		"\xc2\x9c" => "\xc5\x93",
668
		"\xc2\x9e" => "\xc5\xbe",
668
		"\xc2\x9e" => "\xc5\xbe",
669
		"\xc2\x9f" => "\xc5\xb8"
669
		"\xc2\x9f" => "\xc5\xb8"
670
	);
670
	);
671
	return strtr(utf8_encode($str), $cp1252_map);
671
	return strtr(utf8_encode($str), $cp1252_map);
672
}
672
}
673
?>
673
?>