Subversion Repositories eFlore/Applications.cel

Rev

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

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