Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
417 aurelien 1
<?php
2
// In : utf8
3
// Out : utf8
4
 
483 david 5
 
6
// TODO : traiter image multilignes
540 david 7
// TODO : doublons
483 david 8
 
480 david 9
/*
417 aurelien 10
 
480 david 11
Octobre 2010 David Delon.
12
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
13
et liaison d'images déjà chargee aux observations ainsi crées.
417 aurelien 14
 
480 david 15
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
16
Aucune valeur dans les colonnes n'est obligatoire
17
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
18
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
19
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
445 david 20
 
480 david 21
*/
445 david 22
 
480 david 23
 
24
// Nom des colonnes
25
 
445 david 26
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
27
define('LIEUDIT','lieu-dit'); // Texte libre
28
define('STATION','station'); // Texte libre
29
define('MILIEU','milieu'); // Texte libre
30
define('LATITUDE','latitude'); // En decimal systeme WGS84
31
define('LONGITUDE','longitude'); // En decimal systeme WGS84
32
define('NOTES','notes'); // Texte libre
33
define('DATEOBS','date'); // date au format jj/mm/aaaa
34
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
35
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
540 david 36
define('DEPARTEMENT','departement'); //  Texte libre
760 aurelien 37
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
445 david 38
 
540 david 39
 
480 david 40
// Resultat de l'analyse d'une ligne
445 david 41
define('LIGNE_VIDE',1); //
42
define('LIGNE_NORMALE',2); //
43
define('LIGNE_IMAGE_SEULEMENT',3); //
44
 
970 aurelien 45
class InventoryImportExcel extends Cel  {
445 david 46
 
47
// Element constituant une observation
417 aurelien 48
 
760 aurelien 49
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
480 david 50
 
51
// Fichier configuration
417 aurelien 52
	var $config;
480 david 53
 
54
// Encapsulation classe lecture fichier excel
417 aurelien 55
	var $extendExcelReader;
56
 
540 david 57
// Dernier numero d'ordre utilise
58
	var $dernier_ordre=1;
760 aurelien 59
 
60
	var $cpt_images_liees=0;
540 david 61
 
480 david 62
/**
63
 Constructeur
64
**/
417 aurelien 65
	function InventoryImportExcel($config) {
66
 
67
		$this->config=$config;
68
		// Pas d'heritage multiple en php :(
69
 
70
		$this->extendExcelReader = new ExcelReader();
71
		$this->extendExcelReader->initExcelReader();
72
	}
73
 
480 david 74
/**
75
 Sur post
76
**/
445 david 77
	function createElement($pairs) {
417 aurelien 78
 
79
 
480 david 80
		$pairs['utilisateur']=$_POST['identifiant'];
540 david 81
        $this->controleUtilisateur($pairs['utilisateur']);
480 david 82
 
417 aurelien 83
 
540 david 84
        foreach($_FILES as $file) { // C'est le plus simple
85
            $infos_fichier = $file ;
86
        }
417 aurelien 87
 
480 david 88
 
89
// Chargement tableau en memoire
445 david 90
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
480 david 91
		$arr = array();
445 david 92
 
93
		$rowcount=$data->rowcount(0);
94
		$colcount=$data->colcount(0);
95
 
96
		if ($rowcount<=1) { // TODO : retour erreur
97
			print "Tableau vide";
98
			exit;
99
		}
100
 
540 david 101
// Chargement tableau
102
        for($row=1;$row<=$rowcount;$row++)
103
            for($col=1;$col<=$colcount;$col++)
104
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
760 aurelien 105
 
540 david 106
// 1 : Traitement intitules
417 aurelien 107
 
445 david 108
		$line = array();
417 aurelien 109
 
445 david 110
/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
111
 
540 david 112
        for($col=1;$col<=$colcount;$col++) {
113
            $colonne=strtolower($arr[$col][1]);
114
            $colonne=trim($colonne);
115
            $colonne=cp1252_to_utf8($colonne);
116
            $colonne=remove_accent($colonne);
117
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
118
                case COMMUNE:
119
                case LIEUDIT:
120
                case STATION:
121
                case MILIEU:
122
                case DEPARTEMENT:
123
                case LATITUDE:
124
                case LONGITUDE:
125
                case NOTES:
126
                case DATEOBS:
127
                case ESPECE:
760 aurelien 128
                case TRANSMETTRE:
540 david 129
                case IMAGE:
130
                    $selection=array_values($arr[$col]);
131
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
132
                    $line[$colonne]=$selection;
133
                    break;
445 david 134
 
540 david 135
            }
136
        }
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
 
996 aurelien 332
                list($jour,$mois,$annee)=explode("/",$info_dateobs);
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)."')";
480 david 354
//		print "\n";
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
//print_r($nom_latin_decoupe);
611
                    $DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
480 david 612
 
540 david 613
                        // requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
614
                        if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
615
                            $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
616
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
617
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
618
                                            " AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
619
                                            " AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
620
                                            " AND esn_id_nom= en_id_nom ".
621
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
622
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
623
                                            " ORDER BY esn_ce_statut ".
624
                                            " LIMIT 1";
625
                        }
626
                        else { // espece  (on privilegie les noms retenu cf tri par esn_ce_statut)
627
                             $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
628
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
629
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
630
                                            " AND enrg_abreviation_rang = 'sp.' " .
631
                                            " AND esn_id_nom= en_id_nom ".
632
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
633
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
634
                                            " ORDER BY esn_ce_statut ".
635
                                            " LIMIT 1";
636
 
637
                        }
638
                $res =& $DB->query($query);
639
                if (DB::isError($res)) {
640
                     die($res->getMessage());
641
                }
480 david 642
 
540 david 643
                $id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
480 david 644
 
540 david 645
                // Recherche du nom associe
646
                $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
647
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
648
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
649
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
650
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
651
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
652
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
653
                    " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
654
                    "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
655
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
656
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
657
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
658
                    " WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
659
                    " AND a.esn_id_version_projet_taxon = 25 ".
660
                    " AND en_ce_rang = enrg_id_rang" .
661
                    " AND en_id_nom = a.esn_id_nom" .
662
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
663
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
664
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
665
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
666
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
667
                $res =& $DB->query($query);
480 david 668
 
669
 
540 david 670
                if (DB::isError($res)) {
671
                    die($res->getMessage());
672
                }
445 david 673
 
540 david 674
                if ($res->numRows() > 0 ) {
675
                    $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
676
                    return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
677
                }
678
                else {
679
                    return array("nom_sel"=>$identifiant_espece);
680
                }
445 david 681
 
480 david 682
 
540 david 683
                }
684
            }
480 david 685
 
686
 
445 david 687
}
688
 
689
 
690
 
480 david 691
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
692
 
693
        $DB=$this->connectDB($this->config,'cel_db');
694
 
695
	$liste_images = explode("/",$images) ;
696
 
697
	$row =array();
698
        foreach($liste_images as $image) {
699
 
700
		$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
701
 
702
	        $res  =& $DB->query($query);
703
		$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
704
 
705
	        if (DB::isError($res)) {
706
        	    die($res->getMessage());
707
	        }
708
 
709
	}
710
	return $row;
711
 
712
 
445 david 713
}
714
 
540 david 715
       function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
445 david 716
 
480 david 717
                $DB=$this->connectDB($this->config);
718
 
719
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
540 david 720
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
721
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
722
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
723
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
724
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
725
                    " FROM eflore_nom, eflore_nom_rang," .
726
                    "     eflore_naturaliste_intitule_abreviation AS auteur_bex ".
727
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
728
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
729
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
730
                    " ,eflore_selection_nom a, eflore_selection_nom b".
731
                    " WHERE a.esn_id_nom= ".$numNom.
732
                    " AND a.esn_id_version_projet_taxon = 25 ".
733
                    " AND a.esn_id_taxon=b.esn_id_taxon ".
734
                    " AND b.esn_ce_statut=3 ".
735
                    " AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
736
                    " AND en_ce_rang = enrg_id_rang" .
737
                    " AND en_id_nom = b.esn_id_nom" .
738
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
739
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
740
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
741
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
742
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
480 david 743
 
744
 
540 david 745
                $res =& $DB->query($query);
480 david 746
 
747
 
748
 
540 david 749
                if (DB::isError($res)) {
750
                    die($res->getMessage());
751
                }
480 david 752
 
540 david 753
                // Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
480 david 754
 
755
                $value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
756
 
757
                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
540 david 758
                    $fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
759
 
760
                    // Recherche Famille
761
                    while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
480 david 762
                        $fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
540 david 763
                    }
764
                    if ($fam['en_ce_rang']==120) {
480 david 765
                        $famille=$fam['en_nom_supra_generique'];
540 david 766
                    }
767
                    else {
480 david 768
                        $famille="Famille inconnue";
540 david 769
                    }
770
 
771
                    $value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
480 david 772
                }
773
 
540 david 774
                return $value;
480 david 775
 
776
 
777
 
778
        }
779
 
449 david 780
function formaterNom($rawnom) {
480 david 781
 
782
 
449 david 783
                // Constitution du nom:
784
                $nom = '';
445 david 785
 
449 david 786
                if ($rawnom['en_nom_supra_generique'] != '') {
787
                    $nom .= $rawnom['en_nom_supra_generique'];
788
                } else if ($rawnom['en_epithete_infra_generique'] != '') {
789
                    $nom .= $rawnom['en_epithete_infra_generique'];
790
                } else {
791
                        if ($rawnom['en_nom_genre'] != '') {
792
                            $nom .=  $rawnom['en_nom_genre'];
793
                        }
794
                        if ($rawnom['en_epithete_espece']!= '') {
795
                            $nom .= ' '.$rawnom['en_epithete_espece'];
796
                        }
797
                        if ($rawnom['en_epithete_infra_specifique'] != '') {
798
                                if (!empty($rawnom['enrg_abreviation_rang'])) {
799
                                        $nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
800
                                }
801
                                $nom .= ' '.$rawnom['en_epithete_infra_specifique'];
802
                        }
803
 
804
                }
480 david 805
 
806
                return $nom .$this->retournerAuteur($rawnom) ;
807
 
808
 }
809
 
810
 
811
function rechercherFamille($taxon,&$DB) {
812
 
540 david 813
    $row=array();
480 david 814
 
540 david 815
    $query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
480 david 816
        " FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
817
        " WHERE etr_id_taxon_1 = ".$taxon.
818
        " AND etr_id_version_projet_taxon_1 = 25 ".
819
        " AND etr_id_categorie_taxon = 3 ".
820
        " AND etr_id_valeur_taxon = 3 ".
821
        " AND esn_id_taxon =  etr_id_taxon_2 ".
822
        " AND esn_ce_statut = 3 ".
823
        " AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
824
        " AND en_id_nom = esn_id_nom ".
825
        " AND esn_id_version_projet_taxon=en_id_version_projet_nom  ";
540 david 826
    $res =& $DB->query($query);
480 david 827
 
540 david 828
    if (DB::isError($res)) {
829
        die($res->getMessage());
830
    }
480 david 831
 
540 david 832
    if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
833
        return $row;
480 david 834
    }
835
    else {
836
        $row['en_ce_rang']='fin';
837
        return $row;
838
    }
839
 
445 david 840
}
841
 
480 david 842
 
449 david 843
function retournerAuteur($rawnom) {
445 david 844
 
540 david 845
    $auteurs = '';
846
    $auteur_basio = '';
847
    $auteur_modif = '';
848
    if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' )  {
849
        $auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
850
        if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
851
            $auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
852
        }
853
    } else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
854
        $auteur_basio .= $rawnom['abreviation_auteur_basio'];
855
    }
445 david 856
 
540 david 857
    if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
858
        $auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
859
        if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
860
            $auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
861
        }
862
    } else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-')  {
863
        $auteur_modif .= $rawnom['abreviation_auteur_modif'];
864
    }
449 david 865
 
540 david 866
    if (!empty($auteur_modif)) {
867
        $auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
868
    } elseif (!empty($auteur_basio)) {
869
        $auteurs = ' '.$auteur_basio;
870
    }
871
 
872
    return $auteurs ;
449 david 873
}
874
 
875
 
876
 
480 david 877
 
449 david 878
}
879
 
582 david 880
function init_byte_map(){
606 aurelien 881
    $byte_map = array();
582 david 882
    for($x=128;$x<256;++$x){
883
        $byte_map[chr($x)]=utf8_encode(chr($x));
884
    }
885
    $cp1252_map=array(
886
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
887
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
888
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
889
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
890
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
891
            "\x86" => "\xE2\x80\xA0",  // DAGGER
892
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
893
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
894
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
895
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
896
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
897
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
898
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
899
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
900
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
901
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
902
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
903
            "\x95" => "\xE2\x80\xA2",  // BULLET
904
            "\x96" => "\xE2\x80\x93",  // EN DASH
905
            "\x97" => "\xE2\x80\x94",  // EM DASH
906
            "\x98" => "\xCB\x9C",      // SMALL TILDE
907
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
908
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
909
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
910
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
911
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
912
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
913
                );
914
    foreach($cp1252_map as $k=>$v){
915
        $byte_map[$k]=$v;
916
    }
606 aurelien 917
 
918
    return $byte_map;
582 david 919
}
449 david 920
 
602 aurelien 921
function fix_latin($instr){
922
 
606 aurelien 923
    $byte_map = init_byte_map();
924
 
602 aurelien 925
    $ascii_char='[\x00-\x7F]';
926
    $cont_byte='[\x80-\xBF]';
927
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
928
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
929
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
930
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 931
 
602 aurelien 932
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 933
 
582 david 934
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
935
    $outstr='';
936
    $char='';
937
    $rest='';
938
    while((strlen($instr))>0){
602 aurelien 939
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 940
            $char=$match[1];
941
            $rest=$match[2];
942
            $outstr.=$char;
602 aurelien 943
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 944
            $char=$match[1];
945
            $rest=$match[2];
946
            $outstr.=$byte_map[$char];
947
        }
948
        $instr=$rest;
949
    }
950
    return $outstr;
951
}
952
 
953
 
540 david 954
function remove_accent($str)
955
{
956
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
957
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
958
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
959
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
960
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
961
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
962
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
963
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
964
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
965
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
966
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
967
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
968
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
969
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
970
 
971
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
972
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
973
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
974
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
975
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
976
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
977
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
978
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
979
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
980
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
981
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
982
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
983
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
984
  return str_replace($a, $b, $str);
985
}
449 david 986
 
540 david 987
 
988
function cp1252_to_utf8($str) {
989
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
990
"\xc2\x82" => "\xe2\x80\x9a",
991
"\xc2\x83" => "\xc6\x92",
992
"\xc2\x84" => "\xe2\x80\x9e",
993
"\xc2\x85" => "\xe2\x80\xa6",
994
"\xc2\x86" => "\xe2\x80\xa0",
995
"\xc2\x87" => "\xe2\x80\xa1",
996
"\xc2\x88" => "\xcb\x86",
997
"\xc2\x89" => "\xe2\x80\xb0",
998
"\xc2\x8a" => "\xc5\xa0",
999
"\xc2\x8b" => "\xe2\x80\xb9",
1000
"\xc2\x8c" => "\xc5\x92",
1001
"\xc2\x8e" => "\xc5\xbd",
1002
"\xc2\x91" => "\xe2\x80\x98",
1003
"\xc2\x92" => "\xe2\x80\x99",
1004
"\xc2\x93" => "\xe2\x80\x9c",
1005
"\xc2\x94" => "\xe2\x80\x9d",
1006
"\xc2\x95" => "\xe2\x80\xa2",
1007
"\xc2\x96" => "\xe2\x80\x93",
1008
"\xc2\x97" => "\xe2\x80\x94",
1009
 
1010
"\xc2\x98" => "\xcb\x9c",
1011
"\xc2\x99" => "\xe2\x84\xa2",
1012
"\xc2\x9a" => "\xc5\xa1",
1013
"\xc2\x9b" => "\xe2\x80\xba",
1014
"\xc2\x9c" => "\xc5\x93",
1015
"\xc2\x9e" => "\xc5\xbe",
1016
"\xc2\x9f" => "\xc5\xb8"
1017
);
1018
return strtr ( utf8_encode ( $str ), $cp1252_map );
1019
}
1020
 
417 aurelien 1021
/* +--Fin du code ---------------------------------------------------------------------------------------+
1022
* $Log$
1023
*
1024
*
1025
*/
1026
 
1027
 
1028
?>