Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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