Subversion Repositories eFlore/Applications.cel

Rev

Rev 3354 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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