Subversion Repositories eFlore/Applications.cel

Rev

Rev 1079 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
 
3
// In : utf8
4
// Out : utf8
5
 
480 david 6
/*
417 aurelien 7
 
480 david 8
Octobre 2010 David Delon.
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.
417 aurelien 11
 
480 david 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
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.
16
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
445 david 17
 
480 david 18
*/
445 david 19
 
480 david 20
 
21
// Nom des colonnes
22
 
445 david 23
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
24
define('LIEUDIT','lieu-dit'); // Texte libre
25
define('STATION','station'); // Texte libre
26
define('MILIEU','milieu'); // Texte libre
27
define('LATITUDE','latitude'); // En decimal systeme WGS84
28
define('LONGITUDE','longitude'); // En decimal systeme WGS84
29
define('NOTES','notes'); // Texte libre
30
define('DATEOBS','date'); // date au format jj/mm/aaaa
31
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
32
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
540 david 33
define('DEPARTEMENT','departement'); //  Texte libre
760 aurelien 34
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
445 david 35
 
540 david 36
 
480 david 37
// Resultat de l'analyse d'une ligne
445 david 38
define('LIGNE_VIDE',1); //
39
define('LIGNE_NORMALE',2); //
40
define('LIGNE_IMAGE_SEULEMENT',3); //
41
 
540 david 42
// Parser de Nom
43
include('NameParser.php');
445 david 44
 
417 aurelien 45
Class InventoryImportExcel extends DBAccessor  {
46
 
445 david 47
// Element constituant une observation
417 aurelien 48
 
760 aurelien 49
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
480 david 50
 
51
// Fichier configuration
417 aurelien 52
	var $config;
480 david 53
 
54
// Encapsulation classe lecture fichier excel
417 aurelien 55
	var $extendExcelReader;
56
 
540 david 57
// Dernier numero d'ordre utilise
58
	var $dernier_ordre=1;
760 aurelien 59
 
60
	var $cpt_images_liees=0;
540 david 61
 
480 david 62
/**
63
 Constructeur
64
**/
417 aurelien 65
	function InventoryImportExcel($config) {
66
 
67
		$this->config=$config;
68
		// Pas d'heritage multiple en php :(
69
 
70
		$this->extendExcelReader = new ExcelReader();
71
		$this->extendExcelReader->initExcelReader();
72
	}
73
 
480 david 74
/**
75
 Sur post
76
**/
445 david 77
	function createElement($pairs) {
417 aurelien 78
 
79
 
1079 aurelien 80
		$pairs['utilisateur']= $_POST['identifiant'];
81
		if(!isset($_SESSION)) {session_start();}
540 david 82
        $this->controleUtilisateur($pairs['utilisateur']);
480 david 83
 
540 david 84
        foreach($_FILES as $file) { // C'est le plus simple
85
            $infos_fichier = $file ;
86
        }
417 aurelien 87
 
1079 aurelien 88
		// Chargement tableau en memoire
445 david 89
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
480 david 90
		$arr = array();
445 david 91
 
92
		$rowcount=$data->rowcount(0);
93
		$colcount=$data->colcount(0);
94
 
95
		if ($rowcount<=1) { // TODO : retour erreur
96
			print "Tableau vide";
97
			exit;
98
		}
99
 
1079 aurelien 100
		// Chargement tableau
540 david 101
        for($row=1;$row<=$rowcount;$row++)
102
            for($col=1;$col<=$colcount;$col++)
103
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
760 aurelien 104
 
1079 aurelien 105
		// 1 : Traitement intitules
445 david 106
		$line = array();
417 aurelien 107
 
1079 aurelien 108
		/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
540 david 109
        for($col=1;$col<=$colcount;$col++) {
110
            $colonne=strtolower($arr[$col][1]);
111
            $colonne=trim($colonne);
112
            $colonne=cp1252_to_utf8($colonne);
113
            $colonne=remove_accent($colonne);
114
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
115
                case COMMUNE:
116
                case LIEUDIT:
117
                case STATION:
118
                case MILIEU:
119
                case DEPARTEMENT:
120
                case LATITUDE:
121
                case LONGITUDE:
122
                case NOTES:
123
                case DATEOBS:
124
                case ESPECE:
760 aurelien 125
                case TRANSMETTRE:
540 david 126
                case IMAGE:
127
                    $selection=array_values($arr[$col]);
128
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
129
                    $line[$colonne]=$selection;
130
                    break;
445 david 131
 
540 david 132
            }
1079 aurelien 133
        }
134
		// 1 : Traitement lignes
483 david 135
		$cpt_obs=0;
760 aurelien 136
		$cpt_img=0;
540 david 137
 
138
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
139
        $DB=$this->connectDB($this->config,'database_cel');
140
        $query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' ";
141
 
142
        $res =& $DB->query($query);
143
        if (DB::isError($res)) {
144
            die($res->getMessage());
145
        }
146
 
147
        while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
148
            $this->dernier_ordre=$row['ordre']; // 1  par defaut
149
        }
150
 
480 david 151
		for ($i=0;$i<=$rowcount-1;$i++) {
540 david 152
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
480 david 153
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
154
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
1079 aurelien 155
					// print "image non rattachee a une observation";
480 david 156
				}
157
				else {
1079 aurelien 158
					// print "vide";
480 david 159
				}
445 david 160
				$i++;
161
			}
480 david 162
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
540 david 163
				$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
483 david 164
				if ($ordre>0) {
165
					$cpt_obs++; // Compteur d'observations crees
166
				}
445 david 167
				$i++;
480 david 168
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
169
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
445 david 170
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
480 david 171
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
445 david 172
					}
173
					else {
1079 aurelien 174
						// print "vide";
445 david 175
					}
176
					$i++;
177
				}
178
			}
179
		}
760 aurelien 180
		$message = '';
181
 
182
		if($this->cpt_images_liees > 0) {
183
			$message = $this->cpt_images_liees.' images liees pour ';
184
		}
185
 
186
		$message .= $cpt_obs;
187
		print $message;
445 david 188
 
417 aurelien 189
	}
190
 
445 david 191
function analyserLigne($line,$i) {
760 aurelien 192
 
445 david 193
	$ligne_vide=true;
194
	$ligne_image_seulement=true;
195
	$ligne_normale=true;
760 aurelien 196
 
197
	$ligne_identique_sauf_image = true;
198
 
445 david 199
	foreach ($this->format_observation as $colonne) {
760 aurelien 200
 
201
		if($i < 1) {
202
			$ligne_identique_sauf_image = false;
203
		} else {
204
 
1079 aurelien 205
			if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i])
206
				&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
760 aurelien 207
				$ligne_identique_sauf_image = false;
208
			}
209
		}
210
 
445 david 211
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
212
			if ($colonne!=IMAGE) {
213
				$ligne_image_seulement=false;
214
				$ligne_vide=false;
215
			}
216
			$ligne_vide=false;
760 aurelien 217
		}
445 david 218
	}
760 aurelien 219
 
445 david 220
	if ($ligne_vide) {
221
		return LIGNE_VIDE;
222
	}
223
	else {
760 aurelien 224
		if ($ligne_image_seulement || $ligne_identique_sauf_image) {
445 david 225
			return LIGNE_IMAGE_SEULEMENT;
226
		}
227
		else {
228
			return LIGNE_NORMALE;
229
		}
230
	}
231
 
417 aurelien 232
 
445 david 233
}
417 aurelien 234
 
540 david 235
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
760 aurelien 236
 
480 david 237
	$info_image=array();
760 aurelien 238
	$info_transmettre = "0";
239
 
445 david 240
	foreach ($this->format_observation as $colonne) {
241
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
242
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
243
				case COMMUNE:
244
					$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
245
					break;
246
				case LIEUDIT:
480 david 247
					$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]);
445 david 248
					break;
249
				case STATION:
480 david 250
					$info_station=$this->traiterStation($line[STATION][$i]);
445 david 251
					break;
252
				case MILIEU:
480 david 253
					$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
445 david 254
					break;
540 david 255
                case DEPARTEMENT:
256
					$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]);
257
					break;
445 david 258
				case LATITUDE:
480 david 259
					$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
445 david 260
					break;
261
				case LONGITUDE:
480 david 262
					$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]);
445 david 263
					break;
264
				case NOTES:
480 david 265
					$info_notes=$this->traiterNotes($line[NOTES][$i]);
445 david 266
					break;
267
				case DATEOBS:
480 david 268
					$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]);
445 david 269
					break;
760 aurelien 270
				case TRANSMETTRE:
271
					$info_transmettre=$this->traiterTransmettre($line[TRANSMETTRE][$i]);
272
				break;
445 david 273
				case ESPECE:
480 david 274
					$info_espece=$this->traiterEspece($line[ESPECE][$i]);
540 david 275
                    if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
276
                        $complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
277
                        $info_espece['nom_ret']=$complement['Nom_Retenu'];
278
                        $info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
279
                        $info_espece['num_taxon']=$complement['Num_Taxon'];
280
                        $info_espece['famille']=$complement['Famille'];
281
                    }
282
                    break;
445 david 283
				case IMAGE:
480 david 284
					$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
445 david 285
					break;
286
			}
287
		}
480 david 288
		else {
289
		 	switch($colonne) {
290
				case COMMUNE:
291
					$info_commune['name']="000null";
292
					break;
293
				case LIEUDIT:
294
					$info_lieudit="000null";
295
					break;
296
				case STATION:
297
					$info_station="000null";
298
					break;
299
				case MILIEU:
300
					$info_milieu="000null";
301
					break;
540 david 302
				case DEPARTEMENT:
1079 aurelien 303
		            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
582 david 304
					    $info_commune['code']="000null";
1079 aurelien 305
                    }
540 david 306
					break;
480 david 307
				case LATITUDE:
308
					$info_latitude="000null";
309
					break;
310
				case LONGITUDE:
311
					$info_longitude="000null";
312
					break;
1079 aurelien 313
				case NOTES:
314
					$info_notes='';
315
					break;
760 aurelien 316
				case TRANSMETTRE:
317
					$info_transmettre = "0";
318
				break;
480 david 319
 
320
			}
321
 
322
		}
445 david 323
	}
324
 
540 david 325
                $this->dernier_ordre++;
480 david 326
 
1081 aurelien 327
                list($jour,$mois,$annee)=explode("/",$info_dateobs);
480 david 328
                $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
760 aurelien 329
                $query  = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, transmission, date_creation,date_modification,coord_x,coord_y) " .
540 david 330
                    " VALUES('".$DB->escapeSimple($utilisateur)."','".
331
                    $DB->escapeSimple($this->dernier_ordre)."','".
332
                    $DB->escapeSimple($info_espece['nom_sel'])."','".
333
                    $DB->escapeSimple($info_espece['en_id_nom'])."','".
334
                    $DB->escapeSimple($info_espece['nom_ret'])."','".
335
                    $DB->escapeSimple($info_espece['num_nom_ret'])."','".
336
                    $DB->escapeSimple($info_espece['num_taxon'])."','".
337
                    $DB->escapeSimple($info_espece['famille'])."','".
338
                    $DB->escapeSimple($info_commune['name'])."','".
339
                    $DB->escapeSimple($info_commune['code'])."','".
340
                    $DB->escapeSimple($info_dateobs)."','".
341
                    $DB->escapeSimple($info_lieudit)."','".
342
                    $DB->escapeSimple($info_station)."','".
343
                    $DB->escapeSimple($info_milieu)."','".
760 aurelien 344
                    $DB->escapeSimple($info_notes)."','".
345
                    $DB->escapeSimple($info_transmettre)."',".
540 david 346
                    "now() , now(),'".
347
                    $DB->escapeSimple($info_latitude)."','".
348
                    $DB->escapeSimple($info_longitude)."')";
480 david 349
//		print "\n";
350
		   $res =& $DB->query($query);
351
 
352
                if (PEAR::isError($res)) {
353
                        return false;
354
                }
760 aurelien 355
 
480 david 356
	// creation lien image
357
	foreach ($info_image as $pic) {
358
 
760 aurelien 359
		$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation ) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'",    "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
480 david 360
 
361
		$res =& $DB->query($query);
362
 
363
                if (PEAR::isError($res)) {
364
                        return false;
760 aurelien 365
                } else {
366
                	$this->cpt_images_liees++;
480 david 367
                }
368
	}
369
 
540 david 370
		return $this->dernier_ordre;
480 david 371
 
372
 
417 aurelien 373
}
374
 
760 aurelien 375
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) {
417 aurelien 376
 
760 aurelien 377
	$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
378
 
379
	// creation lien image
380
	foreach ($info_image as $pic) {
480 david 381
 
760 aurelien 382
		$DB=$this->connectDB($this->config,'cel_db');
383
		$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'",    "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
384
 
385
		$res =& $DB->query($query);
386
 
387
    	if (PEAR::isError($res)) {
388
            return false;
389
    	} else {
390
    		$this->cpt_images_liees++;
391
    	}
392
	}
445 david 393
}
394
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
395
 
1079 aurelien 396
    $identifiant_commune=trim($identifiant_commune);
397
    $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
445 david 398
 
1079 aurelien 399
	preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
445 david 400
 
1079 aurelien 401
    $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
445 david 402
 
1079 aurelien 403
	if (isset($elements[1])) { // commune + departement : montpellier (34)
445 david 404
		$nom_commune=$elements[1];
405
		$code_commune=$elements[2];
1079 aurelien 406
 	    $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'";
445 david 407
	}
540 david 408
	else { // Code insee seul
409
        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
1079 aurelien 410
        if (isset($elements[1])) { // code insee  commune
540 david 411
            $code_insee_commune=$elements[1];
412
            $query="SELECT DISTINCT name, code  FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
413
        }
414
        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
415
               // Commune
416
            preg_match('/(.*)/',$identifiant_commune,$elements);
1079 aurelien 417
            if (isset($elements[1])) { // commune
540 david 418
                $nom_commune=$elements[1];
541 david 419
                $nom_commune=trim($nom_commune);
420
                $nom_commune=utf8_decode($nom_commune);
421
                $nom_commune=cp1252_to_utf8($nom_commune);
422
                $nom_commune=remove_accent($nom_commune);
423
                $nom_commune=preg_replace("/ /","%",$nom_commune);
424
                $query="SELECT DISTINCT name, code  FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'";
540 david 425
            }
426
        }
445 david 427
	}
428
 
429
	$res =& $DB->query($query);
1079 aurelien 430
    if (DB::isError($res)) {
445 david 431
		 die($res->getMessage());
432
	}
433
 
1079 aurelien 434
	$commune_code = $res->fetchrow(DB_FETCHMODE_ASSOC);
435
 
436
	// cas de la commune introuvable dans le référentiel
437
	if(!is_array($commune_code) || count($commune_code) == 0) {
438
		$commune_code['name'] = fix_latin($identifiant_commune);
439
		$commune_code['code'] = '000null';
440
	}
441
	return $commune_code;
445 david 442
}
443
 
444
function traiterLieudit($lieudit) { // texte libre
445
 
480 david 446
	//echo "traitement lieudit";
582 david 447
    $lieudit=fix_latin($lieudit);
448
	return trim($lieudit);
445 david 449
}
450
 
451
function traiterStation($station) { // texte libre
480 david 452
//	echo "traitement station";
582 david 453
    $station=fix_latin($station);
454
	return trim($station);
445 david 455
}
456
 
457
function traiterMilieu($milieu) { // texte libre
480 david 458
//	echo "traitement milieu";
582 david 459
    $milieu=fix_latin($milieu);
460
	return trim($milieu);
445 david 461
}
462
 
540 david 463
function traiterDepartement($departement) { // texte libre
760 aurelien 464
 
465
	if(is_numeric($departement) && strlen($departement) == 5) {
466
		$departement = substr($departement,0,2);
467
	}
468
 
469
	if(is_numeric($departement) && strlen($departement) == 4) {
470
		$departement = substr($departement,0,1);
471
		$departement = "0"+$departement;
472
	}
1079 aurelien 473
 
474
	if(is_numeric($departement) && $departement <= 9) {
475
		$departement = "0"+$departement;
476
	}
540 david 477
	return utf8_encode(trim($departement));
478
}
479
 
445 david 480
function traiterLatitude($latitude) {	//  verifier formal decimal + limite france ? TODO
480 david 481
//	echo "traitement latitude";
540 david 482
	return trim($latitude);
445 david 483
}
484
 
485
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
480 david 486
//	echo "traitement longitude";
540 david 487
	return trim($longitude);
445 david 488
}
489
 
490
function traiterNotes($notes) { // texte libre
480 david 491
//	echo "traitement notes";
582 david 492
    $notes=remove_accent($notes);
540 david 493
	return utf8_encode(trim($notes));
445 david 494
}
495
 
496
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
480 david 497
//	echo "traitement dateobs";
540 david 498
	return trim($dateobs);
445 david 499
}
500
 
760 aurelien 501
function traiterTransmettre($transmettre) {
502
 
503
	$transmission = '0';
504
 
505
	if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
506
		$transmission = '1';
507
	}
508
 
509
	return $transmission;
510
}
511
 
540 david 512
function traiterEspece($identifiant_espece) {  // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
449 david 513
 
480 david 514
//	echo "traitement  espece";
540 david 515
        $identifiant_espece=trim($identifiant_espece);
445 david 516
 
517
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
518
 
540 david 519
	    preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
520
 
1079 aurelien 521
		if (isset($elements[1])) { // Numero nomenclatural
445 david 522
 
449 david 523
 
540 david 524
            // Recherche du nom associe
525
            $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
526
            $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
527
                "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
528
                " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
529
                " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
530
                " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
531
                " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
532
                " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
533
                " eflore_naturaliste_intitule_abreviation AS auteur_bex ".
534
                " , eflore_naturaliste_intitule_abreviation AS auteur_b ".
535
                " , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
536
                " , eflore_naturaliste_intitule_abreviation AS auteur_m ".
537
                " WHERE a.esn_id_nom= '".$elements[1]. "'".
538
                " AND a.esn_id_version_projet_taxon = 25 ".
539
                " AND en_ce_rang = enrg_id_rang" .
540
                " AND en_id_nom = a.esn_id_nom" .
541
                " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
542
                " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
543
                " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
544
                " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
545
                " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
480 david 546
 
540 david 547
            $res =& $DB->query($query);
480 david 548
 
549
 
540 david 550
            if (DB::isError($res)) {
551
                die($res->getMessage());
552
            }
480 david 553
 
540 david 554
            $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
555
            return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
556
 
449 david 557
		}
558
 
540 david 559
		else { //  Numero taxonomique ou nom scientifique
560
	        preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
449 david 561
 
1079 aurelien 562
		    if (isset($elements[1])) { // Numero taxonomique
540 david 563
 
564
                $DB=$this->connectDB($this->config);
449 david 565
 
540 david 566
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
567
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
568
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
569
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
570
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
571
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
572
                    " FROM eflore_nom, eflore_nom_rang," .
573
                    "     eflore_naturaliste_intitule_abreviation AS auteur_bex ".
574
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
575
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
576
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
577
                    " , eflore_selection_nom ".
578
                    " WHERE esn_id_taxon = '".$elements[1]. "'".
579
                    " AND esn_id_version_projet_taxon = 25 ".
580
                    " AND esn_ce_statut=3 ".
581
                    " AND en_id_nom = esn_id_nom" .
582
                    " AND en_ce_rang = enrg_id_rang" .
583
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
584
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
585
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
586
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
587
                    " AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
449 david 588
 
540 david 589
                $res =& $DB->query($query);
449 david 590
 
540 david 591
                if (DB::isError($res)) {
592
                    die($res->getMessage());
593
                }
449 david 594
 
540 david 595
                $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
596
                return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']);
449 david 597
 
598
 
540 david 599
            }
480 david 600
 
540 david 601
            else { // Nom scientifique
602
                $nameparser=new NameParser();
603
                $nom_latin_decoupe=$nameparser->parse($identifiant_espece);
480 david 604
 
540 david 605
//print_r($nom_latin_decoupe);
606
                    $DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
480 david 607
 
540 david 608
                        // requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
609
                        if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
610
                            $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
611
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
612
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
613
                                            " AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
614
                                            " AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
615
                                            " AND esn_id_nom= en_id_nom ".
616
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
617
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
618
                                            " ORDER BY esn_ce_statut ".
619
                                            " LIMIT 1";
620
                        }
621
                        else { // espece  (on privilegie les noms retenu cf tri par esn_ce_statut)
622
                             $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
623
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
624
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
625
                                            " AND enrg_abreviation_rang = 'sp.' " .
626
                                            " AND esn_id_nom= en_id_nom ".
627
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
628
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
629
                                            " ORDER BY esn_ce_statut ".
630
                                            " LIMIT 1";
631
 
632
                        }
633
                $res =& $DB->query($query);
634
                if (DB::isError($res)) {
635
                     die($res->getMessage());
636
                }
480 david 637
 
540 david 638
                $id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
480 david 639
 
540 david 640
                // Recherche du nom associe
641
                $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
642
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
643
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
644
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
645
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
646
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
647
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
648
                    " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
649
                    "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
650
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
651
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
652
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
653
                    " WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
654
                    " AND a.esn_id_version_projet_taxon = 25 ".
655
                    " AND en_ce_rang = enrg_id_rang" .
656
                    " AND en_id_nom = a.esn_id_nom" .
657
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
658
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
659
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
660
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
661
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
662
                $res =& $DB->query($query);
480 david 663
 
664
 
540 david 665
                if (DB::isError($res)) {
666
                    die($res->getMessage());
667
                }
445 david 668
 
540 david 669
                if ($res->numRows() > 0 ) {
670
                    $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
671
                    return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
672
                }
673
                else {
674
                    return array("nom_sel"=>$identifiant_espece);
675
                }
445 david 676
 
480 david 677
 
540 david 678
                }
679
            }
480 david 680
 
681
 
445 david 682
}
683
 
684
 
685
 
480 david 686
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
687
 
688
        $DB=$this->connectDB($this->config,'cel_db');
689
 
690
	$liste_images = explode("/",$images) ;
691
 
692
	$row =array();
693
        foreach($liste_images as $image) {
694
 
695
		$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
696
 
697
	        $res  =& $DB->query($query);
698
		$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
699
 
700
	        if (DB::isError($res)) {
701
        	    die($res->getMessage());
702
	        }
703
 
704
	}
705
	return $row;
706
 
707
 
445 david 708
}
709
 
540 david 710
       function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
445 david 711
 
480 david 712
                $DB=$this->connectDB($this->config);
713
 
714
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
540 david 715
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
716
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
717
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
718
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
719
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
720
                    " FROM eflore_nom, eflore_nom_rang," .
721
                    "     eflore_naturaliste_intitule_abreviation AS auteur_bex ".
722
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
723
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
724
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
725
                    " ,eflore_selection_nom a, eflore_selection_nom b".
726
                    " WHERE a.esn_id_nom= ".$numNom.
727
                    " AND a.esn_id_version_projet_taxon = 25 ".
728
                    " AND a.esn_id_taxon=b.esn_id_taxon ".
729
                    " AND b.esn_ce_statut=3 ".
730
                    " AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
731
                    " AND en_ce_rang = enrg_id_rang" .
732
                    " AND en_id_nom = b.esn_id_nom" .
733
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
734
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
735
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
736
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
737
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
480 david 738
 
739
 
540 david 740
                $res =& $DB->query($query);
480 david 741
 
742
 
743
 
540 david 744
                if (DB::isError($res)) {
745
                    die($res->getMessage());
746
                }
480 david 747
 
540 david 748
                // Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
480 david 749
 
750
                $value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
751
 
752
                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
540 david 753
                    $fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
754
 
755
                    // Recherche Famille
756
                    while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
480 david 757
                        $fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
540 david 758
                    }
759
                    if ($fam['en_ce_rang']==120) {
480 david 760
                        $famille=$fam['en_nom_supra_generique'];
540 david 761
                    }
762
                    else {
480 david 763
                        $famille="Famille inconnue";
540 david 764
                    }
765
 
766
                    $value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
480 david 767
                }
768
 
540 david 769
                return $value;
480 david 770
 
771
 
772
 
773
        }
774
 
449 david 775
function formaterNom($rawnom) {
480 david 776
 
777
 
449 david 778
                // Constitution du nom:
779
                $nom = '';
445 david 780
 
449 david 781
                if ($rawnom['en_nom_supra_generique'] != '') {
782
                    $nom .= $rawnom['en_nom_supra_generique'];
783
                } else if ($rawnom['en_epithete_infra_generique'] != '') {
784
                    $nom .= $rawnom['en_epithete_infra_generique'];
785
                } else {
786
                        if ($rawnom['en_nom_genre'] != '') {
787
                            $nom .=  $rawnom['en_nom_genre'];
788
                        }
789
                        if ($rawnom['en_epithete_espece']!= '') {
790
                            $nom .= ' '.$rawnom['en_epithete_espece'];
791
                        }
792
                        if ($rawnom['en_epithete_infra_specifique'] != '') {
793
                                if (!empty($rawnom['enrg_abreviation_rang'])) {
794
                                        $nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
795
                                }
796
                                $nom .= ' '.$rawnom['en_epithete_infra_specifique'];
797
                        }
798
 
799
                }
480 david 800
 
801
                return $nom .$this->retournerAuteur($rawnom) ;
802
 
803
 }
804
 
805
 
806
function rechercherFamille($taxon,&$DB) {
807
 
540 david 808
    $row=array();
480 david 809
 
540 david 810
    $query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
480 david 811
        " FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
812
        " WHERE etr_id_taxon_1 = ".$taxon.
813
        " AND etr_id_version_projet_taxon_1 = 25 ".
814
        " AND etr_id_categorie_taxon = 3 ".
815
        " AND etr_id_valeur_taxon = 3 ".
816
        " AND esn_id_taxon =  etr_id_taxon_2 ".
817
        " AND esn_ce_statut = 3 ".
818
        " AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
819
        " AND en_id_nom = esn_id_nom ".
820
        " AND esn_id_version_projet_taxon=en_id_version_projet_nom  ";
540 david 821
    $res =& $DB->query($query);
480 david 822
 
540 david 823
    if (DB::isError($res)) {
824
        die($res->getMessage());
825
    }
480 david 826
 
540 david 827
    if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
828
        return $row;
480 david 829
    }
830
    else {
831
        $row['en_ce_rang']='fin';
832
        return $row;
833
    }
834
 
445 david 835
}
836
 
480 david 837
 
449 david 838
function retournerAuteur($rawnom) {
445 david 839
 
540 david 840
    $auteurs = '';
841
    $auteur_basio = '';
842
    $auteur_modif = '';
843
    if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' )  {
844
        $auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
845
        if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
846
            $auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
847
        }
848
    } else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
849
        $auteur_basio .= $rawnom['abreviation_auteur_basio'];
850
    }
445 david 851
 
540 david 852
    if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
853
        $auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
854
        if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
855
            $auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
856
        }
857
    } else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-')  {
858
        $auteur_modif .= $rawnom['abreviation_auteur_modif'];
859
    }
449 david 860
 
540 david 861
    if (!empty($auteur_modif)) {
862
        $auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
863
    } elseif (!empty($auteur_basio)) {
864
        $auteurs = ' '.$auteur_basio;
865
    }
866
 
867
    return $auteurs ;
449 david 868
}
869
 
870
 
871
 
480 david 872
 
449 david 873
}
874
 
582 david 875
function init_byte_map(){
606 aurelien 876
    $byte_map = array();
582 david 877
    for($x=128;$x<256;++$x){
878
        $byte_map[chr($x)]=utf8_encode(chr($x));
879
    }
880
    $cp1252_map=array(
881
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
882
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
883
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
884
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
885
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
886
            "\x86" => "\xE2\x80\xA0",  // DAGGER
887
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
888
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
889
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
890
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
891
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
892
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
893
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
894
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
895
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
896
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
897
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
898
            "\x95" => "\xE2\x80\xA2",  // BULLET
899
            "\x96" => "\xE2\x80\x93",  // EN DASH
900
            "\x97" => "\xE2\x80\x94",  // EM DASH
901
            "\x98" => "\xCB\x9C",      // SMALL TILDE
902
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
903
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
904
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
905
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
906
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
907
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
908
                );
909
    foreach($cp1252_map as $k=>$v){
910
        $byte_map[$k]=$v;
911
    }
606 aurelien 912
 
913
    return $byte_map;
582 david 914
}
449 david 915
 
602 aurelien 916
function fix_latin($instr){
917
 
606 aurelien 918
    $byte_map = init_byte_map();
919
 
602 aurelien 920
    $ascii_char='[\x00-\x7F]';
921
    $cont_byte='[\x80-\xBF]';
922
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
923
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
924
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
925
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 926
 
602 aurelien 927
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 928
 
582 david 929
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
930
    $outstr='';
931
    $char='';
932
    $rest='';
933
    while((strlen($instr))>0){
602 aurelien 934
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 935
            $char=$match[1];
936
            $rest=$match[2];
937
            $outstr.=$char;
602 aurelien 938
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 939
            $char=$match[1];
940
            $rest=$match[2];
941
            $outstr.=$byte_map[$char];
942
        }
943
        $instr=$rest;
944
    }
945
    return $outstr;
946
}
947
 
948
 
540 david 949
function remove_accent($str)
950
{
951
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
952
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
953
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
954
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
955
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
956
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
957
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
958
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
959
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
960
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
961
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
962
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
963
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
964
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
965
 
966
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
967
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
968
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
969
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
970
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
971
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
972
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
973
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
974
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
975
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
976
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
977
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
978
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
979
  return str_replace($a, $b, $str);
980
}
449 david 981
 
540 david 982
 
983
function cp1252_to_utf8($str) {
984
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
985
"\xc2\x82" => "\xe2\x80\x9a",
986
"\xc2\x83" => "\xc6\x92",
987
"\xc2\x84" => "\xe2\x80\x9e",
988
"\xc2\x85" => "\xe2\x80\xa6",
989
"\xc2\x86" => "\xe2\x80\xa0",
990
"\xc2\x87" => "\xe2\x80\xa1",
991
"\xc2\x88" => "\xcb\x86",
992
"\xc2\x89" => "\xe2\x80\xb0",
993
"\xc2\x8a" => "\xc5\xa0",
994
"\xc2\x8b" => "\xe2\x80\xb9",
995
"\xc2\x8c" => "\xc5\x92",
996
"\xc2\x8e" => "\xc5\xbd",
997
"\xc2\x91" => "\xe2\x80\x98",
998
"\xc2\x92" => "\xe2\x80\x99",
999
"\xc2\x93" => "\xe2\x80\x9c",
1000
"\xc2\x94" => "\xe2\x80\x9d",
1001
"\xc2\x95" => "\xe2\x80\xa2",
1002
"\xc2\x96" => "\xe2\x80\x93",
1003
"\xc2\x97" => "\xe2\x80\x94",
1004
 
1005
"\xc2\x98" => "\xcb\x9c",
1006
"\xc2\x99" => "\xe2\x84\xa2",
1007
"\xc2\x9a" => "\xc5\xa1",
1008
"\xc2\x9b" => "\xe2\x80\xba",
1009
"\xc2\x9c" => "\xc5\x93",
1010
"\xc2\x9e" => "\xc5\xbe",
1011
"\xc2\x9f" => "\xc5\xb8"
1012
);
1013
return strtr ( utf8_encode ( $str ), $cp1252_map );
1014
}
1015
 
417 aurelien 1016
/* +--Fin du code ---------------------------------------------------------------------------------------+
1017
* $Log$
1018
*
1019
*
1020
*/
1021
 
1022
 
1023
?>