Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 3355 Rev 3364
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 Lg extends WidgetCommun {
23
class Lg 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 = 'lg';
33
	const PROJET_DEFAUT = 'lg';
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['lg']['cheminDos']);
99
				$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['lg']['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_lg'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
101
				$retour['donnees']['url_ws_lg'] = 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
 
-
 
122
 
121
 
123
	private function executerSaisie() {
122
	private function executerSaisie() {
124
		$retour = array();
123
		$retour = array();
125
		$retour['squelette'] = 'lg';
124
		$retour['squelette'] = 'lg';
126
		$retour['donnees']['general'] = I18n::get('General');
125
		$retour['donnees']['general'] = I18n::get('General');
127
		$retour['donnees']['observateur'] = I18n::get('Observateur');
126
		$retour['donnees']['observateur'] = I18n::get('Observateur');
128
        $retour['donnees']['observation'] = I18n::get('Observation');
127
        $retour['donnees']['observation'] = I18n::get('Observation');
129
        $retour['donnees']['arbres'] = I18n::get('Arbres');
128
        $retour['donnees']['arbres'] = I18n::get('Arbres');
130
        $retour['donnees']['image'] = I18n::get('Image');
129
        $retour['donnees']['image'] = I18n::get('Image');
131
        $retour['donnees']['lichens'] = I18n::get('Lichens');
130
        $retour['donnees']['lichens'] = I18n::get('Lichens');
132
        $retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
131
        $retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
133
        $retour['donnees']['resume'] = I18n::get('Resume');
132
        $retour['donnees']['resume'] = I18n::get('Resume');
134
		$retour['donnees']['widget'] = $this->rechercherProjet();
133
		$retour['donnees']['widget'] = $this->rechercherProjet();
135
		return $retour;
134
		return $retour;
136
	}
135
	}
137
 
136
 
138
	/* Recherche si le projet existe sinon va chercher les infos de base */
137
	/* Recherche si le projet existe sinon va chercher les infos de base */
139
	private function rechercherProjet() {
138
	private function rechercherProjet() {
140
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
-
 
141
		$estProjetDefini = true;
-
 
142
		$tab = array();
139
		$tab = array();
143
		$url = $this->config['lg']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
140
		$url = $this->config['lg']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
144
		$json = $this->getDao()->consulter($url);
141
		$json = $this->getDao()->consulter($url);
145
 
-
 
146
		if ( $json ) {
-
 
147
			$tab = $this->rechercherChampsSupp();
-
 
148
		} else {
-
 
149
			$url = $this->config['lg']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
-
 
150
			$json = $this->getDao()->consulter($url);
-
 
151
			$estProjetDefini = false;
-
 
152
		}
-
 
153
		$tableau = json_decode($json, true);
142
		$tableau = json_decode($json, true);
154
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
143
		$tableau = $this->traiterParametres($tableau[0]);
155
		if (isset($this->parametres['squelette']) && $this->parametres['squelette'] === 'lichens') {
144
		if (isset($this->parametres['squelette']) && $this->parametres['squelette'] === 'lichens') {
156
			$tableau['type_especes'] = 'liste';
145
			$tableau['type_especes'] = 'liste';
157
			$tableau['referentiel'] = 'taxref';
146
			$tableau['referentiel'] = 'taxref';
158
		}
147
		}
159
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
148
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
160
		if ($tableau['milieux'] != "") {
149
		if ($tableau['milieux'] != "") {
161
			$tableau['milieux'] = explode(";", $tableau['milieux']);
150
			$tableau['milieux'] = explode(";", $tableau['milieux']);
162
		} else {
151
		} else {
163
			$tableau['milieux'] = array();
152
			$tableau['milieux'] = array();
164
		}
153
		}
165
		if (isset($tableau['motscles'])) {
154
		if (isset($tableau['motscles'])) {
166
		    $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
155
		    $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
167
		}
156
		}
168
		$tableau['chpSupp'] = $tab;
157
		$tableau['chpSupp'] = $tab;
169
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
158
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
170
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['lg']['imgProjet'] . '/' );
159
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['lg']['imgProjet'] . '/' );
171
		return $tableau;
160
		return $tableau;
172
	}
161
	}
173
 
-
 
174
	/* Recherche si un projet a des champs de saisie supplémentaire */
-
 
175
	private function rechercherChampsSupp() {
-
 
176
		$retour = array();
-
 
177
		$projet = $this->parametres['projet'];
-
 
178
		$url = $this->config['lg']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
-
 
179
		$json = $this->getDao()->consulter($url);
-
 
180
		$retour = (array) json_decode($json, true);
-
 
181
 
-
 
182
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
-
 
183
 
-
 
184
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
-
 
185
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
-
 
186
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
-
 
187
 
-
 
188
			if ( isset( $chsup['fieldValues'] ) ) {
-
 
189
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $chsup['fieldValues'], true );
-
 
190
				if ( isset($retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] ) ) {
-
 
191
					$retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] = $this->clean_string( $retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] );
-
 
192
				}
-
 
193
 
-
 
194
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
-
 
195
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value ) {
-
 
196
						$retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'][$list_key] = $this->clean_string( $list_value );
-
 
197
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
-
 
198
						$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( $list_value ) );
-
 
199
					}
-
 
200
				}
-
 
201
			}
-
 
202
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
-
 
203
		}
-
 
204
		return $retour;
-
 
205
	}
-
 
206
 
-
 
207
	private function clean_string( $string ) {
-
 
208
		// les fonctions de base de php ne parviennent pas à une conversion satisfaisante des codes ascii
-
 
209
		// qui ont été générés automatiquement lors de la transmission des chaines en json
-
 
210
		// dans le widget cel manager vers la base
-
 
211
		// Pour les mêmes raisons, @apos@ et @quot@ est une autre astuces utilisée dans ce même widget
-
 
212
		// pour permettre la transmission des apostrophes et guillements sans erreur
-
 
213
		$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/' );
-
 
214
		$replacements = array( '&apos;', '&quot;', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý','ÿ' );
-
 
215
 
-
 
216
		$clean_string = preg_replace( $patterns, $replacements, $string );
-
 
217
 
-
 
218
		return $clean_string;
-
 
219
	}
-
 
220
 
162
 
221
	// remplace certains parametres définis en bd par les parametres définis dans l'url
163
	// remplace certains parametres définis en bd par les parametres définis dans l'url
222
	private function traiterParametres($estProjetDefini, $tableau) {
164
	private function traiterParametres($tableau) {
223
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
-
 
224
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
165
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
225
		foreach($this->parametres as $nom_critere => $valeur_critere) {
-
 
226
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
-
 
227
				$tableau[$nom_critere] = $valeur_critere;
166
		foreach($this->parametres as $nom_critere => $valeur_critere) {
228
			} else if (in_array($nom_critere, $criteres)) {
167
			if (in_array($nom_critere, $criteres)) {
229
				$tableau[$nom_critere] = $valeur_critere;
168
				$tableau[$nom_critere] = $valeur_critere;
230
			}
169
			}
231
		}
170
		}
232
		return $tableau;
171
		return $tableau;
233
	}
172
	}
234
 
173
 
235
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
174
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
236
		$retour = array();
175
		$retour = array();
237
		$referentiel = $infos_projets['referentiel'];
176
		$referentiel = $infos_projets['referentiel'];
238
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
177
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
239
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
178
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
240
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
179
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
241
		$retour['ns_referentiel'] = $referentiel;
180
		$retour['ns_referentiel'] = $referentiel;
242
 
181
 
243
		if ( isset( $infos_projets['type_especes'] ) ) {
182
		if ( isset( $infos_projets['type_especes'] ) ) {
244
 
183
 
245
			switch ( $infos_projets['type_especes'] ) {
184
			switch ( $infos_projets['type_especes'] ) {
246
				case 'fixe' :
185
				case 'fixe' :
247
					$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['especes'] );
186
					$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['especes'] );
248
					break;
187
					break;
249
				case 'referentiel' : break;
188
				case 'referentiel' : break;
250
				case 'liste' :
189
				case 'liste' :
251
					$referentiel = $infos_projets['referentiel'];
190
					$referentiel = $infos_projets['referentiel'];
252
////////////////////// temporaire test transmission liste taxons
-
 
253
					$retour['taxons'] = $this->recupererListeNomsSci();
191
					$retour['taxons'] = $this->recupererListeNomsSci();
254
					break;
192
					break;
255
			}
193
			}
256
		} else if ( isset( $infos_projets['referentiel'] ) ) {
194
		} else if ( isset( $infos_projets['referentiel'] ) ) {
257
			$referentiel = $infos_projets['referentiel'];
195
			$referentiel = $infos_projets['referentiel'];
258
			if ( isset($infos_projets['num_nom'] ) ) {
196
			if ( isset($infos_projets['num_nom'] ) ) {
259
				$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['num_nom'] );
197
				$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['num_nom'] );
260
			}
198
			}
261
		}
199
		}
262
		return $retour;
200
		return $retour;
263
	}
201
	}
264
 
202
 
265
	/**
203
	/**
266
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
204
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
267
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
205
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
268
	 * et non le taxon?)
206
	 * et non le taxon?)
269
	 * @param string|int $num_nom
207
	 * @param string|int $num_nom
270
	 * @return array
208
	 * @return array
271
	 */
209
	 */
272
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
210
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
273
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
211
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
274
		$infos = json_decode( file_get_contents( $url_service_infos ) );
212
		$infos = json_decode( file_get_contents( $url_service_infos ) );
275
		// trop de champs injectés dans les infos espèces peuvent
213
		// trop de champs injectés dans les infos espèces peuvent
276
		// faire planter javascript
214
		// faire planter javascript
277
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
215
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
278
		$resultat = array();
216
		$resultat = array();
279
		$retour = array();
217
		$retour = array();
280
		if ( isset( $infos ) && !empty( $infos ) ) {
218
		if ( isset( $infos ) && !empty( $infos ) ) {
281
			$infos = (array) $infos;
219
			$infos = (array) $infos;
282
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
220
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
283
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
221
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
284
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
222
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
285
				$retour['espece_imposee'] = true;
223
				$retour['espece_imposee'] = true;
286
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
224
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
287
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
225
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
288
				$retour['infos_espece'] = $this->array2js( $resultat, true );
226
				$retour['infos_espece'] = $this->array2js( $resultat, true );
289
			}
227
			}
290
		}
228
		}
291
		return $retour;
229
		return $retour;
292
	}
230
	}
293
 
231
 
294
	protected function getReferentielImpose() {
232
	protected function getReferentielImpose() {
295
		$referentiel_impose = true;
233
		$referentiel_impose = true;
296
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
234
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
297
			$this->ns_referentiel = $_GET['referentiel'];
235
			$this->ns_referentiel = $_GET['referentiel'];
298
		} else if (isset($this->configProjet['referentiel'])) {
236
		} else if (isset($this->configProjet['referentiel'])) {
299
			$this->ns_referentiel = $this->configProjet['referentiel'];
237
			$this->ns_referentiel = $this->configProjet['referentiel'];
300
		} else if (isset($this->configMission['referentiel'])) {
238
		} else if (isset($this->configMission['referentiel'])) {
301
			$this->ns_referentiel = $this->configMission['referentiel'];
239
			$this->ns_referentiel = $this->configMission['referentiel'];
302
		} else {
240
		} else {
303
			$referentiel_impose = false;
241
			$referentiel_impose = false;
304
		}
242
		}
305
		return $referentiel_impose;
243
		return $referentiel_impose;
306
	}
244
	}
307
 
245
 
308
	/**
246
	/**
309
	 * Trie par nom français les taxons lus dans le fichier tsv
247
	 * Trie par nom français les taxons lus dans le fichier tsv
310
	 */
248
	 */
311
	protected function recupererListeNomsSci() {
249
	protected function recupererListeNomsSci() {
312
		$taxons = $this->recupererListeTaxon();
250
		$taxons = $this->recupererListeTaxon();
313
		if (is_array($taxons)) {
251
		if (is_array($taxons)) {
314
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
252
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
315
		}
253
		}
316
		return $taxons;
254
		return $taxons;
317
	}
255
	}
318
 
256
 
319
	/**
257
	/**
320
	 * @TODO documenter
258
	 * @TODO documenter
321
	 * @return array
259
	 * @return array
322
	 */
260
	 */
323
	protected function recupererListeNoms() {
261
	protected function recupererListeNoms() {
324
		$taxons = $this->recupererListeTaxon();
262
		$taxons = $this->recupererListeTaxon();
325
		$nomsAAfficher = array();
263
		$nomsAAfficher = array();
326
		$nomsSpeciaux = array();
264
		$nomsSpeciaux = array();
327
		if (is_array($taxons)) {
265
		if (is_array($taxons)) {
328
			foreach ($taxons as $taxon) {
266
			foreach ($taxons as $taxon) {
329
				$nomSciTitle = $taxon['nom_ret'].
267
				$nomSciTitle = $taxon['nom_ret'].
330
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
268
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
331
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
269
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
332
				$nomFrTitle = $taxon['nom_sel'].
270
				$nomFrTitle = $taxon['nom_sel'].
333
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
271
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
334
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
272
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
335
 
273
 
336
				if ($taxon['groupe'] == 'special') {
274
				if ($taxon['groupe'] == 'special') {
337
					$nomsSpeciaux[] = array(
275
					$nomsSpeciaux[] = array(
338
							'num_nom' => $taxon['num_nom_sel'],
276
							'num_nom' => $taxon['num_nom_sel'],
339
							'nom_a_afficher' => $taxon['nom_fr'],
277
							'nom_a_afficher' => $taxon['nom_fr'],
340
							'nom_a_sauver' => $taxon['nom_sel'],
278
							'nom_a_sauver' => $taxon['nom_sel'],
341
							'nom_title' => $nomSciTitle,
279
							'nom_title' => $nomSciTitle,
342
							'nom_type' => 'nom-special');
280
							'nom_type' => 'nom-special');
343
				} else {
281
				} else {
344
					$nomsAAfficher[] = array(
282
					$nomsAAfficher[] = array(
345
							'num_nom' => $taxon['num_nom_sel'],
283
							'num_nom' => $taxon['num_nom_sel'],
346
							'nom_a_afficher' => $taxon['nom_sel'],
284
							'nom_a_afficher' => $taxon['nom_sel'],
347
							'nom_a_sauver' => $taxon['nom_sel'],
285
							'nom_a_sauver' => $taxon['nom_sel'],
348
							'nom_title' => $nomSciTitle,
286
							'nom_title' => $nomSciTitle,
349
							'nom_type' => 'nom-sci');
287
							'nom_type' => 'nom-sci');
350
					$nomsAAfficher[] = array(
288
					$nomsAAfficher[] = array(
351
							'num_nom' => $taxon['num_nom_sel'],
289
							'num_nom' => $taxon['num_nom_sel'],
352
							'nom_a_afficher' => $taxon['nom_fr'],
290
							'nom_a_afficher' => $taxon['nom_fr'],
353
							'nom_a_sauver' => $taxon['nom_fr'],
291
							'nom_a_sauver' => $taxon['nom_fr'],
354
							'nom_title' => $nomFrTitle,
292
							'nom_title' => $nomFrTitle,
355
							'nom_type' => 'nom-fr');
293
							'nom_type' => 'nom-fr');
356
				}
294
				}
357
			}
295
			}
358
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
296
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
359
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
297
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
360
		}
298
		}
361
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
299
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
362
	}
300
	}
363
 
301
 
364
	/**
302
	/**
365
	 * Lit une liste de taxons depuis un fichier tsv fourni
303
	 * Lit une liste de taxons depuis un fichier tsv fourni
366
	 */
304
	 */
367
	protected function recupererListeTaxon() {
305
	protected function recupererListeTaxon() {
368
		$taxons = array();
306
		$taxons = array();
369
		$fichier_tsv = dirname(__FILE__) . self::DS . 'configurations' . self::DS . 'lichens_taxons.tsv';
307
		$fichier_tsv = dirname(__FILE__) . self::DS . 'configurations' . self::DS . 'lichens_taxons.tsv';
370
 
308
 
371
		if ( file_exists( $fichier_tsv ) && is_readable( $fichier_tsv ) ) {
309
		if ( file_exists( $fichier_tsv ) && is_readable( $fichier_tsv ) ) {
372
			$taxons = $this->decomposerFichierTsv( $fichier_tsv );
310
			$taxons = $this->decomposerFichierTsv( $fichier_tsv );
373
		} else {
311
		} else {
374
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_tsv'.";
312
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_tsv'.";
375
		}
313
		}
376
		return $taxons;
314
		return $taxons;
377
	}
315
	}
378
 
316
 
379
	/**
317
	/**
380
	 * Découpe un fihcier csv
318
	 * Découpe un fihcier csv
381
	 */
319
	 */
382
	protected function decomposerFichierTsv($fichier, $delimiter = "\t"){
320
	protected function decomposerFichierTsv($fichier, $delimiter = "\t"){
383
		$header = null;
321
		$header = null;
384
		$data = array();
322
		$data = array();
385
		if (($handle = fopen($fichier, "r")) !== FALSE) {
323
		if (($handle = fopen($fichier, "r")) !== FALSE) {
386
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
324
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
387
				if (!$header) {
325
				if (!$header) {
388
					$header = $row;
326
					$header = $row;
389
				} else {
327
				} else {
390
					$data[] = array_combine($header, $row);
328
					$data[] = array_combine($header, $row);
391
				}
329
				}
392
			}
330
			}
393
			fclose($handle);
331
			fclose($handle);
394
		}
332
		}
395
		return $data;
333
		return $data;
396
	}
334
	}
397
 
335
 
398
	/**
336
	/**
399
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
337
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
400
	 * @param array $array
338
	 * @param array $array
401
	 * @param boolean $show_keys
339
	 * @param boolean $show_keys
402
	 * @return une portion de JSON représentant le tableau
340
	 * @return une portion de JSON représentant le tableau
403
	 */
341
	 */
404
	protected function array2js($array,$show_keys) {
342
	protected function array2js($array,$show_keys) {
405
		$tableauJs = '{}';
343
		$tableauJs = '{}';
406
		if (!empty($array)) {
344
		if (!empty($array)) {
407
			$total = count($array) - 1;
345
			$total = count($array) - 1;
408
			$i = 0;
346
			$i = 0;
409
			$dimensions = array();
347
			$dimensions = array();
410
			foreach ($array as $key => $value) {
348
			foreach ($array as $key => $value) {
411
				if (is_array($value)) {
349
				if (is_array($value)) {
412
					$dimensions[$i] = array2js($value,$show_keys);
350
					$dimensions[$i] = array2js($value,$show_keys);
413
					if ($show_keys) {
351
					if ($show_keys) {
414
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
352
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
415
					}
353
					}
416
				} else {
354
				} else {
417
					$dimensions[$i] = '\"'.addslashes($value).'\"';
355
					$dimensions[$i] = '\"'.addslashes($value).'\"';
418
					if ($show_keys) {
356
					if ($show_keys) {
419
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
357
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
420
					}
358
					}
421
				}
359
				}
422
				if ($i == 0) {
360
				if ($i == 0) {
423
					$dimensions[$i] = '{'.$dimensions[$i];
361
					$dimensions[$i] = '{'.$dimensions[$i];
424
				}
362
				}
425
				if ($i == $total) {
363
				if ($i == $total) {
426
					$dimensions[$i].= '}';
364
					$dimensions[$i].= '}';
427
				}
365
				}
428
				$i++;
366
				$i++;
429
			}
367
			}
430
			$tableauJs = implode(',', $dimensions);
368
			$tableauJs = implode(',', $dimensions);
431
		}
369
		}
432
		return $tableauJs;
370
		return $tableauJs;
433
	}
371
	}
434
 
-
 
435
	private function remove_accents($string) {
-
 
436
	    if ( !preg_match('/[\x80-\xff]/', $string) ) {
-
 
437
	        return $string;
-
 
438
	    }
-
 
439
 
-
 
440
        $chars = array(
-
 
441
            // Decompositions for Latin-1 Supplement
-
 
442
            chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
-
 
443
            chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
-
 
444
            chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
-
 
445
            chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
-
 
446
            chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
-
 
447
            chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
-
 
448
            chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
-
 
449
            chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
-
 
450
            chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
-
 
451
            chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
-
 
452
            chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
-
 
453
            chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
-
 
454
            chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
-
 
455
            chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
-
 
456
            chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
-
 
457
            chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
-
 
458
            chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
-
 
459
            chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
-
 
460
            chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
-
 
461
            chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
-
 
462
            chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
-
 
463
            chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
-
 
464
            chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
-
 
465
            chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
-
 
466
            chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
-
 
467
            chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
-
 
468
            chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
-
 
469
            chr(195).chr(191) => 'y',
-
 
470
            // Decompositions for Latin Extended-A
-
 
471
            chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
-
 
472
            chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
-
 
473
            chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
-
 
474
            chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
-
 
475
            chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
-
 
476
            chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
-
 
477
            chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
-
 
478
            chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
-
 
479
            chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
-
 
480
            chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
-
 
481
            chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
-
 
482
            chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
-
 
483
            chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
-
 
484
            chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
-
 
485
            chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
-
 
486
            chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
-
 
487
            chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
-
 
488
            chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
-
 
489
            chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
-
 
490
            chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
-
 
491
            chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
-
 
492
            chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
-
 
493
            chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
-
 
494
            chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
-
 
495
            chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
-
 
496
            chr(196).chr(178) => 'IJ', chr(196).chr(179) => 'ij',
-
 
497
            chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
-
 
498
            chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
-
 
499
            chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
-
 
500
            chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
-
 
501
            chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
-
 
502
            chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
-
 
503
            chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
-
 
504
            chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
-
 
505
            chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
-
 
506
            chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
-
 
507
            chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
-
 
508
            chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
-
 
509
            chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
-
 
510
            chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
-
 
511
            chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
-
 
512
            chr(197).chr(146) => 'OE', chr(197).chr(147) => 'oe',
-
 
513
            chr(197).chr(148) => 'R', chr(197).chr(149) => 'r',
-
 
514
            chr(197).chr(150) => 'R', chr(197).chr(151) => 'r',
-
 
515
            chr(197).chr(152) => 'R', chr(197).chr(153) => 'r',
-
 
516
            chr(197).chr(154) => 'S', chr(197).chr(155) => 's',
-
 
517
            chr(197).chr(156) => 'S', chr(197).chr(157) => 's',
-
 
518
            chr(197).chr(158) => 'S', chr(197).chr(159) => 's',
-
 
519
            chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
-
 
520
            chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
-
 
521
            chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
-
 
522
            chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
-
 
523
            chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
-
 
524
            chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
-
 
525
            chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
-
 
526
            chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
-
 
527
            chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
-
 
528
            chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
-
 
529
            chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
-
 
530
            chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
-
 
531
            chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
-
 
532
            chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
-
 
533
            chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
-
 
534
            chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
-
 
535
        );
-
 
536
 
-
 
537
        $string = strtr($string, $chars);
-
 
538
 
-
 
539
        return $string;
-
 
540
	}
-
 
541
 
-
 
542
}
372
}
543
?>
373
?>