Subversion Repositories eFlore/Applications.cel

Rev

Rev 3350 | Rev 3425 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3350 Rev 3377
1
 <?php
1
 <?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
4
 * Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
5
 * Encodage en entrée : utf8
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
6
 * Encodage en sortie : utf8
7
 *
7
 *
8
 * Cas d'utilisation et documentation :
8
 * Cas d'utilisation et documentation :
9
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
9
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
10
 *
10
 *
11
 * Paramètres :
11
 * Paramètres :
12
 * ===> extra = booléen (1 ou 0)  [par défaut : 1]
12
 * ===> extra = booléen (1 ou 0)  [par défaut : 1]
13
 * Affiche / Cache la vignette en taille plus importante au bas du widget.
13
 * Affiche / Cache la vignette en taille plus importante au bas du widget.
14
 * ===> vignette = [0-9]+,[0-9]+  [par défaut : 4,3]
14
 * ===> vignette = [0-9]+,[0-9]+  [par défaut : 4,3]
15
 * Indique le nombre de vignette par ligne et le nombre de ligne.
15
 * Indique le nombre de vignette par ligne et le nombre de ligne.
16
 *
16
 *
17
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
17
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
18
 * @license	GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18
 * @license	GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license	CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @license	CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @version	$Id$
20
 * @version	$Id$
21
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
21
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
22
 */
22
 */
23
class Saisie2 extends WidgetCommun {
23
class Saisie2 extends WidgetCommun {
24
 
24
 
25
	const DS = DIRECTORY_SEPARATOR;
25
	const DS = DIRECTORY_SEPARATOR;
26
	const SERVICE_DEFAUT = 'saisie';
26
	const SERVICE_DEFAUT = 'saisie';
27
	const WS_SAISIE = 'CelWidgetSaisie';
27
	const WS_SAISIE = 'CelWidgetSaisie';
28
	const WS_UPLOAD = 'CelWidgetUploadImageTemp';
28
	const WS_UPLOAD = 'CelWidgetUploadImageTemp';
29
	const WS_OBS = 'CelObs';
29
	const WS_OBS = 'CelObs';
30
	const LANGUE_DEFAUT = 'fr';
30
	const LANGUE_DEFAUT = 'fr';
31
	const PROJET_DEFAUT = 'base';
31
	const PROJET_DEFAUT = 'base';
32
	const WS_NOM = 'noms';
32
	const WS_NOM = 'noms';
33
	const EFLORE_API_VERSION = '0.1';
33
	const EFLORE_API_VERSION = '0.1';
34
	private $cel_url_tpl = null;
34
	private $cel_url_tpl = null;
35
	/** Si spécifié, on ajoute une barre de navigation inter-applications */
35
	/** Si spécifié, on ajoute une barre de navigation inter-applications */
36
	private $bar;
36
	private $bar;
37
	//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
37
	//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
38
	private $parametres_autorises = array(
38
	private $parametres_autorises = array(
39
			'projet' => 'projet',
39
			'projet' => 'projet',
40
			'type' => 'type',
40
			'type' => 'type',
41
			'langue' => 'langue',
41
			'langue' => 'langue',
42
			'order' => 'order'
42
			'order' => 'order'
43
	);
43
	);
44
	/**
44
	/**
45
	 * Méthode appelée par défaut pour charger ce widget.
45
	 * Méthode appelée par défaut pour charger ce widget.
46
	 */
46
	 */
47
	public function executer() {
47
	public function executer() {
48
		$retour = null;
48
		$retour = null;
49
		// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
49
		// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
50
		unset($this->parametres['callback']);
50
		unset($this->parametres['callback']);
51
		extract($this->parametres);
51
		extract($this->parametres);
52
		$this->bar = (isset($bar)) ? $bar : false;
52
		$this->bar = (isset($bar)) ? $bar : false;
53
		/* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
53
		/* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
54
		 Sinon, rien ne sera chargé.
54
		 Sinon, rien ne sera chargé.
55
		 L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
55
		 L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
56
		 de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
56
		 de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
57
		 l'application.
57
		 l'application.
58
		 Chemin du fichier chargeant le framework requis */
58
		 Chemin du fichier chargeant le framework requis */
59
		$framework = dirname(__FILE__).'/framework.php';
59
		$framework = dirname(__FILE__).'/framework.php';
60
		if (!file_exists($framework)) {
60
		if (!file_exists($framework)) {
61
			$e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
61
			$e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
62
			trigger_error($e, E_USER_ERROR);
62
			trigger_error($e, E_USER_ERROR);
63
		} else {
63
		} else {
64
			// Inclusion du Framework
64
			// Inclusion du Framework
65
			require_once $framework;
65
			require_once $framework;
66
			// Ajout d'information concernant cette application
66
			// Ajout d'information concernant cette application
67
			Framework::setCheminAppli(__FILE__);// Obligatoire
67
			Framework::setCheminAppli(__FILE__);// Obligatoire
68
			Framework::setInfoAppli(Config::get('info'));// Optionnel
68
			Framework::setInfoAppli(Config::get('info'));// Optionnel
69
 
69
 
70
		}
70
		}
71
		$langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
71
		$langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
72
		$this->langue = I18n::setLangue($langue);
72
		$this->langue = I18n::setLangue($langue);
73
		$this->parametres['langue'] = $langue;
73
		$this->parametres['langue'] = $langue;
74
 
74
 
75
		if (!isset($mode)) {
75
		if (!isset($mode)) {
76
			$mode = self::SERVICE_DEFAUT;
76
			$mode = self::SERVICE_DEFAUT;
77
		}
77
		}
78
		if (!isset($projet)) {
78
		if (!isset($projet)) {
79
			$this->parametres['projet'] = self::PROJET_DEFAUT;
79
			$this->parametres['projet'] = self::PROJET_DEFAUT;
80
		}
80
		}
81
 
81
 
82
		$methode = $this->traiterNomMethodeExecuter($mode);
82
		$methode = $this->traiterNomMethodeExecuter($mode);
83
		if (method_exists($this, $methode)) {
83
		if (method_exists($this, $methode)) {
84
			$retour = $this->$methode();
84
			$retour = $this->$methode();
85
		} else {
85
		} else {
86
			$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
86
			$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
87
		}
87
		}
88
 
88
 
89
		$contenu = ''; //print_r($retour);exit;
89
		$contenu = ''; //print_r($retour);exit;
90
		if (is_null($retour)) {
90
		if (is_null($retour)) {
91
			$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
91
			$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
92
		} else {
92
		} else {
93
			if (isset($retour['donnees'])) {
93
			if (isset($retour['donnees'])) {
94
				// ne pas afficher le projet dans l'url si on est dans saisie de base
94
				// ne pas afficher le projet dans l'url si on est dans saisie de base
95
				$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?'. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
95
				$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?'. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
96
 
96
 
97
				$retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
97
				$retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
98
				$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
98
				$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
99
				$retour['donnees']['bar'] = $this->bar;
99
				$retour['donnees']['bar'] = $this->bar;
100
				$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
100
				$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
101
				$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
101
				$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
102
				$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
102
				$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
103
				$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
103
				$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
104
				$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
104
				$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
105
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
105
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
106
				$retour['donnees']['mode'] = $mode;
106
				$retour['donnees']['mode'] = $mode;
107
				if( isset( $this->parametres['squelette'] ) ) {
107
				if( isset( $this->parametres['squelette'] ) ) {
108
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS. $this->parametres['squelette'].'.tpl.html';
108
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS. $this->parametres['squelette'].'.tpl.html';
109
				} else {
109
				} else {
110
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
110
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
111
				}
111
				}
112
				$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
112
				$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
113
			} else {
113
			} else {
114
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
114
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
115
			}
115
			}
116
		}
116
		}
117
		$this->envoyer($contenu);
117
		$this->envoyer($contenu);
118
	}
118
	}
119
 
119
 
120
 
120
 
121
	private function executerSaisie() {
121
	private function executerSaisie() {
122
		$retour = array();
122
		$retour = array();
123
		$retour['squelette'] = 'saisie';
123
		$retour['squelette'] = 'saisie';
124
		$retour['donnees']['general'] = I18n::get('General');
124
		$retour['donnees']['general'] = I18n::get('General');
125
		$retour['donnees']['aide'] = I18n::get('Aide');
125
		$retour['donnees']['aide'] = I18n::get('Aide');
126
		$retour['donnees']['observateur'] = I18n::get('Observateur');
126
		$retour['donnees']['observateur'] = I18n::get('Observateur');
127
		$retour['donnees']['observation'] = I18n::get('Observation');
127
		$retour['donnees']['observation'] = I18n::get('Observation');
128
		$retour['donnees']['image'] = I18n::get('Image');
128
		$retour['donnees']['image'] = I18n::get('Image');
129
 		$retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
129
 		$retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
130
 		$retour['donnees']['resume'] = I18n::get('Resume');
130
 		$retour['donnees']['resume'] = I18n::get('Resume');
131
		$retour['donnees']['widget'] = $this->rechercherProjet();
131
		$retour['donnees']['widget'] = $this->rechercherProjet();
132
		return $retour;
132
		return $retour;
133
	}
133
	}
134
 
134
 
135
	/* Recherche si le projet existe sinon va chercher les infos de base */
135
	/* Recherche si le projet existe sinon va chercher les infos de base */
136
	private function rechercherProjet() {
136
	private function rechercherProjet() {
137
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
137
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
138
		$estProjetDefini = true;
138
		$estProjetDefini = true;
139
		$tab = array();
139
		$tab = array();
140
		$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
140
		$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
141
		$json = $this->getDao()->consulter($url);
141
		$json = $this->getDao()->consulter($url);
142
 
142
 
143
		if ( $json !== "[]" ) {
143
		if ( $json !== "[]" ) {
144
			$tab = $this->rechercherChampsSupp();
144
			$tab = $this->rechercherChampsSupp();
145
		} else {
145
		} else {
146
			$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
146
			$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
147
			$json = $this->getDao()->consulter($url);
147
			$json = $this->getDao()->consulter($url);
148
			$estProjetDefini = false;
148
			$estProjetDefini = false;
149
		}
149
		}
150
		$tableau = json_decode($json, true);
150
		$tableau = json_decode($json, true);
151
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
151
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
152
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
152
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
153
		if ($tableau['milieux'] != '') {
153
		if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
154
			$tableau['milieux'] = explode(';', $tableau['milieux']);
154
			// si on trouve ":" dans referentiel, referentiel = première partie
155
		} else {
-
 
156
			$tableau['milieux'] = array();
155
			$tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
157
		}
156
		}
-
 
157
		$tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
158
		if (isset($tableau['motscles'])) {
158
		if (isset($tableau['motscles'])) {
159
		    $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
159
		    $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
160
		}
160
		}
161
		$tableau['chpSupp'] = $tab;
161
		$tableau['chpSupp'] = $tab;
162
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
162
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
163
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
163
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
164
		return $tableau;
164
		return $tableau;
165
	}
165
	}
166
 
166
 
167
	/* Recherche si un projet a des champs de saisie supplémentaire */
167
	/* Recherche si un projet a des champs de saisie supplémentaire */
168
	private function rechercherChampsSupp() {
168
	private function rechercherChampsSupp() {
169
		$retour = array();
169
		$retour = array();
170
		$projet = $this->parametres['projet'];
170
		$projet = $this->parametres['projet'];
171
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
171
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
172
		$json = $this->getDao()->consulter($url);
172
		$json = $this->getDao()->consulter($url);
173
		$retour = (array) json_decode($json, true);
173
		$retour = (array) json_decode($json, true);
174
 
174
 
175
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
175
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
176
 
176
 
177
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
177
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
178
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
178
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
179
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
179
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
180
 
180
 
181
			if ( isset( $chsup['fieldValues'] ) ) {
181
			if ( isset( $chsup['fieldValues'] ) ) {
182
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
182
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
183
 
183
 
184
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
184
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
185
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
185
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
186
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
186
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
187
						$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = ($list_value_array !== 'other') ? 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( strtolower($list_value_array[0] ) ) ) : '';
187
						$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = ($list_value_array !== 'other') ? 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( strtolower($list_value_array[0] ) ) ) : '';
188
					}
188
					}
189
				}
189
				}
190
			}
190
			}
191
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
191
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
192
		}
192
		}
193
		return $retour;
193
		return $retour;
194
	}
194
	}
195
 
-
 
196
	private function clean_string( $string ) {
-
 
197
		// les fonctions de base de php ne parviennent pas à une conversion satisfaisante des codes ascii
-
 
198
		// qui ont été générés automatiquement lors de la transmission des chaines en json
-
 
199
		// dans le widget cel manager vers la base
-
 
200
		// Pour les mêmes raisons, @apos@ et @quot@ est une autre astuces utilisée dans ce même widget
-
 
201
		// pour permettre la transmission des apostrophes et guillements sans erreur
-
 
202
		$patterns = array( '/\@apos\@/', '/\@quot\@/', '/u00c0/', '/u00c1/', '/u00c2/', '/u00c3/', '/u00c4/', '/u00c5/', '/u00c6/', '/u00c7/', '/u00c8/', '/u00c9/', '/u00ca/', '/u00cb/', '/u00cc/', '/u00cd/', '/u00ce/', '/u00cf/', '/u00d1/', '/u00d2/', '/u00d3/', '/u00d4/', '/u00d5/', '/u00d6/', '/u00d8/', '/u00d9/', '/u00da/', '/u00db/', '/u00dc/', '/u00dd/', '/u00df/', '/u00e0/', '/u00e1/', '/u00e2/', '/u00e3/', '/u00e4/', '/u00e5/', '/u00e6/', '/u00e7/', '/u00e8/', '/u00e9/', '/u00ea/', '/u00eb/', '/u00ec/', '/u00ed/', '/u00ee/', '/u00ef/', '/u00f0/', '/u00f1/', '/u00f2/', '/u00f3/', '/u00f4/', '/u00f5/', '/u00f6/', '/u00f8/', '/u00f9/', '/u00fa/', '/u00fb/', '/u00fc/', '/u00fd/', '/u00ff/' );
-
 
203
		$replacements = array( '&apos;', '&quot;', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý','ÿ' );
-
 
204
 
-
 
205
		$clean_string = preg_replace( $patterns, $replacements, $string );
-
 
206
 
-
 
207
		return $clean_string;
-
 
208
	}
-
 
209
 
195
 
210
	// remplace certains parametres définis en bd par les parametres définis dans l'url
196
	// remplace certains parametres définis en bd par les parametres définis dans l'url
211
	private function traiterParametres($estProjetDefini, $tableau) {
197
	private function traiterParametres($estProjetDefini, $tableau) {
212
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
198
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
213
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
199
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
214
		foreach($this->parametres as $nom_critere => $valeur_critere) {
200
		foreach($this->parametres as $nom_critere => $valeur_critere) {
215
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
201
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
216
				$tableau[$nom_critere] = $valeur_critere;
202
				$tableau[$nom_critere] = $valeur_critere;
217
			} else if (in_array($nom_critere, $criteres)) {
203
			} else if (in_array($nom_critere, $criteres)) {
218
				$tableau[$nom_critere] = $valeur_critere;
204
				$tableau[$nom_critere] = $valeur_critere;
219
			}
205
			}
220
		}
206
		}
221
		return $tableau;
207
		return $tableau;
222
	}
208
	}
223
 
209
 
224
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
210
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
225
		$retour = array();
211
		$retour = array();
226
		$referentiel = $infos_projets['referentiel'];
212
		$referentiel = $infos_projets['referentiel'];
227
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
213
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
228
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
214
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
229
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
215
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
230
		$retour['ns_referentiel'] = $referentiel;
216
		$retour['ns_referentiel'] = $referentiel;
231
 
217
 
232
		if ( isset( $infos_projets['type_especes'] ) ) {
218
		if ( isset( $infos_projets['type_especes'] ) ) {
233
 
219
 
234
			switch ( $infos_projets['type_especes'] ) {
220
			switch ( $infos_projets['type_especes'] ) {
235
				case 'fixe' :
221
				case 'fixe' :
-
 
222
					$info_taxon = explode(':', $referentiel);
-
 
223
					if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
236
					$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['especes'] );
224
						$retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
-
 
225
					}
237
					break;
226
					break;
238
				case 'referentiel' : break;
227
				case 'referentiel' : break;
239
				case 'liste' :
228
				case 'liste' :
240
					$referentiel = $infos_projets['referentiel'];
-
 
241
////////////////////// temporaire test transmission liste taxons
-
 
242
					$retour['taxons'] = $this->recupererListeNomsSci();
229
					$retour['taxons'] = $this->recupererListeNomsSci();
243
					break;
230
					break;
244
			}
231
			}
245
		} else if ( isset( $infos_projets['referentiel'] ) ) {
232
		} else if ( isset( $referentiel ) ) {
246
			$referentiel = $infos_projets['referentiel'];
-
 
247
			if ( isset($infos_projets['num_nom'] ) ) {
233
			if ( isset($infos_projets['num_nom'] ) ) {
248
				$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['num_nom'] );
234
				$retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
249
			}
235
			}
250
		}
236
		}
251
		return $retour;
237
		return $retour;
252
	}
238
	}
253
 
239
 
254
	/**
240
	/**
255
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
241
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
256
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
242
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
257
	 * et non le taxon?)
243
	 * et non le taxon?)
258
	 * @param string|int $num_nom
244
	 * @param string|int $num_nom
259
	 * @return array
245
	 * @return array
260
	 */
246
	 */
261
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
247
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
262
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
248
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
263
		$infos = json_decode( file_get_contents( $url_service_infos ) );
249
		$infos = json_decode( file_get_contents( $url_service_infos ) );
264
		// trop de champs injectés dans les infos espèces peuvent
250
		// trop de champs injectés dans les infos espèces peuvent
265
		// faire planter javascript
251
		// faire planter javascript
266
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
252
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
267
		$resultat = array();
253
		$resultat = array();
268
		$retour = array();
254
		$retour = array();
269
		if ( isset( $infos ) && !empty( $infos ) ) {
255
		if ( isset( $infos ) && !empty( $infos ) ) {
270
			$infos = (array) $infos;
256
			$infos = (array) $infos;
271
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
257
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
272
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
258
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
273
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
259
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
274
				$retour['espece_imposee'] = true;
260
				$retour['espece_imposee'] = true;
275
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
261
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
276
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
262
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
277
				$retour['infos_espece'] = $this->array2js( $resultat, true );
263
				$retour['infos_espece'] = $this->array2js( $resultat, true );
278
			}
264
			}
279
		}
265
		}
280
		return $retour;
266
		return $retour;
281
	}
267
	}
282
 
268
 
283
	protected function getReferentielImpose() {
269
	protected function getReferentielImpose() {
284
		$referentiel_impose = true;
270
		$referentiel_impose = true;
285
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
271
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
286
			$this->ns_referentiel = $_GET['referentiel'];
272
			$this->ns_referentiel = $_GET['referentiel'];
287
		} else if (isset($this->configProjet['referentiel'])) {
273
		} else if (isset($this->configProjet['referentiel'])) {
288
			$this->ns_referentiel = $this->configProjet['referentiel'];
274
			$this->ns_referentiel = $this->configProjet['referentiel'];
289
		} else if (isset($this->configMission['referentiel'])) {
275
		} else if (isset($this->configMission['referentiel'])) {
290
			$this->ns_referentiel = $this->configMission['referentiel'];
276
			$this->ns_referentiel = $this->configMission['referentiel'];
291
		} else {
277
		} else {
292
			$referentiel_impose = false;
278
			$referentiel_impose = false;
293
		}
279
		}
294
		return $referentiel_impose;
280
		return $referentiel_impose;
295
	}
281
	}
296
 
282
 
297
	/**
283
	/**
298
	 * Trie par nom français les taxons lus dans le fichier csv
284
	 * Trie par nom français les taxons lus dans le fichier csv/tsv
299
	 */
285
	 */
300
	protected function recupererListeNomsSci() {
286
	protected function recupererListeNomsSci() {
301
		$taxons = $this->recupererListeTaxon();
287
		$taxons = $this->recupererListeTaxon();
302
		if (is_array($taxons)) {
288
		if (is_array($taxons)) {
303
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
289
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
304
		}
290
		}
305
		return $taxons;
291
		return $taxons;
306
	}
292
	}
307
 
293
 
308
	/**
294
	/**
309
	 * @TODO documenter
295
	 * @TODO documenter
310
	 * @return array
296
	 * @return array
311
	 */
297
	 */
312
	protected function recupererListeNoms() {
298
	protected function recupererListeNoms() {
313
		$taxons = $this->recupererListeTaxon();
299
		$taxons = $this->recupererListeTaxon();
314
		$nomsAAfficher = array();
300
		$nomsAAfficher = array();
315
		$nomsSpeciaux = array();
301
		$nomsSpeciaux = array();
316
		if (is_array($taxons)) {
302
		if (is_array($taxons)) {
317
			foreach ($taxons as $taxon) {
303
			foreach ($taxons as $taxon) {
318
				$nomSciTitle = $taxon['nom_ret'].
304
				$nomSciTitle = $taxon['nom_ret'].
319
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
305
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
320
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
306
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
321
				$nomFrTitle = $taxon['nom_sel'].
307
				$nomFrTitle = $taxon['nom_sel'].
322
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
308
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
323
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
309
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
324
 
310
 
325
				if ($taxon['groupe'] == 'special') {
311
				if ($taxon['groupe'] == 'special') {
326
					$nomsSpeciaux[] = array(
312
					$nomsSpeciaux[] = array(
327
							'num_nom' => $taxon['num_nom_sel'],
313
							'num_nom' => $taxon['num_nom_sel'],
328
							'nom_a_afficher' => $taxon['nom_fr'],
314
							'nom_a_afficher' => $taxon['nom_fr'],
329
							'nom_a_sauver' => $taxon['nom_sel'],
315
							'nom_a_sauver' => $taxon['nom_sel'],
330
							'nom_title' => $nomSciTitle,
316
							'nom_title' => $nomSciTitle,
331
							'nom_type' => 'nom-special');
317
							'nom_type' => 'nom-special');
332
				} else {
318
				} else {
333
					$nomsAAfficher[] = array(
319
					$nomsAAfficher[] = array(
334
							'num_nom' => $taxon['num_nom_sel'],
320
							'num_nom' => $taxon['num_nom_sel'],
335
							'nom_a_afficher' => $taxon['nom_sel'],
321
							'nom_a_afficher' => $taxon['nom_sel'],
336
							'nom_a_sauver' => $taxon['nom_sel'],
322
							'nom_a_sauver' => $taxon['nom_sel'],
337
							'nom_title' => $nomSciTitle,
323
							'nom_title' => $nomSciTitle,
338
							'nom_type' => 'nom-sci');
324
							'nom_type' => 'nom-sci');
339
					$nomsAAfficher[] = array(
325
					$nomsAAfficher[] = array(
340
							'num_nom' => $taxon['num_nom_sel'],
326
							'num_nom' => $taxon['num_nom_sel'],
341
							'nom_a_afficher' => $taxon['nom_fr'],
327
							'nom_a_afficher' => $taxon['nom_fr'],
342
							'nom_a_sauver' => $taxon['nom_fr'],
328
							'nom_a_sauver' => $taxon['nom_fr'],
343
							'nom_title' => $nomFrTitle,
329
							'nom_title' => $nomFrTitle,
344
							'nom_type' => 'nom-fr');
330
							'nom_type' => 'nom-fr');
345
				}
331
				}
346
			}
332
			}
347
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
333
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
348
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
334
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
349
		}
335
		}
350
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
336
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
351
	}
337
	}
352
 
338
 
353
	/**
339
	/**
354
	 * Lit une liste de taxons depuis un fichier csv fourni
340
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
355
	 */
341
	 */
356
	protected function recupererListeTaxon() {
342
	protected function recupererListeTaxon() {
357
		$taxons = array();
343
		$taxons = array();
358
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
344
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
359
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
345
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
360
		$fichier_csv = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . 'especes.csv';
346
		$chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . 'especes.';
361
 
347
 
362
		if ( file_exists( $fichier_csv ) && is_readable( $fichier_csv ) ) {
348
		if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
-
 
349
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
-
 
350
		} else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
363
			$taxons = $this->decomposerFichierCsv( $fichier_csv );
351
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
364
		} else {
352
		} else {
365
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_csv'.";
353
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_taxon'.";
366
		}
354
		}
367
		return $taxons;
355
		return $taxons;
368
	}
356
	}
369
 
357
 
370
	/**
358
	/**
371
	 * Découpe un fihcier csv
359
	 * Découpe un fihcier csv/tsv
372
	 */
360
	 */
373
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
361
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
374
		$header = null;
362
		$header = null;
375
		$data = array();
363
		$data = array();
376
		if (($handle = fopen($fichier, "r")) !== FALSE) {
364
		if (($handle = fopen($fichier, "r")) !== FALSE) {
377
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
365
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
378
				if (!$header) {
366
				if (!$header) {
379
					$header = $row;
367
					$header = $row;
380
				} else {
368
				} else {
381
					$data[] = array_combine($header, $row);
369
					$data[] = array_combine($header, $row);
382
				}
370
				}
383
			}
371
			}
384
			fclose($handle);
372
			fclose($handle);
385
		}
373
		}
386
		return $data;
374
		return $data;
387
	}
375
	}
388
 
376
 
389
	/**
377
	/**
390
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
378
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
391
	 * @param array $array
379
	 * @param array $array
392
	 * @param boolean $show_keys
380
	 * @param boolean $show_keys
393
	 * @return une portion de JSON représentant le tableau
381
	 * @return une portion de JSON représentant le tableau
394
	 */
382
	 */
395
	protected function array2js($array,$show_keys) {
383
	protected function array2js($array,$show_keys) {
396
		$tableauJs = '{}';
384
		$tableauJs = '{}';
397
		if (!empty($array)) {
385
		if (!empty($array)) {
398
			$total = count($array) - 1;
386
			$total = count($array) - 1;
399
			$i = 0;
387
			$i = 0;
400
			$dimensions = array();
388
			$dimensions = array();
401
			foreach ($array as $key => $value) {
389
			foreach ($array as $key => $value) {
402
				if (is_array($value)) {
390
				if (is_array($value)) {
403
					$dimensions[$i] = array2js($value,$show_keys);
391
					$dimensions[$i] = array2js($value,$show_keys);
404
					if ($show_keys) {
392
					if ($show_keys) {
405
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
393
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
406
					}
394
					}
407
				} else {
395
				} else {
408
					$dimensions[$i] = '\"'.addslashes($value).'\"';
396
					$dimensions[$i] = '\"'.addslashes($value).'\"';
409
					if ($show_keys) {
397
					if ($show_keys) {
410
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
398
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
411
					}
399
					}
412
				}
400
				}
413
				if ($i == 0) {
401
				if ($i == 0) {
414
					$dimensions[$i] = '{'.$dimensions[$i];
402
					$dimensions[$i] = '{'.$dimensions[$i];
415
				}
403
				}
416
				if ($i == $total) {
404
				if ($i == $total) {
417
					$dimensions[$i].= '}';
405
					$dimensions[$i].= '}';
418
				}
406
				}
419
				$i++;
407
				$i++;
420
			}
408
			}
421
			$tableauJs = implode(',', $dimensions);
409
			$tableauJs = implode(',', $dimensions);
422
		}
410
		}
423
		return $tableauJs;
411
		return $tableauJs;
424
	}
412
	}
425
 
-
 
426
	private function remove_accents($string) {
-
 
427
	    if ( !preg_match('/[\x80-\xff]/', $string) )
-
 
428
	        return $string;
-
 
429
 
-
 
430
	        $chars = array(
-
 
431
	            // Decompositions for Latin-1 Supplement
-
 
432
	            chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
-
 
433
	            chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
-
 
434
	            chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
-
 
435
	            chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
-
 
436
	            chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
-
 
437
	            chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
-
 
438
	            chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
-
 
439
	            chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
-
 
440
	            chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
-
 
441
	            chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
-
 
442
	            chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
-
 
443
	            chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
-
 
444
	            chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
-
 
445
	            chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
-
 
446
	            chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
-
 
447
	            chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
-
 
448
	            chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
-
 
449
	            chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
-
 
450
	            chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
-
 
451
	            chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
-
 
452
	            chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
-
 
453
	            chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
-
 
454
	            chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
-
 
455
	            chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
-
 
456
	            chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
-
 
457
	            chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
-
 
458
	            chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
-
 
459
	            chr(195).chr(191) => 'y',
-
 
460
	            // Decompositions for Latin Extended-A
-
 
461
	            chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
-
 
462
	            chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
-
 
463
	            chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
-
 
464
	            chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
-
 
465
	            chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
-
 
466
	            chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
-
 
467
	            chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
-
 
468
	            chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
-
 
469
	            chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
-
 
470
	            chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
-
 
471
	            chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
-
 
472
	            chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
-
 
473
	            chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
-
 
474
	            chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
-
 
475
	            chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
-
 
476
	            chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
-
 
477
	            chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
-
 
478
	            chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
-
 
479
	            chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
-
 
480
	            chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
-
 
481
	            chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
-
 
482
	            chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
-
 
483
	            chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
-
 
484
	            chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
-
 
485
	            chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
-
 
486
	            chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
-
 
487
	            chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
-
 
488
	            chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
-
 
489
	            chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
-
 
490
	            chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
-
 
491
	            chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
-
 
492
	            chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
-
 
493
	            chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
-
 
494
	            chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
-
 
495
	            chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
-
 
496
	            chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
-
 
497
	            chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
-
 
498
	            chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
-
 
499
	            chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
-
 
500
	            chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
-
 
501
	            chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
-
 
502
	            chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
-
 
503
	            chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
-
 
504
	            chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
-
 
505
	            chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
-
 
506
	            chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
-
 
507
	            chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
-
 
508
	            chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
-
 
509
	            chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
-
 
510
	            chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
-
 
511
	            chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
-
 
512
	            chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
-
 
513
	            chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
-
 
514
	            chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
-
 
515
	            chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
-
 
516
	            chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
-
 
517
	            chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
-
 
518
	            chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
-
 
519
	            chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
-
 
520
	            chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
-
 
521
	            chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
-
 
522
	            chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
-
 
523
	            chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
-
 
524
	            chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
-
 
525
	        );
-
 
526
	        
-
 
527
	        $string = strtr($string, $chars);
-
 
528
	        
-
 
529
	        return $string;
-
 
530
	}
-
 
531
}
413
}
532
?>
414
?>