Subversion Repositories eFlore/Applications.cel

Rev

Rev 1081 | Details | Compare with Previous | Last modification | View Log | RSS feed

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