Subversion Repositories eFlore/Applications.cel

Rev

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

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