Subversion Repositories eFlore/Applications.cel

Rev

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

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