Subversion Repositories eFlore/Applications.cel

Rev

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