Subversion Repositories eFlore/Applications.cel

Rev

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

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