Subversion Repositories eFlore/Applications.cel

Rev

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